diff --git a/backend.py b/backend.py index acbcb26..2c6c3a3 100644 --- a/backend.py +++ b/backend.py @@ -1,9 +1,11 @@ import platform import requests -from os import popen +from os import popen,remove,mkdir,_exit from time import sleep import re import pathlib +import json +import tkinter.filedialog as fd def getArch() -> str : arch = platform.machine() @@ -13,12 +15,35 @@ elif arch in ['arm64','aarch64'] : return 'arm64' -APP_PATH: str - -TOKEN: str - OS = platform.system() +if OS == 'Linux' : + APPDATA = f"{pathlib.Path.home()}/.gvm_data/" +elif OS == 'Windows' : + APPDATA =f"{pathlib.Path.home()}AppData/Roaming/GVM/" + +FIRSTOPEN = not pathlib.Path(f"{APPDATA}settings.json").exists() + +if FIRSTOPEN : + try : + mkdir(APPDATA) + except : + pass + finally : + open(f"{APPDATA}settings.json",'w').write(json.dumps({'appPath':'','token':''})) + +SETTINGS = json.load(open(f"{APPDATA}settings.json",'r')) + +def updateSettings(appPath: str, token: str) -> None : + global APP_PATH + global TOKEN + APP_PATH = appPath + TOKEN = token + +APP_PATH: str = SETTINGS['appPath'] +WIN_COMP: str = APP_PATH.replace('/','\\') +TOKEN: str = SETTINGS['token'] + ARCH = getArch() def requestGitHubInfo() -> list : @@ -35,16 +60,22 @@ tag_list = [] response = requestGitHubInfo() + if type(response) == dict : + return ['No options available'] + for i in response : tag_list.append(i['tag_name']) tag_list.sort(reverse=True) - tag_list.pop() + if tag_list != [] : + tag_list.pop() + else : + tag_list.append('No options available') return tag_list -def downloadGodot(cur_version: str) -> None : +def downloadGodot(cur_version: str,mono: str) -> int : response = requestGitHubInfo() @@ -57,26 +88,49 @@ if ASSETS != [] : for asset in ASSETS : if OS == 'Linux' : - regex = re.findall("linux|x11",asset['name']) + re.findall("x86_64|64",asset['name']) - if re.findall("server|headless",asset['name']) == [] and regex in [['linux','x86_64'],['x11','64']] :#(asset['name'].find('linux') > 0 or asset['name'].find('x11') > 0) and (asset['name'].find(ARCH) > 0 or asset['name'].find('64') > 0) and asset['name'].find('server') == -1: + regex: list = re.findall("linux|x11",asset['name']) + re.findall("x86_64|64",asset['name']) + + if mono != 'no_mono' : + regex += re.findall(mono,asset['name']) + monoCatch = "" + monoGoal = ['mono'] + else : + monoCatch = "|mono" + monoGoal = [] + + + if re.findall(f"server|headless{monoCatch}",asset['name']) == [] and regex in [['linux','x86_64']+monoGoal,['x11','64']+monoGoal] :#(asset['name'].find('linux') > 0 or asset['name'].find('x11') > 0) and (asset['name'].find(ARCH) > 0 or asset['name'].find('64') > 0) and asset['name'].find('server') == -1: popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}") sleep(10) popen(f"unzip -d {APP_PATH} {APP_PATH}/Godot.zip") sleep(10) - popen(f"rm -f {APP_PATH}/Godot.zip") + remove(f"{APP_PATH}/Godot.zip") + return 0 elif OS == 'Windows' : - if 'arm64' in re.findall('win',asset['name']) + re.findall('arm64',asset['name']) : - popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}") - popen(f"tar -xf {APP_PATH}/Godot.zip -C {APP_PATH}") - popen(f"DEL {APP_PATH}/Godot.zip") + + if mono != 'no_mono' : + monoGoal = ['mono'] else : + monoGoal = [] + + if ['win','arm64'] + monoGoal == re.findall('win',asset['name']) + re.findall('arm64',asset['name']) + re.findall('mono',asset['name']) : popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}") + sleep(10) popen(f"tar -xf {APP_PATH}/Godot.zip -C {APP_PATH}") - popen(f"DEL {APP_PATH}/Godot.zip") + sleep(10) + remove(f"{APP_PATH}/Godot.zip") + return 0 + elif ['win64'] + monoGoal == re.findall('win64',asset['name']) + re.findall('mono',asset['name']) : + popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}") + sleep(10) + popen(f"tar -xf {APP_PATH}/Godot.zip -C {APP_PATH}") + sleep(10) + remove(f"{APP_PATH}/Godot.zip") + return 0 else : - raise Exception("Incompatible OS.") + return 1 else : - raise Exception("No fitting assets found.") + return 1 def getAssets(response: list, tag: str) -> list : @@ -88,15 +142,34 @@ return [] -def launch(cur_version: str) -> int : +def launch(cur_version: str, mono: str) -> int : VERSION = cur_version.split('-')[0] appDir = pathlib.Path(APP_PATH) - for i in appDir.iterdir() : - if re.findall(VERSION,i.name) == [VERSION] : - popen(f"{APP_PATH}/{i.name}") - return 0 + if mono == 'no_mono' : + for i in appDir.iterdir() : + if re.findall(VERSION,i.name) == [VERSION] and i.is_file() : + popen(f"{APP_PATH}{i.name}") + return 0 + else : + for i in appDir.iterdir() : + if re.findall(VERSION,i.name) + re.findall('mono',i.name) == [VERSION,'mono'] and i.is_dir() : + for exe in i.iterdir() : + if re.findall('exe|x86_64|64',exe.name) and exe.is_file() : + popen(f"{APP_PATH}{i.name}/{exe.name}") - return 1 \ No newline at end of file + return 1 + +def suddenSet(appPath: str, token: str) -> None : + open(f"{APPDATA}settings.json",'w').write(json.dumps({'appPath':appPath,'token':token})) + updateSettings(appPath,token) + +def checkSettings() -> bool : + settings = json.load(open(f"{APPDATA}settings.json",'r')) + + if settings['appPath'] == '' or settings['token'] == '' : + return False + else : + return True \ No newline at end of file diff --git a/main.py b/main.py index 7fb089e..b0e4ed8 100644 --- a/main.py +++ b/main.py @@ -1,17 +1,65 @@ import tkinter as tk import tkinter.ttk as ttk +import tkinter.filedialog as fd import backend +import pathlib def tryDownload() -> None : - backend.downloadGodot(strvar.get()) + if backend.checkSettings() : + if backend.downloadGodot(strvar.get(),mono.get()) == 0 : + print('Download was successful') + else : + print('Something went wrong') + + else : + openSettings() def tryLaunch() -> None : - if backend.launch(strvar.get()) == 0 : - print("Launched successfully") + if backend.checkSettings() : + if backend.launch(strvar.get(),mono.get()) == 0 : + print("Launched successfully") + else : + print("Godot couldn't be launched") else : - print("Godot couldn't be launched") + openSettings() +def getAppDir() -> None : + app_path.set(fd.askdirectory(initialdir=pathlib.Path.home())) +def quit() -> None : + FRONTEND.quit() + +def openSettings() -> None : + + def saveSettings() -> None : + backend.suddenSet(dirSetting.get(),tokenSetting.get()) + VERSION_MENU.destroy() + updateVersionList() + settingsWindow.destroy() + + settingsWindow = tk.Toplevel(FRONTEND) + settingsWindow.resizable(False,False) + settingsWindow.title('Settings') + settingsWindow.geometry("480x320") + + settingsCanvas = tk.Canvas(settingsWindow,bg="#5095A7") + settingsCanvas.place(relheight=1,relwidth=1) + + tk.Label(settingsCanvas,bg="#5095A7",text="PATH:").place(x=100,y=36,height=24,width=40) + tk.Label(settingsCanvas,bg="#5095A7",text="GitHub-Token:").place(x=100,y=100,height=24,width=90) + dirSetting: tk.Entry = tk.Entry(settingsCanvas,bd=1,bg="#aaa",textvariable=app_path) + dirSetting.place(height=24,width=240,x=96,y=60) + tk.Button(settingsCanvas,text="...",activebackground='#aaa',bg='#888',command=getAppDir).place(height=24,width=24,x=336,y=60) + tokenSetting: tk.Entry = tk.Entry(settingsCanvas,bd=1,bg="#aaa",show='*') + tokenSetting.place(height=24,width=264,x=96,y=124) + tk.Button(settingsCanvas,text="Save",activebackground='#aaa',bg='#888',command=saveSettings).place(height=36,width=90,x=195,y=180) + +def updateVersionList() -> None : + CUR_VERSION = backend.verOptions() + strvar.set(CUR_VERSION[0]) + VERSION_MENU = ttk.Combobox(master=CANVAS,textvariable=strvar,values=CUR_VERSION,state='readonly',font="Sans 12",style='M.TCombobox') + VERSION_MENU.place(width=256,height=36,relx=0.31,y=120) + CUR_VERSION = backend.verOptions() @@ -19,6 +67,7 @@ FRONTEND.geometry("650x480") FRONTEND.resizable(False,False) FRONTEND.title("GVM") +app_path = tk.StringVar(FRONTEND,backend.APP_PATH) ttk.Style().configure("M.TCombobox",background="#888") ttk.Style().map("M.TCombobox",background=[('active','#aaa')]) @@ -30,19 +79,25 @@ strvar = tk.StringVar(CANVAS,CUR_VERSION[0]) VERSION_MENU = ttk.Combobox(master=CANVAS,textvariable=strvar,values=CUR_VERSION,state='readonly',font="Sans 12",style='M.TCombobox') +mono = tk.StringVar(CANVAS,'no_mono') +MONO_CHECK = tk.Checkbutton(CANVAS,text="Mono Version",bg="#7245be",fg='#000',activebackground="#804ed8",activeforeground="#000",offvalue='no_mono',onvalue='mono',variable=mono) + Menubar = tk.Menu(CANVAS,type='menubar') file_menu = tk.Menu(Menubar,tearoff=False) -file_menu.add_command(label='Settings') +file_menu.add_command(label='Settings',command=openSettings) +file_menu.add_separator() +file_menu.add_command(label='Exit',command=quit) Menubar.add_cascade(label='File',menu=file_menu) CANVAS.place(relheight=1,relwidth=1) -CANVAS.create_text(325,36,font="Sans 24",text="Godot Version Manager",) +CANVAS.create_text(325,36,font="Sans 24",text="Godot Version Manager") LAUNCH_BUTTON.place(width=72,height=36,relx=0.55,y=380) DOWNLOAD_BUTTON.place(width=72,height=36,relx=0.34,y=380) -VERSION_MENU.place(width=256,height=36,relx=0.31,y=120) +updateVersionList() +MONO_CHECK.place(width=128,height=24,relx=0.75,y=126) #tk.Canvas(bg="#ff0000").place(relheight=1,width=2,x=325) FRONTEND.configure(menu=Menubar)