Added GUI and improved upload capabilities

This commit is contained in:
Samuel Walker 2024-06-20 12:07:56 -06:00
parent a1d505da02
commit 75fa3e05e4
3 changed files with 214 additions and 12 deletions

View File

@ -6,13 +6,15 @@ import subprocess
import time
import os
import datetime
import zipfile
def perform_installation(instance_name, prism_command, prism_instance_path):
def perform_installation(instance_name, prism_command, prism_instance_path, pack):
try:
ftp = FTP("gitea.piwalker.net")
ftp.login()
ftp.prot_p()
ftp.cwd(pack)
# Fetching versions.json from FTP
bio = io.BytesIO()
@ -57,22 +59,79 @@ def perform_installation(instance_name, prism_command, prism_instance_path):
subprocess.run([prism_command, '-l', instance_name])
def upload_pack(username, password, version_tag, fileName):
def upload_pack(username, password, version_tag, fileName, pack):
ftp = FTP("gitea.piwalker.net", username, password)
ftp.prot_p()
ftp.cwd(pack)
bio = io.BytesIO()
ftp.retrbinary("RETR versions.json", bio.write)
bio.seek(0)
versions = json.load(bio)
bio.close()
time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
versions.append({"Version":version_tag, "Date":time, "File":"Versions/fcs7-"+time+".mrpack"})
with open(fileName, 'rb') as fp:
ftp.storbinary("STOR "+versions[len(versions)-1]["File"], fp)
versions.append({"Version":version_tag, "Date":time, "File":"Versions/"+pack+time+".mrpack"})
with zipfile.ZipFile(fileName, 'r') as zin:
zipbytes = io.BytesIO()
zout = zipfile.ZipFile(zipbytes, 'w')
for item in zin.infolist():
buffer = zin.read(item.filename)
if item.filename != "overrides/version.txt":
zout.writestr(item, buffer)
zout.writestr("overrides/version.txt", version_tag)
zout.close()
zipbytes.seek(0)
ftp.storbinary("STOR "+versions[len(versions)-1]["File"], zipbytes)
bio = io.BytesIO()
bio.write(json.dumps(versions).encode())
bio.seek(0)
ftp.storbinary("STOR versions.json", bio)
bio.close()
modpackUpdate(pack, ftp)
ftp.close()
def getModpacks():
ftp = FTP("gitea.piwalker.net")
ftp.login()
ftp.prot_p()
bio = io.BytesIO()
ftp.retrbinary("RETR modpacks.json", bio.write)
bio.seek(0)
ftp.close()
return json.load(bio)
def uploadModpacks(modpacks, ftp):
ftp.cwd("/ftp");
bio = io.BytesIO()
bio.write(json.dumps(modpacks).encode())
bio.seek(0)
ftp.storbinary("STOR modpacks.json", bio)
bio.close()
def modpackUpdate(id, ftp):
modpacks = getModpacks()
time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
for modpack in modpacks:
if modpack["id"] == id:
modpack["last-updated"] = time
uploadModpacks(modpacks, ftp);
def createModpack(id, name, username, password):
modpacks = getModpacks()
time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
modpacks.append({"id":id, "name":name, "last-updated":time})
ftp = FTP("gitea.piwalker.net", username, password)
ftp.prot_p()
uploadModpacks(modpacks,ftp)
ftp.mkd(id)
ftp.cwd(id)
versions = []
bio = io.BytesIO()
bio.write(json.dumps(versions).encode())
bio.seek(0)
ftp.storbinary("STOR versions.json", bio)
ftp.mkd("Versions")
ftp.close()

22
Main.py
View File

@ -17,6 +17,8 @@ config_file_path = 'config.ini' # Path to the configuration file
def select_prism_instance_path():
global prism_instance_path_entry
directory = filedialog.askdirectory()
if not directory:
return
prism_instance_path_entry.delete(0, tk.END)
prism_instance_path_entry.insert(0, directory)
@ -29,7 +31,7 @@ def main():
global prism_instance_path_entry
instance_name = "Familycraft Season 7"
instance_name = "Test Modpack"
prism_command = "prismlauncher"
# Default paths based on OS
@ -88,8 +90,17 @@ def main():
# If a stored Prism instance path exists, pre-fill the entry widget
if stored_prism_instance_path:
prism_instance_path_entry.insert(0, stored_prism_instance_path)
options = []
modpacks = Backend.getModpacks()
for modpack in modpacks:
options.append(modpack["name"])
# Button to select directory
modpack_var = StringVar(value="N/A")
modpack_label = CTkLabel(master=guitabs.tab("Launcher"), text="Select Modpack:", font=("Impact", 30))
modpack_label.pack()
modpack_selector = CTkOptionMenu(master=guitabs.tab("Launcher"), values=options, variable=modpack_var)
modpack_selector.set(options[0])
modpack_selector.pack()
select_button = CTkButton(master=guitabs.tab("Options"), text="Browse...", command=select_prism_instance_path)
select_button.pack(pady=5)
@ -97,7 +108,12 @@ def main():
def start_installation():
prism_instance_path = prism_instance_path_entry.get()
app.destroy() # Close the GUI window
Backend.perform_installation(instance_name, prism_command, prism_instance_path)
for modpack in modpacks:
if modpack["name"] == modpack_var.get():
instance_name = modpack["name"]
instance_id = modpack["id"]
break
Backend.perform_installation(instance_name, prism_command, prism_instance_path, instance_id)
# Button to start installation
install_button = CTkButton(master=guitabs.tab("Launcher"), text="Launch Minecraft", command=start_installation)

135
Upload.py
View File

@ -1,11 +1,138 @@
import Backend
from getpass import getpass
from customtkinter import *
from tkinter import filedialog, simpledialog, messagebox
global version
global modpack
global modpack_name
global modpack_id
global username
global password
global modpacks
def get_credentials():
global username
global password
username = simpledialog.askstring("username", "Username: ")
password = simpledialog.askstring("password", "Password: ", show="*")
def select_file():
global fileName
global file_path_entry
file = filedialog.askopenfilename()
if file:
fileName = file
file_path_entry.insert(0, fileName)
def update_pack():
global modpacks
global fileName
global username
global password
global modpack
global version
get_credentials()
pack_id = None
for pack in modpacks:
if pack["name"] == modpack.get():
pack_id = pack["id"]
Backend.upload_pack(username, password, version.get(), fileName, pack_id)
messagebox.Message(title="complete", message="Modpack updated successfuly")
def create_pack():
global username
global password
global modpacks
global modpack_id
global modpack_name
global version
global fileName
for pack in modpacks:
if pack["id"] == modpack_id.get():
messagebox.Message(title="Error", message="Pack ID already exists").show()
return
if pack["name"] == modpack_name.get():
messagebox.Message(title="Error", message="Pack name already exists").show()
return
get_credentials()
Backend.createModpack(modpack_id.get(), modpack_name.get(), username, password)
Backend.upload_pack(username, password, version.get(), fileName, modpack_id.get())
messagebox.Message(title="complete", message="Modpack created successfully").show()
def main():
global fileName
global modpacks
global modpack_id
global version
global modpack
global modpack_name
fileName = "modpack.mrpack"
username = input("Username: ")
password = getpass()
version_tag = input("Version Number: ")
Backend.upload_pack(username, password, version_tag, fileName)
app = CTk()
app.attributes('-type', 'dialog')
app.geometry('500x400')
app.title("FamilyCraft Launcher Upload Utility")
set_appearance_mode("dark")
set_default_color_theme("blue")
version = StringVar()
modpack = StringVar()
modpack_name = StringVar()
modpack_id = StringVar()
file_label = CTkLabel(master=app, text="Select mrpack file:", font=("Impact", 15))
file_label.pack()
global file_path_entry
file_path_entry = CTkEntry(master=app, width=350, font=("Arial", 14))
file_path_entry.pack(pady=5)
file_path_entry.insert(0, fileName)
browse_button = CTkButton(master=app, text="Browse...", command=select_file)
browse_button.pack(pady=5)
version_label = CTkLabel(master=app, text="Version Number:", font=("Impact", 15))
version_label.pack()
version_entry = CTkEntry(master=app, width=350, font=("Arial", 14), placeholder_text="0.0.0", textvariable=version)
version_entry.pack(pady=5)
guitabs = CTkTabview(master=app, bg_color="transparent")
guitabs.pack(expand=True, fill='x', side="bottom", padx=0, pady=(10,0))
guitabs.add("Update Pack")
guitabs.add("Create Pack")
modpacks = Backend.getModpacks()
options = []
for pack in modpacks:
options.append(pack["name"])
modpack_selector = CTkOptionMenu(master=guitabs.tab("Update Pack"), values=options, variable=modpack)
modpack_selector.set(options[0])
modpack_selector.pack()
update_button = CTkButton(master=guitabs.tab("Update Pack"), text="Update", command=update_pack)
update_button.pack(pady=5)
modpack_id_label = CTkLabel(master=guitabs.tab("Create Pack"), text="ID:", font=("Impact", 15))
modpack_id_label.pack()
modpack_id_entry = CTkEntry(master=guitabs.tab("Create Pack"), width=350, font=("Arial", 14), textvariable=modpack_id)
modpack_id_entry.pack(pady=5)
modpack_name_label = CTkLabel(master=guitabs.tab("Create Pack"), text="Name: ", font=("Impact", 15))
modpack_name_label.pack()
modpack_name_entry = CTkEntry(master=guitabs.tab("Create Pack"), width=350, font=("Arial", 14), textvariable=modpack_name)
modpack_name_entry.pack(pady=5)
create_button = CTkButton(master=guitabs.tab("Create Pack"), text="Create", command=create_pack)
create_button.pack(pady=5)
#username = input("Username: ")
#password = getpass()
#version_tag = input("Version Number: ")
#Backend.upload_pack(username, password, version_tag, fileName, "test")
app.mainloop()
if __name__=="__main__":