#################################################################################
# This file is part of Mana Launcher.
# Copyright (C) 2021 Jesusalva <jesusalva@tmw2.org>
#
# Distributed under the MIT license, except for Steam parts.
#################################################################################
init 2 python:
def handle_client(CLIENT_NAME="", launch=False, download=True):
## Local variables
f=False
if (CLIENT_NAME == ""):
CLIENT_NAME=persistent.client
## Main loop
if (CLIENT_NAME == "manaplus"):
f=cli_manaplus(launch, download)
elif (CLIENT_NAME == "mana"):
f=cli_mana(launch, download)
else:
status_update("ERROR, unrecognized client: %s" % CLIENT_NAME)
return f
def launch_game(idx):
global progress, responsive
########################################################################
## Setup
RPCUpdate(persistent.serverlist[idx]["Name"], persistent.serverlist[idx]["Back"])
HOST=persistent.serverlist[idx]["Host"]
PORT=persistent.serverlist[idx]["Port"]
CMD=handle_client(launch=True)
OPT="-s %s -y evol2 -p %s" % (HOST, PORT)
stdout("%s %s" % (CMD, OPT))
########################################################################
## Obtain access token from vault
## Failures are skipped (!!) unless they are a 403 (FORBIDDEN)
auth = {"vaultId": vaultId,
"token": vaultToken,
"world": persistent.serverlist[idx]["UUID"]}
PWD=""
try:
r=vault.post(VAULT_HOST+"/world_pass", json=auth, timeout=15.0)
if r.status_code == 200:
auth2=r.json()
PWD=" -U %s -P %s" % (auth2["user"], auth2["pass"])
elif r.status_code == 403:
stdout("Warning: Connection was refused (Vault logout?)")
responsive = False
return
else:
stdout("Get World Auth - Returned error code %d" % r.status_code)
except:
pass
########################################################################
## Loop
try:
## Minimize to tray if set
if not renpy.mobile and persistent.iconify:
renpy.iconify()
## Launch your prefered game client, wait for it to finish
if renpy.windows:
app=execute("\"%s\" %s%s" % (CMD, OPT, PWD), shell=True)
else:
app=execute("%s %s%s" % (CMD, OPT, PWD), shell=True)
if app:
traceback.print_exc()
stdout("[CLIENT] An error happened: %d" % app)
#responsive = False
except:
traceback.print_exc()
stdout("[FATAL] An error happened trying to launch the client D:")
responsive = False
# NOTE: Now we would like to un-minimize ourselves
# But we cannot =/
# There's a few tricks but not very nice...
# https://stackoverflow.com/questions/45426203/minimize-window-with-python (Linux)
# https://stackoverflow.com/questions/2791489/how-do-i-take-out-the-focus-or-minimize-a-window-with-python/2792059 (Windows)
########################################################################
## Cleanup
progress=100
# Clean discord RPC and go back to world selection menu
RPCUpdate("Main Menu", "launcher")
return
def md5check_client():
renpy.notify("Checking md5sum...")
try:
installdir=get_path(persistent.client)
fname=handle_client(launch=True, download=False).split("/").pop()
r=requests.get(persistent.host+"/%s.md5" % fname, timeout=10.0)
md5up=r.text.replace("\n", "")
md5us=md5sum(installdir+"/%s" % fname)
if md5up != md5us:
stdout("MD5 Mismatch: hashes differ", True)
stdout("Ours: %s" % md5us, True)
stdout("Them: %s" % md5up, True)
shutil.rmtree(get_path(persistent.client))
renpy.notify("Files are corrupted!")
else:
renpy.notify("All files up to date!")
except:
traceback.print_exc()
renpy.notify("An error happened.")
return
init 1 python:
#############################################################################
def download_manaplus(fname):
installdir=get_path("manaplus")
status_update("Downloading %s on RAM..." % fname, 62)
r=requests.get(persistent.host+"/%s" % fname, timeout=60.0)
if (r.status_code != 200):
status_update("Failure retrieving M+: ERROR %d" % r.status_code)
return False
status_update("Saving %s..." %fname, 64)
with open(installdir+"/%s" % fname, 'wb') as fd:
for chunk in r.iter_content(chunk_size=128):
fd.write(chunk)
status_update("Verifying MD5 hash...", 67)
r=requests.get(persistent.host+"/%s.md5" % fname, timeout=10.0)
md5up=r.text.replace("\n", "")
status_update("Verifying MD5 hash...", 69)
md5us=md5sum(installdir+"/%s" % fname)
if md5up != md5us:
status_update("MD5 Hash Error")
stdout("MD5 Mismatch: hashes differ", True)
stdout("Ours: %s" % md5us, True)
stdout("Them: %s" % md5up, True)
return False
return True
#######################
def install_manaplus():
status_update("Creating ManaPlus directory...", 61)
installdir=get_path("manaplus")
os.mkdir(installdir)
## Detect your plataform
#########################################################
if renpy.linux:
if not download_manaplus("ManaPlus.AppImage"):
return False
status_update("Marking as executable...", 70)
execute("chmod +x \"%s\"" % installdir+"/ManaPlus.AppImage", shell=True)
status_update("Installation successful!", 75)
#########################################################
elif renpy.windows:
if not download_manaplus("ManaPlus.zip"):
return False
status_update("Unzipping file...", 70)
with zipfile.ZipFile(installdir+"/ManaPlus.zip", 'r') as zip_ref:
zip_ref.extractall(installdir)
status_update("Installation successful!", 75)
#########################################################
#elif renpy.android:
#elif renpy.macintosh:
#elif renpy.emscripten: # web
#########################################################
else:
status_update("ERROR: Unsupported Plataform")
return False
return True
###############################
def cli_manaplus(launch=False, download=True):
global SCR_PROMPT, SCR_RESULT
## Check if ManaPlus is already installed
try:
MANAPLUS=os.path.exists(get_path("manaplus"))
except:
traceback.print_exc()
MANAPLUS=False
## Installer
if not MANAPLUS and download:
SCR_PROMPT=("Selected client \"%s\" is not installed.\nDo you wish to install it now?\n\n{size=14}By installing you agree with its {a=%s}Terms of Use and Conditions{/a}.%s{/size}" %
("ManaPlus", "https://gitlab.com/themanaworld/manaplus/manaplus/-/raw/master/COPYING",
ifte(renpy.linux, "\n{i}libfuse2{/i} is required to run AppImages.", "")))
while SCR_RESULT is None:
time.sleep(0.02)
ret=copy.copy(SCR_RESULT)
SCR_RESULT=None
if (not ret):
return False
try:
if not install_manaplus():
# Delete the failed attempt before raising the exception
shutil.rmtree(get_path("manaplus"))
#os.rmdir(get_path("manaplus"))
raise Exception("Installation failed!")
except:
traceback.print_exc()
stdout("Installation failed!", True)
return False
elif not MANAPLUS:
return False
##########
if launch:
if renpy.linux:
os.environ["APPIMAGELAUNCHER_DISABLE"]="1"
pathy=get_path("manaplus")+"/ManaPlus.AppImage"
return pathy.replace(" ", "\\ ")
elif renpy.windows:
pathy=get_path("manaplus")+"/Mana/manaplus.exe"
return pathy.replace("/", "\\")
else:
stdout("Invalid Plataform!")
return False
return True
#############################################################################
def cli_mana(launch=False, download=True):
stdout("ERROR, Mana Client is not implemented!")
return False
## Check for Mana
try:
MANA=os.path.exists(get_path("mana"))
except:
traceback.printexc()
MANA=False
## Installer
if not MANA and download:
SCR_PROMPT=("Selected client \"%s\" is not installed.\nDo you wish to install it now?\n\n{size=14}By installing you agree with its {a=%s}Terms of Use and Conditions{/a}.{/size}" %
("Mana", "https://gitlab.com/themanaworld/tmw-client/????/-/raw/master/COPYING"))
while SCR_RESULT is None:
time.sleep(0.02)
ret=copy.copy(SCR_RESULT)
SCR_RESULT=None
if (not ret):
return False
elif not MANA:
return False
return True