From b3b98aa407a9601424e57ccaab89bf2fc6cd8339 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:11:35 +0900 Subject: [PATCH] fix: parse parent dir --- dzgui/api/mods.py | 4 ++++ dzgui/const/constants.py | 2 ++ dzgui/managers/offline.py | 2 +- dzgui/util/symlink.py | 38 ++++++++++++++++++++++++-------------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/dzgui/api/mods.py b/dzgui/api/mods.py index a32542e..22f1e24 100644 --- a/dzgui/api/mods.py +++ b/dzgui/api/mods.py @@ -12,6 +12,7 @@ from dzgui.api.servers import get_rules, fqip_to_record from dzgui.const.constants import ( APP_NAME, APPID_DAYZ, + DAYZ_COMMUNITY_ROOT, LIBRARYFOLDERS_PATH, WORKSHOP_PATH, ) @@ -50,6 +51,9 @@ def get_local_mods(workshop_path: Path) -> list[Path]: def is_mission(path: Path) -> bool: # TODO: parse integrity of other files + parent = path.parent.name + if parent != DAYZ_COMMUNITY_ROOT: + return False file = path / "init.c" return file.exists() diff --git a/dzgui/const/constants.py b/dzgui/const/constants.py index 78362f7..d9689d2 100644 --- a/dzgui/const/constants.py +++ b/dzgui/const/constants.py @@ -83,3 +83,5 @@ LOG_FILTERS = ("CRITICAL", "WARNING", "INFO", "DEBUG") TMP_PATH = "/tmp" TMP_TARBALL = "/tmp/dzgui.tar.gz" TMP_EXE = "/tmp/dzgui/dzgui" + +DAYZ_COMMUNITY_ROOT = "Missions" diff --git a/dzgui/managers/offline.py b/dzgui/managers/offline.py index b4ab039..c709176 100644 --- a/dzgui/managers/offline.py +++ b/dzgui/managers/offline.py @@ -12,7 +12,7 @@ from dzgui.init.proc import is_dayz_running from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager from dzgui.model.model_factory import ModelFactory from dzgui.strings import dialogs -from dzgui.util.symlink import create_custom_symlinks, symlink_mission +from dzgui.util.symlink import create_custom_symlinks, clone_symlinks, symlink_mission from dzgui.views.dialogs.filepicker import FolderPicker if TYPE_CHECKING: diff --git a/dzgui/util/symlink.py b/dzgui/util/symlink.py index 715131a..99ed87e 100644 --- a/dzgui/util/symlink.py +++ b/dzgui/util/symlink.py @@ -2,7 +2,7 @@ import logging from pathlib import Path from dzgui.api.mods import get_local_mod_path, get_local_mod_ids, _hash -from dzgui.const.constants import APPID_DAYZ, APPID_DAYZ_EXP, APP_NAME +from dzgui.const.constants import APPID_DAYZ, APPID_DAYZ_EXP, APP_NAME, DAYZ_COMMUNITY_ROOT from dzgui.const.enum import Preferences from dzgui.config.query import lookup @@ -11,18 +11,23 @@ import dzgui.api.pefile as PeFile logger = logging.getLogger(APP_NAME) +def expunge_link(file: Path) -> None: + if not file.is_symlink(): + return + # NOTE: unlink stale symlinks + if file.exists() is False: + file.unlink() + if str(file.stem)[:2] == "@C": + file.unlink() + def rebuild_symlinks(config: Path) -> None: # TODO: pass direct path as argument path = lookup(config, Preferences.DEFAULT) steam_path = Path(path) dayz_path = PeFile.get_nested_app_path(steam_path, APPID_DAYZ) for file in dayz_path.iterdir(): - # NOTE: unlink stale symlinks - if file.is_symlink() and file.exists() is False: - file.unlink() - # NOTE: expunge ephemeral (custom) symlinks - if file.is_symlink() and str(file.stem)[:2] == "@C": - file.unlink() + expunge_link(file) + workshop = get_local_mod_path(steam_path) # NOTE: create symlinks for missing mods for mod_id in get_local_mod_ids(steam_path): @@ -49,16 +54,21 @@ def create_custom_symlinks( clone_symlinks(steam_path) return links + def symlink_mission(steam_path: Path, target: str) -> None: dayz_path = PeFile.get_nested_app_path(steam_path, APPID_DAYZ) for file in dayz_path.iterdir(): - if file.is_symlink() and str(file.stem)[:2] == "@C": - file.unlink() - stem = Path(target).name - suffix = _hash(stem, use_custom=True) - source = dayz_path.joinpath(suffix) - source.symlink_to(Path(target)) - return suffix + expunge_link(file) + path = Path(target) + stem = path.name + parent = path.parent + suffix = _hash(str(parent), use_custom=True) + source = dayz_path.joinpath(DAYZ_COMMUNITY_ROOT) + try: + source.symlink_to(parent) + except Exception: + return "" + return f"{DAYZ_COMMUNITY_ROOT}/{stem}" def clone_symlinks(steam_path: Path) -> None: