diff --git a/boiiiwd_package/resources/b_map_image.png b/boiiiwd_package/resources/b_map_image.png new file mode 100644 index 0000000..61f9bb5 Binary files /dev/null and b/boiiiwd_package/resources/b_map_image.png differ diff --git a/boiiiwd_package/resources/b_mod_image.png b/boiiiwd_package/resources/b_mod_image.png new file mode 100644 index 0000000..9232821 Binary files /dev/null and b/boiiiwd_package/resources/b_mod_image.png differ diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index 6edc09b..492a047 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -1,12 +1,7 @@ +import src.shared_vars as main_app from src.imports import * # Start helper functions -def cwd(): - if getattr(sys, 'frozen', False): - return os.path.dirname(sys.executable) - else: - return os.path.dirname(os.path.abspath(__file__)) - def check_config(name, fallback=None): config = configparser.ConfigParser() config.read(CONFIG_FILE_PATH) @@ -23,8 +18,8 @@ def save_config(name, value): config.write(config_file) def check_custom_theme(theme_name): - if os.path.exists(os.path.join(cwd(), theme_name)): - return os.path.join(cwd(), theme_name) + if os.path.exists(os.path.join(application_path, theme_name)): + return os.path.join(application_path, theme_name) else: try: return os.path.join(RESOURCES_DIR, theme_name) @@ -191,7 +186,7 @@ def convert_speed(speed_bytes): def create_default_config(): config = configparser.ConfigParser() config["Settings"] = { - "SteamCMDPath": cwd(), + "SteamCMDPath": application_path, "DestinationFolder": "", "checkforupdtes": "on", "console": "off" @@ -202,7 +197,7 @@ def create_default_config(): def get_steamcmd_path(): config = configparser.ConfigParser() config.read(CONFIG_FILE_PATH) - return config.get("Settings", "SteamCMDPath", fallback=cwd()) + return config.get("Settings", "SteamCMDPath", fallback=application_path) def extract_json_data(json_path, key): with open(json_path, 'r') as json_file: @@ -254,8 +249,7 @@ def show_message(title, message, icon="warning", _return=False, option_1="No", o else: def callback(): CTkMessagebox(title=title, message=message, icon=icon, sound=True) - from src.main import master_win - master_win.after(0, callback) + main_app.app.after(0, callback) def launch_boiii_func(path): procname = "boiii.exe" diff --git a/boiiiwd_package/src/imports.py b/boiiiwd_package/src/imports.py index 736d437..ec924fa 100644 --- a/boiiiwd_package/src/imports.py +++ b/boiiiwd_package/src/imports.py @@ -29,7 +29,7 @@ from .CTkToolTip import ctk_tooltip if getattr(sys, 'frozen', False): # If the application is run as a bundle, the PyInstaller bootloader - # extends the sys module by a flag frozen=True and sets the app + # extends the sys module by a flag frozen=True and sets the app # path into variable _MEIPASS'. application_path = os.path.dirname(sys.executable) else: diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 414a8ae..b6e2eaf 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -207,7 +207,7 @@ class LibraryTab(ctk.CTkScrollableFrame): folders_to_process = [mods_folder, maps_folder] - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) for folder_path in folders_to_process: for zone_path in folder_path.glob("**/zone"): @@ -331,7 +331,7 @@ class LibraryTab(ctk.CTkScrollableFrame): text_to_add += f" | Mode: {mode_type}" text_to_add += f" | ID: {workshop_id} | Size: {size}" date_added = datetime.now().strftime("%d %b, %Y @ %I:%M%p") - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) item_info = { "id": workshop_id, @@ -347,7 +347,7 @@ class LibraryTab(ctk.CTkScrollableFrame): show_message("Error updating json file", f"Error while updating library json file\n{e}") def remove_item(self, item, folder, id): - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): if item == label.cget("text"): self.added_folders.remove(os.path.basename(folder)) @@ -480,7 +480,7 @@ class LibraryTab(ctk.CTkScrollableFrame): date_created ,date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn): def main_thread(): try: - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) top = ctk.CTkToplevel(self) if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) @@ -655,7 +655,7 @@ class LibraryTab(ctk.CTkScrollableFrame): def check_for_update(): lib_data = None - if not os.path.exists(os.path.join(cwd(), LIBRARY_FILE)): + if not os.path.exists(os.path.join(application_path, LIBRARY_FILE)): show_message("Error checking for item updates! -> Setting is on", "Please visit library tab at least once with the correct boiii path!, you also need to have at lease 1 item!") return diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index af3fd74..0143170 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -1,61 +1,20 @@ +from src.update_window import check_for_updates_func from src.helpers import * from src.library_tab import LibraryTab from src.settings_tab import SettingsTab -from src.update_window import UpdateWindow -def check_for_updates_func(window, ignore_up_todate=False): - try: - latest_version = get_latest_release_version() - current_version = VERSION - int_latest_version = int(latest_version.replace("v", "").replace(".", "")) - int_current_version = int(current_version.replace("v", "").replace(".", "")) - - if latest_version and int_latest_version > int_current_version: - msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True) - - result = msg_box.get() - - if result == "View": - webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest") - - if result == "Yes": - update_window = UpdateWindow(window, LATEST_RELEASE_URL) - update_window.start_update() - - if result == "No": - return - - elif int_latest_version < int_current_version: - if ignore_up_todate: - return - msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True) - result = msg_box.get() - elif int_latest_version == int_current_version: - if ignore_up_todate: - return - msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True) - result = msg_box.get() - - else: - show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again") - - except Exception as e: - show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel") - class BOIIIWD(ctk.CTk): def __init__(self): super().__init__() - global master_win - master_win = self # self.app_instance = BOIIIWD() # configure window self.title("boiii Workshop Downloader - Main") try: - geometry_file = os.path.join(cwd(), "boiiiwd_dont_touch.conf") + geometry_file = os.path.join(application_path, "boiiiwd_dont_touch.conf") if os.path.isfile(geometry_file): with open(geometry_file, "r") as conf: self.geometry(conf.read()) @@ -466,7 +425,7 @@ class BOIIIWD(ctk.CTk): def load_configs(self): if os.path.exists(CONFIG_FILE_PATH): destination_folder = check_config("DestinationFolder", "") - steamcmd_path = check_config("SteamCMDPath", os.getcwd()) + steamcmd_path = check_config("SteamCMDPath", application_path) new_appearance_mode = check_config("appearance", "Dark") new_scaling = check_config("scaling", 1.0) self.edit_destination_folder.delete(0, "end") @@ -489,7 +448,7 @@ class BOIIIWD(ctk.CTk): scaling_int = math.trunc(scaling_float) self.settings_tab.scaling_optionemenu.set(f"{scaling_int}%") self.edit_steamcmd_path.delete(0, "end") - self.edit_steamcmd_path.insert(0, cwd()) + self.edit_steamcmd_path.insert(0, application_path) create_default_config() def help_queue_text_func(self, event=None): @@ -557,11 +516,11 @@ class BOIIIWD(ctk.CTk): def download_steamcmd(self): self.edit_steamcmd_path.delete(0, "end") - self.edit_steamcmd_path.insert(0, cwd()) + self.edit_steamcmd_path.insert(0, application_path) save_config("DestinationFolder" ,self.edit_destination_folder.get()) save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) steamcmd_url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip" - steamcmd_zip_path = os.path.join(cwd(), "steamcmd.zip") + steamcmd_zip_path = os.path.join(application_path, "steamcmd.zip") try: response = requests.get(steamcmd_url) @@ -571,7 +530,7 @@ class BOIIIWD(ctk.CTk): zip_file.write(response.content) with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref: - zip_ref.extractall(cwd()) + zip_ref.extractall(application_path) if check_steamcmd(): os.remove(fr"{steamcmd_zip_path}") @@ -1229,7 +1188,7 @@ class BOIIIWD(ctk.CTk): if os.path.exists(json_file_path): self.label_speed.configure(text="Installing...") mod_type = extract_json_data(json_file_path, "Type") - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) if self.library_tab.item_exists_in_file(items_file, workshop_id): get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: @@ -1488,7 +1447,7 @@ class BOIIIWD(ctk.CTk): if os.path.exists(json_file_path): self.label_speed.configure(text="Installing...") mod_type = extract_json_data(json_file_path, "Type") - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) if self.library_tab.item_exists_in_file(items_file, workshop_id): get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: @@ -1593,7 +1552,3 @@ class BOIIIWD(ctk.CTk): self.after(50, self.status_text.configure(text=f"Status: Standby!")) self.after(1, self.label_speed.configure(text=f"Awaiting Download!")) self.skip_boutton.grid_remove() - -# if __name__ == "__main__": -# app = BOIIIWD() -# app.mainloop() \ No newline at end of file diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 09fa236..ce996f6 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -1,47 +1,9 @@ +from src.update_window import check_for_updates_func from src.imports import * from src.helpers import * import src.shared_vars as shared -def check_for_updates_func(window, ignore_up_todate=False): - try: - latest_version = get_latest_release_version() - current_version = VERSION - int_latest_version = int(latest_version.replace("v", "").replace(".", "")) - int_current_version = int(current_version.replace("v", "").replace(".", "")) - - if latest_version and int_latest_version > int_current_version: - msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True) - - result = msg_box.get() - - if result == "View": - webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest") - - from src.update_window import UpdateWindow - if result == "Yes": - update_window = UpdateWindow(window, LATEST_RELEASE_URL) - update_window.start_update() - - if result == "No": - return - - elif int_latest_version < int_current_version: - if ignore_up_todate: - return - msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True) - result = msg_box.get() - elif int_latest_version == int_current_version: - if ignore_up_todate: - return - msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True) - result = msg_box.get() - - else: - show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again") - - except Exception as e: - show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel") class SettingsTab(ctk.CTkFrame): def __init__(self, master=None): @@ -210,7 +172,7 @@ class SettingsTab(ctk.CTkFrame): if response == "No": return elif response == "Ok": - os.system(f"notepad {os.path.join(cwd(), 'config.ini')}") + os.system(f"notepad {os.path.join(application_path, 'config.ini')}") else: return self.after(0, callback) @@ -398,7 +360,7 @@ class SettingsTab(ctk.CTkFrame): return 0 if setting == "theme": - if os.path.exists(os.path.join(cwd(), "boiiiwd_theme.json")): + if os.path.exists(os.path.join(application_path, "boiiiwd_theme.json")): return "Custom" if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_theme.json": return "Default" @@ -419,11 +381,11 @@ class SettingsTab(ctk.CTkFrame): return 0 def boiiiwd_custom_theme(self, disable_only=None): - file_to_rename = os.path.join(cwd(), "boiiiwd_theme.json") + file_to_rename = os.path.join(application_path, "boiiiwd_theme.json") if os.path.exists(file_to_rename): timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") new_name = f"boiiiwd_theme_{timestamp}.json" - os.rename(file_to_rename, os.path.join(cwd(), new_name)) + os.rename(file_to_rename, os.path.join(application_path, new_name)) if not disable_only: show_message("Preset file renamed", "Custom preset disabled, file has been renmaed\n* Restart the app to take effect", icon="info") @@ -431,9 +393,9 @@ class SettingsTab(ctk.CTkFrame): if disable_only: return try: - shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(cwd(), "boiiiwd_theme.json")) + shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(application_path, "boiiiwd_theme.json")) except: - shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(cwd(), "boiiiwd_theme.json")) + shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(application_path, "boiiiwd_theme.json")) show_message("Preset file created", "You can now edit boiiiwd_theme.json in the current directory to your liking\n* Edits will apply next time you open boiiiwd\n* Program will always take boiiiwd_theme.json as the first theme option if found\n* Click on this button again to disable your custom theme or just rename boiiiwd_theme.json", icon="info") def settings_check_for_updates(self): @@ -587,7 +549,7 @@ class SettingsTab(ctk.CTkFrame): if os.path.exists(json_file_path): mod_type = extract_json_data(json_file_path, "Type") - items_file = os.path.join(cwd(), LIBRARY_FILE) + items_file = os.path.join(application_path, LIBRARY_FILE) if shared.app.library_tab.item_exists_in_file(items_file, workshop_id): get_folder_name = shared.app.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") diff --git a/boiiiwd_package/src/update_window.py b/boiiiwd_package/src/update_window.py index 8db49ea..541828c 100644 --- a/boiiiwd_package/src/update_window.py +++ b/boiiiwd_package/src/update_window.py @@ -1,10 +1,49 @@ +import src.shared_vars as main_app from src.imports import * from src.helpers import * + +def check_for_updates_func(window, ignore_up_todate=False): + try: + latest_version = get_latest_release_version() + current_version = VERSION + int_latest_version = int(latest_version.replace("v", "").replace(".", "")) + int_current_version = int(current_version.replace("v", "").replace(".", "")) + + if latest_version and int_latest_version > int_current_version: + msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True) + + result = msg_box.get() + + if result == "View": + webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest") + + if result == "Yes": + update_window = UpdateWindow(window, LATEST_RELEASE_URL) + update_window.start_update() + + if result == "No": + return + + elif int_latest_version < int_current_version: + if ignore_up_todate: + return + msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True) + result = msg_box.get() + elif int_latest_version == int_current_version: + if ignore_up_todate: + return + msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True) + result = msg_box.get() + + else: + show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again") + + except Exception as e: + show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel") + class UpdateWindow(ctk.CTkToplevel): def __init__(self, master, update_url): - global master_win - master_win = master super().__init__(master) self.title("BOIIIWD Self-Updater") self.geometry("400x150") @@ -41,7 +80,7 @@ class UpdateWindow(ctk.CTkToplevel): def update_progress_bar(self): try: - update_dir = os.path.join(os.getcwd(), UPDATER_FOLDER) + update_dir = os.path.join(application_path, UPDATER_FOLDER) response = requests.get(LATEST_RELEASE_URL, stream=True) response.raise_for_status() current_exe = sys.argv[0] @@ -95,9 +134,8 @@ class UpdateWindow(ctk.CTkToplevel): self.label_download.configure(text="Update cancelled.") self.progress_bar.set(0.0) # there's a better solution ill implement it later - global master_win try: - master_win.attributes('-alpha', 1.0) + main_app.app.attributes('-alpha', 1.0) except: pass show_message("Cancelled!", "Update cancelled by user", icon="warning")