spaceningui/__main__.py

549 lines
24 KiB
Python
Raw Normal View History

2025-03-07 20:37:38 -08:00
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