changed folder names to ids to prevent 2 items with same foldername
This commit is contained in:
parent
ad9a7ccc54
commit
6863e6e6cb
69
boiiiwd.py
69
boiiiwd.py
@ -24,7 +24,7 @@ import io
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
VERSION = "v0.3.0"
|
VERSION = "v0.3.1"
|
||||||
GITHUB_REPO = "faroukbmiled/BOIIIWD"
|
GITHUB_REPO = "faroukbmiled/BOIIIWD"
|
||||||
LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip"
|
LATEST_RELEASE_URL = "https://github.com/faroukbmiled/BOIIIWD/releases/latest/download/Release.zip"
|
||||||
UPDATER_FOLDER = "update"
|
UPDATER_FOLDER = "update"
|
||||||
@ -534,6 +534,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
filter_tooltip = CTkToolTip(self.filter_refresh_button, message="Refresh library", topmost=True)
|
filter_tooltip = CTkToolTip(self.filter_refresh_button, message="Refresh library", topmost=True)
|
||||||
self.label_list = []
|
self.label_list = []
|
||||||
self.button_list = []
|
self.button_list = []
|
||||||
|
self.folders_to_rename = []
|
||||||
self.button_view_list = []
|
self.button_view_list = []
|
||||||
self.filter_type = True
|
self.filter_type = True
|
||||||
self.clipboard_has_content = False
|
self.clipboard_has_content = False
|
||||||
@ -668,7 +669,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
button_view_list.grid_remove()
|
button_view_list.grid_remove()
|
||||||
button.grid_remove()
|
button.grid_remove()
|
||||||
|
|
||||||
def load_items(self, boiiiFolder, up_json=False):
|
def load_items(self, boiiiFolder):
|
||||||
maps_folder = Path(boiiiFolder) / "mods"
|
maps_folder = Path(boiiiFolder) / "mods"
|
||||||
mods_folder = Path(boiiiFolder) / "usermaps"
|
mods_folder = Path(boiiiFolder) / "usermaps"
|
||||||
mod_img = os.path.join(RESOURCES_DIR, "mod_image.png")
|
mod_img = os.path.join(RESOURCES_DIR, "mod_image.png")
|
||||||
@ -680,10 +681,14 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
for zone_path in folder_path.glob("**/zone"):
|
for zone_path in folder_path.glob("**/zone"):
|
||||||
json_path = zone_path / "workshop.json"
|
json_path = zone_path / "workshop.json"
|
||||||
if json_path.exists():
|
if json_path.exists():
|
||||||
|
workshop_id = extract_json_data(json_path, "PublisherID")
|
||||||
|
|
||||||
|
if folder_path.name != workshop_id:
|
||||||
|
self.folders_to_rename.append((zone_path.parent, folder_path / workshop_id))
|
||||||
|
|
||||||
name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "")
|
name = extract_json_data(json_path, "Title").replace(">", "").replace("^", "")
|
||||||
name = name[:45] + "..." if len(name) > 45 else name
|
name = name[:45] + "..." if len(name) > 45 else name
|
||||||
item_type = extract_json_data(json_path, "Type")
|
item_type = extract_json_data(json_path, "Type")
|
||||||
workshop_id = extract_json_data(json_path, "PublisherID")
|
|
||||||
folder_name = extract_json_data(json_path, "FolderName")
|
folder_name = extract_json_data(json_path, "FolderName")
|
||||||
size = convert_bytes_to_readable(get_folder_size(zone_path.parent))
|
size = convert_bytes_to_readable(get_folder_size(zone_path.parent))
|
||||||
text_to_add = f"{name} | Type: {item_type.capitalize()}"
|
text_to_add = f"{name} | Type: {item_type.capitalize()}"
|
||||||
@ -717,6 +722,18 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
f.seek(0)
|
f.seek(0)
|
||||||
json.dump(items_data, f, indent=4)
|
json.dump(items_data, f, indent=4)
|
||||||
|
|
||||||
|
if len(self.folders_to_rename) > 1:
|
||||||
|
# well the program hangs for too long on some systems so i had to do this instead
|
||||||
|
def update_folder_names_thread():
|
||||||
|
for folder_path, workshop_id in self.folders_to_rename:
|
||||||
|
try:
|
||||||
|
os.rename(folder_path, workshop_id)
|
||||||
|
except Exception as e:
|
||||||
|
show_message(f"Failed to rename folder from '{folder_path}' to '{workshop_id}'",
|
||||||
|
f"{e}\nPlease restart the program and go to the library tab to fix the issue!", icon="cancel")
|
||||||
|
self.folders_to_rename.clear()
|
||||||
|
threading.Thread(target=update_folder_names_thread).start()
|
||||||
|
|
||||||
if not self.added_items:
|
if not self.added_items:
|
||||||
self.show_no_items_message()
|
self.show_no_items_message()
|
||||||
else:
|
else:
|
||||||
@ -1078,7 +1095,6 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
if not on_launch:
|
if not on_launch:
|
||||||
show_message("No updates found!", "Items are up to date!", icon="info")
|
show_message("No updates found!", "Items are up to date!", icon="info")
|
||||||
|
|
||||||
# yeah im lazy as shit this is what were working with for now
|
|
||||||
def update_items_window(self):
|
def update_items_window(self):
|
||||||
try:
|
try:
|
||||||
top = ctk.CTkToplevel(master=None)
|
top = ctk.CTkToplevel(master=None)
|
||||||
@ -1093,12 +1109,16 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
top.resizable(True, True)
|
top.resizable(True, True)
|
||||||
selected_id_list = []
|
selected_id_list = []
|
||||||
cevent = Event()
|
cevent = Event()
|
||||||
|
self.select_all_bool = False
|
||||||
|
|
||||||
listbox = CTkListbox(top, multiple_selection=True)
|
listbox = CTkListbox(top, multiple_selection=True)
|
||||||
listbox.grid(row=0, column=0, sticky="nsew")
|
listbox.grid(row=0, column=0, sticky="nsew")
|
||||||
|
|
||||||
update_button = ctk.CTkButton(top, text="Update")
|
update_button = ctk.CTkButton(top, text="Update")
|
||||||
update_button.grid(row=1, column=0, pady=10)
|
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):
|
def open_url(id_part, e=None):
|
||||||
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id_part}"
|
url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={id_part}"
|
||||||
@ -1128,6 +1148,17 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
id_part = parts[1].split('|')[0].strip()
|
id_part = parts[1].split('|')[0].strip()
|
||||||
selected_id_list.append(id_part)
|
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():
|
def update_btn_fun():
|
||||||
if len(selected_id_list) == 1:
|
if len(selected_id_list) == 1:
|
||||||
if app.is_downloading:
|
if app.is_downloading:
|
||||||
@ -1157,8 +1188,10 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
|||||||
cevent.y_root = update_button.winfo_rooty()
|
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)
|
show_noti(update_button ,"Please select 1 or more items", event=cevent, noti_dur=0.8, topmost=True)
|
||||||
|
|
||||||
|
|
||||||
listbox.configure(command=update_list)
|
listbox.configure(command=update_list)
|
||||||
update_button.configure(command=update_btn_fun)
|
update_button.configure(command=update_btn_fun)
|
||||||
|
select_button.configure(command=select_all)
|
||||||
|
|
||||||
top.grid_rowconfigure(0, weight=1)
|
top.grid_rowconfigure(0, weight=1)
|
||||||
top.grid_columnconfigure(0, weight=1)
|
top.grid_columnconfigure(0, weight=1)
|
||||||
@ -1696,7 +1729,7 @@ class SettingsTab(ctk.CTkFrame):
|
|||||||
|
|
||||||
if os.path.exists(json_file_path):
|
if os.path.exists(json_file_path):
|
||||||
mod_type = extract_json_data(json_file_path, "Type")
|
mod_type = extract_json_data(json_file_path, "Type")
|
||||||
folder_name = extract_json_data(json_file_path, "FolderName")
|
folder_name = extract_json_data(json_file_path, "PublisherID")
|
||||||
|
|
||||||
if mod_type == "mod":
|
if mod_type == "mod":
|
||||||
mods_folder = os.path.join(boiii_folder, "mods")
|
mods_folder = os.path.join(boiii_folder, "mods")
|
||||||
@ -2516,14 +2549,16 @@ class BOIIIWD(ctk.CTk):
|
|||||||
# the real deal
|
# the real deal
|
||||||
def run_steamcmd_command(self, command, map_folder, wsid, queue=None):
|
def run_steamcmd_command(self, command, map_folder, wsid, queue=None):
|
||||||
steamcmd_path = get_steamcmd_path()
|
steamcmd_path = get_steamcmd_path()
|
||||||
stdout = os.path.join(steamcmd_path, "logs", "workshop_log.txt")
|
stdout_path = os.path.join(steamcmd_path, "logs", "workshop_log.txt")
|
||||||
timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
|
timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(stdout_path), exist_ok=True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(stdout, 'w') as file:
|
with open(stdout_path, 'w') as file:
|
||||||
file.write('')
|
file.write('')
|
||||||
except:
|
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
|
show_console = subprocess.CREATE_NO_WINDOW
|
||||||
if self.settings_tab.console:
|
if self.settings_tab.console:
|
||||||
@ -2558,7 +2593,7 @@ class BOIIIWD(ctk.CTk):
|
|||||||
#wait for process
|
#wait for process
|
||||||
while True:
|
while True:
|
||||||
if not self.is_downloading:
|
if not self.is_downloading:
|
||||||
if self.check_steamcmd_stdout(stdout, wsid):
|
if self.check_steamcmd_stdout(stdout_path, wsid):
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
self.is_downloading = True
|
self.is_downloading = True
|
||||||
elapsed_time = time.time() - start_time
|
elapsed_time = time.time() - start_time
|
||||||
@ -2569,10 +2604,10 @@ class BOIIIWD(ctk.CTk):
|
|||||||
# print("Broken freeeee!")
|
# print("Broken freeeee!")
|
||||||
self.is_downloading = False
|
self.is_downloading = False
|
||||||
try:
|
try:
|
||||||
with open(stdout, 'w') as file:
|
with open(stdout_path, 'w') as file:
|
||||||
file.write('')
|
file.write('')
|
||||||
except:
|
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:
|
if not self.settings_tab.stopped:
|
||||||
self.settings_tab.steam_fail_counter = self.settings_tab.steam_fail_counter + 1
|
self.settings_tab.steam_fail_counter = self.settings_tab.steam_fail_counter + 1
|
||||||
@ -2604,7 +2639,7 @@ class BOIIIWD(ctk.CTk):
|
|||||||
|
|
||||||
while True:
|
while True:
|
||||||
if not self.is_downloading:
|
if not self.is_downloading:
|
||||||
if self.check_steamcmd_stdout(stdout, wsid):
|
if self.check_steamcmd_stdout(stdout_path, wsid):
|
||||||
self.is_downloading = True
|
self.is_downloading = True
|
||||||
if process.poll() != None:
|
if process.poll() != None:
|
||||||
break
|
break
|
||||||
@ -2613,10 +2648,10 @@ class BOIIIWD(ctk.CTk):
|
|||||||
# print("Broken freeeee!")
|
# print("Broken freeeee!")
|
||||||
self.is_downloading = False
|
self.is_downloading = False
|
||||||
try:
|
try:
|
||||||
with open(stdout, 'w') as file:
|
with open(stdout_path, 'w') as file:
|
||||||
file.write('')
|
file.write('')
|
||||||
except:
|
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):
|
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")
|
show_message("SteamCMD has terminated", "SteamCMD has been terminated\nAnd failed to download the map/mod, try again or enable continuous download in settings")
|
||||||
@ -2934,7 +2969,7 @@ class BOIIIWD(ctk.CTk):
|
|||||||
if os.path.exists(json_file_path):
|
if os.path.exists(json_file_path):
|
||||||
self.label_speed.configure(text="Installing...")
|
self.label_speed.configure(text="Installing...")
|
||||||
mod_type = extract_json_data(json_file_path, "Type")
|
mod_type = extract_json_data(json_file_path, "Type")
|
||||||
folder_name = extract_json_data(json_file_path, "FolderName")
|
folder_name = extract_json_data(json_file_path, "PublisherID")
|
||||||
|
|
||||||
if mod_type == "mod":
|
if mod_type == "mod":
|
||||||
mods_folder = os.path.join(destination_folder, "mods")
|
mods_folder = os.path.join(destination_folder, "mods")
|
||||||
@ -3179,7 +3214,7 @@ class BOIIIWD(ctk.CTk):
|
|||||||
if os.path.exists(json_file_path):
|
if os.path.exists(json_file_path):
|
||||||
self.label_speed.configure(text="Installing...")
|
self.label_speed.configure(text="Installing...")
|
||||||
mod_type = extract_json_data(json_file_path, "Type")
|
mod_type = extract_json_data(json_file_path, "Type")
|
||||||
folder_name = extract_json_data(json_file_path, "FolderName")
|
folder_name = extract_json_data(json_file_path, "PublisherID")
|
||||||
|
|
||||||
if mod_type == "mod":
|
if mod_type == "mod":
|
||||||
mods_folder = os.path.join(destination_folder, "mods")
|
mods_folder = os.path.join(destination_folder, "mods")
|
||||||
|
BIN
dist/BOIIIWD.exe
vendored
BIN
dist/BOIIIWD.exe
vendored
Binary file not shown.
Loading…
Reference in New Issue
Block a user