diff --git a/subfiles/comunic.py b/subfiles/comunic.py new file mode 100644 index 0000000..f867ff4 --- /dev/null +++ b/subfiles/comunic.py @@ -0,0 +1,150 @@ +#communication stuff here + +import requests +import json +from hashlib import sha256 +from . import helpers, savetools +from websockets.sync.client import connect +from subprocess import Popen, PIPE +from sys import platform +from os import listdir +from os.path import isfile, join, exists +from pathlib import Path +import subprocess + + + +def downloadLatestDll(self, filepath): + x = requests.get('https://openwf.io/supplementals/client%20drop-in/meta') + meta = json.loads(x.text) + url = f"https://openwf.io/supplementals/client%20drop-in/{meta['version']}/dwmapi.dll"# + content = requests.get(url, stream=True).content + hashofdll = sha256() + hashofdll.update(content)# + if hashofdll.hexdigest() == meta['sha256']: + with open(filepath + "dwmapi.dll", "wb") as out_file: + out_file.write(content) + helpers.messageBox(self=self,title="Bootstrapper Downloaded", message="Bootstrapper Downloaded!", type="info") + else: + helpers.messageBox(self=self,title="Unknown Error.", message="SpaceninGUI could not verify the hash of the Bootstrapper. Sorry :(", type="error")# + +def getLatestVersions(self, cacheFile, value): + ver = { + "server" : ( + "no lol" #not finished update check for server, check back later :3 + ), + "client" : "" + } + #client code here + x = requests.get('https://openwf.io/supplementals/client%20drop-in/meta') + meta = json.loads(x.text) + ver["client"] = meta['version'] + + try: + oldVer = savetools.loadFile(self, cacheFile)["client"] + except: + with open('tempFile.json', 'w') as f: + json.dump({ + "client":'notassigned', + 'server':'notassigned' + },f,indent=2) + + oldVer = savetools.loadFile(self, cacheFile)["client"] + if oldVer == ver["client"]: + client="Up To Date!" + else: + client="New Version " + ver["client"] + server = "server Check Not Implemented" + value[0].set("Latest Server Version: " + server) + value[1].set("Latest Client Version: " + client) + + + + + + + +def serverBackground(self, cd, logArea): # To my knowledge, running the server in the main thread would stall the gui, fuck that lol + logmax = helpers.getLogMax() + logarr=[] + def mongo(): + sysctl = Popen(['systemctl', 'start', 'mongodb']) + sysctl.wait()# + def execute(cd): + popen = Popen(['npm', 'run', 'dev'], stdin=PIPE, stdout=PIPE, universal_newlines=True, cwd=cd) + for stdout_line in iter(popen.stdout.readline, ""): + yield stdout_line + popen.stdout.close() + return_code = popen.wait() + if return_code: + raise subprocess.CalledProcessError(return_code)# + if platform == "linux": + helpers.messageBox(self, title="MongoDB", message="The mongodb server is required to start SNS\nYou will need to give sudo permission for this.", type="info") + mongo() + + for path in execute(cd): + if len(logarr) < logmax: + logarr.append(path) + else: + logarr.pop(0) + logarr.append(path) + if logArea: + logArea.configure(state="normal") + logArea.delete(1.0, "end") + for element in logarr: + pass + logArea.configure(state="disabled") + +def getClientResponse(): + try: + with connect("ws://localhost:61558") as websocket: + message = json.loads(websocket.recv()) + except: + message=False + return message + +def checkForClient(clientpath): + onlyfiles = [f for f in listdir(clientpath) if isfile(join(clientpath, f))] + if "dwmapi.dll" in onlyfiles: + return True + else: + return False + +def runPluto(name, plutolist, conffile): + openwfpath = helpers.getclientpath(conffile) + "/OpenWF/scripts/" + onlyfiles = [f for f in listdir(openwfpath) if isfile(join(openwfpath, f))] + if helpers.getclientresponse(): + running = [] + print(helpers.getclientresponse()["running_scripts"]) + if name in running: + requests.get(url=("http://localhost:61558/stop_script?OpenWF/scripts/" + name)) + else: + requests.get(url=("http://localhost:61558/start_script?OpenWF/scripts/" + name)) + + for script in helpers.getclientresponse()["running_scripts"]: + running.append(script.removeprefix("OpenWF/scripts/"))# + for file in onlyfiles: + if file in running: + if plutolist[file]: plutolist[file].set("Running") + else: + if plutolist[file]: plutolist[file].set("Not Running") + +def getSnPath(file): + if Path(file).is_file(): + with open(file) as f: + d = json.load(f) + return d["spaceninjapath"] + else: + return False + + + + + + + + + + + + \ No newline at end of file diff --git a/subfiles/helpers.py b/subfiles/helpers.py new file mode 100644 index 0000000..95d0c67 --- /dev/null +++ b/subfiles/helpers.py @@ -0,0 +1,77 @@ +from CTkMessagebox import CTkMessagebox +import threading +from .savetools import loadFile + +try: + from os import startfile +except: + from os import system +from sys import platform + +def check(): + print("Save Good") + +def removeChildren(frame): + for element in frame.winfo_children(): + element.destroy() + +def bgThread(func, args): + th = threading.Thread(target=func, args=args) + th.daemon = True + th.start() + +def openLocation(self, location): + if platform == "linux": + system('xdg-open "%s"' % location) + elif platform == "windows": + startfile(foldername) + + +def messageBox(self, title, message, type): #type will be implemented at a later point when required + CTkMessagebox(title=title, message=message) + +def getLogMax(self, save): + return loadFile(self, save)['maxlogsize'] #not entirely sure why I made this a seperate function but eh + +def isNumber(data): + if data == '': + return True + try: + rv = int(data) + except ValueError: + return False + return True + + +#Old Helper options, left here for future reference. Shitty code, but it works, and it may be useful in the future + + + + + + + + + +# def getlogmax(): +# file = 'sngconfig.json' +# if Path(file).is_file(): +# with open(file) as f: +# d = json.load(f) +# +# else: +# return False + + + +# def check4sn(configfile): +# file = helpers.getsnpath(configfile) + "package.json" +# if Path(file).is_file(): +# with open(file) as f: +# d = json.load(f) +# if (d["name"] == "wf-emulator"): +# return True +# else: +# return False# + + diff --git a/subfiles/install.py b/subfiles/install.py new file mode 100644 index 0000000..8dd7d79 --- /dev/null +++ b/subfiles/install.py @@ -0,0 +1,23 @@ +def check(): + print("install Good") + + +def installFiles(self, clientpath, serverpath): + #first install server + self.installstep.set("Downloading Server Through Git") + sysctl = Popen(['git', 'clone', 'https://openwf.io/SpaceNinjaServer.git', serverpath]) + self.installprog.set(1) + sysctl.wait() + self.installstep.set("Installing Server Requirements (via npm)") + self.installprog.set(25) + sysctl = Popen(["npm", '--prefix', f'{serverpath}', 'install']) + sysctl.wait() + self.installstep.set("Copying Config File") + shutil.copy(serverpath + "/config.json.example", serverpath + "/config.json") + self.installstep.set("Starting Bootstrapper Download") + self.installprog.set(50) + print("Server install worked. ") + helpers.downloadlatestdll(clientpath) + self.installprog.set(99) + self.installstep.set("Install Complete!\nPress next then restart to get started!") + diff --git a/subfiles/savetools.py b/subfiles/savetools.py new file mode 100644 index 0000000..d6746e6 --- /dev/null +++ b/subfiles/savetools.py @@ -0,0 +1,22 @@ +import json + +def check(): + print("Save Check Good") + +# Yea I know this is pretty pointless in a seperate file but it's nice to have these things +def loadFile(self, file1): + with open(file1, "r") as file: + + data = json.load(file) + return data + +#Data should be recived in [[data, position], [data, position]] format +def saveFile(self, fileP, data): + with open(fileP, 'r') as file: + data = json.load(file) + for subData in data: + data[subData[1]] = subData[0] + with open(fileP, 'w'): + json.dump(file, indent=2) + + diff --git a/subfiles/themes.py b/subfiles/themes.py new file mode 100644 index 0000000..df067f0 --- /dev/null +++ b/subfiles/themes.py @@ -0,0 +1,12 @@ +def getThemes(self): + themes = { + "black_orange" : { + "fg_color" : "#000000", + "bg_color" : "#14213D", + "bg_deep" : "#121e37", + "border_color" : "#14213D", + "highlight_color" : '#FCA311', + "text_color" : "" + } + } + return themes \ No newline at end of file