from os.path import isfile, join, exists import customtkinter from CTkMessagebox import CTkMessagebox from subfiles import helpers, install, savetools, themes, comunic import json from subprocess import Popen, PIPE import threading from pathlib import Path from sys import platform from hashlib import sha256 from os import listdir from os.path import isfile, join, exists import shutil from websockets.sync.client import connect customtkinter.set_appearance_mode("System") customtkinter.set_window_scaling(1) customtkinter.set_widget_scaling(1) def placeholder(): print("placeholder called") pass class menuTools: def selectFromList(self, itemList, iconList, textvar): #there is a LOT here, I really should make a "menus" file lol self.truePath='' print(textvar.get()) self.threadRunning=False currentOption= customtkinter.StringVar() currentOption.set("Current Option: None") self.currentImage = helpers.getIcon(self, "NA", "/placeholder.png") currentLimit = customtkinter.StringVar() newWindow = customtkinter.CTkToplevel(self.root) newWindow.title("Select An Option") newWindow.geometry("600x400") customtkinter.CTkLabel(newWindow, text="Please Choose an Option", anchor='center').grid(row=0, column=0, sticky="we") centerFrame = customtkinter.CTkFrame(newWindow, width=600, height=200, fg_color="transparent") centerFrame.pack_propagate(False) listFrame= customtkinter.CTkScrollableFrame(centerFrame, height=200, width=300, bg_color="transparent") self.listFrameInner = customtkinter.CTkFrame(listFrame) self.listFrameInner.pack() def submit(self, truePath, textvar, window): print(f"truePath : {self.truePath}") print(textvar.get()) if currentOption.get() == '': window.destroy() else: textvar.set(self.truePath) window.destroy() def change(self, path, name, textVar, iconList): textVar.set(f"Current Option: {name}") print(path) self.truePath=path print(self.truePath) self.currentImage=helpers.getIcon(self, path, iconList[path]) icon=customtkinter.CTkImage(dark_image=self.currentImage, size=(200, 200)) self.iconLabel.destroy() self.iconLabel = customtkinter.CTkLabel(sideFrame, text="", image=icon, width=275, height=200) self.iconLabel.grid(row=0, column=0) def outsideThread(self, listFrame, itemList, limit, truePath): i = 0 for element in itemList: if limit in element["name"].lower(): ass= True else: ass= False print(f"{element["name"]} : {str(ass)}") if limit in element["name"].lower(): if "slot" in element: button = customtkinter.CTkButton(self.listFrameInner, text=(f"{element["name"]} - SLOT {str(element["slot"])}"), border_color="black", anchor="w", fg_color="transparent", width = 299, command=lambda element=element: change(self, element["uniqueName"], element["name"], currentOption, iconList)) else: i+=1 button = customtkinter.CTkButton(self.listFrameInner, text=(f"{element["name"]} - NO SLOT"), border_color="black", anchor="w", fg_color="transparent", width = 299, command=lambda element=element: change(self, element["uniqueName"], element["name"], currentOption, iconList)) button.pack(anchor="nw", expand=True) print(i) self.threadRunning=False def reset(self, args): if self.threadRunning: return #If the search thread is running, just wait, don't be fucking lazy, it takes 2 seconds for THE ENTIRE LIST, it is not that hard helpers.removeChildren(self.listFrameInner) helpers.bgThread(outsideThread, args) helpers.bgThread(outsideThread, [self, listFrame, itemList, '', self.truePath]) sideFrame= customtkinter.CTkFrame(centerFrame, height=200, width=275, fg_color="transparent") icon=customtkinter.CTkImage(dark_image=self.currentImage, size=(200, 200)) self.iconLabel = customtkinter.CTkLabel(sideFrame, text="", image=icon, width=275, height=200) self.iconLabel.grid(row=0, column=0) sideFrame.grid(row=0, column=0, sticky="nsew") searchFrame=customtkinter.CTkFrame(newWindow, width=600) searchFrame.grid(row=2, column=0) search=customtkinter.CTkEntry(searchFrame, textvariable=currentLimit, fg_color="transparent", width=400) search.grid(row=0, column=0) searchButton=customtkinter.CTkButton(searchFrame, width=200, text="Search", command=lambda: reset(self, [self, listFrame, itemList, currentLimit.get(), self.truePath])) searchButton.grid(row=0, column=1) optionLabel= customtkinter.CTkLabel(newWindow, textvariable=currentOption) submitButton=customtkinter.CTkButton(newWindow, width=100, text="Submit", height=30, command= lambda: submit(self,self.truePath,textvar,newWindow)) submitButton.grid(row=4, column=0) centerFrame.grid(row=1, column=0) listFrame.grid(row=0, column=1) optionLabel.grid(row=3, column=0) def verticalButtons(self, buttonList, frame): for button in buttonList.keys(): sideButton = customtkinter.CTkButton(frame, height=28, hover_color=self.theme["highlight_color"], border_color=self.theme["highlight_color"], border_width=(self.x * .001), fg_color="transparent", bg_color="transparent", text=button, command=buttonList[button]) sideButton.pack(pady=(self.y * .01), padx=2, side="top", anchor="nw") def labelDown(self, labelList, frame, column): newFrame=customtkinter.CTkFrame(frame, fg_color="transparent") newFrame.grid(row=0, column=3, sticky="nswe") i=1 l = [] for labelText in labelList: label = customtkinter.CTkLabel(newFrame, textvariable=labelText, height=28, text_color="white") l.append(label) for g in l: g.pack(anchor='nw') i+=1 def horizontalButtons(self, buttonList, frame): for button in buttonList.keys(): sideButton = customtkinter.CTkButton(frame, height=28, hover_color=self.theme["highlight_color"], border_color=self.theme["highlight_color"], border_width=(self.x * .001), fg_color="transparent", bg_color="transparent", text=button, command=buttonList[button]) sideButton.pack(pady=(self.x * .01), padx=2, side="left", anchor="w") class menus(): def serverMenu(self): helpers.removeChildren(self.mainFrame) topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) sideFrame = customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .25), height=self.y*.8, fg_color=self.theme['bg_deep']) sideFrame.grid(row=0, column=0, sticky="ns") borderFrame=customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .01), height=(self.y*.8), fg_color=self.theme['bg_color'], corner_radius=0) borderFrame.grid(row=0, column=1, sticky="ns") sideFrame.grid_propagate(1) buttonList = { "Start Server" : lambda: helpers.bgThread(comunic.startServer, [self, self.serverPath, self.logArea]), "Open Server Location": lambda: helpers.openLocation(self, comunic.getSnPath('sngconfig.json')) } menuTools.verticalButtons(self, buttonList=buttonList, frame=sideFrame) self.logArea = customtkinter.CTkTextbox(topFrame, width=(self.x * .7 * .74)) self.logArea.grid(row=0, column=2, sticky="ns") def updateMenu(self): helpers.removeChildren(self.mainFrame) topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) sideFrame = customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .25), height=self.y*.8, fg_color="transparent", corner_radius=10) sideFrame.grid(row=0, column=0, sticky="ns") borderFrame=customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .01), height=(self.y*.8), fg_color=self.theme['bg_color'], corner_radius=0) borderFrame.grid(row=0, column=1, sticky="ns") sideFrame.grid_propagate(1) self.versions = [ customtkinter.StringVar(), customtkinter.StringVar() ] buttonList = { "Open Client Location" : lambda: helpers.openLocation(self, self.clientPath), "Open Server Location": lambda: helpers.openLocation(self, comunic.getSnPath(self.configFile)), "Update Client Bootstrapper" : lambda: comunic.downloadLatestDll(self, self.clientPath), "Update Server" : lambda: placeholder() } menuTools.verticalButtons(self, buttonList=buttonList, frame=sideFrame) self.versions[0].set("Checking Server Version") self.versions[1].set("Checking Client Version") helpers.bgThread(comunic.getLatestVersions, [self, 'tempFile.json', self.versions]) menuTools.labelDown(self, labelList=self.versions, frame=topFrame, column=3) def clientMenu(self): helpers.removeChildren(self.mainFrame) topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) menuBar = customtkinter.CTkFrame(topFrame, fg_color=self.theme["bg_deep"], width=(self.x * (.70)), height=self.y * .1) menuBar.grid(row=0, column=0, sticky="we") buttonList = { "Start Client (steam)" : lambda: helpers.bgThread(comunic.startClient, [self, json.load(open(self.configFile))["steamID"]]), "Open Logs Location" : lambda: comunic.openClientLogs(self, platform) } menuTools.horizontalButtons(self, buttonList, menuBar) def settingsMenu(self, file): data = savetools.loadFile(self, file) helpers.removeChildren(self.mainFrame) topFrame = customtkinter.CTkScrollableFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) newData = {} def recusiveIssue(self, data, newData, topFrame, recLayer, i): print("Length : " + str(i) + " Type : " + str(type(data))) if type(data) is dict: for key in data.keys(): layerArr = "" for n in range(recLayer): layerArr = layerArr + " " if recLayer > 0: layerArr=layerArr+"↳" l = customtkinter.CTkLabel(topFrame, text=layerArr + key, anchor='w') l.grid(row=i, column=0, sticky='w') print(key + f" : {str(i)}") match data[key]: case str(): newData[key] = customtkinter.StringVar() newData[key].set(data[key]) e = customtkinter.CTkEntry(topFrame, textvariable=newData[key], width=self.x*.5) e.grid(row=i, column=1, padx=10) i+=1 case bool(): newData[key] = customtkinter.BooleanVar() newData[key].set(data[key]) e = customtkinter.CTkSwitch(topFrame, variable=newData[key], onvalue=True, offvalue=False, text='') e.grid(row=i, column=1, padx=10) i+=1 case int(): newData[key] = customtkinter.StringVar() newData[key].set(str(data[key])) e = customtkinter.CTkEntry(topFrame, textvariable=newData[key], width=self.x*.5, validate='key', validatecommand=(self.verifyNumb, '%P')) e.grid(row=i, column=1, padx=10) i+=1 case dict(): i+=1 newData[key] = {} i = recusiveIssue(self, data[key], newData[key], topFrame, (recLayer + 1), i) case list(): i+=1 newData[key] = [] i = recusiveIssue(self, data[key], newData[key], topFrame, (recLayer + 1), i) elif type(data) is list: for key in range(len(data)): layerArr = "" for n in range(recLayer): layerArr = layerArr + " " if recLayer > 0: layerArr=layerArr+"↳" l = customtkinter.CTkLabel(topFrame, text=layerArr + str(key), anchor='w') l.grid(row=i, column=0, sticky='w') print(str(key) + " key") match data[key]: case str(): newData.append(customtkinter.StringVar()) newData[key].set(data[key]) e = customtkinter.CTkEntry(topFrame, textvariable=newData[key], width=self.x*.5) e.grid(row=i, column=1, padx=10) i+=1 case bool(): newData.append(customtkinter.BooleanVar()) newData[key].set(data[key]) e = customtkinter.CTkSwitch(topFrame, variable=newData[key], onvalue=True, offvalue=False, text='') e.grid(row=i, column=1, padx=10) i+=1 case int(): newData.append(customtkinter.IntVar()) newData[key].set(data[key]) e = customtkinter.CTkEntry(topFrame, textvariable=newData[key], width=self.x*.5) e.grid(row=i, column=1, padx=10) i+=1 case dict(): i+=1 newData.append({}) i = recusiveIssue(self, data[key], newData[key], topFrame, (recLayer + 1), i) case list(): i+=1 newData.append([]) i = recusiveIssue(self, data[key], newData[key], topFrame, (recLayer + 1), i) return i i=0 i=recusiveIssue(self, data, newData, topFrame, 0, i) saveButton = customtkinter.CTkButton(topFrame, height=28, hover_color=self.theme["highlight_color"], border_color=self.theme["highlight_color"], border_width=(self.x * .001), fg_color="transparent", bg_color="transparent", text="Save Settings", command=lambda: savetools.saveFile(self, newData, file)) saveButton.grid(row=i, column=0, sticky='w') def plutoMenu(self): helpers.removeChildren(self.mainFrame) plutoList=[f for f in listdir(self.clientPath+'/OpenWF/scripts/') if isfile(join(self.clientPath + "/OpenWF/scripts/", f))] runningList={} print(plutoList) topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) topFrame.columnconfigure(1, weight=1) i=0 for pluto in plutoList: runningList[pluto] = customtkinter.BooleanVar() label = customtkinter.CTkLabel(topFrame, text=pluto) label.grid(row=i, column=0, sticky="nsw", padx=10) toggle = customtkinter e = customtkinter.CTkSwitch(topFrame, variable=runningList[pluto], command=lambda pluto=pluto: comunic.runPluto(self, pluto, runningList), text='') e.grid(row=i, column=1, padx=10) i+=1 print(pluto) def inlineScripting(self): helpers.removeChildren(self.mainFrame) topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)), ) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) sideFrame = customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .25), height=self.y*.8, fg_color=self.theme['bg_deep']) sideFrame.grid(row=0, column=0, sticky="ns") borderFrame=customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .01), height=(self.y*.8), fg_color=self.theme['bg_color'], corner_radius=0) borderFrame.grid(row=0, column=1, sticky="ns") sideFrame.grid_propagate(1) buttonList = { "Push Inline" : lambda: comunic.pushInline(self, self.logArea) } menuTools.verticalButtons(self, buttonList=buttonList, frame=sideFrame) self.logArea = customtkinter.CTkTextbox(topFrame, width=(self.x * .7 * .74)) self.logArea.grid(row=0, column=2, sticky="ns") def arsenalMenu(self): helpers.removeChildren(self.mainFrame) #Load weapons from cache try: self.weapons=helpers.formatExportWeapons(self, './cache/items/weapons.json') self.powersuits=helpers.formatExportPowersuits(self, './cache/items/powersuits.json') self.weaponsIcons=helpers.formatExportPlus(self, './cache/items/plus/weapons.json') self.powersuitsIcons=helpers.formatExportPlus(self, './cache/items/plus/powersuits.json') except: print("FUCK") comunic.getWarframeExports(self, "./cache/items/") comunic.getWarframeExportsPlus(self, "./cache/items/") self.weapons=helpers.formatExportWeapons(self, './cache/items/weapons.json') self.powersuits=helpers.formatExportPowersuits(self, './cache/items/powersuits.json') self.weaponsIcons=helpers.formatExportPlus(self, './cache/items/plus/weapons.json') self.powersuitsIcons=helpers.formatExportPlus(self, './cache/items/plus/powersuits.json') topFrame = customtkinter.CTkFrame(self.mainFrame, fg_color=self.theme["bg_deep"], corner_radius=10, height=(self.y * .80), width=(self.x * (.70)),) topFrame.pack(pady=(self.y * .10)) topFrame.grid_propagate(0) leftFrame = customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .25), height=self.y*.8, fg_color=self.theme['bg_deep']) leftFrame.grid(row=0, column=0, sticky="ns") borderFrame=customtkinter.CTkFrame(topFrame, width=(self.x * .7 * .01), height=(self.y*.8), fg_color=self.theme['bg_color'], corner_radius=0) borderFrame.grid(row=0, column=1, sticky="ns") leftFrame.grid_propagate(1) rightFrame = customtkinter.CTkFrame(topFrame, fg_color=self.theme['bg_deep']) rightFrame.grid(row=0, column=2, sticky="nsew") selectedWeapons = {} i=0 for entry in ["Warframe", "Primary", "Secondary", "Melee"]: selectedWeapons[entry] = customtkinter.StringVar() l=customtkinter.CTkLabel(rightFrame, text=entry) l.grid(row=i, column=0, padx=6) e=customtkinter.CTkEntry(rightFrame, textvariable=selectedWeapons[entry], width=self.x*.3, fg_color=self.theme["fg_color"]) e.grid(row=i, column=1, sticky="n", padx=10, pady=3) if not (entry == "Warframe"): button=customtkinter.CTkButton(rightFrame, text="📁", width=5, command=lambda selectedWeapons=selectedWeapons[entry]: menuTools.selectFromList(self, self.weapons, self.weaponsIcons, selectedWeapons)) elif entry == "Warframe": button=customtkinter.CTkButton(rightFrame, text="📁", width=5, command=lambda selectedWeapons=selectedWeapons[entry]: menuTools.selectFromList(self, self.powersuits, self.powersuitsIcons, selectedWeapons)) #if not entry: # how????? button.grid(row=i, column=2) i+=1 buttonList = { "Push All" : lambda: comunic.pushWeapon(self, [selectedWeapons["Warframe"].get(),selectedWeapons["Primary"].get(),selectedWeapons["Secondary"].get(),selectedWeapons["Melee"].get()], [3, 1, 0, 5]), "Push Warframe" : lambda: comunic.pushWeapon(self, selectedWeapons["Warframe"].get(), 3), "Push Primary" : lambda: comunic.pushWeapon(self, selectedWeapons["Primary"].get(), 1), "Push Secondary" : lambda: comunic.pushWeapon(self, selectedWeapons["Secondary"].get(), 0), "Push Melee" : lambda: comunic.pushWeapon(self, selectedWeapons["Melee"].get(), 5) } menuTools.verticalButtons(self, buttonList, leftFrame) class main(): def exit(self): self.threadStop = True for thread in self.popenThreads: helpers.killPopen(thread) self.root.destroy() def __init__(self, configFile): self.configFile = configFile self.clientPath = json.load(open(configFile))['wfpath'] self.serverPath = json.load(open(configFile))['spaceninjapath'] self.debug = False self.root = customtkinter.CTk() self.popenThreads = [] self.x=750 self.y=500 self.theme = themes.getThemes(self)[json.load(open(configFile))['theme']] self.threadStop = False print() for lib in [helpers, install, savetools]: lib.check() self.rightFrame = customtkinter.CTkScrollableFrame(self.root, orientation="vertical", width=(self.x * .20), height=(self.y * 1), fg_color=self.theme["fg_color"], bg_color=self.theme["bg_color"], corner_radius=0 ) buttonList = { "Server" : lambda: menus.serverMenu(self), "Server Settings": lambda: menus.settingsMenu(self, self.serverPath+'config.json'), "Client" : lambda: menus.clientMenu(self), "Client Settings": lambda: menus.settingsMenu(self, self.clientPath+'OpenWF/client_config.json'), "Scripts" : lambda: menus.plutoMenu(self), "Script Store": lambda: placeholder(), "Inline Scripting" : lambda: menus.inlineScripting(self), "Metadata" : lambda: placeholder(), "Arsenal Management": lambda: menus.arsenalMenu(self), "Weapon Upgrades" : lambda: placeholder(), "Updates": lambda: menus.updateMenu(self), "GUI Settings" : lambda: menus.settingsMenu(self, self.configFile) } menuTools.verticalButtons(self, buttonList, self.rightFrame) self.rightFrame.grid(row=0, column=0) self.mainFrame = customtkinter.CTkScrollableFrame(self.root, width=(self.x * (1-.20)), height=(self.y * 1), fg_color=self.theme["bg_color"], bg_color=self.theme["bg_color"], corner_radius=0) self.verifyNumb = self.root.register(helpers.isNumber) self.mainFrame.grid(row=0, column=1) self.root.title("SpaceNinGui CustomTK 1.0.0") self.root.protocol("WM_DELETE_WINDOW", lambda: main.exit(self)) self.root.geometry(f"{str(self.x)}x{str(self.y)}") self.root.resizable(width=False, height=False) self.root.mainloop() if __name__ == "__main__": if isfile('sngconfig.json'): main('sngconfig.json') else: pass