From 2f7045a025fa1d972792677b929088b134a8978f Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Wed, 20 Sep 2023 02:28:20 -0230 Subject: [PATCH 01/38] Refactor project --- .gitignore | 4 +- .../__pycache__/__init__.cpython-311.pyc | Bin 455 -> 0 bytes .../__pycache__/ctk_tooltip.cpython-311.pyc | Bin 11034 -> 0 bytes README.md | 10 +- boiiiwd_package/__init__.py | 0 boiiiwd_package/boiiiwd.py | 5 +- .../{src => }/resources/Refresh_icon.svg.png | Bin .../{src => }/resources/boiiiwd_blue.json | 0 .../{src => }/resources/boiiiwd_ghost.json | 0 .../{src => }/resources/boiiiwd_grey.json | 0 .../resources/boiiiwd_neonbanana.json | 0 .../{src => }/resources/boiiiwd_obsidian.json | 0 .../{src => }/resources/boiiiwd_test.json | 0 .../{src => }/resources/boiiiwd_theme.json | 0 .../{src => }/resources/map_image.png | Bin .../{src => }/resources/mod_image.png | Bin boiiiwd_package/{ => resources}/ryuk.ico | Bin boiiiwd_package/{src => }/resources/ryuk.png | Bin .../{src => }/resources/sett10.png | Bin boiiiwd_package/{src => }/resources/sett4.png | Bin boiiiwd_package/{src => }/resources/sett5.png | Bin boiiiwd_package/{src => }/resources/sett6.png | Bin boiiiwd_package/{src => }/resources/sett7.png | Bin boiiiwd_package/{src => }/resources/sett8.png | Bin .../{src => }/resources/update_icon.png | Bin .../src/CTkListbox}/__init__.py | 0 .../src/CTkListbox}/ctk_listbox.py | 0 .../src/CTkToolTip}/__init__.py | 1 - .../src/CTkToolTip}/ctk_tooltip.py | 0 boiiiwd_package/src/__init__.py | 5 + boiiiwd_package/src/helpers.py | 100 +++- boiiiwd_package/src/imports.py | 56 +- boiiiwd_package/src/library_tab.py | 509 +++++++++++++++++- boiiiwd_package/src/main.py | 147 +++-- boiiiwd_package/src/resources/ryuk.ico | Bin 4286 -> 0 bytes boiiiwd_package/src/settings_tab.py | 286 +++++++++- boiiiwd_package/src/shared_vars.py | 3 + boiiiwd_package/src/update_window.py | 3 +- build.py | 13 +- 39 files changed, 1001 insertions(+), 141 deletions(-) delete mode 100644 CTkToolTip/__pycache__/__init__.cpython-311.pyc delete mode 100644 CTkToolTip/__pycache__/ctk_tooltip.cpython-311.pyc delete mode 100644 boiiiwd_package/__init__.py rename boiiiwd_package/{src => }/resources/Refresh_icon.svg.png (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_blue.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_ghost.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_grey.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_neonbanana.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_obsidian.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_test.json (100%) rename boiiiwd_package/{src => }/resources/boiiiwd_theme.json (100%) rename boiiiwd_package/{src => }/resources/map_image.png (100%) rename boiiiwd_package/{src => }/resources/mod_image.png (100%) rename boiiiwd_package/{ => resources}/ryuk.ico (100%) rename boiiiwd_package/{src => }/resources/ryuk.png (100%) rename boiiiwd_package/{src => }/resources/sett10.png (100%) rename boiiiwd_package/{src => }/resources/sett4.png (100%) rename boiiiwd_package/{src => }/resources/sett5.png (100%) rename boiiiwd_package/{src => }/resources/sett6.png (100%) rename boiiiwd_package/{src => }/resources/sett7.png (100%) rename boiiiwd_package/{src => }/resources/sett8.png (100%) rename boiiiwd_package/{src => }/resources/update_icon.png (100%) rename {CTkListbox => boiiiwd_package/src/CTkListbox}/__init__.py (100%) rename {CTkListbox => boiiiwd_package/src/CTkListbox}/ctk_listbox.py (100%) rename {CTkToolTip => boiiiwd_package/src/CTkToolTip}/__init__.py (99%) rename {CTkToolTip => boiiiwd_package/src/CTkToolTip}/ctk_tooltip.py (100%) delete mode 100644 boiiiwd_package/src/resources/ryuk.ico create mode 100644 boiiiwd_package/src/shared_vars.py diff --git a/.gitignore b/.gitignore index 7fc6638..6db02d8 100644 --- a/.gitignore +++ b/.gitignore @@ -161,4 +161,6 @@ cython_debug/ # Other *.ini -dist/ \ No newline at end of file +*.conf +dist/ +.vscode \ No newline at end of file diff --git a/CTkToolTip/__pycache__/__init__.cpython-311.pyc b/CTkToolTip/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2620486b2fb1032ccba65734c1f225184ba83ce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 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 SZynzWeNAh=c}_hg`F{b+t|KJ? diff --git a/README.md b/README.md index 9125149..3bcb3cf 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ ## Usage (script): - ```pip install -r requirements.txt``` -> use my modified [CTkToolTip](./CTkToolTip) and [CTkListbox](./CTkListbox) for [v0.2.8](https://github.com/faroukbmiled/BOIIIWD/releases) and up -- ```python boiiiwd.py``` +- ```python boiiiwd_package\boiiiwd.py``` - Slap in your workshop item link for example: "https://steamcommunity.com/sharedfiles/filedetails/?id=3011930738" or just the id 3011930738) ## Features: @@ -36,16 +36,16 @@ ## Freezing into an exe (pyinstaller): -- ```pip install -r requirements.txt``` -> use my modified [CTkToolTip](./CTkToolTip) and [CTkListbox](./CTkListbox) for [v0.2.8](https://github.com/faroukbmiled/BOIIIWD/releases) and up -- ```pip install pyinstaller``` -- ```pyinstaller --noconfirm --onefile --windowed --icon "ryuk.ico" --name "BOIIIWD" --ascii "boiiiwd.py" --add-data "resources;resources" --add-data "c:\\lib\site-packages\customtkinter;customtkinter\" --add-data "c:\\lib\site-packages\CTkMessagebox;CTkMessagebox\" --add-data "c:\\lib\site-packages\CTkToolTip;CTkToolTip\"``` +- ```pip install -r requirements.txt``` -> use my modified [CTkToolTip](./CTkToolTip) and [CTkListbox](./CTkListbox) for [v0.2.8](https://github.com/faroukbmiled/BOIIIWD/releases) and up. +- ```python build.py``` ## Queue tab (beta) - added Queue tab which has a text field that you can slap in workshop ids/links in 2 formats, for example:
-```3010399939,2976006537,2118338989,2113146805``` or
+```3010399939,2976006537,2118338989``` +or
```3010399939 2976006537 2118338989 diff --git a/boiiiwd_package/__init__.py b/boiiiwd_package/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/boiiiwd_package/boiiiwd.py b/boiiiwd_package/boiiiwd.py index dc9c8a9..4f42ab5 100644 --- a/boiiiwd_package/boiiiwd.py +++ b/boiiiwd_package/boiiiwd.py @@ -1,5 +1,4 @@ -from src import main +import src.shared_vars as shared_vars if __name__ == "__main__": - app = main.BOIIIWD() - app.mainloop() + shared_vars.app.mainloop() diff --git a/boiiiwd_package/src/resources/Refresh_icon.svg.png b/boiiiwd_package/resources/Refresh_icon.svg.png similarity index 100% rename from boiiiwd_package/src/resources/Refresh_icon.svg.png rename to boiiiwd_package/resources/Refresh_icon.svg.png diff --git a/boiiiwd_package/src/resources/boiiiwd_blue.json b/boiiiwd_package/resources/boiiiwd_blue.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_blue.json rename to boiiiwd_package/resources/boiiiwd_blue.json diff --git a/boiiiwd_package/src/resources/boiiiwd_ghost.json b/boiiiwd_package/resources/boiiiwd_ghost.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_ghost.json rename to boiiiwd_package/resources/boiiiwd_ghost.json diff --git a/boiiiwd_package/src/resources/boiiiwd_grey.json b/boiiiwd_package/resources/boiiiwd_grey.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_grey.json rename to boiiiwd_package/resources/boiiiwd_grey.json diff --git a/boiiiwd_package/src/resources/boiiiwd_neonbanana.json b/boiiiwd_package/resources/boiiiwd_neonbanana.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_neonbanana.json rename to boiiiwd_package/resources/boiiiwd_neonbanana.json diff --git a/boiiiwd_package/src/resources/boiiiwd_obsidian.json b/boiiiwd_package/resources/boiiiwd_obsidian.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_obsidian.json rename to boiiiwd_package/resources/boiiiwd_obsidian.json diff --git a/boiiiwd_package/src/resources/boiiiwd_test.json b/boiiiwd_package/resources/boiiiwd_test.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_test.json rename to boiiiwd_package/resources/boiiiwd_test.json diff --git a/boiiiwd_package/src/resources/boiiiwd_theme.json b/boiiiwd_package/resources/boiiiwd_theme.json similarity index 100% rename from boiiiwd_package/src/resources/boiiiwd_theme.json rename to boiiiwd_package/resources/boiiiwd_theme.json diff --git a/boiiiwd_package/src/resources/map_image.png b/boiiiwd_package/resources/map_image.png similarity index 100% rename from boiiiwd_package/src/resources/map_image.png rename to boiiiwd_package/resources/map_image.png diff --git a/boiiiwd_package/src/resources/mod_image.png b/boiiiwd_package/resources/mod_image.png similarity index 100% rename from boiiiwd_package/src/resources/mod_image.png rename to boiiiwd_package/resources/mod_image.png diff --git a/boiiiwd_package/ryuk.ico b/boiiiwd_package/resources/ryuk.ico similarity index 100% rename from boiiiwd_package/ryuk.ico rename to boiiiwd_package/resources/ryuk.ico diff --git a/boiiiwd_package/src/resources/ryuk.png b/boiiiwd_package/resources/ryuk.png similarity index 100% rename from boiiiwd_package/src/resources/ryuk.png rename to boiiiwd_package/resources/ryuk.png diff --git a/boiiiwd_package/src/resources/sett10.png b/boiiiwd_package/resources/sett10.png similarity index 100% rename from boiiiwd_package/src/resources/sett10.png rename to boiiiwd_package/resources/sett10.png diff --git a/boiiiwd_package/src/resources/sett4.png b/boiiiwd_package/resources/sett4.png similarity index 100% rename from boiiiwd_package/src/resources/sett4.png rename to boiiiwd_package/resources/sett4.png diff --git a/boiiiwd_package/src/resources/sett5.png b/boiiiwd_package/resources/sett5.png similarity index 100% rename from boiiiwd_package/src/resources/sett5.png rename to boiiiwd_package/resources/sett5.png diff --git a/boiiiwd_package/src/resources/sett6.png b/boiiiwd_package/resources/sett6.png similarity index 100% rename from boiiiwd_package/src/resources/sett6.png rename to boiiiwd_package/resources/sett6.png diff --git a/boiiiwd_package/src/resources/sett7.png b/boiiiwd_package/resources/sett7.png similarity index 100% rename from boiiiwd_package/src/resources/sett7.png rename to boiiiwd_package/resources/sett7.png diff --git a/boiiiwd_package/src/resources/sett8.png b/boiiiwd_package/resources/sett8.png similarity index 100% rename from boiiiwd_package/src/resources/sett8.png rename to boiiiwd_package/resources/sett8.png diff --git a/boiiiwd_package/src/resources/update_icon.png b/boiiiwd_package/resources/update_icon.png similarity index 100% rename from boiiiwd_package/src/resources/update_icon.png rename to boiiiwd_package/resources/update_icon.png diff --git a/CTkListbox/__init__.py b/boiiiwd_package/src/CTkListbox/__init__.py similarity index 100% rename from CTkListbox/__init__.py rename to boiiiwd_package/src/CTkListbox/__init__.py diff --git a/CTkListbox/ctk_listbox.py b/boiiiwd_package/src/CTkListbox/ctk_listbox.py similarity index 100% rename from CTkListbox/ctk_listbox.py rename to boiiiwd_package/src/CTkListbox/ctk_listbox.py diff --git a/CTkToolTip/__init__.py b/boiiiwd_package/src/CTkToolTip/__init__.py similarity index 99% rename from CTkToolTip/__init__.py rename to boiiiwd_package/src/CTkToolTip/__init__.py index 5adf78b..28d3642 100644 --- a/CTkToolTip/__init__.py +++ b/boiiiwd_package/src/CTkToolTip/__init__.py @@ -8,4 +8,3 @@ Homepage: https://github.com/Akascape/CTkToolTip __version__ = '0.8' from .ctk_tooltip import CTkToolTip - diff --git a/CTkToolTip/ctk_tooltip.py b/boiiiwd_package/src/CTkToolTip/ctk_tooltip.py similarity index 100% rename from CTkToolTip/ctk_tooltip.py rename to boiiiwd_package/src/CTkToolTip/ctk_tooltip.py diff --git a/boiiiwd_package/src/__init__.py b/boiiiwd_package/src/__init__.py index e69de29..d8eeb44 100644 --- a/boiiiwd_package/src/__init__.py +++ b/boiiiwd_package/src/__init__.py @@ -0,0 +1,5 @@ +import os, glob +from os.path import dirname, basename, isfile, join + +modules = glob.glob(os.path.join(dirname(__file__), '*.py')) +__all__ = [ basename(f)[:-3] for f in modules if isfile(f) and not f.endswith('__init__.py')] \ No newline at end of file diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index 694790d..6edc09b 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -12,7 +12,7 @@ def check_config(name, fallback=None): config.read(CONFIG_FILE_PATH) if fallback: return config.get("Settings", name, fallback=fallback) - return config.get("Settings", name, fallback="on") + return config.get("Settings", name, fallback="") def save_config(name, value): config = configparser.ConfigParser() @@ -75,6 +75,56 @@ def create_update_script(current_exe, new_exe, updater_folder, program_name): return script_path +def is_internet_available(): + try: + requests.get("https://www.google.com", timeout=3) + return True + except: + return False + +def check_for_updates_func(window, ignore_up_todate=False): + if not is_internet_available(): + show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") + return + 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": + from src.update_window import UpdateWindow + 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") + def extract_workshop_id(link): try: pattern = r'(?<=id=)(\d+)' @@ -271,11 +321,22 @@ def get_button_state_colors(file_path, state): def reset_steamcmd(no_warn=None): steamcmd_path = get_steamcmd_path() - steamcmd_steamapps = os.path.join(steamcmd_path, "steamapps") - if os.path.exists(steamcmd_steamapps): - remove_tree(steamcmd_steamapps, show_error=True) - if not no_warn: - show_message("Success!", "SteamCMD has been reset successfully!", icon="info") + + directories_to_reset = ["steamapps", "dumps", "logs", "depotcache", "appcache","userdata",] + + for directory in directories_to_reset: + directory_path = os.path.join(steamcmd_path, directory) + if os.path.exists(directory_path): + remove_tree(directory_path, show_error=True) + + for root, _, files in os.walk(steamcmd_path): + for filename in files: + if filename.endswith((".old", ".crash")): + file_path = os.path.join(root, filename) + os.remove(file_path) + + if not no_warn: + show_message("Success!", "SteamCMD has been reset successfully!", icon="info") else: if not no_warn: show_message("Warning!", "steamapps folder was not found, maybe already removed?", icon="warning") @@ -298,7 +359,30 @@ def get_item_name(id): except: return False -def show_noti(widget ,message, event=None, noti_dur=3.0): - CTkToolTip(widget, message=message, is_noti=True, noti_event=event, noti_dur=noti_dur) +# you gotta use my modded CTkToolTip originaly by Akascape +def show_noti(widget ,message, event=None, noti_dur=3.0, topmost=False): + ctk_tooltip.CTkToolTip(widget, message=message, is_noti=True, noti_event=event, noti_dur=noti_dur, topmost=topmost) + +def check_item_date(down_date, date_updated): + current_year = datetime.now().year + date_format_with_year = "%d %b, %Y @ %I:%M%p" + date_format_with_added_year = "%d %b @ %I:%M%p, %Y" + try: + try: + download_datetime = datetime.strptime(down_date, date_format_with_year) + except ValueError: + download_datetime = datetime.strptime(down_date + f", {current_year}", date_format_with_added_year) + + try: + upload_datetime = datetime.strptime(date_updated, date_format_with_year) + except ValueError: + upload_datetime = datetime.strptime(date_updated + f", {current_year}", date_format_with_added_year) + + if upload_datetime >= download_datetime: + return True + elif upload_datetime < download_datetime: + return False + except: + return False # End helper functions diff --git a/boiiiwd_package/src/imports.py b/boiiiwd_package/src/imports.py index 954a33c..736d437 100644 --- a/boiiiwd_package/src/imports.py +++ b/boiiiwd_package/src/imports.py @@ -1,30 +1,44 @@ -from CTkMessagebox import CTkMessagebox -from tkinter import Menu, END, Event -from bs4 import BeautifulSoup -import customtkinter as ctk -from CTkToolTip import * -from pathlib import Path -from PIL import Image import configparser -import webbrowser -import subprocess -import threading -import datetime -import requests -import zipfile -import shutil -import psutil +import io import json import math -import time -import sys -import io import os import re +import shutil +import subprocess +import sys +import threading +import time +import webbrowser +import zipfile +from datetime import datetime +from pathlib import Path +from tkinter import END, Event, Menu -VERSION = "v0.2.9" +import customtkinter as ctk +import psutil +import requests +from bs4 import BeautifulSoup +from CTkMessagebox import CTkMessagebox +from PIL import Image + +# Use CTkToolTip and CTkListbox from my repo originally by Akascape (https://github.com/Akascape) +from .CTkListbox import ctk_listbox +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 + # path into variable _MEIPASS'. + application_path = os.path.dirname(sys.executable) +else: + application_path = os.path.dirname(os.path.abspath(__file__)) + +CONFIG_FILE_PATH = "config.ini" GITHUB_REPO = "faroukbmiled/BOIIIWD" LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip" +LIBRARY_FILE = "boiiiwd_library.json" +RESOURCES_DIR = os.path.join(os.path.dirname(__file__), '..', 'resources') UPDATER_FOLDER = "update" -CONFIG_FILE_PATH = "config.ini" -RESOURCES_DIR = os.path.join(os.path.dirname(__file__), 'resources') \ No newline at end of file +VERSION = "v0.3.1" \ No newline at end of file diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 2d73437..414a8ae 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -1,12 +1,14 @@ from src.imports import * -from src.helpers import show_message, get_folder_size, convert_bytes_to_readable,\ - extract_json_data, get_workshop_file_size, extract_workshop_id, show_noti +from src.helpers import * + +import src.shared_vars as shared class LibraryTab(ctk.CTkScrollableFrame): def __init__(self, master, **kwargs): super().__init__(master, **kwargs) self.added_items = set() + self.to_update = set() self.grid_columnconfigure(0, weight=1) self.radiobutton_variable = ctk.StringVar() @@ -15,23 +17,33 @@ class LibraryTab(ctk.CTkScrollableFrame): self.filter_entry.bind("", self.filter_items) self.filter_entry.grid(row=0, column=0, padx=(10, 20), pady=(10, 20), sticky="we") filter_refresh_button_image = os.path.join(RESOURCES_DIR, "Refresh_icon.svg.png") + update_button_image = os.path.join(RESOURCES_DIR, "update_icon.png") self.filter_refresh_button = ctk.CTkButton(self, image=ctk.CTkImage(Image.open(filter_refresh_button_image)), command=self.refresh_items, width=20, height=20, fg_color="transparent", text="") - self.filter_refresh_button.grid(row=0, column=1, padx=(10, 20), pady=(10, 20), sticky="enw") + self.filter_refresh_button.grid(row=0, column=1, padx=(10, 0), pady=(10, 20), sticky="nw") + self.update_button = ctk.CTkButton(self, image=ctk.CTkImage(Image.open(update_button_image)), command=self.check_for_updates, width=65, height=20, + text="", fg_color="transparent") + self.update_button.grid(row=0, column=1, padx=(0, 20), pady=(10, 20), sticky="en") + self.update_tooltip = ctk_tooltip.CTkToolTip(self.update_button, message="Check items for updates", topmost=True) + filter_tooltip = ctk_tooltip.CTkToolTip(self.filter_refresh_button, message="Refresh library", topmost=True) self.label_list = [] self.button_list = [] self.button_view_list = [] + self.file_cleaned = False self.filter_type = True self.clipboard_has_content = False + self.item_block_list = set() + self.added_folders = set() + self.ids_added = set() - def add_item(self, item, image=None, item_type="map", workshop_id=None, folder=None): + def add_item(self, item, image=None, workshop_id=None, folder=None, invalid_warn=False): label = ctk.CTkLabel(self, text=item, image=image, compound="left", padx=5, anchor="w") button = ctk.CTkButton(self, text="Remove", width=60, height=24, fg_color="#3d3f42") button_view = ctk.CTkButton(self, text="Details", width=55, height=24, fg_color="#3d3f42") - button.configure(command=lambda: self.remove_item(item, folder)) - button_view.configure(command=lambda: self.show_map_info(workshop_id)) - button_view_tooltip = CTkToolTip(button_view, message="Opens up a window that shows basic details") - button_tooltip = CTkToolTip(button, message="Removes the map/mod from your game") + button.configure(command=lambda: self.remove_item(item, folder, workshop_id)) + button_view.configure(command=lambda: self.show_map_info(workshop_id, invalid_warn)) + button_view_tooltip = ctk_tooltip.CTkToolTip(button_view, message="Opens up a window that shows basic details") + button_tooltip = ctk_tooltip.CTkToolTip(button, message="Removes the map/mod from your game") label.grid(row=len(self.label_list) + 1, column=0, pady=(0, 10), padx=(5, 10), sticky="w") button.grid(row=len(self.button_list) + 1, column=1, pady=(0, 10), padx=(50, 10), sticky="e") button_view.grid(row=len(self.button_view_list) + 1, column=1, pady=(0, 10), padx=(10, 75), sticky="w") @@ -44,6 +56,8 @@ class LibraryTab(ctk.CTkScrollableFrame): label.bind("", lambda event, label=label: self.copy_to_clipboard(label, workshop_id, event, append=True)) label.bind("", lambda event: self.open_folder_location(folder, event)) label.bind("", lambda event, label=label: self.copy_to_clipboard(label, folder, event)) + if invalid_warn: + label_warn = ctk_tooltip.CTkToolTip(label, message="Duplicated or Blocked item (Search item id in search)") def on_label_hover(self, label, enter): if enter: @@ -75,6 +89,98 @@ class LibraryTab(ctk.CTkScrollableFrame): os.startfile(folder) show_noti(self, "Opening folder", event, 1.0) + def item_exists_in_file(self, items_file, workshop_id, folder_name=None): + if not os.path.exists(items_file): + return False, False + + with open(items_file, "r") as f: + items_data = json.load(f) + for item_info in items_data: + if "id" in item_info and "folder_name" in item_info and "json_folder_name" in item_info: + if item_info["id"] == workshop_id and item_info["folder_name"] == folder_name: + if item_info["folder_name"] in self.added_folders: + continue + if item_info["folder_name"] in self.item_block_list: + return False ,None + return True, True + elif item_info["id"] == workshop_id: + if item_info["folder_name"] in self.added_folders: + continue + if item_info["folder_name"] in self.item_block_list: + return False ,None + return True, False + + elif "id" in item_info and item_info["id"] == workshop_id: + return True, False + return False, False + + def remove_item_by_option(self, items_file, option, option_name="id"): + + if not os.path.exists(items_file): + return + + with open(items_file, "r") as f: + items_data = json.load(f) + + updated_items_data = [item for item in items_data if item.get(option_name) != option] + + if len(updated_items_data) < len(items_data): + with open(items_file, "w") as f: + json.dump(updated_items_data, f, indent=4) + + def get_item_by_id(self, items_file, item_id, return_option="all"): + + if not os.path.exists(items_file): + return None + + with open(items_file, "r") as f: + items_data = json.load(f) + + for item in items_data: + if item.get("id") == item_id: + if return_option == "all": + return item + elif return_option == return_option: + return item.get(return_option) + return None + + def get_item_index_by_id(self, items_data, item_id): + for index, item in enumerate(items_data): + if item.get("id") == item_id: + return index + return None + + def update_or_add_item_by_id(self, items_file, item_info, item_id): + if not os.path.exists(items_file): + with open(items_file, "w") as f: + json.dump([item_info], f, indent=4) + else: + with open(items_file, "r+") as f: + items_data = json.load(f) + existing_item_index = self.get_item_index_by_id(items_data, item_id) + if existing_item_index is not None: + items_data[existing_item_index] = item_info + else: + items_data.append(item_info) + f.seek(0) + f.truncate() + json.dump(items_data, f, indent=4) + + def clean_json_file(self, file): + + if not os.path.exists(file): + show_message("Error", f"File '{file}' does not exist.") + return + + with open(file, "r") as f: + items_data = json.load(f) + + cleaned_items = [item for item in items_data if 'folder_name' in item and 'json_folder_name' + in item and item['folder_name'] not in self.item_block_list and item['folder_name'] in self.added_folders] + + with open(file, 'w') as file: + json.dump(cleaned_items, file, indent=4) + def filter_items(self, event): filter_text = self.filter_entry.get().lower() for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): @@ -93,38 +199,158 @@ class LibraryTab(ctk.CTkScrollableFrame): mods_folder = Path(boiiiFolder) / "usermaps" mod_img = os.path.join(RESOURCES_DIR, "mod_image.png") map_img = os.path.join(RESOURCES_DIR, "map_image.png") + b_mod_img = os.path.join(RESOURCES_DIR, "b_mod_image.png") + b_map_img = os.path.join(RESOURCES_DIR, "b_map_image.png") + map_count = 0 + mod_count = 0 + total_size = 0 folders_to_process = [mods_folder, maps_folder] + items_file = os.path.join(cwd(), LIBRARY_FILE) + for folder_path in folders_to_process: for zone_path in folder_path.glob("**/zone"): json_path = zone_path / "workshop.json" if json_path.exists(): + # current folder name + curr_folder_name = zone_path.parent.name + + workshop_id = extract_json_data(json_path, "PublisherID") name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "") name = name[:45] + "..." if len(name) > 45 else name item_type = extract_json_data(json_path, "Type") - workshop_id = extract_json_data(json_path, "PublisherID") folder_name = extract_json_data(json_path, "FolderName") - size = convert_bytes_to_readable(get_folder_size(zone_path.parent)) + folder_size_bytes = get_folder_size(zone_path.parent) + size = convert_bytes_to_readable(folder_size_bytes) + total_size += folder_size_bytes text_to_add = f"{name} | Type: {item_type.capitalize()}" mode_type = "ZM" if item_type == "map" and folder_name.startswith("zm") else "MP" if folder_name.startswith("mp") and item_type == "map" else None if mode_type: text_to_add += f" | Mode: {mode_type}" text_to_add += f" | ID: {workshop_id} | Size: {size}" - if text_to_add not in self.added_items: - self.added_items.add(text_to_add) - image_path = mod_img if item_type == "mod" else map_img - self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), item_type=item_type, workshop_id=workshop_id, folder=zone_path.parent) + creation_timestamp = None + for ff_file in zone_path.glob("*.ff"): + if ff_file.exists(): + creation_timestamp = ff_file.stat().st_ctime + break + + if creation_timestamp is not None: + date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") + else: + creation_timestamp = zone_path.stat().st_ctime + date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") + + map_count += 1 if item_type == "map" else 0 + mod_count += 1 if item_type == "mod" else 0 + if curr_folder_name not in self.added_folders: + image_path = mod_img if item_type == "mod" else map_img + if not (str(curr_folder_name).strip() == str(workshop_id).strip() or str(curr_folder_name).strip() == str(folder_name).strip()): + try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") + except: pass + self.item_block_list.add(curr_folder_name) + image_path = b_mod_img if item_type == "mod" else b_map_img + text_to_add += " | ⚠️" + elif curr_folder_name not in self.added_folders and workshop_id in self.ids_added: + try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") + except: pass + image_path = b_mod_img if item_type == "mod" else b_map_img + text_to_add += " | ⚠️" + + self.added_items.add(text_to_add) + if image_path is b_mod_img or image_path is b_map_img: + self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent, invalid_warn=True) + else: + self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent) + id_found, folder_found = self.item_exists_in_file(items_file, workshop_id, curr_folder_name) + item_info = { + "id": workshop_id, + "text": text_to_add, + "date": date_added, + "folder_name": curr_folder_name, + "json_folder_name": folder_name + } + # when item is blocked ,item_exists_in_file() returns None for folder_found + if not id_found and folder_found == None: + self.remove_item_by_option(items_file, curr_folder_name, "folder_name") + elif not id_found and not folder_found and curr_folder_name not in self.item_block_list and workshop_id not in self.ids_added: + if not os.path.exists(items_file): + with open(items_file, "w") as f: + json.dump([item_info], f, indent=4) + else: + with open(items_file, "r+") as f: + items_data = json.load(f) + items_data.append(item_info) + f.seek(0) + json.dump(items_data, f, indent=4) + + if id_found and not folder_found and curr_folder_name not in self.item_block_list and workshop_id not in self.ids_added: + self.update_or_add_item_by_id(items_file, item_info, workshop_id) + + # keep here cuz of item_exists_in_file() testing + self.added_folders.add(curr_folder_name) + if not workshop_id in self.ids_added: + self.ids_added.add(workshop_id) + + if not self.file_cleaned and os.path.exists(items_file): + self.file_cleaned = True + self.clean_json_file(items_file) if not self.added_items: self.show_no_items_message() else: self.hide_no_items_message() - def remove_item(self, item, folder): + if map_count > 0 or mod_count > 0: + return f"Maps: {map_count} - Mods: {mod_count} - Total size: {convert_bytes_to_readable(total_size)}" + return "No items in current selected folder" + + def update_item(self, boiiiFolder, id, item_type, foldername): + try: + if item_type == "map": + folder_path = Path(boiiiFolder) / "usermaps" / f"{foldername}" + elif item_type == "mod": + folder_path = Path(boiiiFolder) / "mods" / f"{foldername}" + else: + raise ValueError("Unsupported item_type. It must be 'map' or 'mod'.") + + for zone_path in folder_path.glob("**/zone"): + json_path = zone_path / "workshop.json" + if json_path.exists(): + workshop_id = extract_json_data(json_path, "PublisherID") + if workshop_id == id: + name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "") + name = name[:45] + "..." if len(name) > 45 else name + item_type = extract_json_data(json_path, "Type") + folder_name = extract_json_data(json_path, "FolderName") + size = convert_bytes_to_readable(get_folder_size(zone_path.parent)) + text_to_add = f"{name} | Type: {item_type.capitalize()}" + mode_type = "ZM" if item_type == "map" and folder_name.startswith("zm") else "MP" if folder_name.startswith("mp") and item_type == "map" else None + if mode_type: + 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) + + item_info = { + "id": workshop_id, + "text": text_to_add, + "date": date_added, + "folder_name": foldername, + "json_folder_name": folder_name + } + self.update_or_add_item_by_id(items_file, item_info, id) + return + + except Exception as e: + 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) 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)) try: shutil.rmtree(folder) except Exception as e: @@ -136,7 +362,9 @@ class LibraryTab(ctk.CTkScrollableFrame): self.label_list.remove(label) self.button_list.remove(button) self.added_items.remove(label.cget("text")) + self.ids_added.remove(id) self.button_view_list.remove(button_view_list) + self.remove_item_by_option(items_file, id) def refresh_items(self): for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): @@ -147,8 +375,10 @@ class LibraryTab(ctk.CTkScrollableFrame): self.button_list.clear() self.button_view_list.clear() self.added_items.clear() - from src.main import master_win - self.load_items(master_win.edit_destination_folder.get().strip()) + self.added_folders.clear() + self.ids_added.clear() + status = self.load_items(shared.app.edit_destination_folder.get().strip()) + shared.app.title(f"BOIII Workshop Downloader - Library ➜ {status}") def view_item(self, workshop_id): url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" @@ -163,7 +393,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.no_items_label.forget() # i know i know ,please make a pull request i cant be bother - def show_map_info(self, workshop): + def show_map_info(self, workshop, invalid_warn=False): for button_view in self.button_view_list: button_view.configure(state="disabled") @@ -235,7 +465,7 @@ class LibraryTab(ctk.CTkScrollableFrame): image_size = image.size self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, - date_updated, stars_image, stars_image_size, ratings_text, url) + date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn) except requests.exceptions.RequestException as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") @@ -247,14 +477,16 @@ class LibraryTab(ctk.CTkScrollableFrame): info_thread.start() def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - date_created ,date_updated, stars_image, stars_image_size, ratings_text, url): + 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) 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"))) top.title("Map/Mod Information") top.attributes('-topmost', 'true') + down_date = self.get_item_by_id(items_file, workshop_id, 'date') def close_window(): top.destroy() @@ -262,6 +494,25 @@ class LibraryTab(ctk.CTkScrollableFrame): def view_map_mod(): webbrowser.open(url) + def check_for_updates(): + try: + + if check_item_date(down_date, date_updated): + if show_message("There is an update.", "Press download to redownload!", icon="info", _return=True, option_1="No", option_2="Download"): + if shared.app.is_downloading: + show_message("Error", "Please wait for the current download to finish or stop it then restart.", icon="cancel") + return + shared.app.edit_workshop_id.delete(0, "end") + shared.app.edit_workshop_id.insert(0, workshop_id) + shared.app.main_button_event() + shared.app.download_map(update=True) + top.destroy() + return + else: + show_message("Up to date!", "No updates found!", icon="info") + except: + show_message("Up to date!", "No updates found!", icon="info") + # frames stars_frame = ctk.CTkFrame(top) stars_frame.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 0), sticky="nsew") @@ -293,6 +544,9 @@ class LibraryTab(ctk.CTkScrollableFrame): date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") + date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) + stars_image_label = ctk.CTkLabel(stars_frame) stars_width, stars_height = stars_image_size stars_image_widget = ctk.CTkImage(stars_image, size=(int(stars_width), int(stars_height))) @@ -310,11 +564,19 @@ class LibraryTab(ctk.CTkScrollableFrame): image_label.pack(expand=True, fill="both", padx=(10, 20), pady=(10, 10)) # Buttons - close_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod) - close_button.pack(side="left", padx=(10, 20), pady=(10, 10)) + close_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod, width=130) + close_button.grid(row=0, column=0, padx=(20, 20), pady=(10, 10), sticky="n") - view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window) - view_button.pack(side="right", padx=(10, 20), pady=(10, 10)) + update_btn = ctk.CTkButton(buttons_frame, text="Update", command=check_for_updates, width=130) + update_btn.grid(row=0, column=1, padx=(10, 20), pady=(10, 10), sticky="n") + update_btn_tooltip = ctk_tooltip.CTkToolTip(update_btn, message="Checks and installs updates of the current selected item (redownload!)", topmost=True) + + view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) + view_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") + + if invalid_warn: + update_btn.configure(text="Update", state="disabled") + update_btn_tooltip.configure(message="Disabled due to item being blocked or duplicated") top.grid_rowconfigure(0, weight=0) top.grid_rowconfigure(1, weight=0) @@ -322,7 +584,206 @@ class LibraryTab(ctk.CTkScrollableFrame): top.grid_columnconfigure(0, weight=1) top.grid_columnconfigure(1, weight=1) + buttons_frame.grid_rowconfigure(0, weight=1) + buttons_frame.grid_rowconfigure(1, weight=1) + buttons_frame.grid_rowconfigure(2, weight=1) + buttons_frame.grid_columnconfigure(0, weight=1) + buttons_frame.grid_columnconfigure(1, weight=1) + buttons_frame.grid_columnconfigure(2, weight=1) + finally: for button_view in self.button_view_list: button_view.configure(state="normal") self.after(0, main_thread) + + def check_for_updates(self, on_launch=False): + if not is_internet_available(): + show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") + return + self.after(1, self.update_button.configure(state="disabled")) + self.update_tooltip.configure(message='Still loading please wait...') + cevent = Event() + cevent.x_root = self.update_button.winfo_rootx() + cevent.y_root = self.update_button.winfo_rooty() + if not on_launch: + show_noti(self.update_button, "Please wait, window will popup shortly", event=cevent, noti_dur=3.0, topmost=True) + threading.Thread(target=self.check_items_func, args=(on_launch,)).start() + + def items_update_message(self, to_update_len): + def main_thread(): + if show_message(f"{to_update_len} Item updates available", f"{to_update_len} Workshop Items have an update, Would you like to open the item updater window?", icon="info", _return=True): + shared.app.after(1, self.update_items_window) + else: + return + shared.app.after(0, main_thread) + self.update_button.configure(state="normal", width=65, height=20) + self.update_tooltip.configure(message='Check items for updates') + return + + def check_items_func(self, on_launch): + # Needed to refresh item that needs updates + self.to_update.clear() + + def if_id_needs_update(item_id, item_date, text): + try: + headers = {'Cache-Control': 'no-cache'} + url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={item_id}" + response = requests.get(url, headers=headers) + response.raise_for_status() + content = response.text + soup = BeautifulSoup(content, "html.parser") + details_stats_container = soup.find("div", class_="detailsStatsContainerRight") + details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") + try: + date_updated = details_stat_elements[2].text.strip() + except: + try: + date_updated = details_stat_elements[1].text.strip() + except: + return False + + if check_item_date(item_date, date_updated): + self.to_update.add(text + f" | Updated: {date_updated}") + return True + else: + return False + + except Exception as e: + show_message("Error", f"Error occured\n{e}", icon="cancel") + return + + def check_for_update(): + lib_data = None + + if not os.path.exists(os.path.join(cwd(), 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 + + with open(LIBRARY_FILE, 'r') as file: + lib_data = json.load(file) + + for item in lib_data: + item_id = item["id"] + item_date = item["date"] + if_id_needs_update(item_id, item_date, item["text"]) + + check_for_update() + + to_update_len = len(self.to_update) + if to_update_len > 0: + self.items_update_message(to_update_len) + else: + self.update_button.configure(state="normal", width=65, height=20) + self.update_tooltip.configure(message='Check items for updates') + if not on_launch: + show_message("No updates found!", "Items are up to date!", icon="info") + + def update_items_window(self): + try: + top = ctk.CTkToplevel(master=None) + top.withdraw() + if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): + top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) + top.title("Item updater - List of Items with Updates - Click to select 1 or more") + longest_text_length = max(len(text) for text in self.to_update) + window_width = longest_text_length * 6 + 5 + top.geometry(f"{window_width}x450") + top.attributes('-topmost', 'true') + top.resizable(True, True) + selected_id_list = [] + cevent = Event() + self.select_all_bool = False + + listbox = ctk_listbox.CTkListbox(top, multiple_selection=True) + listbox.grid(row=0, column=0, sticky="nsew") + + update_button = ctk.CTkButton(top, text="Update") + update_button.grid(row=1, column=0, pady=10, padx=5, sticky='ns') + + select_button = ctk.CTkButton(top, text="Select All", width=5) + select_button.grid(row=1, column=0, pady=10, padx=(230, 0), sticky='ns') + + def open_url(id_part, e=None): + url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id_part}" + webbrowser.open(url) + + # you gotta use my modded CTkListbox originaly by Akascape + def add_checkbox_item(index, item_text): + parts = item_text.split('ID: ') + id_part = parts[1].split('|')[0].strip() + listbox.insert(index, item_text, keybind="", func=lambda e: open_url(id_part)) + + def load_items(): + for index, item_text in enumerate(self.to_update): + if index == len(self.to_update) - 1: + add_checkbox_item("end", item_text) + top.deiconify() + return + add_checkbox_item(index, item_text) + + def update_list(selected_option): + selected_id_list.clear() + + if selected_option: + for option in selected_option: + parts = option.split('ID: ') + if len(parts) > 1: + id_part = parts[1].split('|')[0].strip() + selected_id_list.append(id_part) + + def select_all(): + if self.select_all_bool: + listbox.deactivate("all") + update_list(listbox.get()) + self.select_all_bool = False + return + listbox.deactivate("all") + listbox.activate("all") + update_list(listbox.get()) + self.select_all_bool = True + + def update_btn_fun(): + if len(selected_id_list) == 1: + if shared.app.is_downloading: + show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") + return + shared.app.edit_workshop_id.delete(0, "end") + shared.app.edit_workshop_id.insert(0, selected_id_list[0]) + shared.app.main_button_event() + shared.app.download_map(update=True) + top.destroy() + return + + elif len(selected_id_list) > 1: + if shared.app.is_downloading: + show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") + return + comma_separated_ids = ",".join(selected_id_list) + shared.app.queuetextarea.delete("1.0", "end") + shared.app.queuetextarea.insert("1.0", comma_separated_ids) + shared.app.queue_button_event() + shared.app.download_map(update=True) + top.destroy() + return + + else: + cevent.x_root = update_button.winfo_rootx() + cevent.y_root = update_button.winfo_rooty() + show_noti(update_button ,"Please select 1 or more items", event=cevent, noti_dur=0.8, topmost=True) + + + listbox.configure(command=update_list) + update_button.configure(command=update_btn_fun) + select_button.configure(command=select_all) + + top.grid_rowconfigure(0, weight=1) + top.grid_columnconfigure(0, weight=1) + + load_items() + + except Exception as e: + show_message("Error", f"{e}", icon="cancel") + + finally: + self.update_button.configure(state="normal", width=65, height=20) + self.update_tooltip.configure(message='Check items for updates') diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 4f59478..af3fd74 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -1,9 +1,9 @@ -from src.imports import * -from src.helpers import show_message, cwd, check_config, check_custom_theme, get_button_state_colors, convert_speed, valid_id,\ - save_config, check_steamcmd, is_steamcmd_initialized, get_steamcmd_path, reset_steamcmd, get_item_name, get_latest_release_version,\ - get_workshop_file_size, extract_workshop_id, create_default_config, initialize_steam, launch_boiii_func, remove_tree, extract_json_data, convert_seconds, convert_bytes_to_readable -from src.settings_tab import SettingsTab +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: @@ -20,7 +20,6 @@ def check_for_updates_func(window, ignore_up_todate=False): 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() @@ -53,7 +52,7 @@ class BOIIIWD(ctk.CTk): # self.app_instance = BOIIIWD() # configure window - self.title("BOIII Workshop Downloader - Main") + self.title("boiii Workshop Downloader - Main") try: geometry_file = os.path.join(cwd(), "boiiiwd_dont_touch.conf") @@ -185,15 +184,15 @@ class BOIIIWD(ctk.CTk): self.button_browse = ctk.CTkButton(master=self.optionsframe, text="Workshop", command=self.open_browser, width=10) self.button_browse.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="en") - self.button_browse_tooltip = CTkToolTip(self.button_browse, message="Will open steam workshop for boiii in your browser") + self.button_browse_tooltip = ctk_tooltip.CTkToolTip(self.button_browse, message="Will open steam workshop for boiii in your browser") self.info_button = ctk.CTkButton(master=self.optionsframe, text="Details", command=self.show_map_info, width=10) self.info_button.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="wn") - self.label_destination_folder = ctk.CTkLabel(master=self.optionsframe, text="Enter Your BOIII folder:") + self.label_destination_folder = ctk.CTkLabel(master=self.optionsframe, text='Enter Your boiii folder:') self.label_destination_folder.grid(row=3, column=1, padx=20, pady=(0, 0), columnspan=4, sticky="ws") - self.edit_destination_folder = ctk.CTkEntry(master=self.optionsframe, placeholder_text="Your BOIII Instalation folder") + self.edit_destination_folder = ctk.CTkEntry(master=self.optionsframe, placeholder_text="Your boiii Instalation folder") self.edit_destination_folder.grid(row=4, column=1, padx=20, pady=(0, 25), columnspan=4, sticky="ewn") self.button_BOIII_browse = ctk.CTkButton(master=self.optionsframe, text="Select", command=self.open_BOIII_browser) @@ -232,9 +231,9 @@ class BOIIIWD(ctk.CTk): self.sidebar_queue.configure(text="Queue 🚧", command=self.queue_button_event) sidebar_settings_button_image = os.path.join(RESOURCES_DIR, "sett10.png") self.sidebar_settings.configure(command=self.settings_button_event, text="", image=ctk.CTkImage(Image.open(sidebar_settings_button_image), size=(int(35), int(35))), fg_color="transparent", width=45, height=45) - self.sidebar_settings_tooltip = CTkToolTip(self.sidebar_settings, message="Settings") - self.sidebar_library_tooltip = CTkToolTip(self.sidebar_library, message="Experimental") - self.sidebar_queue_tooltip = CTkToolTip(self.sidebar_queue, message="Experimental") + self.sidebar_settings_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_settings, message="Settings") + self.sidebar_library_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_library, message="Experimental") + self.sidebar_queue_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_queue, message="Experimental") self.bind("", self.save_window_size) # context_menus @@ -271,6 +270,10 @@ class BOIIIWD(ctk.CTk): if not check_steamcmd(): self.show_steam_warning_message() + # items check for update, ill change all the variables to work this way at a later date + if self.settings_tab.check_items_var.get(): + self.library_tab.check_for_updates(on_launch=True) + def do_popup(self, event, frame): try: frame.tk_popup(event.x_root, event.y_root) finally: frame.grab_release() @@ -406,8 +409,9 @@ class BOIIIWD(ctk.CTk): def show_library_widgets(self): self.title("BOIII Workshop Downloader - Library") - self.library_tab.load_items(self.edit_destination_folder.get()) + status = self.library_tab.load_items(self.edit_destination_folder.get()) self.library_tab.grid(row=0, rowspan=3, column=1, padx=(0, 20), pady=(20, 20), sticky="nsew") + self.title(f"BOIII Workshop Downloader - Library ➜ {status}") def show_queue_widgets(self): self.title("BOIII Workshop Downloader - Queue") @@ -521,7 +525,7 @@ class BOIIIWD(ctk.CTk): self.queuetextarea.configure(state="disabled") def open_BOIII_browser(self): - selected_folder = ctk.filedialog.askdirectory(title="Select BOIII Folder") + selected_folder = ctk.filedialog.askdirectory(title="Select boiii Folder") if selected_folder: self.edit_destination_folder.delete(0, "end") self.edit_destination_folder.insert(0, selected_folder) @@ -613,8 +617,9 @@ class BOIIIWD(ctk.CTk): self.after(1, lambda mid=workshop_id: self.label_file_size.configure(text=f"File size: {get_workshop_file_size(mid ,raw=True)}")) try: + headers = {'Cache-Control': 'no-cache'} url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) + response = requests.get(url, headers=headers) response.raise_for_status() content = response.text @@ -804,14 +809,16 @@ class BOIIIWD(ctk.CTk): # the real deal def run_steamcmd_command(self, command, map_folder, wsid, queue=None): steamcmd_path = get_steamcmd_path() - stdout = os.path.join(steamcmd_path, "logs", "workshop_log.txt") - timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + stdout_path = os.path.join(steamcmd_path, "logs", "workshop_log.txt") + timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + + os.makedirs(os.path.dirname(stdout_path), exist_ok=True) try: - with open(stdout, 'w') as file: + with open(stdout_path, 'w') as file: file.write('') except: - os.rename(stdout, os.path.join(map_folder, os.path.join(stdout, f"workshop_log_couldntremove_{timestamp}.txt"))) + os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) show_console = subprocess.CREATE_NO_WINDOW if self.settings_tab.console: @@ -846,7 +853,7 @@ class BOIIIWD(ctk.CTk): #wait for process while True: if not self.is_downloading: - if self.check_steamcmd_stdout(stdout, wsid): + if self.check_steamcmd_stdout(stdout_path, wsid): start_time = time.time() self.is_downloading = True elapsed_time = time.time() - start_time @@ -857,10 +864,10 @@ class BOIIIWD(ctk.CTk): # print("Broken freeeee!") self.is_downloading = False try: - with open(stdout, 'w') as file: + with open(stdout_path, 'w') as file: file.write('') except: - os.rename(stdout, os.path.join(map_folder, os.path.join(stdout, f"workshop_log_couldntremove_{timestamp}.txt"))) + os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) if not self.settings_tab.stopped: self.settings_tab.steam_fail_counter = self.settings_tab.steam_fail_counter + 1 @@ -892,7 +899,7 @@ class BOIIIWD(ctk.CTk): while True: if not self.is_downloading: - if self.check_steamcmd_stdout(stdout, wsid): + if self.check_steamcmd_stdout(stdout_path, wsid): self.is_downloading = True if process.poll() != None: break @@ -901,10 +908,10 @@ class BOIIIWD(ctk.CTk): # print("Broken freeeee!") self.is_downloading = False try: - with open(stdout, 'w') as file: + with open(stdout_path, 'w') as file: file.write('') except: - os.rename(stdout, os.path.join(map_folder, os.path.join(stdout, f"workshop_log_couldntremove_{timestamp}.txt"))) + os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) if not os.path.exists(map_folder): show_message("SteamCMD has terminated", "SteamCMD has been terminated\nAnd failed to download the map/mod, try again or enable continuous download in settings") @@ -939,7 +946,7 @@ class BOIIIWD(ctk.CTk): return self.after(0, callback) - def download_map(self): + def download_map(self, update=False): self.is_downloading = False self.fail_threshold = 0 if not self.is_pressed: @@ -948,15 +955,15 @@ class BOIIIWD(ctk.CTk): self.library_tab.load_items(self.edit_destination_folder.get()) if self.queue_enabled: self.item_skipped = False - start_down_thread = threading.Thread(target=self.queue_download_thread) + start_down_thread = threading.Thread(target=self.queue_download_thread, args=(update,)) start_down_thread.start() else: - start_down_thread = threading.Thread(target=self.download_thread) + start_down_thread = threading.Thread(target=self.download_thread, args=(update,)) start_down_thread.start() else: show_message("Warning", "Already pressed, Please wait.") - def queue_download_thread(self): + def queue_download_thread(self, update=None): self.stopped = False self.queue_stop_button = False try: @@ -1032,18 +1039,19 @@ class BOIIIWD(ctk.CTk): if any(workshop_id in item for item in self.library_tab.added_items): self.already_installed.append(workshop_id) - if self.already_installed: - item_ids = ", ".join(self.already_installed) - if self.settings_tab.skip_already_installed: - for item in self.already_installed: - if item in items: - items.remove(item) - show_message("Heads up!, map/s skipped => skip is on in settings", f"These item IDs may already be installed and are skipped:\n{item_ids}", icon="info") - if not any(isinstance(item, int) for item in items): - self.stop_download() - return - else: - show_message("Heads up! map/s not skipped => skip is off in settings", f"These item IDs may already be installed:\n{item_ids}", icon="info") + if not update: + if self.already_installed: + item_ids = ", ".join(self.already_installed) + if self.settings_tab.skip_already_installed: + for item in self.already_installed: + if item in items: + items.remove(item) + show_message("Heads up!, map/s skipped => skip is on in settings", f"These item IDs may already be installed and are skipped:\n{item_ids}", icon="info") + if not any(isinstance(item, int) for item in items): + self.stop_download() + return + else: + show_message("Heads up! map/s not skipped => skip is off in settings", f"These item IDs may already be installed:\n{item_ids}", icon="info") self.after(1, self.status_text.configure(text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)}")) start_time = time.time() @@ -1210,6 +1218,7 @@ class BOIIIWD(ctk.CTk): update_ui_thread.daemon = True update_ui_thread.start() update_ui_thread.join() + self.progress_text.configure(text="0%") self.progress_bar.set(0.0) @@ -1220,7 +1229,21 @@ 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") - folder_name = extract_json_data(json_file_path, "FolderName") + items_file = os.path.join(cwd(), 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: + folder_name = get_folder_name + else: + try: + folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") + else: + try: + folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") if mod_type == "mod": mods_folder = os.path.join(destination_folder, "mods") @@ -1243,6 +1266,8 @@ class BOIIIWD(ctk.CTk): remove_tree(map_folder) remove_tree(download_folder) + self.library_tab.update_item(self.edit_destination_folder.get(), workshop_id, mod_type, folder_name) + if index == len(items) - 1: self.after(1, self.status_text.configure(text=f"Status: Done! => Please press stop only if you see no popup window (rare bug)")) self.show_complete_message(message=f"All files were downloaded\nYou can run the game now!\nPS: You have to restart the game \n(pressing launch will launch/restarts)") @@ -1275,7 +1300,7 @@ class BOIIIWD(ctk.CTk): self.stop_download() self.is_pressed = False - def download_thread(self): + def download_thread(self, update=None): try: self.settings_tab.stopped = False @@ -1332,12 +1357,13 @@ class BOIIIWD(ctk.CTk): self.stop_download() return - if any(workshop_id in item for item in self.library_tab.added_items): - if self.settings_tab.skip_already_installed: - show_message("Heads up!, map skipped => Skip is on in settings", f"This item may already be installed, Stopping: {workshop_id}", icon="info") - self.stop_download() - return - show_message("Heads up! map not skipped => Skip is off in settings", f"This item may already be installed: {workshop_id}", icon="info") + if not update: + if any(workshop_id in item for item in self.library_tab.added_items): + if self.settings_tab.skip_already_installed: + show_message("Heads up!, map skipped => Skip is on in settings", f"This item may already be installed, Stopping: {workshop_id}", icon="info") + self.stop_download() + return + show_message("Heads up! map not skipped => Skip is off in settings", f"This item may already be installed: {workshop_id}", icon="info") self.after(1, lambda mid=workshop_id: self.label_file_size.configure(text=f"File size: {get_workshop_file_size(mid ,raw=True)}")) download_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "downloads", "311210", workshop_id) @@ -1462,7 +1488,21 @@ 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") - folder_name = extract_json_data(json_file_path, "FolderName") + items_file = os.path.join(cwd(), 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: + folder_name = get_folder_name + else: + try: + folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") + else: + try: + folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") if mod_type == "mod": mods_folder = os.path.join(destination_folder, "mods") @@ -1486,6 +1526,7 @@ class BOIIIWD(ctk.CTk): remove_tree(map_folder) remove_tree(download_folder) + self.library_tab.update_item(self.edit_destination_folder.get(), workshop_id, mod_type, folder_name) self.show_complete_message(message=f"{mod_type.capitalize()} files were downloaded\nYou can run the game now!\nPS: You have to restart the game \n(pressing launch will launch/restarts)") self.button_download.configure(state="normal") self.button_stop.configure(state="disabled") @@ -1552,3 +1593,7 @@ 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/resources/ryuk.ico b/boiiiwd_package/src/resources/ryuk.ico deleted file mode 100644 index 981a640c2bf982757fe69e2922229868d19b40d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc(i3s98T70172d59?D@>oE?-Nl6kmt9aEvH=!Y5J8YP;x5Z$mt7DQ1jH1pqDD>ta(=^7ZeK?7Y)iJMW&D5B7oZ88>oj%fZ+N9G?GLuJN(>85df4$$XQXVFv=}dR$ zd^_LwaqjP)|2g;EizF$;SEG^StMrWsNs5sq$skNTl8S}N&wU^9E;7t-{s+D*;(Fhv zPy`bY5PaW$Gg!A~+|OyepdbyA5!;Af>>?yM+UFCza3KN8z&ZI(Va|!KP$*DGsR#=4 zj~}htgf8I{YSkfB;iW$2qVNdjh0Oo#{16qArUpq{KWPEUjTG4GNm!PN6cR=JvSTby zeU5mwhcK-hN!LWwvSPx*g%*hw!mnY{cXFJhDx{zVGv_xue)TG(u0J4o{w3_=+ja{> z$MfV_Ruhq6BD3NkSsCr5TDk~!{1T}LVk%A$8l^{a{2Iyo?25U%XJi0y3sYC zXGP6Ua`J6NX|hqY{^Aqje@Ez_a_{^vNI+Wuvsq&(JpUxIaI08%v4n?(Qnb>@-q8_u z?>b1|rcnk4chT3^kGbVIlKbz|^^@~ocU`QVhyVy&{H|9}^y#grl(z zr_;^wz&`fuI>5yEID5wSGPres9#1!`TOTH(_kF(xzSCH+kV(7kKgf7kT~qOB{WCj17JJa6fVu*Tx=p^fWTDvzG%yPPX(ou{E`^wE8G= zU-s3|r^K%mOnHBuvL_?msXsA)rT1epTaMAuP|n2I05`5);@g+M&Z!gQ96j|y^lHygH{C7?%W|G@kYiSWEb zlXDn*RUyub6|65cGThzF&1*05#!p`72iLE1<(V^_KD3?9j!HZ&WsLUO#X9hiv+0#7 z>u+xLKdD8OS*-sL2oSXs*8M)FmQ(c9<*~6Yn~us{&VTv1FaGa+=L*k0HNhtP8Zwik z$}H=G%ki_#HBT>GT}?wZ41*OL6$m4?=%=42$zLL#+i2wB*xWvyvfq zGv9sT0++vbid|baP-it_)~e8{=aXmD&|0|)ZOswC_VO6=eww&?Zv3Dyq^jp9eZxE- z(Aw%|W5YxA)#tFKIiJqzhuAyR%~-z!SA9OUR&gfLs7Ox?N1wQu?DPb5#r;10d>Y8T zyYy+K0RQ=MQs=w%|EMf~@4X$n-gQkdN@*(1WRu_zJFIvctTdP9&{3O5&-wz&a+5I$ z?eo)@khWAsa>8N^Ih6#t|1>2BZ;2deXKFB8fA#e9M}hk*v~6(ESXIujy^xWPa=K~@ zX?)W=}XuMqqX{bR`W*FMMd zZ>So{(211p@mrdQr3GHLb~WHwS4>rL7F*g%#G0?9zPyOSY@_IltFUE@+^1>jY+l3K zA`?bq2FkRK+v9kVQrhNz{<_nLZ~v+z7olGokGxkI^>L!tRZvxwO;1ZX{m!*`8%rq9 zGl>5Q7huUY(cVx-jB4S`TEE-hiBgZ+aJx*AHvxm+*y xG0C@=siPM&KQ!cSyqVALo3B&`OzxNQF^j1!&m&gwVuVIB=Q@Xbng4(N{0Cdmh`;~< diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 8c4edb8..09fa236 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -1,6 +1,7 @@ from src.imports import * -from src.helpers import show_message, cwd, check_config,\ - save_config, reset_steamcmd, launch_boiii_func, get_latest_release_version +from src.helpers import * + +import src.shared_vars as shared def check_for_updates_func(window, ignore_up_todate=False): try: @@ -57,6 +58,7 @@ class SettingsTab(ctk.CTkFrame): self.steam_fail_number = 10 self.steamcmd_reset = False self.show_fails = True + self.check_items_on_launch = False # Left and right frames, use fg_color="transparent" self.grid_rowconfigure(0, weight=1) @@ -82,7 +84,7 @@ class SettingsTab(ctk.CTkFrame): self.console_var.trace_add("write", self.enable_save_button) self.checkbox_show_console = ctk.CTkSwitch(left_frame, text="Console (On Download)", variable=self.console_var) self.checkbox_show_console.grid(row=1, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_show_console_tooltip = CTkToolTip(self.checkbox_show_console, message="Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop button") + self.checkbox_show_console_tooltip = ctk_tooltip.CTkToolTip(self.checkbox_show_console, message="Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop button") self.console_var.set(self.load_settings("console")) # Show continuous checkbox @@ -90,7 +92,7 @@ class SettingsTab(ctk.CTkFrame): self.continuous_var.trace_add("write", self.enable_save_button) self.checkbox_continuous = ctk.CTkSwitch(left_frame, text="Continuous Download", variable=self.continuous_var) self.checkbox_continuous.grid(row=2, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_continuous_tooltip = CTkToolTip(self.checkbox_continuous, message="This will make sure that the download restarts and resumes! until it finishes if steamcmd crashes randomly (it will not redownload from the start)") + self.checkbox_continuous_tooltip = ctk_tooltip.CTkToolTip(self.checkbox_continuous, message="This will make sure that the download restarts and resumes! until it finishes if steamcmd crashes randomly (it will not redownload from the start)") self.continuous_var.set(self.load_settings("continuous_download")) # clean on finish checkbox @@ -98,7 +100,7 @@ class SettingsTab(ctk.CTkFrame): self.clean_checkbox_var.trace_add("write", self.enable_save_button) self.clean_checkbox = ctk.CTkSwitch(left_frame, text="Clean on finish", variable=self.clean_checkbox_var) self.clean_checkbox.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="nw") - self.clean_checkbox_tooltip = CTkToolTip(self.clean_checkbox, message="Cleans the map that have been downloaded and installed from steamcmd's steamapps folder ,to save space") + self.clean_checkbox_tooltip = ctk_tooltip.CTkToolTip(self.clean_checkbox, message="Cleans the map that have been downloaded and installed from steamcmd's steamapps folder ,to save space") self.clean_checkbox_var.set(self.load_settings("clean_on_finish", "on")) # Show estimated_progress checkbox @@ -106,36 +108,53 @@ class SettingsTab(ctk.CTkFrame): self.estimated_progress_var.trace_add("write", self.enable_save_button) self.estimated_progress_cb = ctk.CTkSwitch(left_frame, text="Estimated Progress Bar", variable=self.estimated_progress_var) self.estimated_progress_cb.grid(row=4, column=1, padx=20, pady=(20, 0), sticky="nw") - self.estimated_progress_var_tooltip = CTkToolTip(self.estimated_progress_cb, message="This will change how to progress bar works by estimating how long the download will take\ + self.estimated_progress_var_tooltip = ctk_tooltip.CTkToolTip(self.estimated_progress_cb, message="This will change how to progress bar works by estimating how long the download will take\ \nThis is not accurate ,it's better than with it off which is calculating the downloaded folder size which steamcmd dumps the full size rigth mostly") self.estimated_progress_var.set(self.load_settings("estimated_progress", "on")) # Show show fails checkbox self.show_fails_var = ctk.BooleanVar() self.show_fails_var.trace_add("write", self.enable_save_button) - self.show_fails_cb = ctk.CTkSwitch(left_frame, text="Show fails (on top of progress bar):", variable=self.show_fails_var) + self.show_fails_cb = ctk.CTkSwitch(left_frame, text="Show fails (on top of progress bar)", variable=self.show_fails_var) self.show_fails_cb.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="nw") - self.show_fails_tooltip = CTkToolTip(self.show_fails_cb, message="Display how many times steamcmd has failed/crashed\nIf the number is getting high quickly then try pressing Reset SteamCMD and try again, otherwise its fine") + self.show_fails_tooltip = ctk_tooltip.CTkToolTip(self.show_fails_cb, message="Display how many times steamcmd has failed/crashed\nIf the number is getting high quickly then try pressing Reset SteamCMD and try again, otherwise its fine") self.estimated_progress_var.set(self.load_settings("show_fails", "on")) # Show skip_already_installed maps checkbox self.skip_already_installed_var = ctk.BooleanVar() self.skip_already_installed_var.trace_add("write", self.enable_save_button) - self.skip_already_installed_ch = ctk.CTkSwitch(left_frame, text="Skip already installed maps:", variable=self.skip_already_installed_var) + self.skip_already_installed_ch = ctk.CTkSwitch(left_frame, text="Skip already installed maps", variable=self.skip_already_installed_var) self.skip_already_installed_ch.grid(row=6, column=1, padx=20, pady=(20, 0), sticky="nw") - self.skip_already_installed_ch_tooltip = CTkToolTip(self.skip_already_installed_ch, message="If on it will not download installed maps,\nthis can miss sometimes if you remove maps manually and not from library tab while the app is running") + self.skip_already_installed_ch_tooltip = ctk_tooltip.CTkToolTip(self.skip_already_installed_ch, message="If on it will not download installed maps,\nthis can miss sometimes if you remove maps manually and not from library tab while the app is running") self.skip_already_installed_var.set(self.load_settings("skip_already_installed", "on")) + # check items for update on launch + self.check_items_var = ctk.BooleanVar() + self.check_items_var.trace_add("write", self.enable_save_button) + self.check_items_ch = ctk.CTkSwitch(left_frame, text="Check Library items on launch", variable=self.check_items_var) + self.check_items_ch.grid(row=7, column=1, padx=20, pady=(20, 0), sticky="nw") + self.check_items_tooltip = ctk_tooltip.CTkToolTip(self.check_items_ch, message="This will show a window on launch of items that have pending updates -> you can open it manually from library tab") + self.check_items_var.set(self.load_settings("check_items", "off")) + # Resetr steam on many fails self.reset_steamcmd_on_fail_var = ctk.IntVar() self.reset_steamcmd_on_fail_var.trace_add("write", self.enable_save_button) - self.reset_steamcmd_on_fail_text = ctk.CTkLabel(left_frame, text=f"Reset steamcmd on % fails: (n of fails)", anchor="w") - self.reset_steamcmd_on_fail_text.grid(row=7, column=1, padx=20, pady=(10, 0), sticky="nw") + self.reset_steamcmd_on_fail_text = ctk.CTkLabel(left_frame, text=f"Reset steamcmd: (n of fails):", anchor="w") + self.reset_steamcmd_on_fail_text.grid(row=8, column=1, padx=20, pady=(10, 0), sticky="nw") self.reset_steamcmd_on_fail = ctk.CTkOptionMenu(left_frame, values=["5", "10", "20", "30", "40", "Custom", "Disable"], variable=self.reset_steamcmd_on_fail_var, command=self.reset_steamcmd_on_fail_func) - self.reset_steamcmd_on_fail.grid(row=8, column=1, padx=20, pady=(0, 0), sticky="nw") - self.reset_steamcmd_on_fail_tooltip = CTkToolTip(self.reset_steamcmd_on_fail, message="This actually fixes steamcmd when its crashing way too much") + self.reset_steamcmd_on_fail.grid(row=8, column=1, padx=(190, 0), pady=(10, 0), sticky="nw") + self.reset_steamcmd_on_fail_tooltip = ctk_tooltip.CTkToolTip(self.reset_steamcmd_on_fail, message="This actually fixes steamcmd when its crashing way too much") self.reset_steamcmd_on_fail.set(value=self.load_settings("reset_on_fail", "10")) + # item folder naming + self.folder_options_label_var = ctk.IntVar() + self.folder_options_label_var.trace_add("write", self.enable_save_button) + self.folder_options_label = ctk.CTkLabel(left_frame, text="Items Folder Naming:", anchor="nw") + self.folder_options_label.grid(row=10, column=1, padx=20, pady=(10, 0), sticky="nw") + self.folder_options = ctk.CTkOptionMenu(left_frame, values=["PublisherID", "FolderName"], variable=self.folder_options_label_var) + self.folder_options.grid(row=10, column=1, padx=(150, 0), pady=(3, 0), sticky="nw") + self.folder_options.set(value=self.load_settings("folder_naming", "PublisherID")) + # Check for updates button n Launch boiii self.check_for_updates = ctk.CTkButton(right_frame, text="Check for updates", command=self.settings_check_for_updates) self.check_for_updates.grid(row=1, column=1, padx=20, pady=(20, 0), sticky="n") @@ -145,28 +164,32 @@ class SettingsTab(ctk.CTkFrame): self.reset_steamcmd = ctk.CTkButton(right_frame, text="Reset SteamCMD", command=self.settings_reset_steamcmd) self.reset_steamcmd.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="n") - self.reset_steamcmd_tooltip = CTkToolTip(self.reset_steamcmd, message="This will remove steamapps folder + all the maps that are potentioaly corrupted or not so use at ur own risk (could fix some issues as well)") + self.reset_steamcmd_tooltip = ctk_tooltip.CTkToolTip(self.reset_steamcmd, message="This will remove steamapps folder + all the maps that are potentioaly corrupted\nor not so use at ur own risk (could fix some issues as well)") + + self.steam_to_boiii = ctk.CTkButton(right_frame, text="Steam to boiii", command=self.from_steam_to_boiii_toplevel) + self.steam_to_boiii.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="n") + self.steam_to_boiii_tooltip = ctk_tooltip.CTkToolTip(self.steam_to_boiii, message="Moves/copies maps and mods from steam to boiii (opens up a window)") # appearance self.appearance_mode_label = ctk.CTkLabel(right_frame, text="Appearance Mode:", anchor="n") - self.appearance_mode_label.grid(row=4, column=1, padx=20, pady=(20, 0)) + self.appearance_mode_label.grid(row=6, column=1, padx=20, pady=(20, 0)) self.appearance_mode_optionemenu = ctk.CTkOptionMenu(right_frame, values=["Light", "Dark", "System"], command=master.change_appearance_mode_event) - self.appearance_mode_optionemenu.grid(row=5, column=1, padx=20, pady=(0, 0)) + self.appearance_mode_optionemenu.grid(row=7, column=1, padx=20, pady=(0, 0)) self.scaling_label = ctk.CTkLabel(right_frame, text="UI Scaling:", anchor="n") - self.scaling_label.grid(row=6, column=1, padx=20, pady=(10, 0)) + self.scaling_label.grid(row=8, column=1, padx=20, pady=(10, 0)) self.scaling_optionemenu = ctk.CTkOptionMenu(right_frame, values=["80%", "90%", "100%", "110%", "120%"], command=master.change_scaling_event) - self.scaling_optionemenu.grid(row=7, column=1, padx=20, pady=(0, 0)) + self.scaling_optionemenu.grid(row=9, column=1, padx=20, pady=(0, 0)) # self.custom_theme = ctk.CTkButton(right_frame, text="Custom theme", command=self.boiiiwd_custom_theme) # self.custom_theme.grid(row=8, column=1, padx=20, pady=(20, 0), sticky="n") self.theme_options_label = ctk.CTkLabel(right_frame, text="Themes:", anchor="n") - self.theme_options_label.grid(row=8, column=1, padx=20, pady=(10, 0)) + self.theme_options_label.grid(row=10, column=1, padx=20, pady=(10, 0)) self.theme_options = ctk.CTkOptionMenu(right_frame, values=["Default", "Blue", "Grey", "Obsidian", "Ghost","NeonBanana", "Custom"], command=self.theme_options_func) - self.theme_options.grid(row=9, column=1, padx=20, pady=(0, 0)) + self.theme_options.grid(row=11, column=1, padx=20, pady=(0, 0)) self.theme_options.set(value=self.load_settings("theme", "Default")) # Save button @@ -238,6 +261,17 @@ class SettingsTab(ctk.CTkFrame): def save_settings(self): self.save_button.configure(state='disabled') + + if self.folder_options.get() == "PublisherID": + save_config("folder_naming", "0") + else: + save_config("folder_naming", "1") + + if self.check_items_var.get(): + save_config("check_items", "on") + else: + save_config("check_items", "off") + if self.check_updates_checkbox.get(): save_config("checkforupdtes", "on") else: @@ -295,6 +329,12 @@ class SettingsTab(ctk.CTkFrame): save_config("reset_on_fail", value) def load_settings(self, setting, fallback=None): + if setting == "folder_naming": + if check_config(setting, fallback) == "1": + return "FolderName" + else: + return "PublisherID" + if setting == "console": if check_config(setting, fallback) == "on": self.console = True @@ -381,7 +421,7 @@ class SettingsTab(ctk.CTkFrame): def boiiiwd_custom_theme(self, disable_only=None): file_to_rename = os.path.join(cwd(), "boiiiwd_theme.json") if os.path.exists(file_to_rename): - timestamp = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") + 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)) @@ -417,3 +457,205 @@ class SettingsTab(ctk.CTkFrame): def settings_reset_steamcmd(self): reset_steamcmd() + + def from_steam_to_boiii_toplevel(self): + def main_thread(): + try: + 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"))) + top.title("Steam to boiii -> Workshop items") + top.attributes('-topmost', 'true') + top.resizable(False, False) + # Create input boxes + center_frame = ctk.CTkFrame(top) + center_frame.grid(row=0, column=0, padx=20, pady=20) + + # Create input boxes + steam_folder_label = ctk.CTkLabel(center_frame, text="Steam Folder:") + steam_folder_label.grid(row=0, column=0, padx=(20, 20), pady=(10, 0), sticky='w') + steam_folder_entry = ctk.CTkEntry(center_frame, width=225) + steam_folder_entry.grid(row=1, column=0, columnspan=2, padx=(0, 20), pady=(10, 10), sticky='nes') + button_steam_browse = ctk.CTkButton(center_frame, text="Select", width=10) + button_steam_browse.grid(row=1, column=2, padx=(0, 20), pady=(10, 10), sticky="wnes") + + boiii_folder_label = ctk.CTkLabel(center_frame, text="boiii Folder:") + boiii_folder_label.grid(row=2, column=0, padx=(20, 20), pady=(10, 0), sticky='w') + boiii_folder_entry = ctk.CTkEntry(center_frame, width=225) + boiii_folder_entry.grid(row=3, column=0, columnspan=2, padx=(0, 20), pady=(10, 10), sticky='nes') + button_BOIII_browse = ctk.CTkButton(center_frame, text="Select", width=10) + button_BOIII_browse.grid(row=3, column=2, padx=(0, 20), pady=(10, 10), sticky="wnes") + + # Create option to choose between cut or copy + operation_label = ctk.CTkLabel(center_frame, text="Choose operation:") + operation_label.grid(row=4, column=0, padx=(20, 20), pady=(10, 10), sticky='wnes') + copy_var = ctk.BooleanVar() + cut_var = ctk.BooleanVar() + copy_check = ctk.CTkCheckBox(center_frame, text="Copy", variable=copy_var) + cut_check = ctk.CTkCheckBox(center_frame, text="Cut", variable=cut_var) + copy_check.grid(row=4, column=1, padx=(0, 10), pady=(10, 10), sticky='wnes') + cut_check.grid(row=4, column=2, padx=(0, 10), pady=(10, 10), sticky='nes') + + # Create progress bar + progress_bar = ctk.CTkProgressBar(center_frame, mode="determinate", height=20, corner_radius=7) + progress_bar.grid(row=5, column=0, columnspan=3, padx=(20, 20), pady=(10, 10), sticky='wnes') + progress_text = ctk.CTkLabel(progress_bar, text="0%", font=("Helvetica", 12), fg_color="transparent", text_color="white", height=0, width=0, corner_radius=0) + progress_text.place(relx=0.5, rely=0.5, anchor="center") + + copy_button = ctk.CTkButton(center_frame, text="Start (Copy)") + copy_button.grid(row=6, column=0, columnspan=3,padx=(20, 20), pady=(10, 10), sticky='wnes') + + # funcs + # had to use this shit again cuz of threading issues with widgets + def copy_with_progress(src, dst): + try: + total_files = sum([len(files) for root, dirs, files in os.walk(src)]) + progress = 0 + + def copy_progress(src, dst): + nonlocal progress + shutil.copy2(src, dst) + progress += 1 + top.after(0, progress_text.configure(text=f"Copying files: {progress}/{total_files}")) + value = (progress / total_files) * 100 + valuep = value / 100 + progress_bar.set(valuep) + + try: + shutil.copytree(src, dst, dirs_exist_ok=True, copy_function=copy_progress) + except Exception as E: + show_message("Error", f"Error copying files: {E}", icon="cancel") + finally: + top.after(0, progress_text.configure(text="0%")) + top.after(0, progress_bar.set(0.0)) + + def check_status(var, op_var): + if var.get(): + op_var.set(False) + if cut_var.get(): + copy_button.configure(text=f"Start (Cut)") + if copy_var.get(): + copy_button.configure(text=f"Start (Copy)") + + def open_BOIII_browser(): + selected_folder = ctk.filedialog.askdirectory(title="Select boiii Folder") + if selected_folder: + boiii_folder_entry.delete(0, "end") + boiii_folder_entry.insert(0, selected_folder) + + def open_steam_browser(): + selected_folder = ctk.filedialog.askdirectory(title="Select Steam Folder (ex: C:\Program Files (x86)\Steam)") + if selected_folder: + steam_folder_entry.delete(0, "end") + steam_folder_entry.insert(0, selected_folder) + save_config("steam_folder" ,steam_folder_entry.get()) + + def start_copy_operation(): + def start_thread(): + try: + if not cut_var.get() and not copy_var.get(): + show_message("Choose operation!", "Please choose an operation, Copy or Cut files from steam!") + return + + copy_button.configure(state="disabled") + steam_folder = steam_folder_entry.get() + ws_folder = os.path.join(steam_folder, "steamapps/workshop/content/311210") + boiii_folder = boiii_folder_entry.get() + + if not os.path.exists(steam_folder) and not os.path.exists(ws_folder): + show_message("Not found", "Either you have no items downloaded from Steam or wrong path, please recheck path (ex: C:\Program Files (x86)\Steam)") + return + + if not os.path.exists(boiii_folder): + show_message("Not found", "boiii folder not found, please recheck path") + return + + top.after(0, progress_text.configure(text="Loading...")) + + map_folder = os.path.join(ws_folder) + + subfolders = [f for f in os.listdir(map_folder) if os.path.isdir(os.path.join(map_folder, f))] + total_folders = len(subfolders) + + if not subfolders: + show_message("No items found", f"No items found in \n{map_folder}") + return + + for i, workshop_id in enumerate(subfolders, start=1): + json_file_path = os.path.join(map_folder, workshop_id, "workshop.json") + copy_button.configure(text=f"Working on -> {i}/{total_folders}") + + if os.path.exists(json_file_path): + mod_type = extract_json_data(json_file_path, "Type") + items_file = os.path.join(cwd(), 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") + if get_folder_name: + folder_name = get_folder_name + else: + try: + folder_name = extract_json_data(json_file_path, shared.app.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") + else: + try: + folder_name = extract_json_data(json_file_path, shared.app.settings_tab.folder_options.get()) + except: + folder_name = extract_json_data(json_file_path, "publisherID") + + if mod_type == "mod": + mods_folder = os.path.join(boiii_folder, "mods") + folder_name_path = os.path.join(mods_folder, folder_name, "zone") + elif mod_type == "map": + usermaps_folder = os.path.join(boiii_folder, "usermaps") + folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") + else: + show_message("Error", "Invalid workshop type in workshop.json, are you sure this is a map or a mod?.", icon="cancel") + continue + + os.makedirs(folder_name_path, exist_ok=True) + + try: + copy_with_progress(os.path.join(map_folder, workshop_id), folder_name_path) + except Exception as E: + show_message("Error", f"Error copying files: {E}", icon="cancel") + continue + + if cut_var.get(): + remove_tree(os.path.join(map_folder, workshop_id)) + + if subfolders: + shared.app.show_complete_message(message=f"All items were moved\nYou can run the game now!\nPS: You have to restart the game\n(pressing launch will launch/restarts)") + + finally: + if cut_var.get(): + copy_button.configure(text=f"Start (Cut)") + if copy_var.get(): + copy_button.configure(text=f"Start (Copy)") + copy_button.configure(state="normal") + top.after(0, progress_bar.set(0)) + top.after(0, progress_text.configure(text="0%")) + + # prevents app hanging + threading.Thread(target=start_thread).start() + + # config + progress_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "progress_bar_fill_color") + progress_bar.configure(progress_color=progress_color) + steam_folder_entry.insert(1, check_config("steam_folder", "")) + boiii_folder_entry.insert(1, shared.app.edit_destination_folder.get()) + button_BOIII_browse.configure(command=open_BOIII_browser) + button_steam_browse.configure(command=open_steam_browser) + copy_button.configure(command=start_copy_operation) + cut_check.configure(command = lambda: check_status(cut_var, copy_var)) + copy_check.configure(command = lambda: check_status(copy_var, cut_var)) + shared.app.create_context_menu(steam_folder_entry) + shared.app.create_context_menu(boiii_folder_entry) + copy_var.set(True) + progress_bar.set(0) + + except Exception as e: + show_message("Error", f"{e}", icon="cancel") + + shared.app.after(0, main_thread) diff --git a/boiiiwd_package/src/shared_vars.py b/boiiiwd_package/src/shared_vars.py new file mode 100644 index 0000000..af5b483 --- /dev/null +++ b/boiiiwd_package/src/shared_vars.py @@ -0,0 +1,3 @@ +import src.main as main + +app = main.BOIIIWD() diff --git a/boiiiwd_package/src/update_window.py b/boiiiwd_package/src/update_window.py index 069128d..8db49ea 100644 --- a/boiiiwd_package/src/update_window.py +++ b/boiiiwd_package/src/update_window.py @@ -1,6 +1,5 @@ from src.imports import * -from src.helpers import show_message, check_config, check_custom_theme,\ - get_button_state_colors, convert_bytes_to_readable, create_update_script +from src.helpers import * class UpdateWindow(ctk.CTkToplevel): def __init__(self, master, update_url): diff --git a/build.py b/build.py index 8032945..101f272 100644 --- a/build.py +++ b/build.py @@ -4,8 +4,8 @@ from distutils.sysconfig import get_python_lib site_packages_path = get_python_lib() NAME = "BOIIIWD" -SCRIPT = "boiiiwd.py" -ICON = "boiiiwd_package/ryuk.ico" +SCRIPT = "boiiiwd_package/boiiiwd.py" +ICON = "boiiiwd_package/resources/ryuk.ico" PyInstaller.__main__.run([ "{}".format(SCRIPT), @@ -15,7 +15,14 @@ PyInstaller.__main__.run([ "--windowed", "--ascii", "--icon", f"{ICON}", - "--add-data", "boiiiwd_package/src/resources;resources", + "--add-data", "boiiiwd_package/resources;resources", + "--add-data", "boiiiwd_package/src;imports", + "--add-data", "boiiiwd_package/src;helpers", + "--add-data", "boiiiwd_package/src;shared_vars", + "--add-data", "boiiiwd_package/src;library_tab", + "--add-data", "boiiiwd_package/src;settings_tab", + "--add-data", "boiiiwd_package/src;update_window", + "--add-data", "boiiiwd_package/src;main", "--add-data", f"{site_packages_path}\customtkinter;customtkinter", "--add-data", f"{site_packages_path}\CTkMessagebox;CTkMessagebox", "--add-data", f"{site_packages_path}\CTkToolTip;CTkToolTip", From 7f4817a94071ff9f7405a4bb0ec04b649e29ed22 Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Wed, 20 Sep 2023 02:35:24 -0230 Subject: [PATCH 02/38] remove old files --- boiiiwd.py | 3485 ------------------------------------------- boiiiwd_old_pyqt.py | 999 ------------- 2 files changed, 4484 deletions(-) delete mode 100644 boiiiwd.py delete mode 100644 boiiiwd_old_pyqt.py diff --git a/boiiiwd.py b/boiiiwd.py deleted file mode 100644 index 76a9e64..0000000 --- a/boiiiwd.py +++ /dev/null @@ -1,3485 +0,0 @@ -# Use CTkToolTip and CTkListbox from my repo originally by Akascape (https://github.com/Akascape) -from CTkMessagebox import CTkMessagebox -from tkinter import Menu, END, Event -from bs4 import BeautifulSoup -from datetime import datetime -import customtkinter as ctk -from pathlib import Path -from CTkToolTip import * -from CTkListbox import * -from PIL import Image -import configparser -import webbrowser -import subprocess -import threading -import requests -import zipfile -import shutil -import psutil -import json -import math -import time -import sys -import io -import os -import re - -VERSION = "v0.3.1" -GITHUB_REPO = "faroukbmiled/BOIIIWD" -LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip" -UPDATER_FOLDER = "update" -CONFIG_FILE_PATH = "config.ini" -RESOURCES_DIR = os.path.join(os.path.dirname(__file__), 'resources') -LIBRARY_FILE = "boiiiwd_library.json" - -# 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) - if fallback: - return config.get("Settings", name, fallback=fallback) - return config.get("Settings", name, fallback="") - -def save_config(name, value): - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - if name and value: - config.set("Settings", name, value) - with open(CONFIG_FILE_PATH, "w") as config_file: - 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) - else: - try: - return os.path.join(RESOURCES_DIR, theme_name) - except: - return os.path.join(RESOURCES_DIR, "boiiiwd_theme.json") - -# theme initialization -ctk.set_appearance_mode(check_config("appearance", "Dark")) # Modes: "System" (standard), "Dark", "Light" -try: - ctk.set_default_color_theme(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json"))) -except: - save_config("theme", "boiiiwd_theme.json") - ctk.set_default_color_theme(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json")) - -def get_latest_release_version(): - try: - release_api_url = f"https://api.github.com/repos/{GITHUB_REPO}/releases/latest" - response = requests.get(release_api_url) - response.raise_for_status() - data = response.json() - return data["tag_name"] - except requests.exceptions.RequestException as e: - show_message("Warning", f"Error while checking for updates: \n{e}") - return None - -def create_update_script(current_exe, new_exe, updater_folder, program_name): - script_content = f""" - @echo off - echo Terminating BOIIIWD.exe... - taskkill /im "{program_name}" /t /f - - echo Replacing BOIIIWD.exe... - cd "{updater_folder}" - taskkill /im "{program_name}" /t /f - move /y "{new_exe}" "../"{program_name}"" - - echo Starting BOIIIWD.exe... - cd .. - start "" "{current_exe}" - - echo Exiting! - exit - """ - - script_path = os.path.join(updater_folder, "boiiiwd_updater.bat") - with open(script_path, "w") as script_file: - script_file.write(script_content) - - return script_path - -def is_internet_available(): - try: - requests.get("https://www.google.com", timeout=3) - return True - except: - return False - -def check_for_updates_func(window, ignore_up_todate=False): - if not is_internet_available(): - show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") - return - 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") - -def extract_workshop_id(link): - try: - pattern = r'(?<=id=)(\d+)' - match = re.search(pattern, link) - - if match: - return match.group(0) - else: - return None - except: - return None - -def check_steamcmd(): - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - - if not os.path.exists(steamcmd_exe_path): - return False - - return True - -def initialize_steam(master): - try: - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - process = subprocess.Popen([steamcmd_exe_path, "+quit"], creationflags=subprocess.CREATE_NEW_CONSOLE) - master.attributes('-alpha', 0.0) - process.wait() - if is_steamcmd_initialized(): - show_message("SteamCMD has terminated!", "BOIIIWD is ready for action.", icon="info") - else: - show_message("SteamCMD has terminated!!", "SteamCMD isn't initialized yet") - except: - show_message("Error!", "An error occurred please check your paths and try again.", icon="cancel") - master.attributes('-alpha', 1.0) - - -def valid_id(workshop_id): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - soup = BeautifulSoup(content, "html.parser") - - try: - soup.find("div", class_="rightDetailsBlock").text.strip() - soup.find("div", class_="workshopItemTitle").text.strip() - soup.find("div", class_="detailsStatRight").text.strip() - stars_div = soup.find("div", class_="fileRatingDetails") - stars_div.find("img")["src"] - return True - except: - return False - -def convert_speed(speed_bytes): - if speed_bytes < 1024: - return speed_bytes, "B/s" - elif speed_bytes < 1024 * 1024: - return speed_bytes / 1024, "KB/s" - elif speed_bytes < 1024 * 1024 * 1024: - return speed_bytes / (1024 * 1024), "MB/s" - else: - return speed_bytes / (1024 * 1024 * 1024), "GB/s" - -def create_default_config(): - config = configparser.ConfigParser() - config["Settings"] = { - "SteamCMDPath": cwd(), - "DestinationFolder": "", - "checkforupdtes": "on", - "console": "off" - } - with open(CONFIG_FILE_PATH, "w") as config_file: - config.write(config_file) - -def get_steamcmd_path(): - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - return config.get("Settings", "SteamCMDPath", fallback=cwd()) - -def extract_json_data(json_path, key): - with open(json_path, 'r') as json_file: - data = json.load(json_file) - return data.get(key, '') - -def convert_bytes_to_readable(size_in_bytes, no_symb=None): - for unit in ['B', 'KB', 'MB', 'GB', 'TB']: - if size_in_bytes < 1024.0: - if no_symb: - return f"{size_in_bytes:.2f}" - return f"{size_in_bytes:.2f} {unit}" - size_in_bytes /= 1024.0 - -def get_workshop_file_size(workshop_id, raw=None): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}&searchtext=" - response = requests.get(url) - soup = BeautifulSoup(response.text, "html.parser") - file_size_element = soup.find("div", class_="detailsStatRight") - - try: - if raw: - file_size_text = file_size_element.get_text(strip=True) - file_size_text = file_size_text.replace(",", "") - file_size_in_mb = float(file_size_text.replace(" MB", "")) - file_size_in_bytes = int(file_size_in_mb * 1024 * 1024) - return convert_bytes_to_readable(file_size_in_bytes) - - if file_size_element: - file_size_text = file_size_element.get_text(strip=True) - file_size_text = file_size_text.replace(",", "") - file_size_in_mb = float(file_size_text.replace(" MB", "")) - file_size_in_bytes = int(file_size_in_mb * 1024 * 1024) - return file_size_in_bytes - return None - except: - return None - -def show_message(title, message, icon="warning", _return=False, option_1="No", option_2="Ok"): - if _return: - msg = CTkMessagebox(title=title, message=message, icon=icon, option_1=option_1, option_2=option_2, sound=True) - response = msg.get() - if response == option_1: - return False - elif response == option_2: - return True - else: - return False - else: - def callback(): - CTkMessagebox(title=title, message=message, icon=icon, sound=True) - app.after(0, callback) - -def launch_boiii_func(path): - procname = "boiii.exe" - try: - if procname in (p.name() for p in psutil.process_iter()): - for proc in psutil.process_iter(): - if proc.name() == procname: - proc.kill() - boiii_path = os.path.join(path, procname) - subprocess.Popen([boiii_path ,"-launch"] , cwd=path) - show_message("Please wait!", "The game has launched in the background it will open up in a sec!", icon="info") - except Exception as e: - show_message("Error: Failed to launch BOIII", f"Failed to launch boiii.exe\nMake sure to put in your correct boiii path\n{e}") - -def remove_tree(folder_path, show_error=None): - if show_error: - try: - shutil.rmtree(folder_path) - except Exception as e: - show_message("Error!", f"An error occurred while trying to remove files:\n{e}", icon="cancel") - try: - shutil.rmtree(folder_path) - except Exception as e: - pass - -def convert_seconds(seconds): - minutes, seconds = divmod(seconds, 60) - hours, minutes = divmod(minutes, 60) - return hours, minutes, seconds - -def get_folder_size(folder_path): - total_size = 0 - for path, dirs, files in os.walk(folder_path): - for f in files: - fp = os.path.join(path, f) - total_size += os.stat(fp).st_size - return total_size - -def is_steamcmd_initialized(): - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - steamcmd_size = os.path.getsize(steamcmd_exe_path) - if steamcmd_size < 3 * 1024 * 1024: - return False - return True - -def get_button_state_colors(file_path, state): - try: - with open(file_path, 'r') as json_file: - data = json.load(json_file) - if 'BOIIIWD_Globals' in data: - boiiiwd_globals = data['BOIIIWD_Globals'] - if state in boiiiwd_globals: - return boiiiwd_globals[state] - else: - return None - else: - return None - except FileNotFoundError: - return None - except json.JSONDecodeError: - return None - -def reset_steamcmd(no_warn=None): - steamcmd_path = get_steamcmd_path() - - directories_to_reset = ["steamapps", "dumps", "logs", "depotcache", "appcache","userdata",] - - for directory in directories_to_reset: - directory_path = os.path.join(steamcmd_path, directory) - if os.path.exists(directory_path): - remove_tree(directory_path, show_error=True) - - for root, _, files in os.walk(steamcmd_path): - for filename in files: - if filename.endswith((".old", ".crash")): - file_path = os.path.join(root, filename) - os.remove(file_path) - - if not no_warn: - show_message("Success!", "SteamCMD has been reset successfully!", icon="info") - else: - if not no_warn: - show_message("Warning!", "steamapps folder was not found, maybe already removed?", icon="warning") - -def get_item_name(id): - try: - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - - soup = BeautifulSoup(content, "html.parser") - - try: - map_name = soup.find("div", class_="workshopItemTitle").text.strip() - name = map_name[:32] + "..." if len(map_name) > 32 else map_name - return name - except: - return True - except: - return False - -# you gotta use my modded CTkToolTip originaly by Akascape -def show_noti(widget ,message, event=None, noti_dur=3.0, topmost=False): - CTkToolTip(widget, message=message, is_noti=True, noti_event=event, noti_dur=noti_dur, topmost=topmost) - -def check_item_date(down_date, date_updated): - current_year = datetime.now().year - date_format_with_year = "%d %b, %Y @ %I:%M%p" - date_format_with_added_year = "%d %b @ %I:%M%p, %Y" - try: - try: - download_datetime = datetime.strptime(down_date, date_format_with_year) - except ValueError: - download_datetime = datetime.strptime(down_date + f", {current_year}", date_format_with_added_year) - - try: - upload_datetime = datetime.strptime(date_updated, date_format_with_year) - except ValueError: - upload_datetime = datetime.strptime(date_updated + f", {current_year}", date_format_with_added_year) - - if upload_datetime >= download_datetime: - return True - elif upload_datetime < download_datetime: - return False - except: - return False - -# End helper functions -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") - if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): - self.after(250, lambda: self.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) - self.protocol("WM_DELETE_WINDOW", self.cancel_update) - self.attributes('-topmost', 'true') - - self.columnconfigure(0, weight=1) - self.columnconfigure(1, weight=1) - self.rowconfigure(0, weight=1) - self.rowconfigure(1, weight=1) - - self.label_download = ctk.CTkLabel(self, text="Starting...") - self.label_download.grid(row=0, column=0, padx=30, pady=(10, 0), sticky="w") - - self.label_size = ctk.CTkLabel(self, text="Size: 0") - self.label_size.grid(row=0, column=1, padx=30, pady=(10, 0), sticky="e") - - self.progress_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "progress_bar_fill_color") - self.progress_bar = ctk.CTkProgressBar(self, mode="determinate", height=20, corner_radius=7, progress_color=self.progress_color) - self.progress_bar.grid(row=1, column=0, columnspan=4, padx=30, pady=10, sticky="ew") - self.progress_bar.set(0) - - self.progress_label = ctk.CTkLabel(self.progress_bar, text="0%", font=("Helvetica", 12), fg_color="transparent", height=0, width=0, corner_radius=0) - self.progress_label.place(relx=0.5, rely=0.5, anchor="center") - - self.cancel_button = ctk.CTkButton(self, text="Cancel", command=self.cancel_update) - self.cancel_button.grid(row=2, column=0, padx=30, pady=(0, 10), sticky="w") - - self.update_url = update_url - self.total_size = None - self.up_cancelled = False - - def update_progress_bar(self): - try: - update_dir = os.path.join(os.getcwd(), UPDATER_FOLDER) - response = requests.get(LATEST_RELEASE_URL, stream=True) - response.raise_for_status() - current_exe = sys.argv[0] - program_name = os.path.basename(current_exe) - new_exe = os.path.join(update_dir, "BOIIIWD.exe") - - if not os.path.exists(update_dir): - os.makedirs(update_dir) - - self.progress_bar.set(0.0) - self.total_size = int(response.headers.get('content-length', 0)) - self.label_size.configure(text=f"Size: {convert_bytes_to_readable(self.total_size)}") - zip_path = os.path.join(update_dir, "latest_version.zip") - - with open(zip_path, "wb") as file: - downloaded_size = 0 - for chunk in response.iter_content(chunk_size=8192): - if self.up_cancelled: - break - if chunk: - file.write(chunk) - downloaded_size += len(chunk) - progress = int((downloaded_size / self.total_size) * 100) - - self.after(1, lambda p=progress: self.label_download.configure(text=f"Downloading update...")) - self.after(1, lambda v=progress / 100.0: self.progress_bar.set(v)) - self.after(1, lambda p=progress: self.progress_label.configure(text=f"{p}%")) - - if not self.up_cancelled: - self.progress_bar.set(1.0) - with zipfile.ZipFile(zip_path, "r") as zip_ref: - zip_ref.extractall(update_dir) - self.label_download.configure(text="Update Downloaded successfully!") - def update_msg(): - msg = CTkMessagebox(title="Success!", message="Update Downloaded successfully!\nPress ok to install it", icon="info", option_1="No", option_2="Ok", sound=True) - response = msg.get() - if response == "No": - self.destroy() - return - elif response == "Ok": - script_path = create_update_script(current_exe, new_exe, update_dir, program_name) - subprocess.run(('cmd', '/C', 'start', '', fr'{script_path}')) - sys.exit(0) - else: - return - self.after(0, update_msg) - return - else: - if os.path.exists(zip_path): - os.remove(fr"{zip_path}") - 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) - except: - pass - show_message("Cancelled!", "Update cancelled by user", icon="warning") - except Exception as e: - self.progress_bar.set(0.0) - self.label_download.configure(text="Update failed") - show_message("Error", f"Error installing the update\n{e}", icon="cancel") - - def start_update(self): - self.thread = threading.Thread(target=self.update_progress_bar) - self.thread.start() - - def cancel_update(self): - self.up_cancelled = True - self.withdraw() - -class LibraryTab(ctk.CTkScrollableFrame): - def __init__(self, master, **kwargs): - - super().__init__(master, **kwargs) - self.added_items = set() - self.to_update = set() - self.grid_columnconfigure(0, weight=1) - - self.radiobutton_variable = ctk.StringVar() - self.no_items_label = ctk.CTkLabel(self, text="", anchor="w") - self.filter_entry = ctk.CTkEntry(self, placeholder_text="Your search query here, or type in mod or map to only see that") - self.filter_entry.bind("", self.filter_items) - self.filter_entry.grid(row=0, column=0, padx=(10, 20), pady=(10, 20), sticky="we") - filter_refresh_button_image = os.path.join(RESOURCES_DIR, "Refresh_icon.svg.png") - update_button_image = os.path.join(RESOURCES_DIR, "update_icon.png") - self.filter_refresh_button = ctk.CTkButton(self, image=ctk.CTkImage(Image.open(filter_refresh_button_image)), command=self.refresh_items, width=20, height=20, - fg_color="transparent", text="") - self.filter_refresh_button.grid(row=0, column=1, padx=(10, 0), pady=(10, 20), sticky="nw") - self.update_button = ctk.CTkButton(self, image=ctk.CTkImage(Image.open(update_button_image)), command=self.check_for_updates, width=65, height=20, - text="", fg_color="transparent") - self.update_button.grid(row=0, column=1, padx=(0, 20), pady=(10, 20), sticky="en") - self.update_tooltip = CTkToolTip(self.update_button, message="Check items for updates", topmost=True) - filter_tooltip = CTkToolTip(self.filter_refresh_button, message="Refresh library", topmost=True) - self.label_list = [] - self.button_list = [] - self.button_view_list = [] - self.file_cleaned = False - self.filter_type = True - self.clipboard_has_content = False - self.item_block_list = set() - self.added_folders = set() - self.ids_added = set() - - def add_item(self, item, image=None, workshop_id=None, folder=None, invalid_warn=False): - label = ctk.CTkLabel(self, text=item, image=image, compound="left", padx=5, anchor="w") - button = ctk.CTkButton(self, text="Remove", width=60, height=24, fg_color="#3d3f42") - button_view = ctk.CTkButton(self, text="Details", width=55, height=24, fg_color="#3d3f42") - button.configure(command=lambda: self.remove_item(item, folder, workshop_id)) - button_view.configure(command=lambda: self.show_map_info(workshop_id, invalid_warn)) - button_view_tooltip = CTkToolTip(button_view, message="Opens up a window that shows basic details") - button_tooltip = CTkToolTip(button, message="Removes the map/mod from your game") - label.grid(row=len(self.label_list) + 1, column=0, pady=(0, 10), padx=(5, 10), sticky="w") - button.grid(row=len(self.button_list) + 1, column=1, pady=(0, 10), padx=(50, 10), sticky="e") - button_view.grid(row=len(self.button_view_list) + 1, column=1, pady=(0, 10), padx=(10, 75), sticky="w") - self.label_list.append(label) - self.button_list.append(button) - self.button_view_list.append(button_view) - label.bind("", lambda event, label=label: self.on_label_hover(label, enter=True)) - label.bind("", lambda event, label=label: self.on_label_hover(label, enter=False)) - label.bind("", lambda event, label=label: self.copy_to_clipboard(label, workshop_id, event)) - label.bind("", lambda event, label=label: self.copy_to_clipboard(label, workshop_id, event, append=True)) - label.bind("", lambda event: self.open_folder_location(folder, event)) - label.bind("", lambda event, label=label: self.copy_to_clipboard(label, folder, event)) - if invalid_warn: - label_warn = CTkToolTip(label, message="Duplicated or Blocked item (Search item id in search)") - - def on_label_hover(self, label, enter): - if enter: - label.configure(fg_color="#272727") - else: - label.configure(fg_color="transparent") - - def copy_to_clipboard(self, label, something, event=None, append=False): - try: - if append: - if self.clipboard_has_content: - label.clipboard_append(f"\n{something}") - show_noti(label, "Appended to clipboard", event, 1.0) - else: - label.clipboard_clear() - label.clipboard_append(something) - self.clipboard_has_content = True - show_noti(label, "Copied to clipboard", event, 1.0) - else: - label.clipboard_clear() - label.clipboard_append(something) - self.clipboard_has_content = True - show_noti(label, "Copied to clipboard", event, 1.0) - except: - pass - - def open_folder_location(self, folder, event=None): - if os.path.exists(folder): - os.startfile(folder) - show_noti(self, "Opening folder", event, 1.0) - - def item_exists_in_file(self, items_file, workshop_id, folder_name=None): - if not os.path.exists(items_file): - return False, False - - with open(items_file, "r") as f: - items_data = json.load(f) - for item_info in items_data: - if "id" in item_info and "folder_name" in item_info and "json_folder_name" in item_info: - if item_info["id"] == workshop_id and item_info["folder_name"] == folder_name: - if item_info["folder_name"] in self.added_folders: - continue - if item_info["folder_name"] in self.item_block_list: - return False ,None - return True, True - elif item_info["id"] == workshop_id: - if item_info["folder_name"] in self.added_folders: - continue - if item_info["folder_name"] in self.item_block_list: - return False ,None - return True, False - - elif "id" in item_info and item_info["id"] == workshop_id: - return True, False - return False, False - - def remove_item_by_option(self, items_file, option, option_name="id"): - - if not os.path.exists(items_file): - return - - with open(items_file, "r") as f: - items_data = json.load(f) - - updated_items_data = [item for item in items_data if item.get(option_name) != option] - - if len(updated_items_data) < len(items_data): - with open(items_file, "w") as f: - json.dump(updated_items_data, f, indent=4) - - def get_item_by_id(self, items_file, item_id, return_option="all"): - - if not os.path.exists(items_file): - return None - - with open(items_file, "r") as f: - items_data = json.load(f) - - for item in items_data: - if item.get("id") == item_id: - if return_option == "all": - return item - elif return_option == return_option: - return item.get(return_option) - return None - - def get_item_index_by_id(self, items_data, item_id): - for index, item in enumerate(items_data): - if item.get("id") == item_id: - return index - return None - - def update_or_add_item_by_id(self, items_file, item_info, item_id): - if not os.path.exists(items_file): - with open(items_file, "w") as f: - json.dump([item_info], f, indent=4) - else: - with open(items_file, "r+") as f: - items_data = json.load(f) - existing_item_index = self.get_item_index_by_id(items_data, item_id) - if existing_item_index is not None: - items_data[existing_item_index] = item_info - else: - items_data.append(item_info) - f.seek(0) - f.truncate() - json.dump(items_data, f, indent=4) - - def clean_json_file(self, file): - - if not os.path.exists(file): - show_message("Error", f"File '{file}' does not exist.") - return - - with open(file, "r") as f: - items_data = json.load(f) - - cleaned_items = [item for item in items_data if 'folder_name' in item and 'json_folder_name' - in item and item['folder_name'] not in self.item_block_list and item['folder_name'] in self.added_folders] - - with open(file, 'w') as file: - json.dump(cleaned_items, file, indent=4) - - def filter_items(self, event): - filter_text = self.filter_entry.get().lower() - for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): - item_text = label.cget("text").lower() - if filter_text in item_text: - label.grid() - button.grid() - button_view_list.grid() - else: - label.grid_remove() - button_view_list.grid_remove() - button.grid_remove() - - def load_items(self, boiiiFolder): - maps_folder = Path(boiiiFolder) / "mods" - mods_folder = Path(boiiiFolder) / "usermaps" - mod_img = os.path.join(RESOURCES_DIR, "mod_image.png") - map_img = os.path.join(RESOURCES_DIR, "map_image.png") - b_mod_img = os.path.join(RESOURCES_DIR, "b_mod_image.png") - b_map_img = os.path.join(RESOURCES_DIR, "b_map_image.png") - map_count = 0 - mod_count = 0 - total_size = 0 - - folders_to_process = [mods_folder, maps_folder] - - items_file = os.path.join(cwd(), LIBRARY_FILE) - - for folder_path in folders_to_process: - for zone_path in folder_path.glob("**/zone"): - json_path = zone_path / "workshop.json" - if json_path.exists(): - # current folder name - curr_folder_name = zone_path.parent.name - - workshop_id = extract_json_data(json_path, "PublisherID") - name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "") - name = name[:45] + "..." if len(name) > 45 else name - item_type = extract_json_data(json_path, "Type") - folder_name = extract_json_data(json_path, "FolderName") - folder_size_bytes = get_folder_size(zone_path.parent) - size = convert_bytes_to_readable(folder_size_bytes) - total_size += folder_size_bytes - text_to_add = f"{name} | Type: {item_type.capitalize()}" - mode_type = "ZM" if item_type == "map" and folder_name.startswith("zm") else "MP" if folder_name.startswith("mp") and item_type == "map" else None - if mode_type: - text_to_add += f" | Mode: {mode_type}" - text_to_add += f" | ID: {workshop_id} | Size: {size}" - - creation_timestamp = None - for ff_file in zone_path.glob("*.ff"): - if ff_file.exists(): - creation_timestamp = ff_file.stat().st_ctime - break - - if creation_timestamp is not None: - date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") - else: - creation_timestamp = zone_path.stat().st_ctime - date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") - - map_count += 1 if item_type == "map" else 0 - mod_count += 1 if item_type == "mod" else 0 - if curr_folder_name not in self.added_folders: - image_path = mod_img if item_type == "mod" else map_img - if not (str(curr_folder_name).strip() == str(workshop_id).strip() or str(curr_folder_name).strip() == str(folder_name).strip()): - try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") - except: pass - self.item_block_list.add(curr_folder_name) - image_path = b_mod_img if item_type == "mod" else b_map_img - text_to_add += " | ⚠️" - elif curr_folder_name not in self.added_folders and workshop_id in self.ids_added: - try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") - except: pass - image_path = b_mod_img if item_type == "mod" else b_map_img - text_to_add += " | ⚠️" - - self.added_items.add(text_to_add) - if image_path is b_mod_img or image_path is b_map_img: - self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent, invalid_warn=True) - else: - self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent) - id_found, folder_found = self.item_exists_in_file(items_file, workshop_id, curr_folder_name) - item_info = { - "id": workshop_id, - "text": text_to_add, - "date": date_added, - "folder_name": curr_folder_name, - "json_folder_name": folder_name - } - # when item is blocked ,item_exists_in_file() returns None for folder_found - if not id_found and folder_found == None: - self.remove_item_by_option(items_file, curr_folder_name, "folder_name") - elif not id_found and not folder_found and curr_folder_name not in self.item_block_list and workshop_id not in self.ids_added: - if not os.path.exists(items_file): - with open(items_file, "w") as f: - json.dump([item_info], f, indent=4) - else: - with open(items_file, "r+") as f: - items_data = json.load(f) - items_data.append(item_info) - f.seek(0) - json.dump(items_data, f, indent=4) - - if id_found and not folder_found and curr_folder_name not in self.item_block_list and workshop_id not in self.ids_added: - self.update_or_add_item_by_id(items_file, item_info, workshop_id) - - # keep here cuz of item_exists_in_file() testing - self.added_folders.add(curr_folder_name) - if not workshop_id in self.ids_added: - self.ids_added.add(workshop_id) - - if not self.file_cleaned and os.path.exists(items_file): - self.file_cleaned = True - self.clean_json_file(items_file) - - if not self.added_items: - self.show_no_items_message() - else: - self.hide_no_items_message() - - if map_count > 0 or mod_count > 0: - return f"Maps: {map_count} - Mods: {mod_count} - Total size: {convert_bytes_to_readable(total_size)}" - return "No items in current selected folder" - - def update_item(self, boiiiFolder, id, item_type, foldername): - try: - if item_type == "map": - folder_path = Path(boiiiFolder) / "usermaps" / f"{foldername}" - elif item_type == "mod": - folder_path = Path(boiiiFolder) / "mods" / f"{foldername}" - else: - raise ValueError("Unsupported item_type. It must be 'map' or 'mod'.") - - for zone_path in folder_path.glob("**/zone"): - json_path = zone_path / "workshop.json" - if json_path.exists(): - workshop_id = extract_json_data(json_path, "PublisherID") - if workshop_id == id: - name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "") - name = name[:45] + "..." if len(name) > 45 else name - item_type = extract_json_data(json_path, "Type") - folder_name = extract_json_data(json_path, "FolderName") - size = convert_bytes_to_readable(get_folder_size(zone_path.parent)) - text_to_add = f"{name} | Type: {item_type.capitalize()}" - mode_type = "ZM" if item_type == "map" and folder_name.startswith("zm") else "MP" if folder_name.startswith("mp") and item_type == "map" else None - if mode_type: - 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) - - item_info = { - "id": workshop_id, - "text": text_to_add, - "date": date_added, - "folder_name": foldername, - "json_folder_name": folder_name - } - self.update_or_add_item_by_id(items_file, item_info, id) - return - - except Exception as e: - 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) - 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)) - try: - shutil.rmtree(folder) - except Exception as e: - show_message("Error" ,f"Error removing folder '{folder}': {e}", icon="cancel") - return - label.destroy() - button.destroy() - button_view_list.destroy() - self.label_list.remove(label) - self.button_list.remove(button) - self.added_items.remove(label.cget("text")) - self.ids_added.remove(id) - self.button_view_list.remove(button_view_list) - self.remove_item_by_option(items_file, id) - - def refresh_items(self): - for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): - label.destroy() - button.destroy() - button_view_list.destroy() - self.label_list.clear() - self.button_list.clear() - self.button_view_list.clear() - self.added_items.clear() - self.added_folders.clear() - self.ids_added.clear() - status = self.load_items(app.edit_destination_folder.get().strip()) - app.title(f"BOIII Workshop Downloader - Library ➜ {status}") - - def view_item(self, workshop_id): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - webbrowser.open(url) - - def show_no_items_message(self): - self.no_items_label.grid(row=1, column=0, padx=10, pady=(0, 10), sticky="n") - self.no_items_label.configure(text="No items found in the selected folder. \nMake sure you have a mod/map downloaded and or have the right boiii folder selected.") - - def hide_no_items_message(self): - self.no_items_label.configure(text="") - self.no_items_label.forget() - - # i know i know ,please make a pull request i cant be bother - def show_map_info(self, workshop, invalid_warn=False): - for button_view in self.button_view_list: - button_view.configure(state="disabled") - - def show_map_thread(): - workshop_id = workshop - - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - show_message("Warning", "Not a valid Workshop ID.") - except: - show_message("Warning", "Not a valid Workshop ID.") - return - try: - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - - soup = BeautifulSoup(content, "html.parser") - - try: - map_mod_type = soup.find("div", class_="rightDetailsBlock").text.strip() - map_name = soup.find("div", class_="workshopItemTitle").text.strip() - map_size = map_size = get_workshop_file_size(workshop_id, raw=True) - details_stats_container = soup.find("div", class_="detailsStatsContainerRight") - details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") - date_created = details_stat_elements[1].text.strip() - try: - ratings = soup.find('div', class_='numRatings') - ratings_text = ratings.get_text() - except: - ratings = "Not found" - ratings_text= "Not enough ratings" - try: - date_updated = details_stat_elements[2].text.strip() - except: - date_updated = "Not updated" - stars_div = soup.find("div", class_="fileRatingDetails") - starts = stars_div.find("img")["src"] - except: - show_message("Warning", "Not a valid Workshop ID\nCouldn't get information.") - for button_view in self.button_view_list: - button_view.configure(state="normal") - return - - try: - preview_image_element = soup.find("img", id="previewImage") - workshop_item_image_url = preview_image_element["src"] - except: - try: - preview_image_element = soup.find("img", id="previewImageMain") - workshop_item_image_url = preview_image_element["src"] - except Exception as e: - show_message("Warning", f"Failed to get preview image ,probably wrong link/id if not please open an issue on github.\n{e}") - for button_view in self.button_view_list: - button_view.configure(state="normal") - return - - starts_image_response = requests.get(starts) - stars_image = Image.open(io.BytesIO(starts_image_response.content)) - stars_image_size = stars_image.size - - image_response = requests.get(workshop_item_image_url) - image_response.raise_for_status() - image = Image.open(io.BytesIO(image_response.content)) - image_size = image.size - - self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, - date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn) - - except requests.exceptions.RequestException as e: - show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") - for button_view in self.button_view_list: - button_view.configure(state="normal") - return - - info_thread = threading.Thread(target=show_map_thread) - info_thread.start() - - def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - 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) - 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"))) - top.title("Map/Mod Information") - top.attributes('-topmost', 'true') - down_date = self.get_item_by_id(items_file, workshop_id, 'date') - - def close_window(): - top.destroy() - - def view_map_mod(): - webbrowser.open(url) - - def check_for_updates(): - try: - - if check_item_date(down_date, date_updated): - if show_message("There is an update.", "Press download to redownload!", icon="info", _return=True, option_1="No", option_2="Download"): - if app.is_downloading: - show_message("Error", "Please wait for the current download to finish or stop it then restart.", icon="cancel") - return - app.edit_workshop_id.delete(0, "end") - app.edit_workshop_id.insert(0, workshop_id) - app.main_button_event() - app.download_map(update=True) - top.destroy() - return - else: - show_message("Up to date!", "No updates found!", icon="info") - except: - show_message("Up to date!", "No updates found!", icon="info") - - # frames - stars_frame = ctk.CTkFrame(top) - stars_frame.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 0), sticky="nsew") - stars_frame.columnconfigure(0, weight=0) - stars_frame.rowconfigure(0, weight=1) - - image_frame = ctk.CTkFrame(top) - image_frame.grid(row=1, column=0, columnspan=2, padx=20, pady=0, sticky="nsew") - - info_frame = ctk.CTkFrame(top) - info_frame.grid(row=2, column=0, columnspan=2, padx=20, pady=20, sticky="nsew") - - buttons_frame = ctk.CTkFrame(top) - buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") - - # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") - name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") - type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - size_label = ctk.CTkLabel(info_frame, text=f"Size (Workshop): {map_size}") - size_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") - date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") - date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") - date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - stars_image_label = ctk.CTkLabel(stars_frame) - stars_width, stars_height = stars_image_size - stars_image_widget = ctk.CTkImage(stars_image, size=(int(stars_width), int(stars_height))) - stars_image_label.configure(image=stars_image_widget, text="") - stars_image_label.pack(side="left", padx=(10, 20), pady=(10, 10)) - - ratings = ctk.CTkLabel(stars_frame) - ratings.configure(text=ratings_text) - ratings.pack(side="right", padx=(10, 20), pady=(10, 10)) - - image_label = ctk.CTkLabel(image_frame) - width, height = image_size - image_widget = ctk.CTkImage(image, size=(int(width), int(height))) - image_label.configure(image=image_widget, text="") - image_label.pack(expand=True, fill="both", padx=(10, 20), pady=(10, 10)) - - # Buttons - close_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod, width=130) - close_button.grid(row=0, column=0, padx=(20, 20), pady=(10, 10), sticky="n") - - update_btn = ctk.CTkButton(buttons_frame, text="Update", command=check_for_updates, width=130) - update_btn.grid(row=0, column=1, padx=(10, 20), pady=(10, 10), sticky="n") - update_btn_tooltip = CTkToolTip(update_btn, message="Checks and installs updates of the current selected item (redownload!)", topmost=True) - - view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) - view_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") - - if invalid_warn: - update_btn.configure(text="Update", state="disabled") - update_btn_tooltip.configure(message="Disabled due to item being blocked or duplicated") - - top.grid_rowconfigure(0, weight=0) - top.grid_rowconfigure(1, weight=0) - top.grid_rowconfigure(2, weight=1) - top.grid_columnconfigure(0, weight=1) - top.grid_columnconfigure(1, weight=1) - - buttons_frame.grid_rowconfigure(0, weight=1) - buttons_frame.grid_rowconfigure(1, weight=1) - buttons_frame.grid_rowconfigure(2, weight=1) - buttons_frame.grid_columnconfigure(0, weight=1) - buttons_frame.grid_columnconfigure(1, weight=1) - buttons_frame.grid_columnconfigure(2, weight=1) - - finally: - for button_view in self.button_view_list: - button_view.configure(state="normal") - self.after(0, main_thread) - - def check_for_updates(self, on_launch=False): - if not is_internet_available(): - show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") - return - self.after(1, self.update_button.configure(state="disabled")) - self.update_tooltip.configure(message='Still loading please wait...') - cevent = Event() - cevent.x_root = self.update_button.winfo_rootx() - cevent.y_root = self.update_button.winfo_rooty() - if not on_launch: - show_noti(self.update_button, "Please wait, window will popup shortly", event=cevent, noti_dur=3.0, topmost=True) - threading.Thread(target=self.check_items_func, args=(on_launch,)).start() - - def items_update_message(self, to_update_len): - def main_thread(): - if show_message(f"{to_update_len} Item updates available", f"{to_update_len} Workshop Items have an update, Would you like to open the item updater window?", icon="info", _return=True): - app.after(1, self.update_items_window) - else: - return - app.after(0, main_thread) - self.update_button.configure(state="normal", width=65, height=20) - self.update_tooltip.configure(message='Check items for updates') - return - - def check_items_func(self, on_launch): - # Needed to refresh item that needs updates - self.to_update.clear() - - def if_id_needs_update(item_id, item_date, text): - try: - headers = {'Cache-Control': 'no-cache'} - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={item_id}" - response = requests.get(url, headers=headers) - response.raise_for_status() - content = response.text - soup = BeautifulSoup(content, "html.parser") - details_stats_container = soup.find("div", class_="detailsStatsContainerRight") - details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") - try: - date_updated = details_stat_elements[2].text.strip() - except: - try: - date_updated = details_stat_elements[1].text.strip() - except: - return False - - if check_item_date(item_date, date_updated): - self.to_update.add(text + f" | Updated: {date_updated}") - return True - else: - return False - - except Exception as e: - show_message("Error", f"Error occured\n{e}", icon="cancel") - return - - def check_for_update(): - lib_data = None - - if not os.path.exists(os.path.join(cwd(), 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 - - with open(LIBRARY_FILE, 'r') as file: - lib_data = json.load(file) - - for item in lib_data: - item_id = item["id"] - item_date = item["date"] - if_id_needs_update(item_id, item_date, item["text"]) - - check_for_update() - - to_update_len = len(self.to_update) - if to_update_len > 0: - self.items_update_message(to_update_len) - else: - self.update_button.configure(state="normal", width=65, height=20) - self.update_tooltip.configure(message='Check items for updates') - if not on_launch: - show_message("No updates found!", "Items are up to date!", icon="info") - - def update_items_window(self): - try: - top = ctk.CTkToplevel(master=None) - top.withdraw() - if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): - top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) - top.title("Item updater - List of Items with Updates - Click to select 1 or more") - longest_text_length = max(len(text) for text in self.to_update) - window_width = longest_text_length * 6 + 5 - top.geometry(f"{window_width}x450") - top.attributes('-topmost', 'true') - top.resizable(True, True) - selected_id_list = [] - cevent = Event() - self.select_all_bool = False - - listbox = CTkListbox(top, multiple_selection=True) - listbox.grid(row=0, column=0, sticky="nsew") - - update_button = ctk.CTkButton(top, text="Update") - update_button.grid(row=1, column=0, pady=10, padx=5, sticky='ns') - - select_button = ctk.CTkButton(top, text="Select All", width=5) - select_button.grid(row=1, column=0, pady=10, padx=(230, 0), sticky='ns') - - def open_url(id_part, e=None): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id_part}" - webbrowser.open(url) - - # you gotta use my modded CTkListbox originaly by Akascape - def add_checkbox_item(index, item_text): - parts = item_text.split('ID: ') - id_part = parts[1].split('|')[0].strip() - listbox.insert(index, item_text, keybind="", func=lambda e: open_url(id_part)) - - def load_items(): - for index, item_text in enumerate(self.to_update): - if index == len(self.to_update) - 1: - add_checkbox_item("end", item_text) - top.deiconify() - return - add_checkbox_item(index, item_text) - - def update_list(selected_option): - selected_id_list.clear() - - if selected_option: - for option in selected_option: - parts = option.split('ID: ') - if len(parts) > 1: - id_part = parts[1].split('|')[0].strip() - selected_id_list.append(id_part) - - def select_all(): - if self.select_all_bool: - listbox.deactivate("all") - update_list(listbox.get()) - self.select_all_bool = False - return - listbox.deactivate("all") - listbox.activate("all") - update_list(listbox.get()) - self.select_all_bool = True - - def update_btn_fun(): - if len(selected_id_list) == 1: - if app.is_downloading: - show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") - return - app.edit_workshop_id.delete(0, "end") - app.edit_workshop_id.insert(0, selected_id_list[0]) - app.main_button_event() - app.download_map(update=True) - top.destroy() - return - - elif len(selected_id_list) > 1: - if app.is_downloading: - show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") - return - comma_separated_ids = ",".join(selected_id_list) - app.queuetextarea.delete("1.0", "end") - app.queuetextarea.insert("1.0", comma_separated_ids) - app.queue_button_event() - app.download_map(update=True) - top.destroy() - return - - else: - cevent.x_root = update_button.winfo_rootx() - cevent.y_root = update_button.winfo_rooty() - show_noti(update_button ,"Please select 1 or more items", event=cevent, noti_dur=0.8, topmost=True) - - - listbox.configure(command=update_list) - update_button.configure(command=update_btn_fun) - select_button.configure(command=select_all) - - top.grid_rowconfigure(0, weight=1) - top.grid_columnconfigure(0, weight=1) - - load_items() - - except Exception as e: - show_message("Error", f"{e}", icon="cancel") - - finally: - self.update_button.configure(state="normal", width=65, height=20) - self.update_tooltip.configure(message='Check items for updates') - -class SettingsTab(ctk.CTkFrame): - def __init__(self, master=None): - super().__init__(master) - # settings default bools - self.skip_already_installed = True - self.stopped = False - self.console = False - self.clean_on_finish = True - self.continuous = True - self.estimated_progress = True - self.steam_fail_counter_toggle = True - self.steam_fail_counter = 0 - self.steam_fail_number = 10 - self.steamcmd_reset = False - self.show_fails = True - self.check_items_on_launch = False - - # Left and right frames, use fg_color="transparent" - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(1, weight=1) - self.grid_columnconfigure(0, weight=1) - left_frame = ctk.CTkFrame(self) - left_frame.grid(row=0, column=0, padx=(20, 20), pady=(20, 0), sticky="nsew") - left_frame.grid_columnconfigure(1, weight=1) - right_frame = ctk.CTkFrame(self) - right_frame.grid(row=0, column=1, padx=(20, 20), pady=(20, 0), sticky="nsew") - right_frame.grid_columnconfigure(1, weight=1) - self.update_idletasks() - - # Check for updates checkbox - self.check_updates_var = ctk.BooleanVar() - self.check_updates_var.trace_add("write", self.enable_save_button) - self.check_updates_checkbox = ctk.CTkSwitch(left_frame, text="Check for updates on launch", variable=self.check_updates_var) - self.check_updates_checkbox.grid(row=0, column=1, padx=20 , pady=(20, 0), sticky="nw") - self.check_updates_var.set(self.load_settings("checkforupdates")) - - # Show console checkbox - self.console_var = ctk.BooleanVar() - self.console_var.trace_add("write", self.enable_save_button) - self.checkbox_show_console = ctk.CTkSwitch(left_frame, text="Console (On Download)", variable=self.console_var) - self.checkbox_show_console.grid(row=1, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_show_console_tooltip = CTkToolTip(self.checkbox_show_console, message="Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop button") - self.console_var.set(self.load_settings("console")) - - # Show continuous checkbox - self.continuous_var = ctk.BooleanVar() - self.continuous_var.trace_add("write", self.enable_save_button) - self.checkbox_continuous = ctk.CTkSwitch(left_frame, text="Continuous Download", variable=self.continuous_var) - self.checkbox_continuous.grid(row=2, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_continuous_tooltip = CTkToolTip(self.checkbox_continuous, message="This will make sure that the download restarts and resumes! until it finishes if steamcmd crashes randomly (it will not redownload from the start)") - self.continuous_var.set(self.load_settings("continuous_download")) - - # clean on finish checkbox - self.clean_checkbox_var = ctk.BooleanVar() - self.clean_checkbox_var.trace_add("write", self.enable_save_button) - self.clean_checkbox = ctk.CTkSwitch(left_frame, text="Clean on finish", variable=self.clean_checkbox_var) - self.clean_checkbox.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="nw") - self.clean_checkbox_tooltip = CTkToolTip(self.clean_checkbox, message="Cleans the map that have been downloaded and installed from steamcmd's steamapps folder ,to save space") - self.clean_checkbox_var.set(self.load_settings("clean_on_finish", "on")) - - # Show estimated_progress checkbox - self.estimated_progress_var = ctk.BooleanVar() - self.estimated_progress_var.trace_add("write", self.enable_save_button) - self.estimated_progress_cb = ctk.CTkSwitch(left_frame, text="Estimated Progress Bar", variable=self.estimated_progress_var) - self.estimated_progress_cb.grid(row=4, column=1, padx=20, pady=(20, 0), sticky="nw") - self.estimated_progress_var_tooltip = CTkToolTip(self.estimated_progress_cb, message="This will change how to progress bar works by estimating how long the download will take\ - \nThis is not accurate ,it's better than with it off which is calculating the downloaded folder size which steamcmd dumps the full size rigth mostly") - self.estimated_progress_var.set(self.load_settings("estimated_progress", "on")) - - # Show show fails checkbox - self.show_fails_var = ctk.BooleanVar() - self.show_fails_var.trace_add("write", self.enable_save_button) - self.show_fails_cb = ctk.CTkSwitch(left_frame, text="Show fails (on top of progress bar)", variable=self.show_fails_var) - self.show_fails_cb.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="nw") - self.show_fails_tooltip = CTkToolTip(self.show_fails_cb, message="Display how many times steamcmd has failed/crashed\nIf the number is getting high quickly then try pressing Reset SteamCMD and try again, otherwise its fine") - self.estimated_progress_var.set(self.load_settings("show_fails", "on")) - - # Show skip_already_installed maps checkbox - self.skip_already_installed_var = ctk.BooleanVar() - self.skip_already_installed_var.trace_add("write", self.enable_save_button) - self.skip_already_installed_ch = ctk.CTkSwitch(left_frame, text="Skip already installed maps", variable=self.skip_already_installed_var) - self.skip_already_installed_ch.grid(row=6, column=1, padx=20, pady=(20, 0), sticky="nw") - self.skip_already_installed_ch_tooltip = CTkToolTip(self.skip_already_installed_ch, message="If on it will not download installed maps,\nthis can miss sometimes if you remove maps manually and not from library tab while the app is running") - self.skip_already_installed_var.set(self.load_settings("skip_already_installed", "on")) - - # check items for update on launch - self.check_items_var = ctk.BooleanVar() - self.check_items_var.trace_add("write", self.enable_save_button) - self.check_items_ch = ctk.CTkSwitch(left_frame, text="Check Library items on launch", variable=self.check_items_var) - self.check_items_ch.grid(row=7, column=1, padx=20, pady=(20, 0), sticky="nw") - self.check_items_tooltip = CTkToolTip(self.check_items_ch, message="This will show a window on launch of items that have pending updates -> you can open it manually from library tab") - self.check_items_var.set(self.load_settings("check_items", "off")) - - # Resetr steam on many fails - self.reset_steamcmd_on_fail_var = ctk.IntVar() - self.reset_steamcmd_on_fail_var.trace_add("write", self.enable_save_button) - self.reset_steamcmd_on_fail_text = ctk.CTkLabel(left_frame, text=f"Reset steamcmd: (n of fails):", anchor="w") - self.reset_steamcmd_on_fail_text.grid(row=8, column=1, padx=20, pady=(10, 0), sticky="nw") - self.reset_steamcmd_on_fail = ctk.CTkOptionMenu(left_frame, values=["5", "10", "20", "30", "40", "Custom", "Disable"], variable=self.reset_steamcmd_on_fail_var, command=self.reset_steamcmd_on_fail_func) - self.reset_steamcmd_on_fail.grid(row=8, column=1, padx=(190, 0), pady=(10, 0), sticky="nw") - self.reset_steamcmd_on_fail_tooltip = CTkToolTip(self.reset_steamcmd_on_fail, message="This actually fixes steamcmd when its crashing way too much") - self.reset_steamcmd_on_fail.set(value=self.load_settings("reset_on_fail", "10")) - - # item folder naming - self.folder_options_label_var = ctk.IntVar() - self.folder_options_label_var.trace_add("write", self.enable_save_button) - self.folder_options_label = ctk.CTkLabel(left_frame, text="Items Folder Naming:", anchor="nw") - self.folder_options_label.grid(row=10, column=1, padx=20, pady=(10, 0), sticky="nw") - self.folder_options = ctk.CTkOptionMenu(left_frame, values=["PublisherID", "FolderName"], variable=self.folder_options_label_var) - self.folder_options.grid(row=10, column=1, padx=(150, 0), pady=(3, 0), sticky="nw") - self.folder_options.set(value=self.load_settings("folder_naming", "PublisherID")) - - # Check for updates button n Launch boiii - self.check_for_updates = ctk.CTkButton(right_frame, text="Check for updates", command=self.settings_check_for_updates) - self.check_for_updates.grid(row=1, column=1, padx=20, pady=(20, 0), sticky="n") - - self.launch_boiii = ctk.CTkButton(right_frame, text="Launch boiii", command=self.settings_launch_boiii) - self.launch_boiii.grid(row=2, column=1, padx=20, pady=(20, 0), sticky="n") - - self.reset_steamcmd = ctk.CTkButton(right_frame, text="Reset SteamCMD", command=self.settings_reset_steamcmd) - self.reset_steamcmd.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="n") - self.reset_steamcmd_tooltip = CTkToolTip(self.reset_steamcmd, message="This will remove steamapps folder + all the maps that are potentioaly corrupted\nor not so use at ur own risk (could fix some issues as well)") - - self.steam_to_boiii = ctk.CTkButton(right_frame, text="Steam to boiii", command=self.from_steam_to_boiii_toplevel) - self.steam_to_boiii.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="n") - self.steam_to_boiii_tooltip = CTkToolTip(self.steam_to_boiii, message="Moves/copies maps and mods from steam to boiii (opens up a window)") - - # appearance - self.appearance_mode_label = ctk.CTkLabel(right_frame, text="Appearance Mode:", anchor="n") - self.appearance_mode_label.grid(row=6, column=1, padx=20, pady=(20, 0)) - self.appearance_mode_optionemenu = ctk.CTkOptionMenu(right_frame, values=["Light", "Dark", "System"], - command=master.change_appearance_mode_event) - self.appearance_mode_optionemenu.grid(row=7, column=1, padx=20, pady=(0, 0)) - self.scaling_label = ctk.CTkLabel(right_frame, text="UI Scaling:", anchor="n") - self.scaling_label.grid(row=8, column=1, padx=20, pady=(10, 0)) - self.scaling_optionemenu = ctk.CTkOptionMenu(right_frame, values=["80%", "90%", "100%", "110%", "120%"], - command=master.change_scaling_event) - self.scaling_optionemenu.grid(row=9, column=1, padx=20, pady=(0, 0)) - - # self.custom_theme = ctk.CTkButton(right_frame, text="Custom theme", command=self.boiiiwd_custom_theme) - # self.custom_theme.grid(row=8, column=1, padx=20, pady=(20, 0), sticky="n") - - self.theme_options_label = ctk.CTkLabel(right_frame, text="Themes:", anchor="n") - self.theme_options_label.grid(row=10, column=1, padx=20, pady=(10, 0)) - self.theme_options = ctk.CTkOptionMenu(right_frame, values=["Default", "Blue", "Grey", "Obsidian", "Ghost","NeonBanana", "Custom"], - command=self.theme_options_func) - self.theme_options.grid(row=11, column=1, padx=20, pady=(0, 0)) - self.theme_options.set(value=self.load_settings("theme", "Default")) - - # Save button - self.save_button = ctk.CTkButton(self, text="Save", command=self.save_settings, state='disabled') - self.save_button.grid(row=3, column=0, padx=20, pady=(20, 20), sticky="nw") - - #version - self.version_info = ctk.CTkLabel(self, text=f"{VERSION}") - self.version_info.grid(row=3, column=1, padx=20, pady=(20, 20), sticky="e") - - def reset_steamcmd_on_fail_func(self, option: str): - if option == "Custom": - try: - save_config("reset_on_fail", "10") - def callback(): - msg = CTkMessagebox(title="config.ini", message="change reset_on_fail value to whatever you want", icon="info", option_1="No", option_2="Ok", sound=True) - response = msg.get() - if response == "No": - return - elif response == "Ok": - os.system(f"notepad {os.path.join(cwd(), 'config.ini')}") - else: - return - self.after(0, callback) - except: - show_message("Couldn't open config.ini" ,"you can do so by yourself and change reset_on_fail value to whatever you want") - else: - return - def theme_options_func(self, option: str): - if option == "Default": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_theme.json") - if option == "Blue": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_blue.json") - if option == "Grey": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_grey.json") - if option == "Ghost": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_ghost.json") - if option == "Obsidian": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_obsidian.json") - if option == "NeonBanana": - self.boiiiwd_custom_theme(disable_only=True) - save_config("theme", "boiiiwd_neonbanana.json") - if option == "Custom": - self.boiiiwd_custom_theme() - save_config("theme", "boiiiwd_theme.json") - if not option == "Custom": - if show_message("Restart to take effect!", f"{option} theme has been set ,please restart to take effect", icon="info", _return=True, option_1="Ok", option_2="Restart"): - try: - p = psutil.Process(os.getpid()) - for handler in p.open_files() + p.connections(): - os.close(handler.fd) - except Exception: - pass - python = sys.executable - os.execl(python, python, *sys.argv) - else: - pass - - def enable_save_button(self, *args): - try: - self.save_button.configure(state='normal') - except: - pass - - def save_settings(self): - self.save_button.configure(state='disabled') - - if self.folder_options.get() == "PublisherID": - save_config("folder_naming", "0") - else: - save_config("folder_naming", "1") - - if self.check_items_var.get(): - save_config("check_items", "on") - else: - save_config("check_items", "off") - - if self.check_updates_checkbox.get(): - save_config("checkforupdtes", "on") - else: - save_config("checkforupdtes", "off") - - if self.checkbox_show_console.get(): - save_config("console", "on") - self.console = True - else: - save_config("console", "off") - self.console = False - - if self.skip_already_installed_ch.get(): - save_config("skip_already_installed", "on") - self.skip_already_installed = True - else: - save_config("skip_already_installed", "off") - self.skip_already_installed = False - - if self.clean_checkbox.get(): - save_config("clean_on_finish", "on") - self.clean_on_finish = True - else: - save_config("clean_on_finish", "off") - self.clean_on_finish = False - - if self.checkbox_continuous.get(): - save_config("continuous_download", "on") - self.continuous = True - else: - save_config("continuous_download", "off") - self.continuous = False - - if self.estimated_progress_cb.get(): - save_config("estimated_progress", "on") - self.estimated_progress = True - else: - save_config("estimated_progress", "off") - self.estimated_progress = False - - if self.show_fails_cb.get(): - save_config("show_fails", "on") - self.show_fails = True - else: - save_config("show_fails", "off") - self.show_fails = False - - if self.reset_steamcmd_on_fail.get(): - value = self.reset_steamcmd_on_fail.get() - if value == "Disable": - self.steam_fail_counter_toggle = False - else: - self.steam_fail_counter_toggle = True - self.steam_fail_number = int(value) - save_config("reset_on_fail", value) - - def load_settings(self, setting, fallback=None): - if setting == "folder_naming": - if check_config(setting, fallback) == "1": - return "FolderName" - else: - return "PublisherID" - - if setting == "console": - if check_config(setting, fallback) == "on": - self.console = True - return 1 - else: - self.console = False - return 0 - - if setting == "continuous_download": - if check_config(setting, "on") == "on": - self.continuous = True - return 1 - else: - self.continuous = False - return 0 - - if setting == "clean_on_finish": - if check_config(setting, fallback) == "on": - self.clean_on_finish = True - return 1 - else: - self.clean_on_finish = False - return 0 - if setting == "estimated_progress": - if check_config(setting, fallback) == "on": - self.estimated_progress = True - return 1 - else: - self.estimated_progress = False - return 0 - - if setting == "reset_on_fail": - option = check_config(setting, fallback) - if option == "Disable" or option == "Custom": - self.steam_fail_counter_toggle = False - return "Disable" - else: - try: - self.steam_fail_number = int(option) - self.steam_fail_counter_toggle = True - return option - except: - self.steam_fail_counter_toggle = True - self.steam_fail_number = 10 - return "10" - - if setting == "show_fails": - if check_config(setting, fallback) == "on": - self.show_fails = True - return 1 - else: - self.show_fails = False - return 0 - - if setting == "skip_already_installed": - if check_config(setting, fallback) == "on": - self.skip_already_installed = True - return 1 - else: - self.skip_already_installed = False - return 0 - - if setting == "theme": - if os.path.exists(os.path.join(cwd(), "boiiiwd_theme.json")): - return "Custom" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_theme.json": - return "Default" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_grey.json": - return "Grey" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_blue.json": - return "Blue" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_obsidian.json": - return "Obsidian" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_ghost.json": - return "Ghost" - if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_neonbanana.json": - return "NeonBanana" - else: - if check_config(setting, fallback) == "on": - return 1 - else: - return 0 - - def boiiiwd_custom_theme(self, disable_only=None): - file_to_rename = os.path.join(cwd(), "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)) - - 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") - else: - 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")) - except: - shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(cwd(), "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): - check_for_updates_func(self, ignore_up_todate=False) - - def load_on_switch_screen(self): - self.check_updates_var.set(self.load_settings("checkforupdtes")) - self.console_var.set(self.load_settings("console")) - self.reset_steamcmd_on_fail.set(value=self.load_settings("reset_on_fail", "10")) - self.estimated_progress_var.set(self.load_settings("estimated_progress", "on")) - self.clean_checkbox_var.set(self.load_settings("clean_on_finish", "on")) - self.continuous_var.set(self.load_settings("continuous_download")) - self.show_fails_var.set(self.load_settings("show_fails", "on")) - self.skip_already_installed_var.set(self.load_settings("skip_already_installed", "on")) - - # keep last cuz of trace_add() - self.save_button.configure(state='disabled') - - def settings_launch_boiii(self): - launch_boiii_func(check_config("destinationfolder")) - - def settings_reset_steamcmd(self): - reset_steamcmd() - - def from_steam_to_boiii_toplevel(self): - def main_thread(): - try: - 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"))) - top.title("Steam to boiii -> Workshop items") - top.attributes('-topmost', 'true') - top.resizable(False, False) - # Create input boxes - center_frame = ctk.CTkFrame(top) - center_frame.grid(row=0, column=0, padx=20, pady=20) - - # Create input boxes - steam_folder_label = ctk.CTkLabel(center_frame, text="Steam Folder:") - steam_folder_label.grid(row=0, column=0, padx=(20, 20), pady=(10, 0), sticky='w') - steam_folder_entry = ctk.CTkEntry(center_frame, width=225) - steam_folder_entry.grid(row=1, column=0, columnspan=2, padx=(0, 20), pady=(10, 10), sticky='nes') - button_steam_browse = ctk.CTkButton(center_frame, text="Select", width=10) - button_steam_browse.grid(row=1, column=2, padx=(0, 20), pady=(10, 10), sticky="wnes") - - boiii_folder_label = ctk.CTkLabel(center_frame, text="boiii Folder:") - boiii_folder_label.grid(row=2, column=0, padx=(20, 20), pady=(10, 0), sticky='w') - boiii_folder_entry = ctk.CTkEntry(center_frame, width=225) - boiii_folder_entry.grid(row=3, column=0, columnspan=2, padx=(0, 20), pady=(10, 10), sticky='nes') - button_BOIII_browse = ctk.CTkButton(center_frame, text="Select", width=10) - button_BOIII_browse.grid(row=3, column=2, padx=(0, 20), pady=(10, 10), sticky="wnes") - - # Create option to choose between cut or copy - operation_label = ctk.CTkLabel(center_frame, text="Choose operation:") - operation_label.grid(row=4, column=0, padx=(20, 20), pady=(10, 10), sticky='wnes') - copy_var = ctk.BooleanVar() - cut_var = ctk.BooleanVar() - copy_check = ctk.CTkCheckBox(center_frame, text="Copy", variable=copy_var) - cut_check = ctk.CTkCheckBox(center_frame, text="Cut", variable=cut_var) - copy_check.grid(row=4, column=1, padx=(0, 10), pady=(10, 10), sticky='wnes') - cut_check.grid(row=4, column=2, padx=(0, 10), pady=(10, 10), sticky='nes') - - # Create progress bar - progress_bar = ctk.CTkProgressBar(center_frame, mode="determinate", height=20, corner_radius=7) - progress_bar.grid(row=5, column=0, columnspan=3, padx=(20, 20), pady=(10, 10), sticky='wnes') - progress_text = ctk.CTkLabel(progress_bar, text="0%", font=("Helvetica", 12), fg_color="transparent", text_color="white", height=0, width=0, corner_radius=0) - progress_text.place(relx=0.5, rely=0.5, anchor="center") - - copy_button = ctk.CTkButton(center_frame, text="Start (Copy)") - copy_button.grid(row=6, column=0, columnspan=3,padx=(20, 20), pady=(10, 10), sticky='wnes') - - # funcs - # had to use this shit again cuz of threading issues with widgets - def copy_with_progress(src, dst): - try: - total_files = sum([len(files) for root, dirs, files in os.walk(src)]) - progress = 0 - - def copy_progress(src, dst): - nonlocal progress - shutil.copy2(src, dst) - progress += 1 - top.after(0, progress_text.configure(text=f"Copying files: {progress}/{total_files}")) - value = (progress / total_files) * 100 - valuep = value / 100 - progress_bar.set(valuep) - - try: - shutil.copytree(src, dst, dirs_exist_ok=True, copy_function=copy_progress) - except Exception as E: - show_message("Error", f"Error copying files: {E}", icon="cancel") - finally: - top.after(0, progress_text.configure(text="0%")) - top.after(0, progress_bar.set(0.0)) - - def check_status(var, op_var): - if var.get(): - op_var.set(False) - if cut_var.get(): - copy_button.configure(text=f"Start (Cut)") - if copy_var.get(): - copy_button.configure(text=f"Start (Copy)") - - def open_BOIII_browser(): - selected_folder = ctk.filedialog.askdirectory(title="Select boiii Folder") - if selected_folder: - boiii_folder_entry.delete(0, "end") - boiii_folder_entry.insert(0, selected_folder) - - def open_steam_browser(): - selected_folder = ctk.filedialog.askdirectory(title="Select Steam Folder (ex: C:\Program Files (x86)\Steam)") - if selected_folder: - steam_folder_entry.delete(0, "end") - steam_folder_entry.insert(0, selected_folder) - save_config("steam_folder" ,steam_folder_entry.get()) - - def start_copy_operation(): - def start_thread(): - try: - if not cut_var.get() and not copy_var.get(): - show_message("Choose operation!", "Please choose an operation, Copy or Cut files from steam!") - return - - copy_button.configure(state="disabled") - steam_folder = steam_folder_entry.get() - ws_folder = os.path.join(steam_folder, "steamapps/workshop/content/311210") - boiii_folder = boiii_folder_entry.get() - - if not os.path.exists(steam_folder) and not os.path.exists(ws_folder): - show_message("Not found", "Either you have no items downloaded from Steam or wrong path, please recheck path (ex: C:\Program Files (x86)\Steam)") - return - - if not os.path.exists(boiii_folder): - show_message("Not found", "boiii folder not found, please recheck path") - return - - top.after(0, progress_text.configure(text="Loading...")) - - map_folder = os.path.join(ws_folder) - - subfolders = [f for f in os.listdir(map_folder) if os.path.isdir(os.path.join(map_folder, f))] - total_folders = len(subfolders) - - if not subfolders: - show_message("No items found", f"No items found in \n{map_folder}") - return - - for i, workshop_id in enumerate(subfolders, start=1): - json_file_path = os.path.join(map_folder, workshop_id, "workshop.json") - copy_button.configure(text=f"Working on -> {i}/{total_folders}") - - if os.path.exists(json_file_path): - mod_type = extract_json_data(json_file_path, "Type") - items_file = os.path.join(cwd(), LIBRARY_FILE) - - if app.library_tab.item_exists_in_file(items_file, workshop_id): - get_folder_name = app.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") - if get_folder_name: - folder_name = get_folder_name - else: - try: - folder_name = extract_json_data(json_file_path, app.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - else: - try: - folder_name = extract_json_data(json_file_path, app.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - - if mod_type == "mod": - mods_folder = os.path.join(boiii_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") - elif mod_type == "map": - usermaps_folder = os.path.join(boiii_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") - else: - show_message("Error", "Invalid workshop type in workshop.json, are you sure this is a map or a mod?.", icon="cancel") - continue - - os.makedirs(folder_name_path, exist_ok=True) - - try: - copy_with_progress(os.path.join(map_folder, workshop_id), folder_name_path) - except Exception as E: - show_message("Error", f"Error copying files: {E}", icon="cancel") - continue - - if cut_var.get(): - remove_tree(os.path.join(map_folder, workshop_id)) - - if subfolders: - app.show_complete_message(message=f"All items were moved\nYou can run the game now!\nPS: You have to restart the game\n(pressing launch will launch/restarts)") - - finally: - if cut_var.get(): - copy_button.configure(text=f"Start (Cut)") - if copy_var.get(): - copy_button.configure(text=f"Start (Copy)") - copy_button.configure(state="normal") - top.after(0, progress_bar.set(0)) - top.after(0, progress_text.configure(text="0%")) - - # prevents app hanging - threading.Thread(target=start_thread).start() - - # config - progress_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "progress_bar_fill_color") - progress_bar.configure(progress_color=progress_color) - steam_folder_entry.insert(1, check_config("steam_folder", "")) - boiii_folder_entry.insert(1, app.edit_destination_folder.get()) - button_BOIII_browse.configure(command=open_BOIII_browser) - button_steam_browse.configure(command=open_steam_browser) - copy_button.configure(command=start_copy_operation) - cut_check.configure(command = lambda: check_status(cut_var, copy_var)) - copy_check.configure(command = lambda: check_status(copy_var, cut_var)) - app.create_context_menu(steam_folder_entry) - app.create_context_menu(boiii_folder_entry) - copy_var.set(True) - progress_bar.set(0) - - except Exception as e: - show_message("Error", f"{e}", icon="cancel") - - app.after(0, main_thread) - -class BOIIIWD(ctk.CTk): - def __init__(self): - super().__init__() - # self.app_instance = BOIIIWD() - - # configure window - self.title("boiii Workshop Downloader - Main") - - try: - geometry_file = os.path.join(cwd(), "boiiiwd_dont_touch.conf") - if os.path.isfile(geometry_file): - with open(geometry_file, "r") as conf: - self.geometry(conf.read()) - else: - self.geometry(f"{910}x{560}") - except: - self.geometry(f"{910}x{560}") - - if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): - self.wm_iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico")) - self.protocol("WM_DELETE_WINDOW", self.on_closing) - - # Qeue frame/tab, keep here or app will start shrinked eveytime - self.qeueuframe = ctk.CTkFrame(self) - self.qeueuframe.columnconfigure(1, weight=1) - self.qeueuframe.columnconfigure(2, weight=1) - self.qeueuframe.columnconfigure(3, weight=1) - self.qeueuframe.rowconfigure(1, weight=1) - self.qeueuframe.rowconfigure(2, weight=1) - self.qeueuframe.rowconfigure(3, weight=1) - self.qeueuframe.rowconfigure(4, weight=1) - - self.workshop_queue_label = ctk.CTkLabel(self.qeueuframe, text="Workshop IDs/Links -> press help to see examples:") - self.workshop_queue_label.grid(row=0, column=0, padx=(20, 20), pady=(20, 20), sticky="wns") - - self.help_button = ctk.CTkButton(master=self.qeueuframe, text="Help", command=self.help_queue_text_func, width=10, height=10, fg_color="#585858") - self.help_button.grid(row=0, column=0, padx=(352, 0), pady=(23, 0), sticky="en") - self.help_restore_content = None - - self.queuetextarea = ctk.CTkTextbox(master=self.qeueuframe, font=("", 15)) - self.queuetextarea.grid(row=1, column=0, columnspan=4, padx=(20, 20), pady=(0, 20), sticky="nwse") - - self.status_text = ctk.CTkLabel(self.qeueuframe, text="Status: Standby!") - self.status_text.grid(row=3, column=0, padx=(20, 20), pady=(0, 20), sticky="ws") - - self.skip_boutton = ctk.CTkButton(master=self.qeueuframe, text="Skip", command=self.skip_current_queue_item, width=10, height=10, fg_color="#585858") - - self.qeueuframe.grid_remove() - - # configure grid layout (4x4) - self.grid_columnconfigure(1, weight=1) - self.grid_columnconfigure((2, 3), weight=0) - self.grid_rowconfigure((0, 1, 2), weight=1) - self.settings_tab = SettingsTab(self) - self.library_tab = LibraryTab(self, corner_radius=3) - - # create sidebar frame with widgets - font = "Comic Sans MS" - if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.png")): - ryuks_icon = os.path.join(RESOURCES_DIR, "ryuk.png") - self.sidebar_icon = ctk.CTkImage(light_image=Image.open(ryuks_icon), dark_image=Image.open(ryuks_icon), size=(40, 40)) - else: - self.sidebar_icon = None - self.sidebar_frame = ctk.CTkFrame(self, width=100, corner_radius=10) - self.sidebar_frame.grid(row=0, column=0, rowspan=3, padx=(10, 20), pady=(10, 10), sticky="nsew") - self.sidebar_frame.grid_rowconfigure(4, weight=1) - self.logo_label = ctk.CTkLabel(self.sidebar_frame, text='',image=self.sidebar_icon) - self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10)) - self.txt_label = ctk.CTkLabel(self.sidebar_frame, text="- Sidebar -", font=(font, 17)) - self.txt_label.grid(row=1, column=0, padx=20, pady=(20, 10)) - self.sidebar_main = ctk.CTkButton(self.sidebar_frame, height=28) - self.sidebar_main.grid(row=2, column=0, padx=10, pady=(20, 6)) - self.sidebar_queue = ctk.CTkButton(self.sidebar_frame, height=28) - self.sidebar_queue.grid(row=3, column=0, padx=10, pady=6) - self.sidebar_library = ctk.CTkButton(self.sidebar_frame, height=28) - self.sidebar_library.grid(row=4, column=0, padx=10, pady=6, sticky="n") - self.sidebar_settings = ctk.CTkButton(self.sidebar_frame, height=28) - self.sidebar_settings.grid(row=5, column=0, padx=10, pady=6, sticky="n") - - # create optionsframe - self.optionsframe = ctk.CTkFrame(self) - self.optionsframe.grid(row=0, column=1, rowspan=2, padx=(0, 20), pady=(20, 0), sticky="nsew") - self.txt_main = ctk.CTkLabel(self.optionsframe, text="💎 BOIIIWD 💎", font=(font, 20)) - self.txt_main.grid(row=0, column=1, columnspan=5, padx=0, pady=(20, 20), sticky="n") - - # create slider and progressbar frame - self.slider_progressbar_frame = ctk.CTkFrame(self) - self.slider_progressbar_frame.grid(row=2, column=1, rowspan=1, padx=(0, 20), pady=(20, 20), sticky="nsew") - - self.slider_progressbar_frame.columnconfigure(0, weight=0) - self.slider_progressbar_frame.columnconfigure(1, weight=1) - self.slider_progressbar_frame.columnconfigure(2, weight=0) - self.slider_progressbar_frame.rowconfigure(0, weight=1) - self.slider_progressbar_frame.rowconfigure(1, weight=1) - self.slider_progressbar_frame.rowconfigure(2, weight=1) - self.slider_progressbar_frame.rowconfigure(3, weight=1) - - # self.spacer = ctk.CTkLabel(master=self.slider_progressbar_frame, text="") - # self.spacer.grid(row=0, column=0, columnspan=1) - - self.label_speed = ctk.CTkLabel(master=self.slider_progressbar_frame, text="Awaiting Download!") - self.label_speed.grid(row=1, column=0, padx=20, pady=(0, 10), sticky="w") - self.elapsed_time = ctk.CTkLabel(master=self.slider_progressbar_frame, text="", anchor="center") - self.elapsed_time.grid(row=1, column=1, padx=20, pady=(0, 10), sticky="nsew") # Use "nsew" to center label - self.label_file_size = ctk.CTkLabel(master=self.slider_progressbar_frame, text="File size: 0KB") - self.label_file_size.grid(row=1, column=2, padx=(0, 20), pady=(0, 10), sticky="e") - - self.progress_bar = ctk.CTkProgressBar(master=self.slider_progressbar_frame, mode="determinate", height=20, corner_radius=7) - self.progress_bar.grid(row=2, column=0, padx=20, pady=(0, 10), columnspan=3, sticky="ew") - - self.progress_text = ctk.CTkLabel(self.progress_bar, text="0%", font=("Helvetica", 12), fg_color="transparent", text_color="white", height=0, width=0, corner_radius=0) - self.progress_text.place(relx=0.5, rely=0.5, anchor="center") - - self.button_download = ctk.CTkButton(master=self.slider_progressbar_frame, text="Download", command=self.download_map) - self.button_download.grid(row=4, column=0, padx=20, pady=(5, 20), columnspan=2, sticky="ew") - - self.button_stop = ctk.CTkButton(master=self.slider_progressbar_frame, text="Stop", command=self.stop_download) - self.button_stop.grid(row=4, column=2, padx=(0, 20), pady=(5, 20), columnspan=1, sticky="w") - - # options frame - self.optionsframe.columnconfigure(1, weight=1) - self.optionsframe.columnconfigure(2, weight=1) - self.optionsframe.columnconfigure(3, weight=1) - self.optionsframe.rowconfigure(1, weight=1) - self.optionsframe.rowconfigure(2, weight=1) - self.optionsframe.rowconfigure(3, weight=1) - self.optionsframe.rowconfigure(4, weight=1) - - self.label_workshop_id = ctk.CTkLabel(master=self.optionsframe, text="Enter the Workshop ID or Link of the map/mod you want to download:\n") - self.label_workshop_id.grid(row=1, column=1, padx=20, pady=(10, 0), columnspan=4, sticky="ws") - - self.check_if_changed = ctk.StringVar() - self.check_if_changed.trace_add("write", self.id_chnaged_handler) - self.edit_workshop_id = ctk.CTkEntry(master=self.optionsframe, textvariable=self.check_if_changed) - self.edit_workshop_id.grid(row=2, column=1, padx=20, pady=(0, 10), columnspan=4, sticky="ewn") - - self.button_browse = ctk.CTkButton(master=self.optionsframe, text="Workshop", command=self.open_browser, width=10) - self.button_browse.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="en") - self.button_browse_tooltip = CTkToolTip(self.button_browse, message="Will open steam workshop for boiii in your browser") - - self.info_button = ctk.CTkButton(master=self.optionsframe, text="Details", command=self.show_map_info, width=10) - self.info_button.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="wn") - - self.label_destination_folder = ctk.CTkLabel(master=self.optionsframe, text='Enter Your boiii folder:') - self.label_destination_folder.grid(row=3, column=1, padx=20, pady=(0, 0), columnspan=4, sticky="ws") - - self.edit_destination_folder = ctk.CTkEntry(master=self.optionsframe, placeholder_text="Your boiii Instalation folder") - self.edit_destination_folder.grid(row=4, column=1, padx=20, pady=(0, 25), columnspan=4, sticky="ewn") - - self.button_BOIII_browse = ctk.CTkButton(master=self.optionsframe, text="Select", command=self.open_BOIII_browser) - self.button_BOIII_browse.grid(row=4, column=5, padx=(0, 20), pady=(0, 10), sticky="ewn") - - self.label_steamcmd_path = ctk.CTkLabel(master=self.optionsframe, text="Enter SteamCMD path:") - self.label_steamcmd_path.grid(row=5, column=1, padx=20, pady=(0, 0), columnspan=3, sticky="wn") - - self.edit_steamcmd_path = ctk.CTkEntry(master=self.optionsframe, placeholder_text="Enter your SteamCMD path") - self.edit_steamcmd_path.grid(row=6, column=1, padx=20, pady=(0, 30), columnspan=4, sticky="ewn") - - self.button_steamcmd_browse = ctk.CTkButton(master=self.optionsframe, text="Select", command=self.open_steamcmd_path_browser) - self.button_steamcmd_browse.grid(row=6, column=5, padx=(0, 20), pady=(0, 30), sticky="ewn") - - - # set default values - self.active_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "button_active_state_color") - self.normal_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "button_normal_state_color") - self.progress_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "progress_bar_fill_color") - self.settings_tab.appearance_mode_optionemenu.set("Dark") - self.settings_tab.scaling_optionemenu.set("100%") - self.progress_bar.set(0.0) - self.progress_bar.configure(progress_color=self.progress_color) - self.hide_settings_widgets() - self.button_stop.configure(state="disabled") - self.is_pressed = False - self.queue_enabled = False - self.queue_stop_button = False - self.is_downloading = False - self.item_skipped = False - self.fail_threshold = 0 - - # sidebar windows bouttons - self.sidebar_main.configure(command=self.main_button_event, text="Main ⬇️", fg_color=(self.active_color), state="active") - self.sidebar_library.configure(text="Library 📙", command=self.library_button_event) - self.sidebar_queue.configure(text="Queue 🚧", command=self.queue_button_event) - sidebar_settings_button_image = os.path.join(RESOURCES_DIR, "sett10.png") - self.sidebar_settings.configure(command=self.settings_button_event, text="", image=ctk.CTkImage(Image.open(sidebar_settings_button_image), size=(int(35), int(35))), fg_color="transparent", width=45, height=45) - self.sidebar_settings_tooltip = CTkToolTip(self.sidebar_settings, message="Settings") - self.sidebar_library_tooltip = CTkToolTip(self.sidebar_library, message="Experimental") - self.sidebar_queue_tooltip = CTkToolTip(self.sidebar_queue, message="Experimental") - self.bind("", self.save_window_size) - - # context_menus - self.create_context_menu(self.edit_workshop_id) - self.create_context_menu(self.edit_destination_folder) - self.create_context_menu(self.edit_steamcmd_path) - self.create_context_menu(self.queuetextarea, textbox=True) - self.create_context_menu(self.library_tab.filter_entry, textbox=False, library=True) - # valid event required for filter_items() - self.cevent = Event() - self.cevent.x = 0 - self.cevent.y = 0 - - # load ui configs - self.load_configs() - - if check_config("checkforupdtes") == "on": - self.withdraw() - check_for_updates_func(self, ignore_up_todate=True) - self.update() - self.deiconify() - - try: - self.settings_tab.load_settings("clean_on_finish", "on") - self.settings_tab.load_settings("continuous_download", "on") - self.settings_tab.load_settings("console", "off") - self.settings_tab.load_settings("estimated_progress", "on") - self.settings_tab.load_settings("reset_on_fail", "10") - self.settings_tab.load_settings("show_fails", "on") - self.settings_tab.load_settings("skip_already_installed", "on") - except: - pass - - if not check_steamcmd(): - self.show_steam_warning_message() - - # items check for update, ill change all the variables to work this way at a later date - if self.settings_tab.check_items_var.get(): - self.library_tab.check_for_updates(on_launch=True) - - def do_popup(self, event, frame): - try: frame.tk_popup(event.x_root, event.y_root) - finally: frame.grab_release() - - def create_context_menu(self, text_widget, textbox=False, library=False): - context_menu = Menu(text_widget, tearoff=False, background='#565b5e', fg='white', borderwidth=0, bd=0) - context_menu.add_command(label="Paste", command=lambda: self.clipboard_paste(text_widget, textbox, library)) - context_menu.add_separator() - context_menu.add_command(label="Copy", command=lambda: self.clipboard_copy(text_widget, textbox, library)) - context_menu.add_separator() - context_menu.add_command(label="Cut", command=lambda: self.clipboard_cut(text_widget, textbox, library)) - context_menu.add_separator() - context_menu.add_command(label="Select All", command=lambda: self.select_all(text_widget, textbox)) - text_widget.bind("", lambda event: self.do_popup(event, frame=context_menu)) - - def clipboard_copy(self, text, textbox=False, library=False): - text.clipboard_clear() - try: - text.clipboard_append(text.selection_get()) - except: - if textbox: - text.clipboard_append(text.get("1.0", END)) - else: - text.clipboard_append(text.get()) - finally: - if library: - self.library_tab.filter_items(self.cevent) - - def clipboard_paste(self, text, textbox=False, library=False): - try: - if textbox: - text_cont = text.get("1.0", END) - else: - text_cont = text.get() - if textbox: - if text.tag_ranges("sel"): - text.delete("sel.first", "sel.last") - else: - if text.selection_get() in text_cont: - start_index = text_cont.index(text.selection_get()) - end_index = start_index + len(text.selection_get()) - text.delete(start_index, end_index) - text.insert(ctk.INSERT, text.clipboard_get()) - except: - text.insert(ctk.INSERT, text.clipboard_get()) - finally: - if library: - self.library_tab.filter_items(self.cevent) - - def select_all(self, text_widget, textbox=False): - if textbox: - text_widget.tag_add("sel", "1.0", "end") - text_widget.focus() - else: - text_widget.select_range(0, END) - text_widget.focus() - - def clipboard_cut(self, text, textbox=False, library=False): - text.clipboard_clear() - if textbox: - text_cont = text.get(1.0, END) - else: - text_cont = text.get() - try: - if textbox: - if text.tag_ranges("sel"): - selected_text = text.get("sel.first", "sel.last") - text.clipboard_append(selected_text) - text.delete("sel.first", "sel.last") - else: - raise - else: - text.clipboard_append(text.selection_get()) - if text.selection_get() in text_cont: - start_index = text_cont.index(text.selection_get()) - end_index = start_index + len(text.selection_get()) - text.delete(start_index, end_index) - except: - if textbox: - text.clipboard_append(text.get("1.0", END)) - text.delete(1.0, "end") - else: - text.clipboard_append(text.get()) - text.delete(0, "end") - finally: - if library: - self.library_tab.filter_items(self.cevent) - - def save_window_size(self, event): - with open("boiiiwd_dont_touch.conf", "w") as conf: - conf.write(self.geometry()) - - def on_closing(self): - save_config("DestinationFolder" ,self.edit_destination_folder.get()) - save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) - self.stop_download(on_close=True) - os._exit(0) - - def id_chnaged_handler(self, some=None, other=None ,shit=None): - self.after(1, self.label_file_size.configure(text=f"File size: 0KB")) - - def check_for_updates(self): - check_for_updates_func(self, ignore_up_todate=False) - - def change_appearance_mode_event(self, new_appearance_mode: str): - ctk.set_appearance_mode(new_appearance_mode) - save_config("appearance", new_appearance_mode) - - def change_scaling_event(self, new_scaling: str): - new_scaling_float = int(new_scaling.replace("%", "")) / 100 - ctk.set_widget_scaling(new_scaling_float) - save_config("scaling", str(new_scaling_float)) - - def hide_main_widgets(self): - self.optionsframe.grid_forget() - self.slider_progressbar_frame.grid_forget() - - def show_main_widgets(self): - self.title("BOIII Workshop Downloader - Main") - self.slider_progressbar_frame.grid(row=2, column=1, rowspan=1, padx=(0, 20), pady=(20, 20), sticky="nsew") - self.optionsframe.grid(row=0, column=1, rowspan=2, padx=(0, 20), pady=(20, 0), sticky="nsew") - - def hide_settings_widgets(self): - self.settings_tab.grid_forget() - - def show_settings_widgets(self): - self.title("BOIII Workshop Downloader - Settings") - self.settings_tab.grid(row=0, rowspan=3, column=1, padx=(0, 20), pady=(20, 20), sticky="nsew") - self.settings_tab.load_on_switch_screen() - - def hide_library_widgets(self): - self.library_tab.grid_remove() - - def show_library_widgets(self): - self.title("BOIII Workshop Downloader - Library") - status = self.library_tab.load_items(self.edit_destination_folder.get()) - self.library_tab.grid(row=0, rowspan=3, column=1, padx=(0, 20), pady=(20, 20), sticky="nsew") - self.title(f"BOIII Workshop Downloader - Library ➜ {status}") - - def show_queue_widgets(self): - self.title("BOIII Workshop Downloader - Queue") - self.optionsframe.grid_forget() - self.queue_enabled = True - self.slider_progressbar_frame.grid(row=2, column=1, rowspan=1, padx=(0, 20), pady=(20, 20), sticky="nsew") - self.qeueuframe.grid(row=0, column=1, rowspan=2, padx=(0, 20), pady=(20, 0), sticky="nsew") - - def hide_queue_widgets(self): - self.queue_enabled = False - self.qeueuframe.grid_forget() - - def main_button_event(self): - self.sidebar_main.configure(state="active", fg_color=(self.active_color)) - self.sidebar_settings.configure(state="normal", fg_color="transparent") - self.sidebar_library.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_queue.configure(state="normal", fg_color=(self.normal_color)) - self.hide_settings_widgets() - self.hide_library_widgets() - self.hide_queue_widgets() - self.show_main_widgets() - - def settings_button_event(self): - self.sidebar_main.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_library.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_queue.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_settings.configure(state="active", fg_color=(self.active_color)) - self.hide_main_widgets() - self.hide_library_widgets() - self.hide_queue_widgets() - self.show_settings_widgets() - - def library_button_event(self): - self.sidebar_main.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_settings.configure(state="normal", fg_color="transparent") - self.sidebar_queue.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_library.configure(state="active", fg_color=(self.active_color)) - self.hide_main_widgets() - self.hide_settings_widgets() - self.hide_queue_widgets() - self.show_library_widgets() - - def queue_button_event(self): - self.sidebar_main.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_settings.configure(state="normal", fg_color="transparent") - self.sidebar_library.configure(state="normal", fg_color=(self.normal_color)) - self.sidebar_queue.configure(state="active", fg_color=(self.active_color)) - self.hide_settings_widgets() - self.hide_library_widgets() - self.show_queue_widgets() - - def load_configs(self): - if os.path.exists(CONFIG_FILE_PATH): - destination_folder = check_config("DestinationFolder", "") - steamcmd_path = check_config("SteamCMDPath", os.getcwd()) - new_appearance_mode = check_config("appearance", "Dark") - new_scaling = check_config("scaling", 1.0) - self.edit_destination_folder.delete(0, "end") - self.edit_destination_folder.insert(0, destination_folder) - self.edit_steamcmd_path.delete(0, "end") - self.edit_steamcmd_path.insert(0, steamcmd_path) - ctk.set_appearance_mode(new_appearance_mode) - ctk.set_widget_scaling(float(new_scaling)) - self.settings_tab.appearance_mode_optionemenu.set(new_appearance_mode) - scaling_float = float(new_scaling)*100 - scaling_int = math.trunc(scaling_float) - self.settings_tab.scaling_optionemenu.set(f"{scaling_int}%") - else: - new_appearance_mode = check_config("appearance", "Dark") - new_scaling = check_config("scaling", 1.0) - ctk.set_appearance_mode(new_appearance_mode) - ctk.set_widget_scaling(float(new_scaling)) - self.settings_tab.appearance_mode_optionemenu.set(new_appearance_mode) - scaling_float = float(new_scaling)*100 - 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()) - create_default_config() - - def help_queue_text_func(self, event=None): - textarea_content = self.queuetextarea.get("1.0", "end").strip() - help_text = "3010399939,2976006537,2118338989,...\nor:\n3010399939\n2976006537\n2113146805\n..." - if any(char.strip() for char in textarea_content): - if help_text in textarea_content: - self.workshop_queue_label.configure(text="Workshop IDs/Links => press help to see examples:") - self.help_button.configure(text="Help") - self.queuetextarea.configure(state="normal") - self.queuetextarea.delete(1.0, "end") - self.queuetextarea.insert(1.0, "") - if self.help_restore_content: - self.queuetextarea.insert(1.0, self.help_restore_content.strip()) - else: - self.queuetextarea.insert(1.0, "") - else: - if not help_text in textarea_content: - self.help_restore_content = textarea_content - self.workshop_queue_label.configure(text="Workshop IDs/Links => press help to see examples:") - self.help_button.configure(text="Restore") - self.queuetextarea.configure(state="normal") - self.queuetextarea.delete(1.0, "end") - self.queuetextarea.insert(1.0, "") - self.workshop_queue_label.configure(text="Workshop IDs/Links => press restore to remove examples:") - self.queuetextarea.insert(1.0, help_text) - self.queuetextarea.configure(state="disabled") - else: - self.help_restore_content = textarea_content - self.workshop_queue_label.configure(text="Workshop IDs/Links => press restore to remove examples:") - self.help_button.configure(text="Restore") - self.queuetextarea.insert(1.0, help_text) - self.queuetextarea.configure(state="disabled") - - def open_BOIII_browser(self): - selected_folder = ctk.filedialog.askdirectory(title="Select boiii Folder") - if selected_folder: - self.edit_destination_folder.delete(0, "end") - self.edit_destination_folder.insert(0, selected_folder) - save_config("DestinationFolder" ,self.edit_destination_folder.get()) - save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) - - def open_steamcmd_path_browser(self): - selected_folder = ctk.filedialog.askdirectory(title="Select SteamCMD Folder") - if selected_folder: - self.edit_steamcmd_path.delete(0, "end") - self.edit_steamcmd_path.insert(0, selected_folder) - save_config("DestinationFolder" ,self.edit_destination_folder.get()) - save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) - - def show_steam_warning_message(self): - def callback(): - msg = CTkMessagebox(title="Warning", message="steamcmd.exe was not found in the specified directory.\nPress Download to get it or Press Cancel and select it from there!.", - icon="warning", option_1="Cancel", option_2="Download", sound=True) - response = msg.get() - if response == "Cancel": - return - elif response == "Download": - self.download_steamcmd() - self.after(0, callback) - - def open_browser(self): - link = "https://steamcommunity.com/app/311210/workshop/" - webbrowser.open(link) - - def download_steamcmd(self): - self.edit_steamcmd_path.delete(0, "end") - self.edit_steamcmd_path.insert(0, cwd()) - 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") - - try: - response = requests.get(steamcmd_url) - response.raise_for_status() - - with open(steamcmd_zip_path, "wb") as zip_file: - zip_file.write(response.content) - - with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref: - zip_ref.extractall(cwd()) - - if check_steamcmd(): - os.remove(fr"{steamcmd_zip_path}") - def inti_steam(): - msg = CTkMessagebox(title="Success", message="SteamCMD has been downloaded ,Press ok to initialize it.", icon="info", option_1="No", option_2="Ok", sound=True) - response = msg.get() - if response == "No": - pass - elif response == "Ok": - initialize_steam_thread = threading.Thread(target=lambda: initialize_steam(self)) - initialize_steam_thread.start() - else: - pass - self.after(0, inti_steam) - else: - show_message("Error", "Failed to find steamcmd.exe after extraction.\nMake you sure to select the correct SteamCMD path (by default current BOIIIWD path)", icon="cancel") - os.remove(fr"{steamcmd_zip_path}") - except requests.exceptions.RequestException as e: - show_message("Error", f"Failed to download SteamCMD: {e}", icon="cancel") - os.remove(fr"{steamcmd_zip_path}") - except zipfile.BadZipFile: - show_message("Error", "Failed to extract SteamCMD. The downloaded file might be corrupted.", icon="cancel") - os.remove(fr"{steamcmd_zip_path}") - - def show_map_info(self): - def show_map_thread(): - workshop_id = self.edit_workshop_id.get().strip() - - if not workshop_id: - show_message("Warning", "Please enter a Workshop ID/Link first.") - return - - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - show_message("Warning", "Please enter a valid Workshop ID/Link.") - except: - show_message("Warning", "Please enter a valid Workshop ID/Link.") - return - if self.button_download._state == "normal": - self.after(1, lambda mid=workshop_id: self.label_file_size.configure(text=f"File size: {get_workshop_file_size(mid ,raw=True)}")) - - try: - headers = {'Cache-Control': 'no-cache'} - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url, headers=headers) - response.raise_for_status() - content = response.text - - soup = BeautifulSoup(content, "html.parser") - - try: - map_mod_type = soup.find("div", class_="rightDetailsBlock").text.strip() - map_name = soup.find("div", class_="workshopItemTitle").text.strip() - map_size = map_size = get_workshop_file_size(workshop_id, raw=True) - details_stats_container = soup.find("div", class_="detailsStatsContainerRight") - details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") - date_created = details_stat_elements[1].text.strip() - try: - ratings = soup.find('div', class_='numRatings') - ratings_text = ratings.get_text() - except: - ratings = "Not found" - ratings_text= "Not enough ratings" - try: - date_updated = details_stat_elements[2].text.strip() - except: - date_updated = "Not updated" - stars_div = soup.find("div", class_="fileRatingDetails") - starts = stars_div.find("img")["src"] - except: - show_message("Warning", "Please enter a valid Workshop ID/Link\nCouldn't get information.") - return - - try: - preview_image_element = soup.find("img", id="previewImage") - workshop_item_image_url = preview_image_element["src"] - except: - try: - preview_image_element = soup.find("img", id="previewImageMain") - workshop_item_image_url = preview_image_element["src"] - except Exception as e: - show_message("Warning", f"Failed to get preview image ,probably wrong link/id if not please open an issue on github.\n{e}") - return - - starts_image_response = requests.get(starts) - stars_image = Image.open(io.BytesIO(starts_image_response.content)) - stars_image_size = stars_image.size - - image_response = requests.get(workshop_item_image_url) - image_response.raise_for_status() - image = Image.open(io.BytesIO(image_response.content)) - image_size = image.size - - self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created , - date_updated, stars_image, stars_image_size, ratings_text, url) - - except requests.exceptions.RequestException as e: - show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") - return - - info_thread = threading.Thread(target=show_map_thread) - info_thread.start() - - def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - date_created ,date_updated, stars_image, stars_image_size, ratings_text, url): - def main_thread(): - top = ctk.CTkToplevel(self) - top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) - top.title("Map/Mod Information") - top.attributes('-topmost', 'true') - - def close_window(): - top.destroy() - - def view_map_mod(): - webbrowser.open(url) - - # frames - stars_frame = ctk.CTkFrame(top) - stars_frame.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 0), sticky="nsew") - stars_frame.columnconfigure(0, weight=0) - stars_frame.rowconfigure(0, weight=1) - - image_frame = ctk.CTkFrame(top) - image_frame.grid(row=1, column=0, columnspan=2, padx=20, pady=0, sticky="nsew") - - info_frame = ctk.CTkFrame(top) - info_frame.grid(row=2, column=0, columnspan=2, padx=20, pady=20, sticky="nsew") - - buttons_frame = ctk.CTkFrame(top) - buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") - - # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") - name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") - type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - size_label = ctk.CTkLabel(info_frame, text=f"Size: {map_size}") - size_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") - date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") - date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - stars_image_label = ctk.CTkLabel(stars_frame) - stars_width, stars_height = stars_image_size - stars_image_widget = ctk.CTkImage(stars_image, size=(int(stars_width), int(stars_height))) - stars_image_label.configure(image=stars_image_widget, text="") - stars_image_label.pack(side="left", padx=(10, 20), pady=(10, 10)) - - ratings = ctk.CTkLabel(stars_frame) - ratings.configure(text=ratings_text) - ratings.pack(side="right", padx=(10, 20), pady=(10, 10)) - - image_label = ctk.CTkLabel(image_frame) - width, height = image_size - image_widget = ctk.CTkImage(image, size=(int(width), int(height))) - image_label.configure(image=image_widget, text="") - image_label.pack(expand=True, fill="both", padx=(10, 20), pady=(10, 10)) - - # Buttons - close_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod) - close_button.pack(side="left", padx=(10, 20), pady=(10, 10)) - - view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window) - view_button.pack(side="right", padx=(10, 20), pady=(10, 10)) - - top.grid_rowconfigure(0, weight=0) - top.grid_rowconfigure(1, weight=0) - top.grid_rowconfigure(2, weight=1) - top.grid_columnconfigure(0, weight=1) - top.grid_columnconfigure(1, weight=1) - - self.after(0, main_thread) - - def check_steamcmd_stdout(self, log_file_path, target_item_id): - temp_file_path = log_file_path + '.temp' - shutil.copy2(log_file_path, temp_file_path) - - try: - with open(temp_file_path, 'r') as log_file: - log_file.seek(0, os.SEEK_END) - file_size = log_file.tell() - - position = file_size - lines_found = 0 - - while lines_found < 7 and position > 0: - position -= 1 - log_file.seek(position, os.SEEK_SET) - - char = log_file.read(1) - - if char == '\n': - lines_found += 1 - - lines = log_file.readlines()[-7:] - - for line in reversed(lines): - line = line.lower().strip() - if f"download item {target_item_id.strip()}" in line: - return True - - return False - finally: - os.remove(temp_file_path) - - def skip_current_queue_item(self): - if self.button_download._state == "normal": - self.skip_boutton.grid_remove() - self.after(1, self.status_text.configure(text=f"Status: Standby!")) - return - self.settings_tab.stopped = True - self.item_skipped = True - self.settings_tab.steam_fail_counter = 0 - self.is_pressed = False - self.is_downloading = False - self.after(1, self.label_file_size.configure(text=f"File size: 0KB")) - - subprocess.run(['taskkill', '/F', '/IM', 'steamcmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - creationflags=subprocess.CREATE_NO_WINDOW) - self.skip_boutton.grid_remove() - self.after(2, self.status_text.configure(text=f"Status: Skipping...")) - self.label_speed.configure(text="Network Speed: 0 KB/s") - self.progress_text.configure(text="0%") - self.progress_bar.set(0.0) - - # the real deal - def run_steamcmd_command(self, command, map_folder, wsid, queue=None): - steamcmd_path = get_steamcmd_path() - stdout_path = os.path.join(steamcmd_path, "logs", "workshop_log.txt") - timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - - os.makedirs(os.path.dirname(stdout_path), exist_ok=True) - - try: - with open(stdout_path, 'w') as file: - file.write('') - except: - os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) - - show_console = subprocess.CREATE_NO_WINDOW - if self.settings_tab.console: - show_console = subprocess.CREATE_NEW_CONSOLE - - if os.path.exists(map_folder): - try: - try: - os.remove(map_folder) - except: - os.rename(map_folder, os.path.join(map_folder, os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", f"couldntremove_{timestamp}"))) - except Exception as e: - self.settings_tab.stopped = True - self.queue_stop_button = True - show_message("Error", f"Couldn't remove {map_folder}, please do so manually\n{e}", icon="cancel") - self.stop_download() - return - - if self.settings_tab.continuous: - start_time = 0 - while not os.path.exists(map_folder) and not self.settings_tab.stopped: - process = subprocess.Popen( - [steamcmd_path + "\steamcmd.exe"] + command.split(), - stdout=None if self.settings_tab.console else subprocess.PIPE, - stderr=None if self.settings_tab.console else subprocess.PIPE, - text=True, - bufsize=1, - universal_newlines=True, - creationflags=show_console - ) - - #wait for process - while True: - if not self.is_downloading: - if self.check_steamcmd_stdout(stdout_path, wsid): - start_time = time.time() - self.is_downloading = True - elapsed_time = time.time() - start_time - if process.poll() != None: - break - time.sleep(1) - - # print("Broken freeeee!") - self.is_downloading = False - try: - with open(stdout_path, 'w') as file: - file.write('') - except: - os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) - - if not self.settings_tab.stopped: - self.settings_tab.steam_fail_counter = self.settings_tab.steam_fail_counter + 1 - if elapsed_time < 20 and elapsed_time > 0 and not os.path.exists(map_folder): - self.fail_threshold = self.fail_threshold + 1 - - if self.settings_tab.steam_fail_counter_toggle: - try: - if self.fail_threshold >= int(self.settings_tab.steam_fail_number): - reset_steamcmd(no_warn=True) - self.settings_tab.steamcmd_reset = True - self.settings_tab.steam_fail_counter = 0 - self.fail_threshold = 0 - except: - if self.fail_threshold >= 25: - reset_steamcmd(no_warn=True) - self.settings_tab.steam_fail_counter = 0 - self.fail_threshold = 0 - else: - process = subprocess.Popen( - [steamcmd_path + "\steamcmd.exe"] + command.split(), - stdout=None if self.settings_tab.console else subprocess.PIPE, - stderr=None if self.settings_tab.console else subprocess.PIPE, - text=True, - bufsize=1, - universal_newlines=True, - creationflags=show_console - ) - - while True: - if not self.is_downloading: - if self.check_steamcmd_stdout(stdout_path, wsid): - self.is_downloading = True - if process.poll() != None: - break - time.sleep(1) - - # print("Broken freeeee!") - self.is_downloading = False - try: - with open(stdout_path, 'w') as file: - file.write('') - except: - os.rename(stdout_path, os.path.join(map_folder, os.path.join(stdout_path, f"workshop_log_couldntremove_{timestamp}.txt"))) - - if not os.path.exists(map_folder): - show_message("SteamCMD has terminated", "SteamCMD has been terminated\nAnd failed to download the map/mod, try again or enable continuous download in settings") - - self.settings_tab.stopped = True - if not queue: - self.button_download.configure(state="normal") - self.button_stop.configure(state="disabled") - - return process.returncode - - def show_init_message(self): - def callback(): - msg = CTkMessagebox(title="Warning", message="SteamCMD is not initialized, Press OK to do so!\nProgram may go unresponsive until SteamCMD is finished downloading.", icon="info", option_1="No", option_2="Ok", sound=True) - response = msg.get() - if response == "No": - return - elif response == "Ok": - initialize_steam_thread = threading.Thread(target=lambda: initialize_steam(self)) - initialize_steam_thread.start() - else: - return - self.after(0, callback) - - def show_complete_message(self, message): - def callback(): - msg = CTkMessagebox(title="Downloads Complete", message=message, icon="info", option_1="Launch", option_2="Ok", sound=True) - response = msg.get() - if response=="Launch": - launch_boiii_func(self.edit_destination_folder.get().strip()) - if response=="Ok": - return - self.after(0, callback) - - def download_map(self, update=False): - self.is_downloading = False - self.fail_threshold = 0 - if not self.is_pressed: - self.after(1, self.label_speed.configure(text=f"Loading...")) - self.is_pressed = True - self.library_tab.load_items(self.edit_destination_folder.get()) - if self.queue_enabled: - self.item_skipped = False - start_down_thread = threading.Thread(target=self.queue_download_thread, args=(update,)) - start_down_thread.start() - else: - start_down_thread = threading.Thread(target=self.download_thread, args=(update,)) - start_down_thread.start() - else: - show_message("Warning", "Already pressed, Please wait.") - - def queue_download_thread(self, update=None): - self.stopped = False - self.queue_stop_button = False - try: - save_config("DestinationFolder" ,self.edit_destination_folder.get()) - save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) - - if not check_steamcmd(): - self.show_steam_warning_message() - return - - steamcmd_path = get_steamcmd_path() - - if not is_steamcmd_initialized(): - self.show_init_message() - return - - text = self.queuetextarea.get("1.0", "end") - items = [] - if "," in text: - items = [n.strip() for n in text.split(",")] - else: - items = [n.strip() for n in text.split("\n") if n.strip()] - - if not items: - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - - destination_folder = self.edit_destination_folder.get().strip() - - if not destination_folder or not os.path.exists(destination_folder): - show_message("Error", "Please select a valid destination folder => in the main tab!.") - self.stop_download() - return - - if not steamcmd_path or not os.path.exists(steamcmd_path): - show_message("Error", "Please enter a valid SteamCMD path => in the main tab!.") - self.stop_download() - return - - self.total_queue_size = 0 - self.already_installed = [] - for item in items: - self.fail_threshold = 0 - item.strip() - workshop_id = item - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - except: - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - if not valid_id(workshop_id): - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - - ws_file_size = get_workshop_file_size(workshop_id) - file_size = ws_file_size - self.total_queue_size += ws_file_size - - if file_size is None: - show_message("Error", "Failed to retrieve file size.", icon="cancel") - self.stop_download() - return - - if any(workshop_id in item for item in self.library_tab.added_items): - self.already_installed.append(workshop_id) - - if not update: - if self.already_installed: - item_ids = ", ".join(self.already_installed) - if self.settings_tab.skip_already_installed: - for item in self.already_installed: - if item in items: - items.remove(item) - show_message("Heads up!, map/s skipped => skip is on in settings", f"These item IDs may already be installed and are skipped:\n{item_ids}", icon="info") - if not any(isinstance(item, int) for item in items): - self.stop_download() - return - else: - show_message("Heads up! map/s not skipped => skip is off in settings", f"These item IDs may already be installed:\n{item_ids}", icon="info") - - self.after(1, self.status_text.configure(text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)}")) - start_time = time.time() - for index, item in enumerate(items): - self.settings_tab.steam_fail_counter = 0 - current_number = index + 1 - total_items = len(items) - if self.queue_stop_button: - self.stop_download() - break - item.strip() - self.settings_tab.stopped = False - workshop_id = item - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - except: - show_message("Warning", "Please enter valid Workshop IDs/Links.", icon="warning") - self.stop_download() - return - ws_file_size = get_workshop_file_size(workshop_id) - file_size = ws_file_size - self.after(1, lambda mid=workshop_id: self.label_file_size.configure(text=f"File size: {get_workshop_file_size(mid ,raw=True)}")) - download_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "downloads", "311210", workshop_id) - map_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", workshop_id) - if not os.path.exists(download_folder): - os.makedirs(download_folder) - - def check_and_update_progress(): - previous_net_speed = 0 - est_downloaded_bytes = 0 - file_size = ws_file_size - item_name = get_item_name(workshop_id) if get_item_name(workshop_id) else "Error getting name" - - while not self.settings_tab.stopped: - if self.settings_tab.steamcmd_reset: - self.settings_tab.steamcmd_reset = False - previous_net_speed = 0 - est_downloaded_bytes = 0 - - if self.item_skipped: - if index > 0: - prev_item_size = None - previous_item = items[index - 1] - prev_item_path = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "downloads", "311210", previous_item) - prev_item_path_2 = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", previous_item) - if os.path.exists(prev_item_path): - prev_item_size = sum(os.path.getsize(os.path.join(prev_item_path, f)) for f in os.listdir(prev_item_path)) - elif os.path.exists(prev_item_path_2): - prev_item_size = sum(os.path.getsize(os.path.join(prev_item_path_2, f)) for f in os.listdir(prev_item_path_2)) - else: - prev_item_size = get_workshop_file_size(previous_item) - if prev_item_size: - self.total_queue_size -= prev_item_size - self.item_skipped = False - - while not self.is_downloading and not self.settings_tab.stopped: - self.after(1, self.label_speed.configure(text=f"Waiting for steamcmd...")) - time_elapsed = time.time() - start_time - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - self.after(1, self.status_text.configure( - text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)} | ID: {workshop_id} | {item_name} | Waiting {current_number}/{total_items}")) - if len(items) > 1: - self.skip_boutton.grid(row=3, column=1, padx=(10, 20), pady=(0, 25), sticky="ws") - if index == len(items) - 1: - self.skip_boutton.grid_remove() - time.sleep(1) - if self.is_downloading: - break - - try: - current_size = sum(os.path.getsize(os.path.join(download_folder, f)) for f in os.listdir(download_folder)) - except: - try: - current_size = sum(os.path.getsize(os.path.join(map_folder, f)) for f in os.listdir(map_folder)) - except: - continue - - progress = int(current_size / file_size * 100) - - if progress > 100 and not self.settings_tab.stopped: - progress = int(current_size / current_size * 100) - self.total_queue_size -= file_size - file_size = current_size - self.total_queue_size += file_size - self.after(1, self.status_text.configure( - text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)} | ID: {workshop_id} | {item_name} | Downloading {current_number}/{total_items}")) - self.after(1, lambda p=progress: self.label_file_size.configure(text=f"Wrong size reported\nFile size: ~{convert_bytes_to_readable(current_size)}")) - - if self.settings_tab.estimated_progress and not self.settings_tab.stopped: - time_elapsed = time.time() - start_time - raw_net_speed = psutil.net_io_counters().bytes_recv - - current_net_speed_text = raw_net_speed - net_speed_bytes = current_net_speed_text - previous_net_speed - previous_net_speed = current_net_speed_text - - current_net_speed = net_speed_bytes - down_cap = 150000000 - if current_net_speed >= down_cap: - current_net_speed = 10 - - est_downloaded_bytes += current_net_speed - - percentage_complete = (est_downloaded_bytes / file_size) * 100 - - progress = min(percentage_complete / 100, 0.99) - - net_speed, speed_unit = convert_speed(net_speed_bytes) - - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - - # print(f"raw_net {raw_net_speed}\ncurrent_net_speed: {current_net_speed}\nest_downloaded_bytes {est_downloaded_bytes}\npercentage_complete {percentage_complete}\nprogress {progress}") - self.after(1, self.status_text.configure( - text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)} | ID: {workshop_id} | {item_name} | Downloading {current_number}/{total_items}")) - self.after(1, self.progress_bar.set(progress)) - self.after(1, lambda v=net_speed: self.label_speed.configure(text=f"Network Speed: {v:.2f} {speed_unit}")) - self.after(1, lambda p=min(percentage_complete ,99): self.progress_text.configure(text=f"{p:.2f}%")) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - - time.sleep(1) - else: - if not self.settings_tab.stopped: - time_elapsed = time.time() - start_time - progress = int(current_size / file_size * 100) - self.after(1, lambda v=progress / 100.0: self.progress_bar.set(v)) - - current_net_speed = psutil.net_io_counters().bytes_recv - - net_speed_bytes = current_net_speed - previous_net_speed - previous_net_speed = current_net_speed - - net_speed, speed_unit = convert_speed(net_speed_bytes) - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - - self.after(1, self.status_text.configure( - text=f"Status: Total size: ~{convert_bytes_to_readable(self.total_queue_size)} | ID: {workshop_id} | {item_name} | Downloading {current_number}/{total_items}")) - self.after(1, lambda v=net_speed: self.label_speed.configure(text=f"Network Speed: {v:.2f} {speed_unit}")) - self.after(1, lambda p=progress: self.progress_text.configure(text=f"{p}%")) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - time.sleep(1) - - command = f"+login anonymous app_update 311210 +workshop_download_item 311210 {workshop_id} validate +quit" - steamcmd_thread = threading.Thread(target=lambda: self.run_steamcmd_command(command, map_folder, workshop_id, queue=True)) - steamcmd_thread.start() - - def wait_for_threads(): - update_ui_thread = threading.Thread(target=check_and_update_progress) - update_ui_thread.daemon = True - update_ui_thread.start() - update_ui_thread.join() - - self.progress_text.configure(text="0%") - self.progress_bar.set(0.0) - - map_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", workshop_id) - - json_file_path = os.path.join(map_folder, "workshop.json") - - 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) - 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: - folder_name = get_folder_name - else: - try: - folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - else: - try: - folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - - if mod_type == "mod": - mods_folder = os.path.join(destination_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") - elif mod_type == "map": - usermaps_folder = os.path.join(destination_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") - else: - show_message("Error", f"Invalid workshop type in workshop.json, are you sure this is a map or a mod?., skipping {workshop_id}...", icon="cancel") - return - - os.makedirs(folder_name_path, exist_ok=True) - - try: - self.copy_with_progress(map_folder, folder_name_path) - except Exception as E: - show_message("Error", f"Error copying files: {E}", icon="cancel") - - if self.settings_tab.clean_on_finish: - remove_tree(map_folder) - remove_tree(download_folder) - - self.library_tab.update_item(self.edit_destination_folder.get(), workshop_id, mod_type, folder_name) - - if index == len(items) - 1: - self.after(1, self.status_text.configure(text=f"Status: Done! => Please press stop only if you see no popup window (rare bug)")) - self.show_complete_message(message=f"All files were downloaded\nYou can run the game now!\nPS: You have to restart the game \n(pressing launch will launch/restarts)") - self.label_speed.configure(text="Awaiting Download!") - elif os.path.exists(json_file_path) and not self.settings_tab.stopped: - show_message("Error", "Failed to find workshop.json, please try again.", icon="cancel") - if index == len(items) - 1: - self.stop_download() - return - - self.button_download.configure(state="disabled") - self.button_stop.configure(state="normal") - update_wait_thread = threading.Thread(target=wait_for_threads) - update_wait_thread.start() - steamcmd_thread.join() - update_wait_thread.join() - - if index == len(items) - 1: - self.button_download.configure(state="normal") - self.button_stop.configure(state="disabled") - self.after(1, self.status_text.configure(text=f"Status: Done!")) - self.skip_boutton.grid_remove() - self.after(1, self.label_file_size.configure(text=f"File size: 0KB")) - self.settings_tab.stopped = True - self.stop_download() - return - finally: - self.settings_tab.steam_fail_counter = 0 - self.after(1, self.label_file_size.configure(text=f"File size: 0KB")) - self.stop_download() - self.is_pressed = False - - def download_thread(self, update=None): - try: - self.settings_tab.stopped = False - - save_config("DestinationFolder" ,self.edit_destination_folder.get()) - save_config("SteamCMDPath" ,self.edit_steamcmd_path.get()) - - if not check_steamcmd(): - self.show_steam_warning_message() - return - - steamcmd_path = get_steamcmd_path() - - if not is_steamcmd_initialized(): - self.show_init_message() - return - - workshop_id = self.edit_workshop_id.get().strip() - - destination_folder = self.edit_destination_folder.get().strip() - - if not destination_folder or not os.path.exists(destination_folder): - show_message("Error", "Please select a valid destination folder.") - self.stop_download() - return - - if not steamcmd_path or not os.path.exists(steamcmd_path): - show_message("Error", "Please enter a valid SteamCMD path.") - self.stop_download() - return - - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - show_message("Warning", "Please enter a valid Workshop ID/Link.", icon="warning") - self.stop_download() - return - except: - show_message("Warning", "Please enter a valid Workshop ID/Link.", icon="warning") - self.stop_download() - return - - ws_file_size = get_workshop_file_size(workshop_id) - file_size = ws_file_size - - if not valid_id(workshop_id): - show_message("Warning", "Please enter a valid Workshop ID/Link.", icon="warning") - self.stop_download() - return - - if file_size is None: - show_message("Error", "Failed to retrieve file size.", icon="cancel") - self.stop_download() - return - - if not update: - if any(workshop_id in item for item in self.library_tab.added_items): - if self.settings_tab.skip_already_installed: - show_message("Heads up!, map skipped => Skip is on in settings", f"This item may already be installed, Stopping: {workshop_id}", icon="info") - self.stop_download() - return - show_message("Heads up! map not skipped => Skip is off in settings", f"This item may already be installed: {workshop_id}", icon="info") - - self.after(1, lambda mid=workshop_id: self.label_file_size.configure(text=f"File size: {get_workshop_file_size(mid ,raw=True)}")) - download_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "downloads", "311210", workshop_id) - map_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", workshop_id) - if not os.path.exists(download_folder): - os.makedirs(download_folder) - - def check_and_update_progress(): - previous_net_speed = 0 - est_downloaded_bytes = 0 - start_time = time.time() - file_size = ws_file_size - - while not self.settings_tab.stopped: - if self.settings_tab.steamcmd_reset: - self.settings_tab.steamcmd_reset = False - previous_net_speed = 0 - est_downloaded_bytes = 0 - - while not self.is_downloading and not self.settings_tab.stopped: - self.after(1, self.label_speed.configure(text=f"Waiting for steamcmd...")) - time_elapsed = time.time() - start_time - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - time.sleep(1) - if self.is_downloading: - break - - try: - current_size = sum(os.path.getsize(os.path.join(download_folder, f)) for f in os.listdir(download_folder)) - except: - try: - current_size = sum(os.path.getsize(os.path.join(map_folder, f)) for f in os.listdir(map_folder)) - except: - continue - - progress = int(current_size / file_size * 100) - - if progress > 100: - progress = int(current_size / current_size * 100) - file_size = current_size - self.after(1, lambda p=progress: self.label_file_size.configure(text=f"Wrong size reported\nActual size: ~{convert_bytes_to_readable(current_size)}")) - - - if self.settings_tab.estimated_progress and not self.settings_tab.stopped: - time_elapsed = time.time() - start_time - raw_net_speed = psutil.net_io_counters().bytes_recv - - current_net_speed_text = raw_net_speed - net_speed_bytes = current_net_speed_text - previous_net_speed - previous_net_speed = current_net_speed_text - - current_net_speed = net_speed_bytes - down_cap = 150000000 - if current_net_speed >= down_cap: - current_net_speed = 10 - - est_downloaded_bytes += current_net_speed - - percentage_complete = (est_downloaded_bytes / file_size) * 100 - - progress = min(percentage_complete / 100, 0.99) - - net_speed, speed_unit = convert_speed(net_speed_bytes) - - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - - # print(f"raw_net {raw_net_speed}\ncurrent_net_speed: {current_net_speed}\nest_downloaded_bytes {est_downloaded_bytes}\npercentage_complete {percentage_complete}\nprogress {progress}") - - self.after(1, self.progress_bar.set(progress)) - self.after(1, lambda v=net_speed: self.label_speed.configure(text=f"Network Speed: {v:.2f} {speed_unit}")) - self.after(1, lambda p=min(percentage_complete ,99): self.progress_text.configure(text=f"{p:.2f}%")) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - - time.sleep(1) - else: - if not self.settings_tab.stopped: - time_elapsed = time.time() - start_time - progress = int(current_size / file_size * 100) - self.after(1, lambda v=progress / 100.0: self.progress_bar.set(v)) - - current_net_speed = psutil.net_io_counters().bytes_recv - - net_speed_bytes = current_net_speed - previous_net_speed - previous_net_speed = current_net_speed - - net_speed, speed_unit = convert_speed(net_speed_bytes) - elapsed_hours, elapsed_minutes, elapsed_seconds = convert_seconds(time_elapsed) - - self.after(1, lambda v=net_speed: self.label_speed.configure(text=f"Network Speed: {v:.2f} {speed_unit}")) - self.after(1, lambda p=progress: self.progress_text.configure(text=f"{p}%")) - if self.settings_tab.show_fails: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d} - Fails: {self.fail_threshold}")) - else: - self.after(1, lambda h=elapsed_hours, m=elapsed_minutes, s=elapsed_seconds: self.elapsed_time.configure(text=f"Elapsed Time: {int(h):02d}:{int(m):02d}:{int(s):02d}")) - time.sleep(1) - - command = f"+login anonymous app_update 311210 +workshop_download_item 311210 {workshop_id} validate +quit" - steamcmd_thread = threading.Thread(target=lambda: self.run_steamcmd_command(command, map_folder, workshop_id)) - steamcmd_thread.start() - - def wait_for_threads(): - update_ui_thread = threading.Thread(target=check_and_update_progress) - update_ui_thread.daemon = True - update_ui_thread.start() - update_ui_thread.join() - - self.settings_tab.stopped = True - self.progress_text.configure(text="0%") - self.progress_bar.set(0.0) - - map_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", workshop_id) - - json_file_path = os.path.join(map_folder, "workshop.json") - - 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) - 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: - folder_name = get_folder_name - else: - try: - folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - else: - try: - folder_name = extract_json_data(json_file_path, self.settings_tab.folder_options.get()) - except: - folder_name = extract_json_data(json_file_path, "publisherID") - - if mod_type == "mod": - mods_folder = os.path.join(destination_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") - elif mod_type == "map": - usermaps_folder = os.path.join(destination_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") - else: - show_message("Error", "Invalid workshop type in workshop.json, are you sure this is a map or a mod?.", icon="cancel") - self.stop_download() - return - - os.makedirs(folder_name_path, exist_ok=True) - - try: - self.copy_with_progress(map_folder, folder_name_path) - except Exception as E: - show_message("Error", f"Error copying files: {E}", icon="cancel") - - if self.settings_tab.clean_on_finish: - remove_tree(map_folder) - remove_tree(download_folder) - - self.library_tab.update_item(self.edit_destination_folder.get(), workshop_id, mod_type, folder_name) - self.show_complete_message(message=f"{mod_type.capitalize()} files were downloaded\nYou can run the game now!\nPS: You have to restart the game \n(pressing launch will launch/restarts)") - self.button_download.configure(state="normal") - self.button_stop.configure(state="disabled") - elif os.path.exists(json_file_path) and not self.settings_tab.stopped: - show_message("Error", "Failed to find workshop.json, please try again.", icon="cancel") - self.stop_download() - return - - update_wait_thread = threading.Thread(target=wait_for_threads) - update_wait_thread.start() - self.button_download.configure(state="disabled") - self.button_stop.configure(state="normal") - steamcmd_thread.join() - update_wait_thread.join() - - finally: - self.settings_tab.steam_fail_counter = 0 - self.stop_download() - self.is_pressed = False - - def copy_with_progress(self, src, dst): - try: - total_files = sum([len(files) for root, dirs, files in os.walk(src)]) - progress = 0 - - def copy_progress(src, dst): - nonlocal progress - shutil.copy2(src, dst) - progress += 1 - self.progress_text.configure(text=f"Copying files: {progress}/{total_files}") - value = (progress / total_files) * 100 - valuep = value / 100 - self.progress_bar.set(valuep) - - try: - shutil.copytree(src, dst, dirs_exist_ok=True, copy_function=copy_progress) - except Exception as E: - show_message("Error", f"Error copying files: {E}", icon="cancel") - finally: - self.progress_text.configure(text="0%") - self.progress_bar.set(0.0) - - def stop_download(self, on_close=None): - self.settings_tab.stopped = True - self.queue_stop_button = True - self.settings_tab.steam_fail_counter = 0 - self.is_pressed = False - self.is_downloading = False - self.after(1, self.label_file_size.configure(text=f"File size: 0KB")) - - if on_close: - subprocess.run(['taskkill', '/F', '/IM', 'steamcmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - creationflags=subprocess.CREATE_NO_WINDOW) - return - - subprocess.run(['taskkill', '/F', '/IM', 'steamcmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, - creationflags=subprocess.CREATE_NO_WINDOW) - - self.button_download.configure(state="normal") - self.button_stop.configure(state="disabled") - self.progress_text.configure(text="0%") - self.elapsed_time.configure(text=f"") - self.progress_bar.set(0.0) - 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() diff --git a/boiiiwd_old_pyqt.py b/boiiiwd_old_pyqt.py deleted file mode 100644 index 6fc91b7..0000000 --- a/boiiiwd_old_pyqt.py +++ /dev/null @@ -1,999 +0,0 @@ -import os -import sys -import re -import subprocess -import configparser -import json -import shutil -import zipfile -import psutil -import requests -import time -import threading -from bs4 import BeautifulSoup -from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QDialog, \ - QVBoxLayout, QMessageBox, QHBoxLayout, QProgressBar, QSizePolicy, QFileDialog, QCheckBox, QSpacerItem -from PyQt5.QtCore import Qt, QThread, pyqtSignal -from PyQt5.QtCore import QCoreApplication, QSettings -from PyQt5.QtGui import QIcon, QPixmap, QCloseEvent -import webbrowser -import qdarktheme - -VERSION = "v0.1.3" -GITHUB_REPO = "faroukbmiled/BOIIIWD" -LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip" -UPDATER_FOLDER = "update" -CONFIG_FILE_PATH = "config.ini" -global stopped, steampid, console, up_cancelled -steampid = None -stopped = False -console = False -up_cancelled = False - -def get_latest_release_version(): - try: - release_api_url = f"https://api.github.com/repos/{GITHUB_REPO}/releases/latest" - response = requests.get(release_api_url) - response.raise_for_status() - data = response.json() - return data["tag_name"] - except requests.exceptions.RequestException as e: - show_message("Warning", f"Error while checking for updates: \n{e}") - return None - - -def create_update_script(current_exe, new_exe, updater_folder, program_name): - script_content = f""" - @echo off - echo Terminating BOIIIWD.exe... - taskkill /im "{program_name}" /t /f - - echo Replacing BOIIIWD.exe... - cd "{updater_folder}" - taskkill /im "{program_name}" /t /f - move /y "{new_exe}" "../"{program_name}"" - - echo Starting BOIIIWD.exe... - cd .. - start "" "{current_exe}" - - echo Exiting! - exit - """ - - script_path = os.path.join(updater_folder, "boiiiwd_updater.bat") - with open(script_path, "w") as script_file: - script_file.write(script_content) - - return script_path - -def cwd(): - if getattr(sys, 'frozen', False): - return os.path.dirname(sys.executable) - else: - return os.path.dirname(os.path.abspath(__file__)) - -def extract_workshop_id(link): - try: - pattern = r'(?<=id=)(\d+)' - match = re.search(pattern, link) - - if match: - return match.group(0) - else: - return None - except: - return None - -def check_steamcmd(): - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - - if not os.path.exists(steamcmd_exe_path): - return False - - return True - -def initialize_steam(): - try: - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - process = subprocess.Popen([steamcmd_exe_path, "+quit"], creationflags=subprocess.CREATE_NEW_CONSOLE) - process.wait() - - show_message("Done!", "BOIIIWD is ready for action.", icon=QMessageBox.Information) - except: - show_message("Done!", "An error occurred please check your paths and try again.") - -def valid_id(workshop_id): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - soup = BeautifulSoup(content, "html.parser") - - try: - soup.find("div", class_="rightDetailsBlock").text.strip() - soup.find("div", class_="workshopItemTitle").text.strip() - soup.find("div", class_="detailsStatRight").text.strip() - stars_div = soup.find("div", class_="fileRatingDetails") - stars_div.find("img")["src"] - return True - except: - return False - -def convert_speed(speed_bytes): - if speed_bytes < 1024: - return speed_bytes, "B/s" - elif speed_bytes < 1024 * 1024: - return speed_bytes / 1024, "KB/s" - elif speed_bytes < 1024 * 1024 * 1024: - return speed_bytes / (1024 * 1024), "MB/s" - else: - return speed_bytes / (1024 * 1024 * 1024), "GB/s" - -def create_default_config(): - config = configparser.ConfigParser() - config["Settings"] = { - "SteamCMDPath": cwd(), - "DestinationFolder": "", - "checkforupdtes": "on", - "console": "off" - } - with open(CONFIG_FILE_PATH, "w") as config_file: - config.write(config_file) - -def run_steamcmd_command(command): - steamcmd_path = get_steamcmd_path() - show_console = subprocess.CREATE_NO_WINDOW - if console: - show_console = subprocess.CREATE_NEW_CONSOLE - - process = subprocess.Popen( - [steamcmd_path + "\steamcmd.exe"] + command.split(), - stdout=None if console else subprocess.PIPE, - stderr=None if console else subprocess.PIPE, - text=True, - bufsize=1, - universal_newlines=True, - creationflags=show_console - ) - - global steampid - steampid = process.pid - - if process.poll() is not None: - return process.returncode - - process.communicate() - - if process.returncode != 0: - show_message("Warning", "SteamCMD encountered an error while downloading, try again!") - - return process.returncode - -def get_steamcmd_path(): - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - return config.get("Settings", "SteamCMDPath", fallback=cwd()) - -def config_check_for_updates(state=None): - if state: - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - config["Settings"]["checkforupdtes"] = state - with open(CONFIG_FILE_PATH, "w") as config_file: - config.write(config_file) - return - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - return config.get("Settings", "checkforupdtes", fallback="on") - -def config_console_state(state=None): - if state: - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - config["Settings"]["console"] = state - with open(CONFIG_FILE_PATH, "w") as config_file: - config.write(config_file) - return - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - return config.get("Settings", "console", fallback="off") - -def extract_json_data(json_path): - with open(json_path, "r") as json_file: - data = json.load(json_file) - return data["Type"], data["FolderName"] - -def convert_bytes_to_readable(size_in_bytes): - for unit in ['B', 'KB', 'MB', 'GB', 'TB']: - if size_in_bytes < 1024.0: - return f"{size_in_bytes:.2f} {unit}" - size_in_bytes /= 1024.0 - -def get_workshop_file_size(workshop_id, raw=None): - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}&searchtext=" - response = requests.get(url) - soup = BeautifulSoup(response.text, "html.parser") - file_size_element = soup.find("div", class_="detailsStatRight") - - try: - if raw: - file_size_text = file_size_element.get_text(strip=True) - file_size_text = file_size_text.replace(",", "") - file_size_in_mb = float(file_size_text.replace(" MB", "")) - file_size_in_bytes = int(file_size_in_mb * 1024 * 1024) - return convert_bytes_to_readable(file_size_in_bytes) - - if file_size_element: - file_size_text = file_size_element.get_text(strip=True) - file_size_text = file_size_text.replace(",", "") - file_size_in_mb = float(file_size_text.replace(" MB", "")) - file_size_in_bytes = int(file_size_in_mb * 1024 * 1024) - return file_size_in_bytes - return None - except: - return None - -def update_progress_bar(current_size, file_size, progress_bar): - if file_size is not None: - progress = int(current_size / file_size * 100) - progress_bar.setValue(progress) - -def check_and_update_progress(file_size, folder_name_path, progress_bar, speed_label): - previous_net_speed = 0 - - while not stopped: - current_size = sum(os.path.getsize(os.path.join(folder_name_path, f)) for f in os.listdir(folder_name_path)) - update_progress_bar(current_size, file_size, progress_bar) - - current_net_speed = psutil.net_io_counters().bytes_recv - - net_speed_bytes = current_net_speed - previous_net_speed - previous_net_speed = current_net_speed - - net_speed, speed_unit = convert_speed(net_speed_bytes) - - speed_label.setText(f"Network Speed: {net_speed:.2f} {speed_unit}") - - QCoreApplication.processEvents() - time.sleep(1) - -def download_workshop_map(workshop_id, destination_folder, progress_bar, speed_label): - file_size = get_workshop_file_size(workshop_id) - if file_size is None: - show_message("Error", "Failed to retrieve file size.") - return - - download_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "downloads", "311210", workshop_id) - if not os.path.exists(download_folder): - os.makedirs(download_folder) - - command = f"+login anonymous +workshop_download_item 311210 {workshop_id} +quit" - progress_thread = threading.Thread(target=check_and_update_progress, args=(file_size, download_folder, progress_bar, speed_label)) - progress_thread.daemon = True - progress_thread.start() - - run_steamcmd_command(command) - - global stopped - stopped = True - progress_bar.setValue(100) - - map_folder = os.path.join(get_steamcmd_path(), "steamapps", "workshop", "content", "311210", workshop_id) - - json_file_path = os.path.join(map_folder, "workshop.json") - - if os.path.exists(json_file_path): - global mod_type - mod_type, folder_name = extract_json_data(json_file_path) - - if mod_type == "mod": - mods_folder = os.path.join(destination_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") - elif mod_type == "map": - usermaps_folder = os.path.join(destination_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") - else: - show_message("Error", "Invalid map type in workshop.json.") - return - - os.makedirs(folder_name_path, exist_ok=True) - - try: - shutil.copytree(map_folder, folder_name_path, dirs_exist_ok=True) - except Exception as E: - show_message("Error", f"Error copying files: {E}") - - show_message("Download Complete", f"{mod_type} files are downloaded at \n{folder_name_path}\nYou can run the game now!", icon=QMessageBox.Information) - -def show_message(title, message, icon=QMessageBox.Warning, exit_on_close=False): - msg = QMessageBox() - msg.setWindowTitle(title) - msg.setWindowIcon(QIcon('ryuk.ico')) - msg.setText(message) - msg.setIcon(icon) - - if exit_on_close: - msg.setStandardButtons(QMessageBox.Ok | QMessageBox.No) - msg.setDefaultButton(QMessageBox.Ok) - result = msg.exec_() - - if result == QMessageBox.No: - sys.exit(0) - else: - msg.exec_() - -class UpdatePorgressThread(QThread): - global up_cancelled - progress_update = pyqtSignal(int) - - def __init__(self, label_progress, progress_bar, label_size): - super().__init__() - self.label_progress = label_progress - self.progress_bar = progress_bar - self.label_size = label_size - self.cancelled = False - - def run(self): - try: - update_dir = os.path.join(os.getcwd(), UPDATER_FOLDER) - response = requests.get(LATEST_RELEASE_URL, stream=True) - response.raise_for_status() - current_exe = sys.argv[0] - program_name = os.path.basename(current_exe) - new_exe = os.path.join(update_dir, "BOIIIWD.exe") - - if not os.path.exists(update_dir): - os.makedirs(update_dir) - - zip_path = os.path.join(update_dir, "latest_version.zip") - total_size = int(response.headers.get('content-length', 0)) - size = convert_bytes_to_readable(total_size) - self.label_size.setText(f"Size: {size}") - - with open(zip_path, "wb") as zip_file: - chunk_size = 8192 - current_size = 0 - - for chunk in response.iter_content(chunk_size=chunk_size): - if up_cancelled: - break - - if chunk: - zip_file.write(chunk) - current_size += len(chunk) - progress = int(current_size / total_size * 100) - self.progress_update.emit(progress) - QCoreApplication.processEvents() - - if not up_cancelled: - with zipfile.ZipFile(zip_path, "r") as zip_ref: - zip_ref.extractall(update_dir) - - self.label_progress.setText("Update installed successfully!") - time.sleep(1) - script_path = create_update_script(current_exe, new_exe, update_dir, program_name) - subprocess.run(('cmd', '/C', 'start', '', fr'{script_path}')) - sys.exit(0) - else: - if os.path.exists(zip_path): - os.remove(fr"{zip_path}") - self.label_progress.setText("Update cancelled.") - - except Exception as e: - self.label_progress.setText("Error installing the update.") - show_message("Warning", f"Error installing the update: {e}") - -class UpdateProgressWindow(QDialog): - def __init__(self): - super().__init__() - self.setWindowTitle("Updating...") - self.setWindowIcon(QIcon('ryuk.ico')) - - layout = QVBoxLayout() - - info_layout = QHBoxLayout() - self.label_progress = QLabel("Downloading latest update from Github...") - info_layout.addWidget(self.label_progress, 3) - - self.label_size = QLabel("File size: 0KB") - info_layout.addWidget(self.label_size, 1) - - layout.addLayout(info_layout) - - self.progress_bar = QProgressBar() - layout.addWidget(self.progress_bar) - - spacer = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - layout.addSpacerItem(spacer) - - button_layout = QHBoxLayout() - self.cancel_button = QPushButton("Cancel") - self.cancel_button.clicked.connect(self.cancel_update) - button_layout.addItem(QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)) - button_layout.addWidget(self.cancel_button) - layout.addLayout(button_layout) - - self.setLayout(layout) - - global up_cancelled - self.thread = None - up_cancelled = False - - - def update_progress(self, value): - self.progress_bar.setValue(value) - - def start_update(self): - self.thread = UpdatePorgressThread(self.label_progress, self.progress_bar, self.label_size) - self.thread.progress_update.connect(self.update_progress) - self.thread.finished.connect(self.on_update_finished) - self.thread.start() - - def on_update_finished(self): - """code""" - # self.accept() - - def cancel_update(self): - global up_cancelled - up_cancelled = True - self.label_progress.setText("Update cancelled.") - - def closeEvent(self, event: QCloseEvent): - global up_cancelled - if not up_cancelled: - self.cancel_update() - super().closeEvent(event) - -class DownloadThread(QThread): - finished = pyqtSignal() - - def __init__(self, workshop_id, destination_folder, progress_bar, label_speed): - super().__init__() - self.workshop_id = workshop_id - self.destination_folder = destination_folder - self.progress_bar = progress_bar - self.label_speed = label_speed - - def run(self): - download_workshop_map(self.workshop_id, self.destination_folder, self.progress_bar, self.label_speed) - self.finished.emit() - -class WorkshopDownloaderApp(QWidget): - def __init__(self): - super().__init__() - self.initUI() - - if not check_steamcmd(): - self.show_warning_message() - - self.download_thread = None - self.button_download.setEnabled(True) - self.button_stop.setEnabled(False) - - def show_warning_message(self): - msg_box = QMessageBox(self) - msg_box.setWindowTitle("Warning") - msg_box.setWindowIcon(QIcon('ryuk.ico')) - msg_box.setText("steamcmd.exe was not found in the specified directory.\nPress Download to get it or Press OK and select it from there!.") - msg_box.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) - - download_button = msg_box.addButton("Download", QMessageBox.AcceptRole) - download_button.clicked.connect(self.download_steamcmd) - msg_box.setDefaultButton(download_button) - - result = msg_box.exec_() - if result == QMessageBox.Cancel: - sys.exit(0) - - def download_steamcmd(self): - self.edit_steamcmd_path.setText(cwd()) - self.save_config(self.edit_destination_folder.text(), self.edit_steamcmd_path.text()) - steamcmd_url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip" - steamcmd_zip_path = os.path.join(cwd(), "steamcmd.zip") - - try: - response = requests.get(steamcmd_url) - response.raise_for_status() - - with open(steamcmd_zip_path, "wb") as zip_file: - zip_file.write(response.content) - - with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref: - zip_ref.extractall(cwd()) - - if check_steamcmd(): - os.remove(fr"{steamcmd_zip_path}") - show_message("Success", "SteamCMD has been downloaded ,Press ok to initialize it.", icon=QMessageBox.Information, exit_on_close=True) - initialize_steam() - - else: - show_message("Error", "Failed to find steamcmd.exe after extraction.\nMake you sure to select the correct SteamCMD path (which is the current BOIIIWD path)") - os.remove(fr"{steamcmd_zip_path}") - except requests.exceptions.RequestException as e: - show_message("Error", f"Failed to download SteamCMD: {e}") - os.remove(fr"{steamcmd_zip_path}") - except zipfile.BadZipFile: - show_message("Error", "Failed to extract SteamCMD. The downloaded file might be corrupted.") - os.remove(fr"{steamcmd_zip_path}") - - - def check_for_updates(self, ignore_up_todate=False): - try: - latest_version = get_latest_release_version() - current_version = VERSION - - if latest_version and latest_version != current_version: - msg_box = QMessageBox() - msg_box.setWindowTitle("Update Available") - msg_box.setWindowIcon(QIcon('ryuk.ico')) - msg_box.setText(f"An update is available!, Do you want to install it?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}") - msg_box.setIcon(QMessageBox.Information) - msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Open) - msg_box.setDefaultButton(QMessageBox.Yes) - result = msg_box.exec_() - - if result == QMessageBox.Open: - webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest") - - if result == QMessageBox.Yes: - update_progress_window = UpdateProgressWindow() - update_progress_window.start_update() - update_progress_window.exec_() - elif latest_version == current_version: - if ignore_up_todate: - return - msg_box = QMessageBox() - msg_box.setWindowTitle("Up to Date!") - msg_box.setWindowIcon(QIcon('ryuk.ico')) - msg_box.setText(f"No Updates Available!") - msg_box.setIcon(QMessageBox.Information) - msg_box.setStandardButtons(QMessageBox.Ok) - msg_box.setDefaultButton(QMessageBox.Ok) - result = msg_box.exec_() - except Exception as e: - show_message("Error", f"Error while checking for updates: \n{e}") - - def initUI(self): - self.setWindowTitle(f'BOIII Workshop Downloader {VERSION}-beta') - self.setWindowIcon(QIcon('ryuk.ico')) - self.setGeometry(100, 100, 400, 200) - self.settings = QSettings("MyApp", "MyWindow") - self.restore_geometry() - - layout = QVBoxLayout() - - browse_layout = QHBoxLayout() - - self.label_workshop_id = QLabel("Enter the Workshop ID or Link of the map/mod you want to download:") - browse_layout.addWidget(self.label_workshop_id, 3) - - self.button_browse = QPushButton("Browse") - self.button_browse.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.button_browse.clicked.connect(self.open_browser) - browse_layout.addWidget(self.button_browse, 1) - - layout.addLayout(browse_layout) - - info_workshop_layout = QHBoxLayout() - - self.edit_workshop_id = QLineEdit() - self.edit_workshop_id.setPlaceholderText("Workshop ID/Link => Press info to see map/mod info") - self.edit_workshop_id.textChanged.connect(self.reset_file_size) - info_workshop_layout.addWidget(self.edit_workshop_id, 3) - - layout.addLayout(info_workshop_layout) - self.info_button = QPushButton("Info") - self.info_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.info_button.clicked.connect(self.show_map_info) - info_workshop_layout.addWidget(self.info_button, 1) - - self.label_destination_folder = QLabel("Enter Your BOIII folder:") - layout.addWidget(self.label_destination_folder, 3) - - Boiii_Input = QHBoxLayout() - self.edit_destination_folder = QLineEdit() - self.edit_destination_folder.setPlaceholderText("Your BOIII Instalation folder") - Boiii_Input.addWidget(self.edit_destination_folder, 90) - - layout.addLayout(Boiii_Input) - - self.button_BOIII_browse = QPushButton("Select") - self.button_BOIII_browse.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.button_BOIII_browse.clicked.connect(self.open_BOIII_browser) - Boiii_Input.addWidget(self.button_BOIII_browse, 10) - - self.label_steamcmd_path = QLabel("Enter SteamCMD path (default):") - layout.addWidget(self.label_steamcmd_path) - - steamcmd_path = QHBoxLayout() - self.edit_steamcmd_path = QLineEdit() - steamcmd_path.addWidget(self.edit_steamcmd_path, 90) - - self.button_steamcmd_browse = QPushButton("Select") - self.button_steamcmd_browse.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.button_steamcmd_browse.clicked.connect(self.open_steamcmd_path_browser) - steamcmd_path.addWidget(self.button_steamcmd_browse, 10) - - layout.addLayout(steamcmd_path) - layout.addSpacing(10) - - buttons_layout = QHBoxLayout() - - self.button_download = QPushButton("Download") - self.button_download.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.button_download.clicked.connect(self.download_map) - buttons_layout.addWidget(self.button_download, 70) - - self.button_stop = QPushButton("Stop") - self.button_stop.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self.button_stop.clicked.connect(self.stop_download) - buttons_layout.addWidget(self.button_stop, 25) - - layout.addLayout(buttons_layout) - - InfoBar = QHBoxLayout() - - self.label_speed = QLabel("Network Speed: 0 KB/s") - InfoBar.addWidget(self.label_speed, 3) - - self.label_file_size = QLabel("File size: 0KB") - InfoBar.addWidget(self.label_file_size, 1) - - InfoWidget = QWidget() - InfoWidget.setLayout(InfoBar) - - layout.addWidget(InfoWidget) - - self.progress_bar = QProgressBar() - layout.addWidget(self.progress_bar, 75) - - spacer = QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum) - layout.addSpacerItem(spacer) - - check_for_update_layout = QHBoxLayout() - check_update_button = QPushButton("Check for Updates") - check_update_button.clicked.connect(self.check_for_updates) - check_update_button.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) - - self.check_for_update_layout = QVBoxLayout() - self.check_for_update_layout.addWidget(check_update_button) - - self.show_more_button = QPushButton("Launch boiii") - self.show_more_button.clicked.connect(self.launch_boiii) - - check_for_update_layout = QHBoxLayout() - check_for_update_layout.addWidget(check_update_button) - - self.check_for_updates_checkbox = QPushButton("Settings") - self.check_for_updates_checkbox.clicked.connect(self.open_settings_dialog) - - - check_for_update_layout = QHBoxLayout() - check_for_update_layout.addWidget(check_update_button) - check_for_update_layout.addWidget(self.check_for_updates_checkbox) - check_for_update_layout.addWidget(self.show_more_button) - - layout.addLayout(check_for_update_layout) - - self.setLayout(layout) - - self.load_config() - - if config_check_for_updates() == "on": - self.check_for_updates(ignore_up_todate=True) - - try: - global console - if config_console_state() == "on": - console = True - return 1 - else: - console = False - return 0 - except: - pass - - def download_map(self): - global stopped - stopped = False - self.save_config(self.edit_destination_folder.text(), self.edit_steamcmd_path.text()) - - if not check_steamcmd(): - self.show_warning_message() - return - - steamcmd_path = get_steamcmd_path() - steamcmd_exe_path = os.path.join(steamcmd_path, "steamcmd.exe") - steamcmd_size = os.path.getsize(steamcmd_exe_path) - if steamcmd_size < 3 * 1024 * 1024: - show_message("Warning", "SteamCMD is not initialized, Press OK to do so!\nProgram may go unresponsive until SteamCMD is finished downloading.", icon=QMessageBox.Warning, exit_on_close=True) - initialize_steam() - return - - workshop_id = self.edit_workshop_id.text().strip() - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - except: - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - - if not valid_id(workshop_id): - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - - destination_folder = self.edit_destination_folder.text() - steamcmd_path = self.edit_steamcmd_path.text() - self.label_file_size.setText(f"File size: {get_workshop_file_size(workshop_id, raw=True)}") - - if not destination_folder: - show_message("Error", "Please select a destination folder.") - return - - if not steamcmd_path: - show_message("Error", "Please enter the SteamCMD path.") - return - - self.button_stop.setEnabled(True) - self.progress_bar.setValue(0) - self.button_download.setEnabled(False) - - self.download_thread = DownloadThread(workshop_id, destination_folder, self.progress_bar, self.label_speed) - self.download_thread.finished.connect(self.on_download_finished) - self.download_thread.start() - - def stop_download(self): - global stopped - stopped = True - - subprocess.run(['taskkill', '/F', '/IM', 'steamcmd.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - if self.download_thread and self.download_thread.isRunning(): - self.download_thread.terminate() - - self.button_download.setEnabled(True) - self.button_stop.setEnabled(False) - self.progress_bar.setValue(0) - self.label_speed.setText(f"Network Speed: {0:.2f} KB/s") - self.label_file_size.setText(f"File size: 0KB") - - def open_BOIII_browser(self): - selected_folder = QFileDialog.getExistingDirectory(self, "Select BOIII Folder", "") - if selected_folder: - self.edit_destination_folder.setText(selected_folder) - self.save_config(self.edit_destination_folder.text(), self.edit_steamcmd_path.text()) - - def open_steamcmd_path_browser(self): - selected_folder = QFileDialog.getExistingDirectory(self, "Select SteamCMD Folder", "") - if selected_folder: - self.edit_steamcmd_path.setText(selected_folder) - self.save_config(self.edit_destination_folder.text(), self.edit_steamcmd_path.text()) - - def on_download_finished(self): - self.button_download.setEnabled(True) - self.progress_bar.setValue(0) - self.label_speed.setText(f"Network Speed: {0:.2f} KB/s") - self.label_file_size.setText(f"File size: 0KB") - self.button_stop.setEnabled(False) - self.save_config(self.edit_destination_folder.text(), self.edit_steamcmd_path.text()) - - def open_browser(self): - link = "https://steamcommunity.com/app/311210/workshop/" - webbrowser.open(link) - - def load_config(self): - config = configparser.ConfigParser() - if os.path.exists(CONFIG_FILE_PATH): - config.read(CONFIG_FILE_PATH) - destination_folder = config.get("Settings", "DestinationFolder", fallback="") - steamcmd_path = config.get("Settings", "SteamCMDPath", fallback=cwd()) - self.edit_destination_folder.setText(destination_folder) - self.edit_steamcmd_path.setText(steamcmd_path) - else: - create_default_config() - - def save_config(self, destination_folder, steamcmd_path): - config = configparser.ConfigParser() - config.read(CONFIG_FILE_PATH) - config.set("Settings", "DestinationFolder", destination_folder) - config.set("Settings", "SteamCMDPath", steamcmd_path) - with open(CONFIG_FILE_PATH, "w") as config_file: - config.write(config_file) - - def reset_file_size(self): - self.label_file_size.setText(f"File size: 0KB") - - def show_map_info(self): - workshop_id = self.edit_workshop_id.text().strip() - - if not workshop_id: - QMessageBox.warning(self, "Warning", "Please enter a Workshop ID first.") - return - - if not workshop_id.isdigit(): - try: - if extract_workshop_id(workshop_id).strip().isdigit(): - workshop_id = extract_workshop_id(workshop_id).strip() - else: - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - except: - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - - self.label_file_size.setText(f"File size: {get_workshop_file_size(workshop_id, raw=True)}") - try: - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - - soup = BeautifulSoup(content, "html.parser") - - try: - map_mod_type = soup.find("div", class_="rightDetailsBlock").text.strip() - map_name = soup.find("div", class_="workshopItemTitle").text.strip() - map_size = soup.find("div", class_="detailsStatRight").text.strip() - stars_div = soup.find("div", class_="fileRatingDetails") - stars = stars_div.find("img")["src"] - except: - QMessageBox.warning(self, "Warning", "Please enter a valid Workshop ID.") - return - - try: - preview_image_element = soup.find("img", id="previewImage") - workshop_item_image_url = preview_image_element["src"] - except: - preview_image_element = soup.find("img", id="previewImageMain") - workshop_item_image_url = preview_image_element["src"] - - image_response = requests.get(workshop_item_image_url) - image_response.raise_for_status() - - stars_response = requests.get(stars) - stars_response.raise_for_status() - - pixmap = QPixmap() - pixmap.loadFromData(image_response.content) - - pixmap_stars = QPixmap() - pixmap_stars.loadFromData(stars_response.content) - - label = QLabel(self) - label.setPixmap(pixmap) - label.setAlignment(Qt.AlignCenter) - - label_stars = QLabel(self) - label_stars.setPixmap(pixmap_stars) - label_stars.setAlignment(Qt.AlignCenter) - - info = ( - f"Name: {map_name}
" - f"Type: {map_mod_type}
" - f"Size: {map_size}
" - ) - - msg_box = QMessageBox(self) - msg_box.setWindowTitle("Map/Mod Information") - msg_box.setWindowIcon(QIcon('ryuk.ico')) - msg_box.setIconPixmap(pixmap) - msg_box.setInformativeText(info) - msg_box.setDetailedText(f"Stars: {stars}\nLink: {url}") - msg_box.setStandardButtons(QMessageBox.Ok) - - msg_box.exec_() - - except requests.exceptions.RequestException as e: - show_message("Error", f"Failed to fetch map information.\nError: {e}") - - def launch_boiii(self): - try: - boiii_path = os.path.join(self.edit_destination_folder.text(), "boiii.exe") - subprocess.Popen([boiii_path], cwd=self.edit_destination_folder.text()) - except Exception as e: - show_message("Error: Failed to launch BOIII", f"Failed to launch boiii.exe\nMake sure to put in your correct boiii path\n{e}") - - def open_settings_dialog(self): - settings_dialog = SettingsDialog() - settings_dialog.exec_() - - def closeEvent(self, event): - self.settings.setValue("geometry", self.saveGeometry()) - super().closeEvent(event) - - def restore_geometry(self): - geometry = self.settings.value("geometry", None) - if geometry is not None: - self.restoreGeometry(geometry) - -class SettingsDialog(QDialog): - def __init__(self): - super().__init__() - self.setWindowTitle("Settings") - self.setWindowIcon(QIcon('ryuk.ico')) - self.setGeometry(50, 50, 250, 120) - self.settings = QSettings("MyApp2", "MyWindow2") - self.restore_geometry() - self.initUI() - - def initUI(self): - layout = QVBoxLayout() - - self.check_updates_checkbox = QCheckBox("Check for updates on launch") - self.check_updates_checkbox.setChecked(self.load_settings(updates=True)) - layout.addWidget(self.check_updates_checkbox) - - buttons_layout = QHBoxLayout() - self.checkbox_show_console = QCheckBox("Console (On Download)", self) - self.checkbox_show_console.setChecked(self.load_settings(console=True)) - tooltip_text = "Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop boutton." - self.checkbox_show_console.setToolTip(tooltip_text) - - buttons_layout.addWidget(self.checkbox_show_console, 5) - - layout.addLayout(buttons_layout) - - save_button = QPushButton("Save") - save_button.setFixedWidth(60) - save_button.clicked.connect(self.save_settings) - layout.addWidget(save_button, alignment=Qt.AlignLeft) - - self.setLayout(layout) - - def save_settings(self): - global console - if self.check_updates_checkbox.isChecked(): - config_check_for_updates(state="on") - else: - config_check_for_updates(state="off") - - if self.checkbox_show_console.isChecked(): - config_console_state(state="on") - console = True - else: - config_console_state(state="off") - console = False - - self.accept() - - def load_settings(self, console=None, updates=None): - if updates: - if config_check_for_updates() == "on": - return 1 - else: - return 0 - if console: - if config_console_state() == "on": - console = True - return 1 - else: - console = False - return 0 - - def closeEvent(self, event): - self.settings.setValue("geometry", self.saveGeometry()) - super().closeEvent(event) - - def restore_geometry(self): - geometry = self.settings.value("geometry", None) - if geometry is not None: - self.restoreGeometry(geometry) - -if __name__ == "__main__": - app = QApplication(sys.argv) - qdarktheme.setup_theme() - - if not os.path.exists(CONFIG_FILE_PATH): - create_default_config() - - window = WorkshopDownloaderApp() - window.show() - - sys.exit(app.exec_()) From cf86eb35f9539f9c3e0a974c1cb7ab52e2fb81b9 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 14:35:02 +0100 Subject: [PATCH 03/38] add --- boiiiwd_package/resources/b_map_image.png | Bin 0 -> 203626 bytes boiiiwd_package/resources/b_mod_image.png | Bin 0 -> 13821 bytes boiiiwd_package/src/helpers.py | 18 +++---- boiiiwd_package/src/imports.py | 2 +- boiiiwd_package/src/library_tab.py | 10 ++-- boiiiwd_package/src/main.py | 63 ++++------------------ boiiiwd_package/src/settings_tab.py | 54 +++---------------- boiiiwd_package/src/update_window.py | 48 +++++++++++++++-- 8 files changed, 72 insertions(+), 123 deletions(-) create mode 100644 boiiiwd_package/resources/b_map_image.png create mode 100644 boiiiwd_package/resources/b_mod_image.png diff --git a/boiiiwd_package/resources/b_map_image.png b/boiiiwd_package/resources/b_map_image.png new file mode 100644 index 0000000000000000000000000000000000000000..61f9bb5da32f5ba4229f627be77564aa4e9f3881 GIT binary patch literal 203626 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 GnJxY>MCt%T;$qc(rc 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 z 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

5NBG`gJ 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 O?J(G-|8R>#*#849n=?fK literal 0 HcmV?d00001 diff --git a/boiiiwd_package/resources/b_mod_image.png b/boiiiwd_package/resources/b_mod_image.png new file mode 100644 index 0000000000000000000000000000000000000000..92328216a0bfc9bdba473fd96e47938957746de9 GIT binary patch literal 13821 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 literal 0 HcmV?d00001 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") From 4d8f3e367997ef0db12cbe6b0ec4186343fd832c Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 14:44:00 +0100 Subject: [PATCH 04/38] add --- boiiiwd_package/src/helpers.py | 6 ++---- boiiiwd_package/src/main.py | 5 ++--- boiiiwd_package/src/settings_tab.py | 6 ++---- boiiiwd_package/src/update_window.py | 9 ++++----- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index 492a047..30af1aa 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -21,10 +21,8 @@ def check_custom_theme(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) - except: - return os.path.join(RESOURCES_DIR, "boiiiwd_theme.json") + try: return os.path.join(RESOURCES_DIR, theme_name) + except: return os.path.join(RESOURCES_DIR, "boiiiwd_theme.json") # theme initialization ctk.set_appearance_mode(check_config("appearance", "Dark")) # Modes: "System" (standard), "Dark", "Light" diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 0143170..b2f0c7b 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -223,8 +223,7 @@ class BOIIIWD(ctk.CTk): self.settings_tab.load_settings("reset_on_fail", "10") self.settings_tab.load_settings("show_fails", "on") self.settings_tab.load_settings("skip_already_installed", "on") - except: - pass + except: pass if not check_steamcmd(): self.show_steam_warning_message() @@ -367,7 +366,7 @@ class BOIIIWD(ctk.CTk): self.library_tab.grid_remove() def show_library_widgets(self): - self.title("BOIII Workshop Downloader - Library") + self.title("BOIII Workshop Downloader - Library ➜ Loading... ⏳") status = self.library_tab.load_items(self.edit_destination_folder.get()) self.library_tab.grid(row=0, rowspan=3, column=1, padx=(0, 20), pady=(20, 20), sticky="nsew") self.title(f"BOIII Workshop Downloader - Library ➜ {status}") diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index ce996f6..41f123a 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -216,10 +216,8 @@ class SettingsTab(ctk.CTkFrame): pass def enable_save_button(self, *args): - try: - self.save_button.configure(state='normal') - except: - pass + try: self.save_button.configure(state='normal') + except: pass def save_settings(self): self.save_button.configure(state='disabled') diff --git a/boiiiwd_package/src/update_window.py b/boiiiwd_package/src/update_window.py index 541828c..a70af6c 100644 --- a/boiiiwd_package/src/update_window.py +++ b/boiiiwd_package/src/update_window.py @@ -133,12 +133,11 @@ class UpdateWindow(ctk.CTkToplevel): os.remove(fr"{zip_path}") self.label_download.configure(text="Update cancelled.") self.progress_bar.set(0.0) - # there's a better solution ill implement it later - try: - main_app.app.attributes('-alpha', 1.0) - except: - pass + + try: main_app.app.attributes('-alpha', 1.0) + except: pass show_message("Cancelled!", "Update cancelled by user", icon="warning") + except Exception as e: self.progress_bar.set(0.0) self.label_download.configure(text="Update failed") From 52678c19121870bc7292a729782793992ac8d112 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 16:18:57 +0100 Subject: [PATCH 05/38] add --- boiiiwd_package/resources/sett4.png | Bin 27167 -> 0 bytes boiiiwd_package/resources/sett5.png | Bin 33112 -> 0 bytes boiiiwd_package/resources/sett6.png | Bin 617478 -> 0 bytes boiiiwd_package/resources/sett7.png | Bin 333794 -> 0 bytes boiiiwd_package/resources/sett8.png | Bin 23938 -> 0 bytes boiiiwd_package/src/helpers.py | 2 +- boiiiwd_package/src/imports.py | 4 ++-- boiiiwd_package/src/library_tab.py | 14 +++++++------- boiiiwd_package/src/main.py | 8 ++++---- boiiiwd_package/src/settings_tab.py | 20 ++++++++++---------- 10 files changed, 24 insertions(+), 24 deletions(-) delete mode 100644 boiiiwd_package/resources/sett4.png delete mode 100644 boiiiwd_package/resources/sett5.png delete mode 100644 boiiiwd_package/resources/sett6.png delete mode 100644 boiiiwd_package/resources/sett7.png delete mode 100644 boiiiwd_package/resources/sett8.png diff --git a/boiiiwd_package/resources/sett4.png b/boiiiwd_package/resources/sett4.png deleted file mode 100644 index 94f52992ce636591faaf34314b2da19cb78bfb1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27167 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

@yu^o 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

UVq^ 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 z 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 LFTS~G+aLcQa-bhC diff --git a/boiiiwd_package/resources/sett7.png b/boiiiwd_package/resources/sett7.png deleted file mode 100644 index c232b8134b835fa9ecab433800c707bc4a28a1c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333794 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 z

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", lambda event: self.open_folder_location(folder, event)) label.bind("", lambda event, label=label: self.copy_to_clipboard(label, folder, event)) if invalid_warn: - label_warn = ctk_tooltip.CTkToolTip(label, message="Duplicated or Blocked item (Search item id in search)") + label_warn = CTkToolTip(label, message="Duplicated or Blocked item (Search item id in search)") def on_label_hover(self, label, enter): if enter: @@ -569,7 +569,7 @@ class LibraryTab(ctk.CTkScrollableFrame): update_btn = ctk.CTkButton(buttons_frame, text="Update", command=check_for_updates, width=130) update_btn.grid(row=0, column=1, padx=(10, 20), pady=(10, 10), sticky="n") - update_btn_tooltip = ctk_tooltip.CTkToolTip(update_btn, message="Checks and installs updates of the current selected item (redownload!)", topmost=True) + update_btn_tooltip = CTkToolTip(update_btn, message="Checks and installs updates of the current selected item (redownload!)", topmost=True) view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) view_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") @@ -694,7 +694,7 @@ class LibraryTab(ctk.CTkScrollableFrame): cevent = Event() self.select_all_bool = False - listbox = ctk_listbox.CTkListbox(top, multiple_selection=True) + listbox = CTkListbox(top, multiple_selection=True) listbox.grid(row=0, column=0, sticky="nsew") update_button = ctk.CTkButton(top, text="Update") diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index b2f0c7b..613c54f 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -143,7 +143,7 @@ class BOIIIWD(ctk.CTk): self.button_browse = ctk.CTkButton(master=self.optionsframe, text="Workshop", command=self.open_browser, width=10) self.button_browse.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="en") - self.button_browse_tooltip = ctk_tooltip.CTkToolTip(self.button_browse, message="Will open steam workshop for boiii in your browser") + self.button_browse_tooltip = CTkToolTip(self.button_browse, message="Will open steam workshop for boiii in your browser") self.info_button = ctk.CTkButton(master=self.optionsframe, text="Details", command=self.show_map_info, width=10) self.info_button.grid(row=2, column=5, padx=(0, 20), pady=(0, 10), sticky="wn") @@ -190,9 +190,9 @@ class BOIIIWD(ctk.CTk): self.sidebar_queue.configure(text="Queue 🚧", command=self.queue_button_event) sidebar_settings_button_image = os.path.join(RESOURCES_DIR, "sett10.png") self.sidebar_settings.configure(command=self.settings_button_event, text="", image=ctk.CTkImage(Image.open(sidebar_settings_button_image), size=(int(35), int(35))), fg_color="transparent", width=45, height=45) - self.sidebar_settings_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_settings, message="Settings") - self.sidebar_library_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_library, message="Experimental") - self.sidebar_queue_tooltip = ctk_tooltip.CTkToolTip(self.sidebar_queue, message="Experimental") + self.sidebar_settings_tooltip = CTkToolTip(self.sidebar_settings, message="Settings") + self.sidebar_library_tooltip = CTkToolTip(self.sidebar_library, message="Experimental") + self.sidebar_queue_tooltip = CTkToolTip(self.sidebar_queue, message="Experimental") self.bind("", self.save_window_size) # context_menus diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 41f123a..5aca2d6 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -46,7 +46,7 @@ class SettingsTab(ctk.CTkFrame): self.console_var.trace_add("write", self.enable_save_button) self.checkbox_show_console = ctk.CTkSwitch(left_frame, text="Console (On Download)", variable=self.console_var) self.checkbox_show_console.grid(row=1, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_show_console_tooltip = ctk_tooltip.CTkToolTip(self.checkbox_show_console, message="Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop button") + self.checkbox_show_console_tooltip = CTkToolTip(self.checkbox_show_console, message="Toggle SteamCMD console\nPlease don't close the Console If you want to stop press the Stop button") self.console_var.set(self.load_settings("console")) # Show continuous checkbox @@ -54,7 +54,7 @@ class SettingsTab(ctk.CTkFrame): self.continuous_var.trace_add("write", self.enable_save_button) self.checkbox_continuous = ctk.CTkSwitch(left_frame, text="Continuous Download", variable=self.continuous_var) self.checkbox_continuous.grid(row=2, column=1, padx=20, pady=(20, 0), sticky="nw") - self.checkbox_continuous_tooltip = ctk_tooltip.CTkToolTip(self.checkbox_continuous, message="This will make sure that the download restarts and resumes! until it finishes if steamcmd crashes randomly (it will not redownload from the start)") + self.checkbox_continuous_tooltip = CTkToolTip(self.checkbox_continuous, message="This will make sure that the download restarts and resumes! until it finishes if steamcmd crashes randomly (it will not redownload from the start)") self.continuous_var.set(self.load_settings("continuous_download")) # clean on finish checkbox @@ -62,7 +62,7 @@ class SettingsTab(ctk.CTkFrame): self.clean_checkbox_var.trace_add("write", self.enable_save_button) self.clean_checkbox = ctk.CTkSwitch(left_frame, text="Clean on finish", variable=self.clean_checkbox_var) self.clean_checkbox.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="nw") - self.clean_checkbox_tooltip = ctk_tooltip.CTkToolTip(self.clean_checkbox, message="Cleans the map that have been downloaded and installed from steamcmd's steamapps folder ,to save space") + self.clean_checkbox_tooltip = CTkToolTip(self.clean_checkbox, message="Cleans the map that have been downloaded and installed from steamcmd's steamapps folder ,to save space") self.clean_checkbox_var.set(self.load_settings("clean_on_finish", "on")) # Show estimated_progress checkbox @@ -70,7 +70,7 @@ class SettingsTab(ctk.CTkFrame): self.estimated_progress_var.trace_add("write", self.enable_save_button) self.estimated_progress_cb = ctk.CTkSwitch(left_frame, text="Estimated Progress Bar", variable=self.estimated_progress_var) self.estimated_progress_cb.grid(row=4, column=1, padx=20, pady=(20, 0), sticky="nw") - self.estimated_progress_var_tooltip = ctk_tooltip.CTkToolTip(self.estimated_progress_cb, message="This will change how to progress bar works by estimating how long the download will take\ + self.estimated_progress_var_tooltip = CTkToolTip(self.estimated_progress_cb, message="This will change how to progress bar works by estimating how long the download will take\ \nThis is not accurate ,it's better than with it off which is calculating the downloaded folder size which steamcmd dumps the full size rigth mostly") self.estimated_progress_var.set(self.load_settings("estimated_progress", "on")) @@ -79,7 +79,7 @@ class SettingsTab(ctk.CTkFrame): self.show_fails_var.trace_add("write", self.enable_save_button) self.show_fails_cb = ctk.CTkSwitch(left_frame, text="Show fails (on top of progress bar)", variable=self.show_fails_var) self.show_fails_cb.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="nw") - self.show_fails_tooltip = ctk_tooltip.CTkToolTip(self.show_fails_cb, message="Display how many times steamcmd has failed/crashed\nIf the number is getting high quickly then try pressing Reset SteamCMD and try again, otherwise its fine") + self.show_fails_tooltip = CTkToolTip(self.show_fails_cb, message="Display how many times steamcmd has failed/crashed\nIf the number is getting high quickly then try pressing Reset SteamCMD and try again, otherwise its fine") self.estimated_progress_var.set(self.load_settings("show_fails", "on")) # Show skip_already_installed maps checkbox @@ -87,7 +87,7 @@ class SettingsTab(ctk.CTkFrame): self.skip_already_installed_var.trace_add("write", self.enable_save_button) self.skip_already_installed_ch = ctk.CTkSwitch(left_frame, text="Skip already installed maps", variable=self.skip_already_installed_var) self.skip_already_installed_ch.grid(row=6, column=1, padx=20, pady=(20, 0), sticky="nw") - self.skip_already_installed_ch_tooltip = ctk_tooltip.CTkToolTip(self.skip_already_installed_ch, message="If on it will not download installed maps,\nthis can miss sometimes if you remove maps manually and not from library tab while the app is running") + self.skip_already_installed_ch_tooltip = CTkToolTip(self.skip_already_installed_ch, message="If on it will not download installed maps,\nthis can miss sometimes if you remove maps manually and not from library tab while the app is running") self.skip_already_installed_var.set(self.load_settings("skip_already_installed", "on")) # check items for update on launch @@ -95,7 +95,7 @@ class SettingsTab(ctk.CTkFrame): self.check_items_var.trace_add("write", self.enable_save_button) self.check_items_ch = ctk.CTkSwitch(left_frame, text="Check Library items on launch", variable=self.check_items_var) self.check_items_ch.grid(row=7, column=1, padx=20, pady=(20, 0), sticky="nw") - self.check_items_tooltip = ctk_tooltip.CTkToolTip(self.check_items_ch, message="This will show a window on launch of items that have pending updates -> you can open it manually from library tab") + self.check_items_tooltip = CTkToolTip(self.check_items_ch, message="This will show a window on launch of items that have pending updates -> you can open it manually from library tab") self.check_items_var.set(self.load_settings("check_items", "off")) # Resetr steam on many fails @@ -105,7 +105,7 @@ class SettingsTab(ctk.CTkFrame): self.reset_steamcmd_on_fail_text.grid(row=8, column=1, padx=20, pady=(10, 0), sticky="nw") self.reset_steamcmd_on_fail = ctk.CTkOptionMenu(left_frame, values=["5", "10", "20", "30", "40", "Custom", "Disable"], variable=self.reset_steamcmd_on_fail_var, command=self.reset_steamcmd_on_fail_func) self.reset_steamcmd_on_fail.grid(row=8, column=1, padx=(190, 0), pady=(10, 0), sticky="nw") - self.reset_steamcmd_on_fail_tooltip = ctk_tooltip.CTkToolTip(self.reset_steamcmd_on_fail, message="This actually fixes steamcmd when its crashing way too much") + self.reset_steamcmd_on_fail_tooltip = CTkToolTip(self.reset_steamcmd_on_fail, message="This actually fixes steamcmd when its crashing way too much") self.reset_steamcmd_on_fail.set(value=self.load_settings("reset_on_fail", "10")) # item folder naming @@ -126,11 +126,11 @@ class SettingsTab(ctk.CTkFrame): self.reset_steamcmd = ctk.CTkButton(right_frame, text="Reset SteamCMD", command=self.settings_reset_steamcmd) self.reset_steamcmd.grid(row=3, column=1, padx=20, pady=(20, 0), sticky="n") - self.reset_steamcmd_tooltip = ctk_tooltip.CTkToolTip(self.reset_steamcmd, message="This will remove steamapps folder + all the maps that are potentioaly corrupted\nor not so use at ur own risk (could fix some issues as well)") + self.reset_steamcmd_tooltip = CTkToolTip(self.reset_steamcmd, message="This will remove steamapps folder + all the maps that are potentioaly corrupted\nor not so use at ur own risk (could fix some issues as well)") self.steam_to_boiii = ctk.CTkButton(right_frame, text="Steam to boiii", command=self.from_steam_to_boiii_toplevel) self.steam_to_boiii.grid(row=5, column=1, padx=20, pady=(20, 0), sticky="n") - self.steam_to_boiii_tooltip = ctk_tooltip.CTkToolTip(self.steam_to_boiii, message="Moves/copies maps and mods from steam to boiii (opens up a window)") + self.steam_to_boiii_tooltip = CTkToolTip(self.steam_to_boiii, message="Moves/copies maps and mods from steam to boiii (opens up a window)") # appearance self.appearance_mode_label = ctk.CTkLabel(right_frame, text="Appearance Mode:", anchor="n") From 478d2a665287e319f92c0111ace4fc137500bc0e Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 17:59:00 +0100 Subject: [PATCH 06/38] add --- boiiiwd_package/boiiiwd.py | 4 +-- boiiiwd_package/src/library_tab.py | 43 +++++++++++++++-------------- boiiiwd_package/src/settings_tab.py | 20 +++++++------- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/boiiiwd_package/boiiiwd.py b/boiiiwd_package/boiiiwd.py index 4f42ab5..0095ea5 100644 --- a/boiiiwd_package/boiiiwd.py +++ b/boiiiwd_package/boiiiwd.py @@ -1,4 +1,4 @@ -import src.shared_vars as shared_vars +import src.shared_vars as main_app if __name__ == "__main__": - shared_vars.app.mainloop() + main_app.app.mainloop() diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index b6dcafc..3cdb0c8 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -1,7 +1,8 @@ from src.imports import * from src.helpers import * -import src.shared_vars as shared +import src.shared_vars as main_app + class LibraryTab(ctk.CTkScrollableFrame): def __init__(self, master, **kwargs): @@ -217,7 +218,7 @@ class LibraryTab(ctk.CTkScrollableFrame): curr_folder_name = zone_path.parent.name workshop_id = extract_json_data(json_path, "PublisherID") - name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "") + name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) name = name[:45] + "..." if len(name) > 45 else name item_type = extract_json_data(json_path, "Type") folder_name = extract_json_data(json_path, "FolderName") @@ -377,8 +378,8 @@ class LibraryTab(ctk.CTkScrollableFrame): self.added_items.clear() self.added_folders.clear() self.ids_added.clear() - status = self.load_items(shared.app.edit_destination_folder.get().strip()) - shared.app.title(f"BOIII Workshop Downloader - Library ➜ {status}") + status = self.load_items(main_app.app.edit_destination_folder.get().strip()) + main_app.app.title(f"BOIII Workshop Downloader - Library ➜ {status}") def view_item(self, workshop_id): url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" @@ -499,13 +500,13 @@ class LibraryTab(ctk.CTkScrollableFrame): if check_item_date(down_date, date_updated): if show_message("There is an update.", "Press download to redownload!", icon="info", _return=True, option_1="No", option_2="Download"): - if shared.app.is_downloading: + if main_app.app.is_downloading: show_message("Error", "Please wait for the current download to finish or stop it then restart.", icon="cancel") return - shared.app.edit_workshop_id.delete(0, "end") - shared.app.edit_workshop_id.insert(0, workshop_id) - shared.app.main_button_event() - shared.app.download_map(update=True) + main_app.app.edit_workshop_id.delete(0, "end") + main_app.app.edit_workshop_id.insert(0, workshop_id) + main_app.app.main_button_event() + main_app.app.download_map(update=True) top.destroy() return else: @@ -612,10 +613,10 @@ class LibraryTab(ctk.CTkScrollableFrame): def items_update_message(self, to_update_len): def main_thread(): if show_message(f"{to_update_len} Item updates available", f"{to_update_len} Workshop Items have an update, Would you like to open the item updater window?", icon="info", _return=True): - shared.app.after(1, self.update_items_window) + main_app.app.after(1, self.update_items_window) else: return - shared.app.after(0, main_thread) + main_app.app.after(0, main_thread) self.update_button.configure(state="normal", width=65, height=20) self.update_tooltip.configure(message='Check items for updates') return @@ -744,25 +745,25 @@ class LibraryTab(ctk.CTkScrollableFrame): def update_btn_fun(): if len(selected_id_list) == 1: - if shared.app.is_downloading: + if main_app.app.is_downloading: show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") return - shared.app.edit_workshop_id.delete(0, "end") - shared.app.edit_workshop_id.insert(0, selected_id_list[0]) - shared.app.main_button_event() - shared.app.download_map(update=True) + main_app.app.edit_workshop_id.delete(0, "end") + main_app.app.edit_workshop_id.insert(0, selected_id_list[0]) + main_app.app.main_button_event() + main_app.app.download_map(update=True) top.destroy() return elif len(selected_id_list) > 1: - if shared.app.is_downloading: + if main_app.app.is_downloading: show_message("Error", "Please wait for the current download to finish or stop it then start.", icon="cancel") return comma_separated_ids = ",".join(selected_id_list) - shared.app.queuetextarea.delete("1.0", "end") - shared.app.queuetextarea.insert("1.0", comma_separated_ids) - shared.app.queue_button_event() - shared.app.download_map(update=True) + main_app.app.queuetextarea.delete("1.0", "end") + main_app.app.queuetextarea.insert("1.0", comma_separated_ids) + main_app.app.queue_button_event() + main_app.app.download_map(update=True) top.destroy() return diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 5aca2d6..ca59b0d 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -2,7 +2,7 @@ from src.update_window import check_for_updates_func from src.imports import * from src.helpers import * -import src.shared_vars as shared +import src.shared_vars as main_app class SettingsTab(ctk.CTkFrame): @@ -549,18 +549,18 @@ class SettingsTab(ctk.CTkFrame): mod_type = extract_json_data(json_file_path, "Type") 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") + if main_app.app.library_tab.item_exists_in_file(items_file, workshop_id): + get_folder_name = main_app.app.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: folder_name = get_folder_name else: try: - folder_name = extract_json_data(json_file_path, shared.app.settings_tab.folder_options.get()) + folder_name = extract_json_data(json_file_path, main_app.app.settings_tab.folder_options.get()) except: folder_name = extract_json_data(json_file_path, "publisherID") else: try: - folder_name = extract_json_data(json_file_path, shared.app.settings_tab.folder_options.get()) + folder_name = extract_json_data(json_file_path, main_app.app.settings_tab.folder_options.get()) except: folder_name = extract_json_data(json_file_path, "publisherID") @@ -586,7 +586,7 @@ class SettingsTab(ctk.CTkFrame): remove_tree(os.path.join(map_folder, workshop_id)) if subfolders: - shared.app.show_complete_message(message=f"All items were moved\nYou can run the game now!\nPS: You have to restart the game\n(pressing launch will launch/restarts)") + main_app.app.show_complete_message(message=f"All items were moved\nYou can run the game now!\nPS: You have to restart the game\n(pressing launch will launch/restarts)") finally: if cut_var.get(): @@ -604,18 +604,18 @@ class SettingsTab(ctk.CTkFrame): progress_color = get_button_state_colors(check_custom_theme(check_config("theme", fallback="boiiiwd_theme.json")), "progress_bar_fill_color") progress_bar.configure(progress_color=progress_color) steam_folder_entry.insert(1, check_config("steam_folder", "")) - boiii_folder_entry.insert(1, shared.app.edit_destination_folder.get()) + boiii_folder_entry.insert(1, main_app.app.edit_destination_folder.get()) button_BOIII_browse.configure(command=open_BOIII_browser) button_steam_browse.configure(command=open_steam_browser) copy_button.configure(command=start_copy_operation) cut_check.configure(command = lambda: check_status(cut_var, copy_var)) copy_check.configure(command = lambda: check_status(copy_var, cut_var)) - shared.app.create_context_menu(steam_folder_entry) - shared.app.create_context_menu(boiii_folder_entry) + main_app.app.create_context_menu(steam_folder_entry) + main_app.app.create_context_menu(boiii_folder_entry) copy_var.set(True) progress_bar.set(0) except Exception as e: show_message("Error", f"{e}", icon="cancel") - shared.app.after(0, main_thread) + main_app.app.after(0, main_thread) From 119543377148b47c24b8728bc6e13c9e57fa0237 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 18:07:40 +0100 Subject: [PATCH 07/38] none if id is not there --- boiiiwd_package/src/library_tab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 3cdb0c8..6a05929 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -217,7 +217,7 @@ class LibraryTab(ctk.CTkScrollableFrame): # current folder name curr_folder_name = zone_path.parent.name - workshop_id = extract_json_data(json_path, "PublisherID") + workshop_id = extract_json_data(json_path, "PublisherID") or "None" name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) name = name[:45] + "..." if len(name) > 45 else name item_type = extract_json_data(json_path, "Type") @@ -253,7 +253,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.item_block_list.add(curr_folder_name) image_path = b_mod_img if item_type == "mod" else b_map_img text_to_add += " | ⚠️" - elif curr_folder_name not in self.added_folders and workshop_id in self.ids_added: + elif (curr_folder_name not in self.added_folders and (workshop_id in self.ids_added or workshop_id == "None")): try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") except: pass image_path = b_mod_img if item_type == "mod" else b_map_img From 5d16064f12ce834364a5a5d7366bef77c415b891 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 18:45:20 +0100 Subject: [PATCH 08/38] internet checker decorator --- boiiiwd_package/src/helpers.py | 28 +++++++++++++++++++--------- boiiiwd_package/src/library_tab.py | 13 ++++++------- boiiiwd_package/src/main.py | 5 ++++- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index 738421c..b9587b3 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -1,7 +1,14 @@ +import socket import src.shared_vars as main_app from src.imports import * # Start helper functions + +#testing app offline +def guard(*args, **kwargs): + pass +socket.socket = guard + def check_config(name, fallback=None): config = configparser.ConfigParser() config.read(CONFIG_FILE_PATH) @@ -68,17 +75,19 @@ def create_update_script(current_exe, new_exe, updater_folder, program_name): return script_path -def is_internet_available(): - try: - requests.get("https://www.google.com", timeout=3) - return True - except: - return False +def if_internet_available(func): + def wrapper(*args, **kwargs): + try: + requests.get("https://www.google.com", timeout=3) + return func(*args, **kwargs) + except: + show_message("Offline", "No internet connection. Please check your internet connection and try again.") + return + return wrapper + +@if_internet_available def check_for_updates_func(window, ignore_up_todate=False): - if not is_internet_available(): - show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") - return try: latest_version = get_latest_release_version() current_version = VERSION @@ -154,6 +163,7 @@ def initialize_steam(master): show_message("Error!", "An error occurred please check your paths and try again.", icon="cancel") master.attributes('-alpha', 1.0) +@if_internet_available def valid_id(workshop_id): url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" response = requests.get(url) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 6a05929..06b67a9 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -218,10 +218,10 @@ class LibraryTab(ctk.CTkScrollableFrame): curr_folder_name = zone_path.parent.name workshop_id = extract_json_data(json_path, "PublisherID") or "None" - name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) + name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) or "None" name = name[:45] + "..." if len(name) > 45 else name - item_type = extract_json_data(json_path, "Type") - folder_name = extract_json_data(json_path, "FolderName") + item_type = extract_json_data(json_path, "Type") or "None" + folder_name = extract_json_data(json_path, "FolderName") or "None" folder_size_bytes = get_folder_size(zone_path.parent) size = convert_bytes_to_readable(folder_size_bytes) total_size += folder_size_bytes @@ -394,6 +394,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.no_items_label.forget() # i know i know ,please make a pull request i cant be bother + @if_internet_available def show_map_info(self, workshop, invalid_warn=False): for button_view in self.button_view_list: button_view.configure(state="disabled") @@ -468,7 +469,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn) - except requests.exceptions.RequestException as e: + except Exception as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") for button_view in self.button_view_list: button_view.configure(state="normal") @@ -597,10 +598,8 @@ class LibraryTab(ctk.CTkScrollableFrame): button_view.configure(state="normal") self.after(0, main_thread) + @if_internet_available def check_for_updates(self, on_launch=False): - if not is_internet_available(): - show_message("Error!", "Internet connection is not available. Please check your internet connection and try again.") - return self.after(1, self.update_button.configure(state="disabled")) self.update_tooltip.configure(message='Still loading please wait...') cevent = Event() diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 613c54f..8a3e8ea 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -513,6 +513,7 @@ class BOIIIWD(ctk.CTk): link = "https://steamcommunity.com/app/311210/workshop/" webbrowser.open(link) + @if_internet_available def download_steamcmd(self): self.edit_steamcmd_path.delete(0, "end") self.edit_steamcmd_path.insert(0, application_path) @@ -554,6 +555,7 @@ class BOIIIWD(ctk.CTk): show_message("Error", "Failed to extract SteamCMD. The downloaded file might be corrupted.", icon="cancel") os.remove(fr"{steamcmd_zip_path}") + @if_internet_available def show_map_info(self): def show_map_thread(): workshop_id = self.edit_workshop_id.get().strip() @@ -627,7 +629,7 @@ class BOIIIWD(ctk.CTk): image_size = image.size self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created , - date_updated, stars_image, stars_image_size, ratings_text, url) + date_updated, stars_image, stars_image_size, ratings_text, url) except requests.exceptions.RequestException as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") @@ -904,6 +906,7 @@ class BOIIIWD(ctk.CTk): return self.after(0, callback) + @if_internet_available def download_map(self, update=False): self.is_downloading = False self.fail_threshold = 0 From 90f9d1cceab703756e6a5d2f4f540734ae3b1906 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 19:16:25 +0100 Subject: [PATCH 09/38] added folder name in library --- boiiiwd_package/src/helpers.py | 8 ++++---- boiiiwd_package/src/library_tab.py | 17 ++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index b9587b3..bfb06db 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -1,13 +1,13 @@ -import socket import src.shared_vars as main_app from src.imports import * # Start helper functions #testing app offline -def guard(*args, **kwargs): - pass -socket.socket = guard +# import socket +# def guard(*args, **kwargs): +# pass +# socket.socket = guard def check_config(name, fallback=None): config = configparser.ConfigParser() diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 06b67a9..fd98bb7 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -42,7 +42,7 @@ class LibraryTab(ctk.CTkScrollableFrame): button = ctk.CTkButton(self, text="Remove", width=60, height=24, fg_color="#3d3f42") button_view = ctk.CTkButton(self, text="Details", width=55, height=24, fg_color="#3d3f42") button.configure(command=lambda: self.remove_item(item, folder, workshop_id)) - button_view.configure(command=lambda: self.show_map_info(workshop_id, invalid_warn)) + button_view.configure(command=lambda: self.show_map_info(workshop_id, folder ,invalid_warn)) button_view_tooltip = CTkToolTip(button_view, message="Opens up a window that shows basic details") button_tooltip = CTkToolTip(button, message="Removes the map/mod from your game") label.grid(row=len(self.label_list) + 1, column=0, pady=(0, 10), padx=(5, 10), sticky="w") @@ -393,9 +393,8 @@ class LibraryTab(ctk.CTkScrollableFrame): self.no_items_label.configure(text="") self.no_items_label.forget() - # i know i know ,please make a pull request i cant be bother @if_internet_available - def show_map_info(self, workshop, invalid_warn=False): + def show_map_info(self, workshop, folder, invalid_warn=False): for button_view in self.button_view_list: button_view.configure(state="disabled") @@ -467,7 +466,8 @@ class LibraryTab(ctk.CTkScrollableFrame): image_size = image.size self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, - date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn) + date_updated, stars_image, stars_image_size, ratings_text, + url, workshop_id, invalid_warn, folder) except Exception as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") @@ -479,7 +479,8 @@ class LibraryTab(ctk.CTkScrollableFrame): info_thread.start() def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - date_created ,date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn): + date_created ,date_updated, stars_image, stars_image_size, ratings_text, + url, workshop_id, invalid_warn, folder): def main_thread(): try: items_file = os.path.join(application_path, LIBRARY_FILE) @@ -549,6 +550,9 @@ class LibraryTab(ctk.CTkScrollableFrame): date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) + folder_name = ctk.CTkLabel(info_frame, text=f"Folder name: {os.path.basename(folder)}") + folder_name.grid(row=6, column=0, columnspan=2, sticky="w", padx=20, pady=5) + stars_image_label = ctk.CTkLabel(stars_frame) stars_width, stars_height = stars_image_size stars_image_widget = ctk.CTkImage(stars_image, size=(int(stars_width), int(stars_height))) @@ -613,8 +617,7 @@ class LibraryTab(ctk.CTkScrollableFrame): def main_thread(): if show_message(f"{to_update_len} Item updates available", f"{to_update_len} Workshop Items have an update, Would you like to open the item updater window?", icon="info", _return=True): main_app.app.after(1, self.update_items_window) - else: - return + else: return main_app.app.after(0, main_thread) self.update_button.configure(state="normal", width=65, height=20) self.update_tooltip.configure(message='Check items for updates') From c1b601e4d163f9f217b4d4a793f3778f9c9b36a7 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Wed, 20 Sep 2023 19:25:14 +0100 Subject: [PATCH 10/38] update_item gets timestamp from ff file --- boiiiwd_package/src/library_tab.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index fd98bb7..6945eaf 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -331,7 +331,19 @@ class LibraryTab(ctk.CTkScrollableFrame): if mode_type: 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") + + creation_timestamp = None + for ff_file in zone_path.glob("*.ff"): + if ff_file.exists(): + creation_timestamp = ff_file.stat().st_ctime + break + + if creation_timestamp is not None: + date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") + else: + creation_timestamp = zone_path.stat().st_ctime + date_added = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") + items_file = os.path.join(application_path, LIBRARY_FILE) item_info = { From cffe35a44786f5e2380603e02f511d83598501f2 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 14:03:20 +0100 Subject: [PATCH 11/38] add --- boiiiwd_package/src/library_tab.py | 1 + boiiiwd_package/src/main.py | 2 +- boiiiwd_package/src/settings_tab.py | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 6945eaf..9e59ec5 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -380,6 +380,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.remove_item_by_option(items_file, id) def refresh_items(self): + main_app.app.title("BOIII Workshop Downloader - Library ➜ Loading... ⏳") for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): label.destroy() button.destroy() diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 8a3e8ea..4109b95 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -11,7 +11,7 @@ class BOIIIWD(ctk.CTk): # self.app_instance = BOIIIWD() # configure window - self.title("boiii Workshop Downloader - Main") + self.title("BOIII Workshop Downloader - Main") try: geometry_file = os.path.join(application_path, "boiiiwd_dont_touch.conf") diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index ca59b0d..5ab3183 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -180,6 +180,7 @@ class SettingsTab(ctk.CTkFrame): show_message("Couldn't open config.ini" ,"you can do so by yourself and change reset_on_fail value to whatever you want") else: return + def theme_options_func(self, option: str): if option == "Default": self.boiiiwd_custom_theme(disable_only=True) From f973d8fb23b572165aa1396f03bda3f038154221 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 17:57:59 +0100 Subject: [PATCH 12/38] added details when offline (library) --- boiiiwd_package/src/helpers.py | 6 ++ boiiiwd_package/src/library_tab.py | 162 ++++++++++++++++++----------- 2 files changed, 109 insertions(+), 59 deletions(-) diff --git a/boiiiwd_package/src/helpers.py b/boiiiwd_package/src/helpers.py index bfb06db..ce4670e 100644 --- a/boiiiwd_package/src/helpers.py +++ b/boiiiwd_package/src/helpers.py @@ -76,6 +76,12 @@ def create_update_script(current_exe, new_exe, updater_folder, program_name): return script_path def if_internet_available(func): + if func == "return": + try: + requests.get("https://www.google.com", timeout=3) + return True + except: + return False def wrapper(*args, **kwargs): try: requests.get("https://www.google.com", timeout=3) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 9e59ec5..597256d 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -406,13 +406,13 @@ class LibraryTab(ctk.CTkScrollableFrame): self.no_items_label.configure(text="") self.no_items_label.forget() - @if_internet_available def show_map_info(self, workshop, folder, invalid_warn=False): for button_view in self.button_view_list: button_view.configure(state="disabled") def show_map_thread(): workshop_id = workshop + online = if_internet_available("return") if not workshop_id.isdigit(): try: @@ -423,86 +423,126 @@ class LibraryTab(ctk.CTkScrollableFrame): except: show_message("Warning", "Not a valid Workshop ID.") return - try: - url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" - response = requests.get(url) - response.raise_for_status() - content = response.text - - soup = BeautifulSoup(content, "html.parser") - + if online: try: - map_mod_type = soup.find("div", class_="rightDetailsBlock").text.strip() - map_name = soup.find("div", class_="workshopItemTitle").text.strip() - map_size = map_size = get_workshop_file_size(workshop_id, raw=True) - details_stats_container = soup.find("div", class_="detailsStatsContainerRight") - details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") - date_created = details_stat_elements[1].text.strip() - try: - ratings = soup.find('div', class_='numRatings') - ratings_text = ratings.get_text() - except: - ratings = "Not found" - ratings_text= "Not enough ratings" - try: - date_updated = details_stat_elements[2].text.strip() - except: - date_updated = "Not updated" - stars_div = soup.find("div", class_="fileRatingDetails") - starts = stars_div.find("img")["src"] - except: - show_message("Warning", "Not a valid Workshop ID\nCouldn't get information.") - for button_view in self.button_view_list: - button_view.configure(state="normal") - return + url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" + response = requests.get(url) + response.raise_for_status() + content = response.text + + soup = BeautifulSoup(content, "html.parser") - try: - preview_image_element = soup.find("img", id="previewImage") - workshop_item_image_url = preview_image_element["src"] - except: try: - preview_image_element = soup.find("img", id="previewImageMain") - workshop_item_image_url = preview_image_element["src"] - except Exception as e: - show_message("Warning", f"Failed to get preview image ,probably wrong link/id if not please open an issue on github.\n{e}") + map_mod_type = soup.find("div", class_="rightDetailsBlock").text.strip() + map_name = soup.find("div", class_="workshopItemTitle").text.strip() + map_size = map_size = get_workshop_file_size(workshop_id, raw=True) + details_stats_container = soup.find("div", class_="detailsStatsContainerRight") + details_stat_elements = details_stats_container.find_all("div", class_="detailsStatRight") + date_created = details_stat_elements[1].text.strip() + try: + ratings = soup.find('div', class_='numRatings') + ratings_text = ratings.get_text() + except: + ratings = "Not found" + ratings_text= "Not enough ratings" + try: + date_updated = details_stat_elements[2].text.strip() + except: + date_updated = "Not updated" + stars_div = soup.find("div", class_="fileRatingDetails") + starts = stars_div.find("img")["src"] + except: + show_message("Warning", "Not a valid Workshop ID\nCouldn't get information.") for button_view in self.button_view_list: button_view.configure(state="normal") return - starts_image_response = requests.get(starts) - stars_image = Image.open(io.BytesIO(starts_image_response.content)) - stars_image_size = stars_image.size + try: + preview_image_element = soup.find("img", id="previewImage") + workshop_item_image_url = preview_image_element["src"] + except: + try: + preview_image_element = soup.find("img", id="previewImageMain") + workshop_item_image_url = preview_image_element["src"] + except Exception as e: + show_message("Warning", f"Failed to get preview image ,probably wrong link/id if not please open an issue on github.\n{e}") + for button_view in self.button_view_list: + button_view.configure(state="normal") + return - image_response = requests.get(workshop_item_image_url) - image_response.raise_for_status() - image = Image.open(io.BytesIO(image_response.content)) - image_size = image.size + starts_image_response = requests.get(starts) + stars_image = Image.open(io.BytesIO(starts_image_response.content)) + stars_image_size = stars_image.size - self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, - date_updated, stars_image, stars_image_size, ratings_text, - url, workshop_id, invalid_warn, folder) + image_response = requests.get(workshop_item_image_url) + image_response.raise_for_status() + image = Image.open(io.BytesIO(image_response.content)) + image_size = image.size + + self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, + date_updated, stars_image, stars_image_size, ratings_text, + url, workshop_id, invalid_warn, folder) + + except Exception as e: + show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") + for button_view in self.button_view_list: + button_view.configure(state="normal") + return + else: + json_path = Path(folder) / "zone" / "workshop.json" + for ff_file in json_path.parent.glob("*.ff"): + if ff_file.exists(): + creation_timestamp = ff_file.stat().st_ctime + break + if json_path.exists(): + workshop_id = extract_json_data(json_path, "PublisherID") or "None" + name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) or "None" + map_name = name[:45] + "..." if len(name) > 45 else name + map_mod_type = extract_json_data(json_path, "Type") or "None" + folder_size_bytes = get_folder_size(json_path.parent.parent) + map_size = convert_bytes_to_readable(folder_size_bytes) + preview_iamge = json_path.parent / "previewimage.png" + if preview_iamge.exists(): + image = Image.open(preview_iamge) + else: + image = Image.open(os.path.join(RESOURCES_DIR, "ryuk.png")) + image_size = image.size + offline_date = datetime.fromtimestamp(creation_timestamp).strftime("%d %b, %Y @ %I:%M%p") + date_updated = "Offline" + date_created = "Offline" + stars_image = Image.open(os.path.join(RESOURCES_DIR, "ryuk.png")) + stars_image_size = stars_image.size + ratings_text = "Offline" + url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" + + self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, + date_updated, stars_image, stars_image_size, ratings_text, + url, workshop_id, invalid_warn, folder, offline_date) - except Exception as e: - show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") - for button_view in self.button_view_list: - button_view.configure(state="normal") - return info_thread = threading.Thread(target=show_map_thread) info_thread.start() def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, date_created ,date_updated, stars_image, stars_image_size, ratings_text, - url, workshop_id, invalid_warn, folder): + url, workshop_id, invalid_warn, folder, offline_date=None): def main_thread(): try: + threshold_width = 1000 + threshold_height = 1000 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"))) top.title("Map/Mod Information") top.attributes('-topmost', 'true') - down_date = self.get_item_by_id(items_file, workshop_id, 'date') + size_text = "Size (Workshop):" + + if offline_date: + down_date = offline_date + size_text = "Size (On Disk):" + else: + down_date = self.get_item_by_id(items_file, workshop_id, 'date') def close_window(): top.destroy() @@ -551,13 +591,13 @@ class LibraryTab(ctk.CTkScrollableFrame): type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - size_label = ctk.CTkLabel(info_frame, text=f"Size (Workshop): {map_size}") + size_label = ctk.CTkLabel(info_frame, text=f"{size_text} {map_size}") size_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) - date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") + date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated if not invalid_warn else 'None'}") date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") @@ -578,6 +618,10 @@ class LibraryTab(ctk.CTkScrollableFrame): image_label = ctk.CTkLabel(image_frame) width, height = image_size + if width > threshold_width or height > threshold_height: + width = width // 2 + height = height // 2 + image_widget = ctk.CTkImage(image, size=(int(width), int(height))) image_label.configure(image=image_widget, text="") image_label.pack(expand=True, fill="both", padx=(10, 20), pady=(10, 10)) From f2729478eba0a878e7056df6a0962f108c47a3c0 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 19:00:22 +0100 Subject: [PATCH 13/38] improvments --- boiiiwd_package/src/library_tab.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 597256d..eebbd28 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -1,3 +1,4 @@ +from src.CTkToolTip import ctk_tooltip from src.imports import * from src.helpers import * @@ -528,8 +529,6 @@ class LibraryTab(ctk.CTkScrollableFrame): url, workshop_id, invalid_warn, folder, offline_date=None): def main_thread(): try: - threshold_width = 1000 - threshold_height = 1000 items_file = os.path.join(application_path, LIBRARY_FILE) top = ctk.CTkToplevel(self) if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): @@ -597,7 +596,14 @@ class LibraryTab(ctk.CTkScrollableFrame): date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) - date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated if not invalid_warn else 'None'}") + if date_updated != "Not updated" and date_updated != "Offline": + date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated} 🔗") + date_updated_label_tooltip = CTkToolTip(date_updated_label, message="View changelogs", topmost=True) + date_updated_label.configure(cursor="hand2") + date_updated_label.bind("", lambda e: + webbrowser.open(f"https://steamcommunity.com/sharedfiles/filedetails/changelog/{workshop_id}")) + else: + date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") @@ -618,7 +624,8 @@ class LibraryTab(ctk.CTkScrollableFrame): image_label = ctk.CTkLabel(image_frame) width, height = image_size - if width > threshold_width or height > threshold_height: + # preview image is too big if offlinr, // to round floats + if width > 1000 or height > 1000: width = width // 2 height = height // 2 From 58c22796f0d67ff86a6d9b6ab74b91b60c986138 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 19:14:30 +0100 Subject: [PATCH 14/38] show folder instead of id if item is invalid --- boiiiwd_package/src/library_tab.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index eebbd28..2e28cdf 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -1,4 +1,3 @@ -from src.CTkToolTip import ctk_tooltip from src.imports import * from src.helpers import * @@ -253,10 +252,12 @@ class LibraryTab(ctk.CTkScrollableFrame): except: pass self.item_block_list.add(curr_folder_name) image_path = b_mod_img if item_type == "mod" else b_map_img + text_to_add = re.sub(r'ID:\s+\d+', f'Folder: {curr_folder_name}', text_to_add) text_to_add += " | ⚠️" elif (curr_folder_name not in self.added_folders and (workshop_id in self.ids_added or workshop_id == "None")): try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") except: pass + text_to_add = re.sub(r'ID:\s+\d+', f'Folder: {curr_folder_name}', text_to_add) image_path = b_mod_img if item_type == "mod" else b_map_img text_to_add += " | ⚠️" From f08da67a5787bae66632e1abc147502019fc9950 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 19:17:53 +0100 Subject: [PATCH 15/38] better regex --- boiiiwd_package/src/library_tab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 2e28cdf..d2a7b69 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -252,12 +252,12 @@ class LibraryTab(ctk.CTkScrollableFrame): except: pass self.item_block_list.add(curr_folder_name) image_path = b_mod_img if item_type == "mod" else b_map_img - text_to_add = re.sub(r'ID:\s+\d+', f'Folder: {curr_folder_name}', text_to_add) + text_to_add = re.sub(r'ID:\s+(?:\d+|None)', f'Folder: {curr_folder_name}', text_to_add) text_to_add += " | ⚠️" elif (curr_folder_name not in self.added_folders and (workshop_id in self.ids_added or workshop_id == "None")): try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") except: pass - text_to_add = re.sub(r'ID:\s+\d+', f'Folder: {curr_folder_name}', text_to_add) + text_to_add = re.sub(r'ID:\s+(?:\d+|None)', f'Folder: {curr_folder_name}', text_to_add) image_path = b_mod_img if item_type == "mod" else b_map_img text_to_add += " | ⚠️" From 46e8db353c0d80e78e34d462f2b950a49a10d175 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Thu, 21 Sep 2023 19:32:56 +0100 Subject: [PATCH 16/38] offline details edge case --- boiiiwd_package/src/library_tab.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index d2a7b69..2bd5c6f 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -492,10 +492,14 @@ class LibraryTab(ctk.CTkScrollableFrame): return else: json_path = Path(folder) / "zone" / "workshop.json" + creation_timestamp = None for ff_file in json_path.parent.glob("*.ff"): if ff_file.exists(): creation_timestamp = ff_file.stat().st_ctime break + if not creation_timestamp: + creation_timestamp = json_path.parent.stat().st_ctime + if json_path.exists(): workshop_id = extract_json_data(json_path, "PublisherID") or "None" name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) or "None" @@ -520,6 +524,11 @@ class LibraryTab(ctk.CTkScrollableFrame): self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn, folder, offline_date) + else: + show_message("Warning", "Couldn't get offline information, Please connect to internet and try again") + for button_view in self.button_view_list: + button_view.configure(state="normal") + return info_thread = threading.Thread(target=show_map_thread) From 531d1d78c05ef2974cac86e5d1924f0b51b24f04 Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Fri, 22 Sep 2023 00:08:15 -0230 Subject: [PATCH 17/38] detail button support mods with no ID --- boiiiwd_package/src/library_tab.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 2bd5c6f..29204de 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -214,9 +214,8 @@ class LibraryTab(ctk.CTkScrollableFrame): for zone_path in folder_path.glob("**/zone"): json_path = zone_path / "workshop.json" if json_path.exists(): - # current folder name - curr_folder_name = zone_path.parent.name + curr_folder_name = zone_path.parent.name workshop_id = extract_json_data(json_path, "PublisherID") or "None" name = re.sub(r'\^\w+', '', extract_json_data(json_path, "Title")) or "None" name = name[:45] + "..." if len(name) > 45 else name @@ -415,17 +414,21 @@ class LibraryTab(ctk.CTkScrollableFrame): def show_map_thread(): workshop_id = workshop online = if_internet_available("return") + valid_id = None if not workshop_id.isdigit(): try: if extract_workshop_id(workshop_id).strip().isdigit(): workshop_id = extract_workshop_id(workshop_id).strip() else: - show_message("Warning", "Not a valid Workshop ID.") + raise except: - show_message("Warning", "Not a valid Workshop ID.") - return - if online: + valid_id = False + # show_message("Warning", "Not a valid Workshop ID.") + for button_view in self.button_view_list: + button_view.configure(state="normal") + # return + if online and valid_id!=False: try: url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" response = requests.get(url) @@ -454,7 +457,7 @@ class LibraryTab(ctk.CTkScrollableFrame): stars_div = soup.find("div", class_="fileRatingDetails") starts = stars_div.find("img")["src"] except: - show_message("Warning", "Not a valid Workshop ID\nCouldn't get information.") + show_message("Warning", "Couldn't get information.") for button_view in self.button_view_list: button_view.configure(state="normal") return @@ -486,7 +489,7 @@ class LibraryTab(ctk.CTkScrollableFrame): url, workshop_id, invalid_warn, folder) except Exception as e: - show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") + show_message("Error", f"Failed to fetch information.\nError: {e}", icon="cancel") for button_view in self.button_view_list: button_view.configure(state="normal") return @@ -530,7 +533,6 @@ class LibraryTab(ctk.CTkScrollableFrame): button_view.configure(state="normal") return - info_thread = threading.Thread(target=show_map_thread) info_thread.start() From ef3172fa6aee761202aecb5e9574ad628784857a Mon Sep 17 00:00:00 2001 From: WantedDV <122710241+WantedDV@users.noreply.github.com> Date: Fri, 22 Sep 2023 00:10:39 -0230 Subject: [PATCH 18/38] disable workshop link for invalid ID - show folder name in detail info --- boiiiwd_package/src/library_tab.py | 34 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 29204de..0af6394 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -598,15 +598,21 @@ class LibraryTab(ctk.CTkScrollableFrame): # fillers name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) + + id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id}") + id_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) + + folder_name = ctk.CTkLabel(info_frame, text=f"Folder: {os.path.basename(folder)}") + folder_name.grid(row=1, column=1, columnspan=2, sticky="w", padx=20, pady=5) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") - type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) + type_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) size_label = ctk.CTkLabel(info_frame, text=f"{size_text} {map_size}") - size_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) + size_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") - date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_created_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) if date_updated != "Not updated" and date_updated != "Offline": date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated} 🔗") @@ -616,13 +622,10 @@ class LibraryTab(ctk.CTkScrollableFrame): webbrowser.open(f"https://steamcommunity.com/sharedfiles/filedetails/changelog/{workshop_id}")) else: date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") - date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) - folder_name = ctk.CTkLabel(info_frame, text=f"Folder name: {os.path.basename(folder)}") - folder_name.grid(row=6, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") + date_updated_label.grid(row=6, column=0, columnspan=2, sticky="w", padx=20, pady=5) stars_image_label = ctk.CTkLabel(stars_frame) stars_width, stars_height = stars_image_size @@ -636,7 +639,7 @@ class LibraryTab(ctk.CTkScrollableFrame): image_label = ctk.CTkLabel(image_frame) width, height = image_size - # preview image is too big if offlinr, // to round floats + # preview image is too big if offline, // to round floats if width > 1000 or height > 1000: width = width // 2 height = height // 2 @@ -646,19 +649,24 @@ class LibraryTab(ctk.CTkScrollableFrame): image_label.pack(expand=True, fill="both", padx=(10, 20), pady=(10, 10)) # Buttons - close_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod, width=130) - close_button.grid(row=0, column=0, padx=(20, 20), pady=(10, 10), sticky="n") + view_button = ctk.CTkButton(buttons_frame, text="View", command=view_map_mod, width=130) + view_button.grid(row=0, column=0, padx=(20, 20), pady=(10, 10), sticky="n") + view_button_tooltip = CTkToolTip(view_button, message="View Workshop", topmost=True) update_btn = ctk.CTkButton(buttons_frame, text="Update", command=check_for_updates, width=130) update_btn.grid(row=0, column=1, padx=(10, 20), pady=(10, 10), sticky="n") update_btn_tooltip = CTkToolTip(update_btn, message="Checks and installs updates of the current selected item (redownload!)", topmost=True) - view_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) - view_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") + close_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) + close_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") if invalid_warn: update_btn.configure(text="Update", state="disabled") update_btn_tooltip.configure(message="Disabled due to item being blocked or duplicated") + + if not workshop_id.isdigit(): + view_button.configure(text="View", state="disabled") + view_button_tooltip.configure(message="Not a valid Workshop ID") top.grid_rowconfigure(0, weight=0) top.grid_rowconfigure(1, weight=0) From 1622d9616111e8bf26d5d38edd4155974d540a26 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 17:51:00 +0100 Subject: [PATCH 19/38] testing folder renaming ,settings tab --- boiiiwd_package/src/library_tab.py | 21 +++++++++---- boiiiwd_package/src/main.py | 14 +++++++-- boiiiwd_package/src/settings_tab.py | 47 ++++++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 2bd5c6f..3a2b550 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -36,6 +36,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.item_block_list = set() self.added_folders = set() self.ids_added = set() + self.refresh_next_time = False def add_item(self, item, image=None, workshop_id=None, folder=None, invalid_warn=False): label = ctk.CTkLabel(self, text=item, image=image, compound="left", padx=5, anchor="w") @@ -195,7 +196,14 @@ class LibraryTab(ctk.CTkScrollableFrame): button_view_list.grid_remove() button.grid_remove() - def load_items(self, boiiiFolder): + def load_items(self, boiiiFolder, dont_add=False): + if self.refresh_next_time and not dont_add: + self.refresh_next_time = False + self.refresh_items() + + if dont_add: + self.refresh_next_time = True + maps_folder = Path(boiiiFolder) / "mods" mods_folder = Path(boiiiFolder) / "usermaps" mod_img = os.path.join(RESOURCES_DIR, "mod_image.png") @@ -262,9 +270,9 @@ class LibraryTab(ctk.CTkScrollableFrame): text_to_add += " | ⚠️" self.added_items.add(text_to_add) - if image_path is b_mod_img or image_path is b_map_img: + if image_path is b_mod_img or image_path is b_map_img and not dont_add: self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent, invalid_warn=True) - else: + elif not dont_add: self.add_item(text_to_add, image=ctk.CTkImage(Image.open(image_path)), workshop_id=workshop_id, folder=zone_path.parent) id_found, folder_found = self.item_exists_in_file(items_file, workshop_id, curr_folder_name) item_info = { @@ -381,7 +389,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.button_view_list.remove(button_view_list) self.remove_item_by_option(items_file, id) - def refresh_items(self): + def refresh_items(self, skip_load=False): main_app.app.title("BOIII Workshop Downloader - Library ➜ Loading... ⏳") for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list): label.destroy() @@ -393,8 +401,9 @@ class LibraryTab(ctk.CTkScrollableFrame): self.added_items.clear() self.added_folders.clear() self.ids_added.clear() - status = self.load_items(main_app.app.edit_destination_folder.get().strip()) - main_app.app.title(f"BOIII Workshop Downloader - Library ➜ {status}") + if not skip_load: + status = self.load_items(main_app.app.edit_destination_folder.get().strip()) + main_app.app.title(f"BOIII Workshop Downloader - Library ➜ {status}") def view_item(self, workshop_id): url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 4109b95..5db0a4b 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -629,7 +629,7 @@ class BOIIIWD(ctk.CTk): image_size = image.size self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created , - date_updated, stars_image, stars_image_size, ratings_text, url) + date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id) except requests.exceptions.RequestException as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") @@ -639,7 +639,7 @@ class BOIIIWD(ctk.CTk): info_thread.start() def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - date_created ,date_updated, stars_image, stars_image_size, ratings_text, url): + date_created ,date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id): def main_thread(): top = ctk.CTkToplevel(self) top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) @@ -680,7 +680,15 @@ class BOIIIWD(ctk.CTk): date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) - date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") + if date_updated != "Not updated": + date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated} 🔗") + date_updated_label_tooltip = CTkToolTip(date_updated_label, message="View changelogs", topmost=True) + date_updated_label.configure(cursor="hand2") + date_updated_label.bind("", lambda e: + webbrowser.open(f"https://steamcommunity.com/sharedfiles/filedetails/changelog/{workshop_id}")) + else: + date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") + date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) stars_image_label = ctk.CTkLabel(stars_frame) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 5ab3183..bd494d1 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -1,4 +1,5 @@ from src.update_window import check_for_updates_func +from src.library_tab import LibraryTab as LT from src.imports import * from src.helpers import * @@ -113,7 +114,8 @@ class SettingsTab(ctk.CTkFrame): self.folder_options_label_var.trace_add("write", self.enable_save_button) self.folder_options_label = ctk.CTkLabel(left_frame, text="Items Folder Naming:", anchor="nw") self.folder_options_label.grid(row=10, column=1, padx=20, pady=(10, 0), sticky="nw") - self.folder_options = ctk.CTkOptionMenu(left_frame, values=["PublisherID", "FolderName"], variable=self.folder_options_label_var) + self.folder_options = ctk.CTkOptionMenu(left_frame, values=["PublisherID", "FolderName"], command=self.change_folder_naming, + variable=self.folder_options_label_var) self.folder_options.grid(row=10, column=1, padx=(150, 0), pady=(3, 0), sticky="nw") self.folder_options.set(value=self.load_settings("folder_naming", "PublisherID")) @@ -400,6 +402,49 @@ class SettingsTab(ctk.CTkFrame): def settings_check_for_updates(self): check_for_updates_func(self, ignore_up_todate=False) + def rename_all_folders(self, option): + boiiiFolder = main_app.app.edit_destination_folder.get() + maps_folder = Path(boiiiFolder) / "mods" + mods_folder = Path(boiiiFolder) / "usermaps" + folders_to_process = [mods_folder, maps_folder] + processed_names = set() + for folder_path in folders_to_process: + for zone_path in folder_path.glob("**/zone"): + if zone_path.parent.name in main_app.app.library_tab.item_block_list: + continue + json_path = zone_path / "workshop.json" + if json_path.exists(): + folder_to_rename = zone_path.parent + new_folder_name = extract_json_data(json_path, option) + while new_folder_name in processed_names: + new_folder_name += f"_{extract_json_data(json_path, 'PublisherID')}" + folder_to_rename.rename(os.path.join(folder_path, new_folder_name)) + processed_names.add(new_folder_name) + return new_folder_name + + def change_folder_naming(self, option): + main_app.app.title("BOIII Workshop Downloader - Settings ➜ Loading... ⏳") + try: + if os.path.exists(main_app.app.edit_destination_folder.get()): + lib = main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) + if not "No items" in lib: + if show_message("Renaming", "Would you like to rename all your exisiting item folders now?", _return=True): + main_app.app.title("BOIII Workshop Downloader - Settings ➜ Renaming... ⏳") + try :self.rename_all_folders(option) + except Exception as er: show_message("Error!", f"Error occured when renaming\n{er}"); return + show_message("Done", "All folders have been renamed") + else: + show_message("Heads up!", "Only newly downloaded items will be affected", icon="info") + else: + show_message("Warning -> Check boiii path", f"You don't have any items yet ,from now on item's folders will be named as their {option}") + else: + show_message("Warning -> Check boiii path", f"You don't have any items yet ,from now on item's folders will be named as their {option}") + except Exception as e: + show_message("Error", f"Error occured \n{e}") + finally: + main_app.app.title("BOIII Workshop Downloader - Settings") + self.save_settings() + def load_on_switch_screen(self): self.check_updates_var.set(self.load_settings("checkforupdtes")) self.console_var.set(self.load_settings("console")) From b0257d153ba37a636cefbd4ff2a3a4214abd2b3f Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 18:28:16 +0100 Subject: [PATCH 20/38] fix ,Path is tripping --- boiiiwd_package/src/settings_tab.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index bd494d1..96723e8 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -1,5 +1,4 @@ from src.update_window import check_for_updates_func -from src.library_tab import LibraryTab as LT from src.imports import * from src.helpers import * @@ -404,23 +403,32 @@ class SettingsTab(ctk.CTkFrame): def rename_all_folders(self, option): boiiiFolder = main_app.app.edit_destination_folder.get() - maps_folder = Path(boiiiFolder) / "mods" - mods_folder = Path(boiiiFolder) / "usermaps" + maps_folder = os.path.join(boiiiFolder, "mods") + mods_folder = os.path.join(boiiiFolder, "usermaps") folders_to_process = [mods_folder, maps_folder] processed_names = set() for folder_path in folders_to_process: - for zone_path in folder_path.glob("**/zone"): - if zone_path.parent.name in main_app.app.library_tab.item_block_list: + for folder_name in os.listdir(folder_path): + zone_path = os.path.join(folder_path, folder_name, "zone") + if not os.path.isdir(zone_path): continue - json_path = zone_path / "workshop.json" - if json_path.exists(): - folder_to_rename = zone_path.parent + if zone_path in main_app.app.library_tab.item_block_list: + continue + json_path = os.path.join(zone_path, "workshop.json") + if os.path.exists(json_path): + folder_to_rename = os.path.join(folder_path, folder_name) new_folder_name = extract_json_data(json_path, option) while new_folder_name in processed_names: new_folder_name += f"_{extract_json_data(json_path, 'PublisherID')}" - folder_to_rename.rename(os.path.join(folder_path, new_folder_name)) + new_path = os.path.join(folder_path, new_folder_name) + + while os.path.exists(new_path): + publisher_id = extract_json_data(json_path, 'PublisherID') + new_folder_name += f"_{publisher_id}" + new_path = os.path.join(folder_path, new_folder_name) + + os.rename(folder_to_rename, new_path) processed_names.add(new_folder_name) - return new_folder_name def change_folder_naming(self, option): main_app.app.title("BOIII Workshop Downloader - Settings ➜ Loading... ⏳") From dcf6f71f3871c36ddeca11e121eaba85bae25915 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 18:38:33 +0100 Subject: [PATCH 21/38] major edge case --- boiiiwd_package/src/library_tab.py | 13 ++++++++----- boiiiwd_package/src/settings_tab.py | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 7f60e9c..f11c3ab 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -254,7 +254,8 @@ class LibraryTab(ctk.CTkScrollableFrame): mod_count += 1 if item_type == "mod" else 0 if curr_folder_name not in self.added_folders: image_path = mod_img if item_type == "mod" else map_img - if not (str(curr_folder_name).strip() == str(workshop_id).strip() or str(curr_folder_name).strip() == str(folder_name).strip()): + if not (str(curr_folder_name).strip() == str(workshop_id).strip() or str(curr_folder_name).strip() == str(folder_name).strip() + or str(curr_folder_name).strip() == f"{folder_name}_{workshop_id}"): try: self.remove_item_by_option(items_file, curr_folder_name, "folder_name") except: pass self.item_block_list.add(curr_folder_name) @@ -300,7 +301,9 @@ class LibraryTab(ctk.CTkScrollableFrame): # keep here cuz of item_exists_in_file() testing self.added_folders.add(curr_folder_name) - if not workshop_id in self.ids_added: + # added that cuz it sometimes can add blocked ids first + # and legit ids will be blocked cuz theyll be added to "ids_added" + if not workshop_id in self.ids_added and curr_folder_name not in self.item_block_list: self.ids_added.add(workshop_id) if not self.file_cleaned and os.path.exists(items_file): @@ -607,10 +610,10 @@ class LibraryTab(ctk.CTkScrollableFrame): # fillers name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - + id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id}") id_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - + folder_name = ctk.CTkLabel(info_frame, text=f"Folder: {os.path.basename(folder)}") folder_name.grid(row=1, column=1, columnspan=2, sticky="w", padx=20, pady=5) @@ -672,7 +675,7 @@ class LibraryTab(ctk.CTkScrollableFrame): if invalid_warn: update_btn.configure(text="Update", state="disabled") update_btn_tooltip.configure(message="Disabled due to item being blocked or duplicated") - + if not workshop_id.isdigit(): view_button.configure(text="View", state="disabled") view_button_tooltip.configure(message="Not a valid Workshop ID") diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 96723e8..b99cc59 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -412,7 +412,7 @@ class SettingsTab(ctk.CTkFrame): zone_path = os.path.join(folder_path, folder_name, "zone") if not os.path.isdir(zone_path): continue - if zone_path in main_app.app.library_tab.item_block_list: + if folder_name in main_app.app.library_tab.item_block_list: continue json_path = os.path.join(zone_path, "workshop.json") if os.path.exists(json_path): From 2c2b11c4336036d8b3e193e48e753cc3aa72e211 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 18:44:55 +0100 Subject: [PATCH 22/38] update json after renaming --- boiiiwd_package/src/settings_tab.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index b99cc59..ffb961b 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -440,7 +440,8 @@ class SettingsTab(ctk.CTkFrame): main_app.app.title("BOIII Workshop Downloader - Settings ➜ Renaming... ⏳") try :self.rename_all_folders(option) except Exception as er: show_message("Error!", f"Error occured when renaming\n{er}"); return - show_message("Done", "All folders have been renamed") + main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) + show_message("Done!", "All folders have been renamed", icon="info") else: show_message("Heads up!", "Only newly downloaded items will be affected", icon="info") else: @@ -450,6 +451,7 @@ class SettingsTab(ctk.CTkFrame): except Exception as e: show_message("Error", f"Error occured \n{e}") finally: + main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) main_app.app.title("BOIII Workshop Downloader - Settings") self.save_settings() From c7ceba56299de4ea44db7726f6989103cf4473fb Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 18:51:04 +0100 Subject: [PATCH 23/38] add --- boiiiwd_package/src/settings_tab.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index ffb961b..3623e14 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -440,7 +440,6 @@ class SettingsTab(ctk.CTkFrame): main_app.app.title("BOIII Workshop Downloader - Settings ➜ Renaming... ⏳") try :self.rename_all_folders(option) except Exception as er: show_message("Error!", f"Error occured when renaming\n{er}"); return - main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) show_message("Done!", "All folders have been renamed", icon="info") else: show_message("Heads up!", "Only newly downloaded items will be affected", icon="info") @@ -451,7 +450,6 @@ class SettingsTab(ctk.CTkFrame): except Exception as e: show_message("Error", f"Error occured \n{e}") finally: - main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) main_app.app.title("BOIII Workshop Downloader - Settings") self.save_settings() From 9656d92865694b04f26f2d0ca4c6e456f53a1c30 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 19:00:20 +0100 Subject: [PATCH 24/38] add --- boiiiwd_package/src/settings_tab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 3623e14..70c413e 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -416,14 +416,14 @@ class SettingsTab(ctk.CTkFrame): continue json_path = os.path.join(zone_path, "workshop.json") if os.path.exists(json_path): + publisher_id = extract_json_data(json_path, 'PublisherID') folder_to_rename = os.path.join(folder_path, folder_name) new_folder_name = extract_json_data(json_path, option) while new_folder_name in processed_names: - new_folder_name += f"_{extract_json_data(json_path, 'PublisherID')}" + new_folder_name += f"_{publisher_id}" new_path = os.path.join(folder_path, new_folder_name) while os.path.exists(new_path): - publisher_id = extract_json_data(json_path, 'PublisherID') new_folder_name += f"_{publisher_id}" new_path = os.path.join(folder_path, new_folder_name) From 8b9ec407213f892471b12c2cfb9c6ae58f00226c Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 21:05:49 +0100 Subject: [PATCH 25/38] added check in for item existance in steam to boiii and download functions --- boiiiwd_package/src/main.py | 34 ++++++++++++++++++++--------- boiiiwd_package/src/settings_tab.py | 16 +++++++++----- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 5db0a4b..7bfd40b 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -1199,7 +1199,9 @@ class BOIIIWD(ctk.CTk): self.label_speed.configure(text="Installing...") mod_type = extract_json_data(json_file_path, "Type") items_file = os.path.join(application_path, LIBRARY_FILE) - if self.library_tab.item_exists_in_file(items_file, workshop_id): + item_exixsts = self.library_tab.item_exists_in_file(items_file, workshop_id) + + if item_exixsts: get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: folder_name = get_folder_name @@ -1215,15 +1217,20 @@ class BOIIIWD(ctk.CTk): folder_name = extract_json_data(json_file_path, "publisherID") if mod_type == "mod": - mods_folder = os.path.join(destination_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") + path_folder = os.path.join(destination_folder, "mods") + folder_name_path = os.path.join(path_folder, folder_name, "zone") elif mod_type == "map": - usermaps_folder = os.path.join(destination_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") + path_folder = os.path.join(destination_folder, "usermaps") + folder_name_path = os.path.join(path_folder, folder_name, "zone") else: show_message("Error", f"Invalid workshop type in workshop.json, are you sure this is a map or a mod?., skipping {workshop_id}...", icon="cancel") return + if not item_exixsts: + while os.path.exists(os.path.join(path_folder, folder_name)): + folder_name += f"_{workshop_id}" + folder_name_path = os.path.join(path_folder, folder_name, "zone") + os.makedirs(folder_name_path, exist_ok=True) try: @@ -1458,7 +1465,9 @@ class BOIIIWD(ctk.CTk): self.label_speed.configure(text="Installing...") mod_type = extract_json_data(json_file_path, "Type") items_file = os.path.join(application_path, LIBRARY_FILE) - if self.library_tab.item_exists_in_file(items_file, workshop_id): + item_exixsts = self.library_tab.item_exists_in_file(items_file, workshop_id) + + if item_exixsts: get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: folder_name = get_folder_name @@ -1474,16 +1483,21 @@ class BOIIIWD(ctk.CTk): folder_name = extract_json_data(json_file_path, "publisherID") if mod_type == "mod": - mods_folder = os.path.join(destination_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") + path_folder = os.path.join(destination_folder, "mods") + folder_name_path = os.path.join(path_folder, folder_name, "zone") elif mod_type == "map": - usermaps_folder = os.path.join(destination_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") + path_folder = os.path.join(destination_folder, "usermaps") + folder_name_path = os.path.join(path_folder, folder_name, "zone") else: show_message("Error", "Invalid workshop type in workshop.json, are you sure this is a map or a mod?.", icon="cancel") self.stop_download() return + if not item_exixsts: + while os.path.exists(os.path.join(path_folder, folder_name)): + folder_name += f"_{workshop_id}" + folder_name_path = os.path.join(path_folder, folder_name, "zone") + os.makedirs(folder_name_path, exist_ok=True) try: diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 70c413e..9d41bd1 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -602,8 +602,9 @@ 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(application_path, LIBRARY_FILE) + item_exixsts = main_app.app.library_tab.item_exists_in_file(items_file, workshop_id) - if main_app.app.library_tab.item_exists_in_file(items_file, workshop_id): + if item_exixsts: get_folder_name = main_app.app.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name") if get_folder_name: folder_name = get_folder_name @@ -619,15 +620,20 @@ class SettingsTab(ctk.CTkFrame): folder_name = extract_json_data(json_file_path, "publisherID") if mod_type == "mod": - mods_folder = os.path.join(boiii_folder, "mods") - folder_name_path = os.path.join(mods_folder, folder_name, "zone") + path_folder = os.path.join(boiii_folder, "mods") + folder_name_path = os.path.join(path_folder, folder_name, "zone") elif mod_type == "map": - usermaps_folder = os.path.join(boiii_folder, "usermaps") - folder_name_path = os.path.join(usermaps_folder, folder_name, "zone") + path_folder = os.path.join(boiii_folder, "usermaps") + folder_name_path = os.path.join(path_folder, folder_name, "zone") else: show_message("Error", "Invalid workshop type in workshop.json, are you sure this is a map or a mod?.", icon="cancel") continue + if not item_exixsts: + while os.path.exists(os.path.join(path_folder, folder_name)): + folder_name += f"_{workshop_id}" + folder_name_path = os.path.join(path_folder, folder_name, "zone") + os.makedirs(folder_name_path, exist_ok=True) try: From 75a45ad3d009991bdb9f6e70f977476ad36ece00 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 21:10:56 +0100 Subject: [PATCH 26/38] sometimes text overlap each other ,this is better for now --- boiiiwd_package/src/library_tab.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index f11c3ab..a1efac6 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -611,11 +611,11 @@ class LibraryTab(ctk.CTkScrollableFrame): name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id}") + id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id} | Folder: {os.path.basename(folder)}") id_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - folder_name = ctk.CTkLabel(info_frame, text=f"Folder: {os.path.basename(folder)}") - folder_name.grid(row=1, column=1, columnspan=2, sticky="w", padx=20, pady=5) + # folder_name = ctk.CTkLabel(info_frame, text=f"") + # folder_name.grid(row=1, column=1, columnspan=2, sticky="w", padx=20, pady=5) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") type_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) From e88f2c9af8ca058900f3f834c8c3c950ab6845e4 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 23:15:51 +0100 Subject: [PATCH 27/38] pass if item already named after the option --- boiiiwd_package/src/settings_tab.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 9d41bd1..8c6ef7e 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -414,7 +414,13 @@ class SettingsTab(ctk.CTkFrame): continue if folder_name in main_app.app.library_tab.item_block_list: continue + json_path = os.path.join(zone_path, "workshop.json") + if option == "FolderName" and folder_name == extract_json_data(json_path, option): + continue + elif option == "PublisherID" and folder_name == extract_json_data(json_path, option): + continue + if os.path.exists(json_path): publisher_id = extract_json_data(json_path, 'PublisherID') folder_to_rename = os.path.join(folder_path, folder_name) From 602a444b0a31ede81b9127026803f2f7ab40b1a5 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Fri, 22 Sep 2023 23:18:56 +0100 Subject: [PATCH 28/38] add --- boiiiwd_package/src/settings_tab.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 8c6ef7e..40a1b6b 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -416,15 +416,14 @@ class SettingsTab(ctk.CTkFrame): continue json_path = os.path.join(zone_path, "workshop.json") - if option == "FolderName" and folder_name == extract_json_data(json_path, option): - continue - elif option == "PublisherID" and folder_name == extract_json_data(json_path, option): + new_name = extract_json_data(json_path, option) + if folder_name == new_name: continue if os.path.exists(json_path): publisher_id = extract_json_data(json_path, 'PublisherID') folder_to_rename = os.path.join(folder_path, folder_name) - new_folder_name = extract_json_data(json_path, option) + new_folder_name = new_name while new_folder_name in processed_names: new_folder_name += f"_{publisher_id}" new_path = os.path.join(folder_path, new_folder_name) From beefa0378e299bd8dd58029603f837179dd590b8 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 09:28:08 +0100 Subject: [PATCH 29/38] added item update to steam to boiii --- boiiiwd_package/src/settings_tab.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 40a1b6b..57d523f 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -650,6 +650,8 @@ class SettingsTab(ctk.CTkFrame): if cut_var.get(): remove_tree(os.path.join(map_folder, workshop_id)) + main_app.app.library_tab.update_item(main_app.app.edit_destination_folder.get(), workshop_id, mod_type, folder_name) + if subfolders: main_app.app.show_complete_message(message=f"All items were moved\nYou can run the game now!\nPS: You have to restart the game\n(pressing launch will launch/restarts)") From 5e6832d602607bcc208abeeac02ee008bc0267d1 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 11:52:00 +0100 Subject: [PATCH 30/38] description window in details (view...) --- boiiiwd_package/src/library_tab.py | 47 ++++++++++++++++++++++++++--- boiiiwd_package/src/settings_tab.py | 2 ++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index a1efac6..95d1cfb 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -466,6 +466,11 @@ class LibraryTab(ctk.CTkScrollableFrame): date_updated = details_stat_elements[2].text.strip() except: date_updated = "Not updated" + try: + description = soup.find('div', class_='workshopItemDescription').get_text() + except: + description = "Not available" + stars_div = soup.find("div", class_="fileRatingDetails") starts = stars_div.find("img")["src"] except: @@ -498,7 +503,7 @@ class LibraryTab(ctk.CTkScrollableFrame): self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, date_updated, stars_image, stars_image_size, ratings_text, - url, workshop_id, invalid_warn, folder) + url, workshop_id, invalid_warn, folder, description, online) except Exception as e: show_message("Error", f"Failed to fetch information.\nError: {e}", icon="cancel") @@ -534,11 +539,12 @@ class LibraryTab(ctk.CTkScrollableFrame): stars_image = Image.open(os.path.join(RESOURCES_DIR, "ryuk.png")) stars_image_size = stars_image.size ratings_text = "Offline" + description = re.sub(r'\^\w+', '', extract_json_data(json_path, "Description")) or "Not available" url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={workshop_id}" self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created, date_updated, stars_image, stars_image_size, ratings_text, - url, workshop_id, invalid_warn, folder, offline_date) + url, workshop_id, invalid_warn, folder, description, online ,offline_date) else: show_message("Warning", "Couldn't get offline information, Please connect to internet and try again") for button_view in self.button_view_list: @@ -550,7 +556,7 @@ class LibraryTab(ctk.CTkScrollableFrame): def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, date_created ,date_updated, stars_image, stars_image_size, ratings_text, - url, workshop_id, invalid_warn, folder, offline_date=None): + url, workshop_id, invalid_warn, folder, description ,online,offline_date=None): def main_thread(): try: items_file = os.path.join(application_path, LIBRARY_FILE) @@ -573,6 +579,31 @@ class LibraryTab(ctk.CTkScrollableFrame): def view_map_mod(): webbrowser.open(url) + def show_description(event): + def main_thread(): + description_window = ctk.CTkToplevel(None) + + if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): + description_window.after(210, lambda: description_window.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) + + description_window.attributes('-topmost', 'true') + description_window.title("Description") + y_pos = event.y_root + x_pos = event.x_root + calc_req_width = len(description) * 6 + 5 + win_width = calc_req_width if calc_req_width < 500 else 500 + description_window.geometry(f"{win_width + 5}x200+{x_pos}+{y_pos}") + + frame = ctk.CTkScrollableFrame(description_window) + frame.pack(fill=ctk.BOTH, expand=True) + + description_label = ctk.CTkLabel(frame, text=description, wraplength=500, justify="left") + description_label.grid(padx=(10, 10), pady=(10, 10), sticky="nwes") + + description_window.after(50, description_window.focus_set) + + main_app.app.after(0, main_thread) + def check_for_updates(): try: @@ -608,8 +639,11 @@ class LibraryTab(ctk.CTkScrollableFrame): buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") + name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name} (View...)") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) + name_label_tooltip = CTkToolTip(name_label, message="View description", topmost=True) + name_label.configure(cursor="hand2") + name_label.bind("", lambda e: show_description(e)) id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id} | Folder: {os.path.basename(folder)}") id_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) @@ -672,6 +706,11 @@ class LibraryTab(ctk.CTkScrollableFrame): close_button = ctk.CTkButton(buttons_frame, text="Close", command=close_window, width=130) close_button.grid(row=0, column=2, padx=(10, 20), pady=(10, 10), sticky="n") + if not online: + view_button.configure(state="disabled") + update_btn.configure(state="disabled") + update_btn_tooltip.configure(message="Currently offline") + view_button_tooltip.configure(message="Currently offline") if invalid_warn: update_btn.configure(text="Update", state="disabled") update_btn_tooltip.configure(message="Disabled due to item being blocked or duplicated") diff --git a/boiiiwd_package/src/settings_tab.py b/boiiiwd_package/src/settings_tab.py index 57d523f..ae3e435 100644 --- a/boiiiwd_package/src/settings_tab.py +++ b/boiiiwd_package/src/settings_tab.py @@ -480,6 +480,8 @@ class SettingsTab(ctk.CTkFrame): def from_steam_to_boiii_toplevel(self): def main_thread(): try: + # to make sure json file is up to date + main_app.app.library_tab.load_items(main_app.app.edit_destination_folder.get(), dont_add=True) 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"))) From 14ecf21464aa98c6be024df6b09a7b72f2de5f9d Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 12:40:25 +0100 Subject: [PATCH 31/38] description window improvments --- boiiiwd_package/src/library_tab.py | 15 ++++++----- boiiiwd_package/src/main.py | 43 +++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 95d1cfb..57dd9c7 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -592,14 +592,17 @@ class LibraryTab(ctk.CTkScrollableFrame): x_pos = event.x_root calc_req_width = len(description) * 6 + 5 win_width = calc_req_width if calc_req_width < 500 else 500 - description_window.geometry(f"{win_width + 5}x200+{x_pos}+{y_pos}") + description_window.geometry(f"{win_width + 5}x300+{x_pos}+{y_pos}") - frame = ctk.CTkScrollableFrame(description_window) - frame.pack(fill=ctk.BOTH, expand=True) - - description_label = ctk.CTkLabel(frame, text=description, wraplength=500, justify="left") - description_label.grid(padx=(10, 10), pady=(10, 10), sticky="nwes") + if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_obsidian.json": + description_label = ctk.CTkTextbox(description_window, activate_scrollbars=True, scrollbar_button_color="#5b6c7f") + else: + description_label = ctk.CTkTextbox(description_window, activate_scrollbars=True) + description_label.insert("1.0", description) + description_label.pack(fill=ctk.BOTH, expand=True, padx=(10, 10), pady=(10, 10)) + description_label.configure(state="disabled") + main_app.app.create_context_menu(description_label, textbox=True) description_window.after(50, description_window.focus_set) main_app.app.after(0, main_thread) diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 7bfd40b..ef9c6f8 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -602,6 +602,11 @@ class BOIIIWD(ctk.CTk): date_updated = details_stat_elements[2].text.strip() except: date_updated = "Not updated" + try: + description = soup.find('div', class_='workshopItemDescription').get_text() + except: + description = "Not available" + stars_div = soup.find("div", class_="fileRatingDetails") starts = stars_div.find("img")["src"] except: @@ -629,7 +634,7 @@ class BOIIIWD(ctk.CTk): image_size = image.size self.toplevel_info_window(map_name, map_mod_type, map_size, image, image_size, date_created , - date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id) + date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, description) except requests.exceptions.RequestException as e: show_message("Error", f"Failed to fetch map information.\nError: {e}", icon="cancel") @@ -639,7 +644,8 @@ class BOIIIWD(ctk.CTk): info_thread.start() def toplevel_info_window(self, map_name, map_mod_type, map_size, image, image_size, - date_created ,date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id): + date_created ,date_updated, stars_image, stars_image_size, + ratings_text, url, workshop_id, description): def main_thread(): top = ctk.CTkToplevel(self) top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) @@ -652,6 +658,34 @@ class BOIIIWD(ctk.CTk): def view_map_mod(): webbrowser.open(url) + def show_description(event): + def main_thread(): + description_window = ctk.CTkToplevel(None) + + if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")): + description_window.after(210, lambda: description_window.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) + + description_window.attributes('-topmost', 'true') + description_window.title("Description") + y_pos = event.y_root + x_pos = event.x_root + calc_req_width = len(description) * 6 + 5 + win_width = calc_req_width if calc_req_width < 500 else 500 + description_window.geometry(f"{win_width + 5}x300+{x_pos}+{y_pos}") + + if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_obsidian.json": + description_label = ctk.CTkTextbox(description_window, activate_scrollbars=True, scrollbar_button_color="#5b6c7f") + else: + description_label = ctk.CTkTextbox(description_window, activate_scrollbars=True) + description_label.insert("1.0", description) + description_label.pack(fill=ctk.BOTH, expand=True, padx=(10, 10), pady=(10, 10)) + description_label.configure(state="disabled") + + self.create_context_menu(description_label, textbox=True) + description_window.after(50, description_window.focus_set) + + self.after(0, main_thread) + # frames stars_frame = ctk.CTkFrame(top) stars_frame.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 0), sticky="nsew") @@ -668,8 +702,11 @@ class BOIIIWD(ctk.CTk): buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") + name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name} (View...)") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) + name_label_tooltip = CTkToolTip(name_label, message="View description", topmost=True) + name_label.configure(cursor="hand2") + name_label.bind("", lambda e: show_description(e)) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) From 3d5ec2f8f4ec87554156257b133edd58b0d03d71 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 13:02:45 +0100 Subject: [PATCH 32/38] added description line in details --- boiiiwd_package/src/library_tab.py | 27 ++++++++++++++------------- boiiiwd_package/src/main.py | 20 ++++++++++++-------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 57dd9c7..e3cbe4d 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -642,26 +642,27 @@ class LibraryTab(ctk.CTkScrollableFrame): buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name} (View...)") + name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - name_label_tooltip = CTkToolTip(name_label, message="View description", topmost=True) - name_label.configure(cursor="hand2") - name_label.bind("", lambda e: show_description(e)) + + shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description + description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") + description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) + description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) + description_lab.configure(cursor="hand2") + description_lab.bind("", lambda e: show_description(e)) id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id} | Folder: {os.path.basename(folder)}") - id_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - - # folder_name = ctk.CTkLabel(info_frame, text=f"") - # folder_name.grid(row=1, column=1, columnspan=2, sticky="w", padx=20, pady=5) + id_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") - type_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) + type_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) size_label = ctk.CTkLabel(info_frame, text=f"{size_text} {map_size}") - size_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) + size_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") - date_created_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_created_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) if date_updated != "Not updated" and date_updated != "Offline": date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated} 🔗") @@ -671,10 +672,10 @@ class LibraryTab(ctk.CTkScrollableFrame): webbrowser.open(f"https://steamcommunity.com/sharedfiles/filedetails/changelog/{workshop_id}")) else: date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") - date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_updated_label.grid(row=6, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_updated_label = ctk.CTkLabel(info_frame, text=f"Downloaded at: {down_date}") - date_updated_label.grid(row=6, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_updated_label.grid(row=7, column=0, columnspan=2, sticky="w", padx=20, pady=5) stars_image_label = ctk.CTkLabel(stars_frame) stars_width, stars_height = stars_image_size diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index ef9c6f8..fe9421a 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -702,20 +702,24 @@ class BOIIIWD(ctk.CTk): buttons_frame.grid(row=3, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="nsew") # fillers - name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name} (View...)") + name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - name_label_tooltip = CTkToolTip(name_label, message="View description", topmost=True) - name_label.configure(cursor="hand2") - name_label.bind("", lambda e: show_description(e)) + + shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description + description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") + description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) + description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) + description_lab.configure(cursor="hand2") + description_lab.bind("", lambda e: show_description(e)) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") - type_label.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) + type_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) size_label = ctk.CTkLabel(info_frame, text=f"Size: {map_size}") - size_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) + size_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) date_created_label = ctk.CTkLabel(info_frame, text=f"Posted: {date_created}") - date_created_label.grid(row=3, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_created_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) if date_updated != "Not updated": date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated} 🔗") @@ -726,7 +730,7 @@ class BOIIIWD(ctk.CTk): else: date_updated_label = ctk.CTkLabel(info_frame, text=f"Updated: {date_updated}") - date_updated_label.grid(row=4, column=0, columnspan=2, sticky="w", padx=20, pady=5) + date_updated_label.grid(row=5, column=0, columnspan=2, sticky="w", padx=20, pady=5) stars_image_label = ctk.CTkLabel(stars_frame) stars_width, stars_height = stars_image_size From b968b3e2b38f75b7a8cc00fc8c66e1deb9c295d1 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 13:04:43 +0100 Subject: [PATCH 33/38] added description line in details --- boiiiwd_package/src/library_tab.py | 7 ++++--- boiiiwd_package/src/main.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index e3cbe4d..6856375 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -648,9 +648,10 @@ class LibraryTab(ctk.CTkScrollableFrame): shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) - description_lab.configure(cursor="hand2") - description_lab.bind("", lambda e: show_description(e)) + if len(description) > 30: + description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) + description_lab.configure(cursor="hand2") + description_lab.bind("", lambda e: show_description(e)) id_label = ctk.CTkLabel(info_frame, text=f"ID: {workshop_id} | Folder: {os.path.basename(folder)}") id_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index fe9421a..75091ba 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -708,9 +708,10 @@ class BOIIIWD(ctk.CTk): shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) - description_lab.configure(cursor="hand2") - description_lab.bind("", lambda e: show_description(e)) + if len(description) > 30: + description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) + description_lab.configure(cursor="hand2") + description_lab.bind("", lambda e: show_description(e)) type_label = ctk.CTkLabel(info_frame, text=f"Type: {map_mod_type}") type_label.grid(row=2, column=0, columnspan=2, sticky="w", padx=20, pady=5) From d736457106c19cd969a194b49f1cf43d4e58e56d Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 13:25:25 +0100 Subject: [PATCH 34/38] parse breaks in desc window --- boiiiwd_package/src/library_tab.py | 7 ++++--- boiiiwd_package/src/main.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 6856375..577c544 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -467,7 +467,7 @@ class LibraryTab(ctk.CTkScrollableFrame): except: date_updated = "Not updated" try: - description = soup.find('div', class_='workshopItemDescription').get_text() + description = soup.find('div', class_='workshopItemDescription').get_text(separator='\n') except: description = "Not available" @@ -645,10 +645,11 @@ class LibraryTab(ctk.CTkScrollableFrame): name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description + desc_threshold = 30 + shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - if len(description) > 30: + if len(description) > desc_threshold: description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) description_lab.configure(cursor="hand2") description_lab.bind("", lambda e: show_description(e)) diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 75091ba..17c1d2b 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -603,7 +603,7 @@ class BOIIIWD(ctk.CTk): except: date_updated = "Not updated" try: - description = soup.find('div', class_='workshopItemDescription').get_text() + description = soup.find('div', class_='workshopItemDescription').get_text(separator='\n') except: description = "Not available" @@ -705,10 +705,11 @@ class BOIIIWD(ctk.CTk): name_label = ctk.CTkLabel(info_frame, text=f"Name: {map_name}") name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) - shortened_description = f"{description[:30]}... (View)" if len(description) > 30 else description + desc_threshold = 30 + shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) - if len(description) > 30: + if len(description) > desc_threshold: description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) description_lab.configure(cursor="hand2") description_lab.bind("", lambda e: show_description(e)) From 3f13a5f0b3a3d5f8a8389b26f20677e52fa8c926 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 13:33:00 +0100 Subject: [PATCH 35/38] dont parse breaks in line --- boiiiwd_package/src/library_tab.py | 3 ++- boiiiwd_package/src/main.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 577c544..dbd543c 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -647,7 +647,8 @@ class LibraryTab(ctk.CTkScrollableFrame): desc_threshold = 30 shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description - description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") + shortened_description = re.sub(r'\n', '', shortened_description).strip() + description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) if len(description) > desc_threshold: description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 17c1d2b..5baebdc 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -707,7 +707,8 @@ class BOIIIWD(ctk.CTk): desc_threshold = 30 shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description - description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description.strip()}") + shortened_description = re.sub(r'\n', '', shortened_description).strip() + description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) if len(description) > desc_threshold: description_lab_tooltip = CTkToolTip(description_lab, message="View description", topmost=True) From 75f793ec600578885aff6d6f013b4b49dda7e15b Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 13:41:27 +0100 Subject: [PATCH 36/38] better regex for desc --- boiiiwd_package/src/library_tab.py | 6 ++++-- boiiiwd_package/src/main.py | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index dbd543c..70103de 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -646,8 +646,10 @@ class LibraryTab(ctk.CTkScrollableFrame): name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) desc_threshold = 30 - shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description - shortened_description = re.sub(r'\n', '', shortened_description).strip() + shortened_description = re.sub(r'\n', '', description).strip() + shortened_description = re.sub(r'([^a-zA-Z0-9\s:().])', '', shortened_description) + shortened_description = f"{shortened_description[:desc_threshold]}... (View)"\ + if len(shortened_description) > desc_threshold else shortened_description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) if len(description) > desc_threshold: diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 5baebdc..1036d36 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -706,8 +706,10 @@ class BOIIIWD(ctk.CTk): name_label.grid(row=0, column=0, columnspan=2, sticky="w", padx=20, pady=5) desc_threshold = 30 - shortened_description = f"{description[:desc_threshold]}... (View)" if len(description) > desc_threshold else description - shortened_description = re.sub(r'\n', '', shortened_description).strip() + shortened_description = re.sub(r'\n', '', description).strip() + shortened_description = re.sub(r'([^a-zA-Z0-9\s:().])', '', shortened_description) + shortened_description = f"{shortened_description[:desc_threshold]}... (View)"\ + if len(shortened_description) > desc_threshold else shortened_description description_lab = ctk.CTkLabel(info_frame, text=f"Description: {shortened_description}") description_lab.grid(row=1, column=0, columnspan=2, sticky="w", padx=20, pady=5) if len(description) > desc_threshold: From 016ac80ec7b763748352ae54ac31ec97193308a8 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 14:10:58 +0100 Subject: [PATCH 37/38] move desc window ~to the middle --- boiiiwd_package/src/library_tab.py | 4 ++-- boiiiwd_package/src/main.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index 70103de..bf1dd75 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -588,8 +588,8 @@ class LibraryTab(ctk.CTkScrollableFrame): description_window.attributes('-topmost', 'true') description_window.title("Description") - y_pos = event.y_root - x_pos = event.x_root + x_pos = event.x_root - 300 + y_pos = event.y_root - 200 calc_req_width = len(description) * 6 + 5 win_width = calc_req_width if calc_req_width < 500 else 500 description_window.geometry(f"{win_width + 5}x300+{x_pos}+{y_pos}") diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 1036d36..8e4e056 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -667,8 +667,8 @@ class BOIIIWD(ctk.CTk): description_window.attributes('-topmost', 'true') description_window.title("Description") - y_pos = event.y_root - x_pos = event.x_root + x_pos = event.x_root - 300 + y_pos = event.y_root - 200 calc_req_width = len(description) * 6 + 5 win_width = calc_req_width if calc_req_width < 500 else 500 description_window.geometry(f"{win_width + 5}x300+{x_pos}+{y_pos}") From 1b59262462876405239e37bc2e70954bebf94178 Mon Sep 17 00:00:00 2001 From: faroukbmiled Date: Sat, 23 Sep 2023 14:16:51 +0100 Subject: [PATCH 38/38] map name in desc window --- boiiiwd_package/src/library_tab.py | 2 +- boiiiwd_package/src/main.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/boiiiwd_package/src/library_tab.py b/boiiiwd_package/src/library_tab.py index bf1dd75..a5644b4 100644 --- a/boiiiwd_package/src/library_tab.py +++ b/boiiiwd_package/src/library_tab.py @@ -587,7 +587,7 @@ class LibraryTab(ctk.CTkScrollableFrame): description_window.after(210, lambda: description_window.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) description_window.attributes('-topmost', 'true') - description_window.title("Description") + description_window.title(f"Description - {map_name}") x_pos = event.x_root - 300 y_pos = event.y_root - 200 calc_req_width = len(description) * 6 + 5 diff --git a/boiiiwd_package/src/main.py b/boiiiwd_package/src/main.py index 8e4e056..41c8978 100644 --- a/boiiiwd_package/src/main.py +++ b/boiiiwd_package/src/main.py @@ -1,3 +1,4 @@ +from turtle import title from src.update_window import check_for_updates_func from src.helpers import * @@ -666,7 +667,7 @@ class BOIIIWD(ctk.CTk): description_window.after(210, lambda: description_window.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico"))) description_window.attributes('-topmost', 'true') - description_window.title("Description") + description_window.title(f"Description - {map_name}") x_pos = event.x_root - 300 y_pos = event.y_root - 200 calc_req_width = len(description) * 6 + 5