Files
hytale/hytale.py
T
2026-06-04 15:17:33 +02:00

151 lines
6.3 KiB
Python

#!/usr/bin/python3
import os
from pathlib import Path
import argparse
import json
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning # pyright: ignore[reportMissingImports]
import subprocess
import sys
#DONE nettoyer et faire un script propre /main /fonctions /nommage
#DONE Kill le serveur proprement (fonction) --parser
#globalconf
base_post_url = "https://oauth.accounts.hytale.com/oauth2"
headers = {"Content-Type":"application/x-www-form-urlencoded","User-Agent":"curl/7.81.0"}
SCRIPT_DIR = Path(__file__).parent.resolve()
USER = os.environ["USER"]
# Change le répertoire de travail courant pour /opt/hytale/Server
os.chdir(f'{SCRIPT_DIR}/Server')
def hytale_rest_post(url: str, data1=None):
response = requests.post(base_post_url + url,headers=headers,data=data1,verify=True)
return response
def hytale_rest_get(url: str, token=None):
response = requests.get(url,headers={"Content-Type":"application/x-www-form-urlencoded","User-Agent":"curl/7.81.0", "Authorization": f"Bearer {token}"},verify=True)
return response
def launch_server(credentials_file):
if os.path.exists(f"{SCRIPT_DIR}/{credentials_file}"):
with open(f"{SCRIPT_DIR}/{credentials_file}", 'r', encoding='utf-8') as f:
my_file_data = json.load(f)
else:
print("No credentials file found, please generate credentials first")
return 102
identity_token = my_file_data["identityToken"]
session_token = my_file_data["sessionToken"]
# Lauch the server
launch_status = subprocess.run(["bash", "-c", f"nohup java -jar HytaleServer.jar --auth-mode authenticated --session-token {session_token} --identity-token {identity_token} --assets ../Assets.zip --backup --backup-dir backups --backup-frequency 30 --allow-op --event-debug --ignore-broken-mods &> /var/log/hytale.log &"])
if launch_status.returncode == 0:
print("Server launched successfully")
return True
def kill_server():
# Utilise pgrep pour trouver les processus java qui contiennent "HytaleServer.jar" dans leur ligne de commande
result = subprocess.run(["pgrep", "-f", "java.*HytaleServer.jar.*"], capture_output=True, text=True)
pids = result.stdout.split("\n")
# Tuer chaque processus trouvé
for pid in pids:
if pid == "":
pass
else :
os.kill(int(pid),9)
print(f"{pid} killed" )
return True
def generate_credentials(credentials_file):
print("Generating credentials...")
# Step 1: Request Device Code
device_code_response = hytale_rest_post("/device/auth",{"client_id": "hytale-server","scope": "openid offline auth:server"})
my_device_code = device_code_response.json().get('device_code')
# Step 2: Poll for Token
authentication_response = hytale_rest_post("/token",{"client_id":"hytale-server","grant_type":"urn:ietf:params:oauth:grant-type:device_code","device_code": my_device_code})
print('Click on the link to approve the app: ' + device_code_response.json().get('verification_uri_complete'))
while authentication_response.status_code != 200:
input("Approve the app and press enter to continue...")
authentication_response = hytale_rest_post("/token",{"client_id":"hytale-server","grant_type":"urn:ietf:params:oauth:grant-type:device_code","device_code": my_device_code})
# Step 3: Get Profile Information
my_token = authentication_response.json().get("access_token")
my_profile = hytale_rest_get("https://account-data.hytale.com/my-account/get-profiles",my_token)
my_uuid = my_profile.json().get("profiles")[0].get("uuid")
# Step 4: Create Game Session
games_token_response = requests.post("https://sessions.hytale.com/game-session/new", headers={"Content-Type":"application/json","User-Agent":"curl/7.81.0", "Authorization": f"Bearer {my_token}"}, data=json.dumps({"uuid": my_uuid}))
update_credentials(games_token_response.json(),credentials_file)
return True
def update_credentials(data: dict, credentials_file):
if os.path.exists(f"{SCRIPT_DIR}/{credentials_file}"):
with open(f"{SCRIPT_DIR}/{credentials_file}", 'r', encoding='utf-8') as f:
my_file_data = json.load(f)
else:
my_file_data = {}
# Mise à jour des valeurs si elles sont présentes dans data
if 'identityToken' in data:
my_file_data["identityToken"] = data['identityToken']
if 'sessionToken' in data:
my_file_data["sessionToken"] = data['sessionToken']
# Écriture dans le fichier
with open(f"{SCRIPT_DIR}/{credentials_file}", 'w', encoding='utf-8') as f:
json.dump(my_file_data, f, indent=4, ensure_ascii=False)
print(f"Fichier {credentials_file} mis à jour avec succès !")
def refresh_credentials(credentials_file):
if os.path.exists(f"{SCRIPT_DIR}/{credentials_file}"):
with open(f"{SCRIPT_DIR}/{credentials_file}", 'r', encoding='utf-8') as f:
my_file_data = json.load(f)
refresh_session = requests.post("https://sessions.hytale.com/game-session/refresh",headers={"Content-Type":"application/json","User-Agent":"curl/7.81.0", "Authorization": f"Bearer {my_file_data["sessionToken"]}"})
if refresh_session.status_code == 200:
print ("Refresh session validated!")
update_credentials(refresh_session.json(),credentials_file)
def new_game_session ():
pass
def main():
parser = argparse.ArgumentParser(description="Manage Hytale Server")
parser.add_argument("-Rs", "--relaunch-server",action="store_true")
parser.add_argument("-Ko","--kill-server",action="store_true")
parser.add_argument("-Rt", "--refresh-game-token",action="store_true")
parser.add_argument("-Nr", "--no-refresh",action="store_true")
parser.add_argument("-C", "--credentials-file",default="default_credentials.json")
args = parser.parse_args()
if args.relaunch_server:
kill_server()
print("Server has been killed properly, let's continue")
if args.kill_server:
kill_server()
print("Server has been killed properly, exit")
sys.exit(0)
if args.refresh_game_token:
refresh_credentials(args.credentials_file)
sys.exit(0)
if not args.no_refresh:
generate_credentials(args.credentials_file)
launch_server(args.credentials_file)
main()