summaryrefslogtreecommitdiff
path: root/py_modules/lsfg_vk/wrapper_service.py
diff options
context:
space:
mode:
authorxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-11 11:08:12 -0400
committerxXJSONDeruloXx <danielhimebauch@gmail.com>2026-09-11 11:08:12 -0400
commit954b2abc47d8772211cb8ecee523900f823184e8 (patch)
treec25109bebc87ccfb9e71a0863a10e81caa695908 /py_modules/lsfg_vk/wrapper_service.py
parentbc73d150230f92d614962f7384a7430cf64dcd14 (diff)
downloaddecky-lsfg-vk-954b2abc47d8772211cb8ecee523900f823184e8.tar.gz
decky-lsfg-vk-954b2abc47d8772211cb8ecee523900f823184e8.zip
better uninstall cleanup
Diffstat (limited to 'py_modules/lsfg_vk/wrapper_service.py')
-rw-r--r--py_modules/lsfg_vk/wrapper_service.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/py_modules/lsfg_vk/wrapper_service.py b/py_modules/lsfg_vk/wrapper_service.py
index ebe9526..906e55b 100644
--- a/py_modules/lsfg_vk/wrapper_service.py
+++ b/py_modules/lsfg_vk/wrapper_service.py
@@ -87,9 +87,12 @@ class WrapperService(BaseService):
entry = {
"state": cls._validate_state(raw.get("state")),
"command_token_added": raw.get("command_token_added", False),
+ "non_steam": raw.get("non_steam", False),
}
if type(entry["command_token_added"]) is not bool:
raise ValueError("command_token_added must be a boolean")
+ if type(entry["non_steam"]) is not bool:
+ raise ValueError("non_steam must be a boolean")
return entry
@classmethod
@@ -263,6 +266,7 @@ class WrapperService(BaseService):
"wrapper_path": self.WRAPPER_TOKEN,
"wrapper_owned": self._wrapper_marker() if document["apps"] else False,
"command_token_added": entry.get("command_token_added", False) if entry else False,
+ "non_steam": entry.get("non_steam", False) if entry else False,
}
def get(self, appid: str) -> Dict[str, Any]:
@@ -281,6 +285,7 @@ class WrapperService(BaseService):
"state": None,
"wrapper_path": self.WRAPPER_TOKEN,
"wrapper_owned": False,
+ "non_steam": False,
}
def set(
@@ -288,18 +293,22 @@ class WrapperService(BaseService):
appid: str,
state: Dict[str, Any],
command_token_added: bool = False,
+ non_steam: bool = False,
) -> Dict[str, Any]:
try:
normalized = self._valid_appid(appid)
validated_state = self._validate_state(state)
if type(command_token_added) is not bool:
raise ValueError("command_token_added must be a boolean")
+ if type(non_steam) is not bool:
+ raise ValueError("non_steam must be a boolean")
with self._lock:
self._assert_wrapper_owned_or_absent()
document, _, _ = self._read_document()
document["apps"][normalized] = {
"state": validated_state,
"command_token_added": command_token_added,
+ "non_steam": non_steam,
}
self._write_pair(document)
return self._response(document, normalized)
@@ -312,6 +321,7 @@ class WrapperService(BaseService):
"state": None,
"wrapper_path": self.WRAPPER_TOKEN,
"wrapper_owned": False,
+ "non_steam": False,
}
def remove(self, appid: str) -> Dict[str, Any]:
@@ -334,6 +344,7 @@ class WrapperService(BaseService):
"state": None,
"wrapper_path": self.WRAPPER_TOKEN,
"wrapper_owned": False,
+ "non_steam": False,
}
def repair(self) -> Dict[str, Any]:
@@ -353,3 +364,66 @@ class WrapperService(BaseService):
"wrapper_path": self.WRAPPER_TOKEN,
"wrapper_owned": False,
}
+
+ def list_apps(self) -> Dict[str, Any]:
+ try:
+ with self._lock:
+ document, _, _ = self._read_document()
+ self._assert_wrapper_owned_or_absent()
+ apps = [
+ {
+ "appid": appid,
+ "non_steam": entry.get("non_steam", False),
+ "command_token_added": entry.get("command_token_added", False),
+ }
+ for appid, entry in document["apps"].items()
+ ]
+ return {
+ "success": True,
+ "message": "",
+ "error": None,
+ "apps": apps,
+ "wrapper_path": self.WRAPPER_TOKEN,
+ }
+ except Exception as error:
+ return {
+ "success": False,
+ "message": "",
+ "error": str(error),
+ "apps": [],
+ "wrapper_path": self.WRAPPER_TOKEN,
+ }
+
+ def purge(self) -> Dict[str, Any]:
+ """Remove the plugin-owned wrapper and its sidecar during uninstall.
+
+ This is deliberately separate from ``remove``: normal profile removal
+ leaves a safe passthrough wrapper for the remaining profiles, while an
+ uninstall should remove the wrapper entirely. Both files are
+ validated before anything is removed so a user's replacement wrapper
+ or damaged state is left untouched.
+ """
+ removed = []
+ try:
+ with self._lock:
+ _document, sidecar_exists, _ = self._read_document()
+ wrapper_owned = self._assert_wrapper_owned_or_absent()
+ if wrapper_owned:
+ self.wrapper_path.unlink()
+ removed.append(str(self.wrapper_path))
+ if sidecar_exists:
+ self.sidecar_path.unlink()
+ removed.append(str(self.sidecar_path))
+ return {
+ "success": True,
+ "message": "Removed lsfg-vk workaround state",
+ "error": None,
+ "removed_files": removed,
+ }
+ except Exception as error:
+ return {
+ "success": False,
+ "message": "",
+ "error": str(error),
+ "removed_files": removed or None,
+ }