151 lines
6.3 KiB
Python
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() |