From a1a29616e56475d75fce75134c574be3b547950f Mon Sep 17 00:00:00 2001 From: Wayne Heaney <42350981+wheaney@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:59:22 -0700 Subject: Add Plugin.uninstall callback support (#555) * Add Plugin.uninstall callback support https://github.com/SteamDeckHomebrew/decky-loader/issues/536 * Remove empty deck.sh --- backend/decky_loader/browser.py | 2 +- backend/decky_loader/plugin/plugin.py | 4 ++-- backend/decky_loader/plugin/sandboxed_plugin.py | 23 ++++++++++++++++++++--- 3 files changed, 23 insertions(+), 6 deletions(-) (limited to 'backend') diff --git a/backend/decky_loader/browser.py b/backend/decky_loader/browser.py index c0af701b..6fa71bb2 100644 --- a/backend/decky_loader/browser.py +++ b/backend/decky_loader/browser.py @@ -135,7 +135,7 @@ class PluginBrowser: # logger.debug("current plugins: %s", snapshot_string) if name in self.plugins: logger.debug("Plugin %s was found", name) - self.plugins[name].stop() + self.plugins[name].stop(uninstall=True) logger.debug("Plugin %s was stopped", name) del self.plugins[name] logger.debug("Plugin %s was removed from the dictionary", name) diff --git a/backend/decky_loader/plugin/plugin.py b/backend/decky_loader/plugin/plugin.py index 02d80470..6fa86858 100644 --- a/backend/decky_loader/plugin/plugin.py +++ b/backend/decky_loader/plugin/plugin.py @@ -97,9 +97,9 @@ class PluginWrapper: self._listener_task = create_task(self._response_listener()) return self - def stop(self): + def stop(self, uninstall: bool = False): self._listener_task.cancel() async def _(self: PluginWrapper): - await self._socket.write_single_line(dumps({ "stop": True }, ensure_ascii=False)) + await self._socket.write_single_line(dumps({ "stop": True, "uninstall": uninstall }, ensure_ascii=False)) await self._socket.close_socket_connection() create_task(_(self)) \ No newline at end of file diff --git a/backend/decky_loader/plugin/sandboxed_plugin.py b/backend/decky_loader/plugin/sandboxed_plugin.py index 98706a33..0bbcb471 100644 --- a/backend/decky_loader/plugin/sandboxed_plugin.py +++ b/backend/decky_loader/plugin/sandboxed_plugin.py @@ -76,7 +76,7 @@ class SandboxedPlugin: # append the plugin's `py_modules` to the recognized python paths syspath.append(path.join(environ["DECKY_PLUGIN_DIR"], "py_modules")) - + #TODO: FIX IN A LESS CURSED WAY keys = [key for key in sysmodules if key.startswith("decky_loader.")] for key in keys: @@ -138,12 +138,29 @@ class SandboxedPlugin: self.log.error("Failed to unload " + self.name + "!\n" + format_exc()) exit(0) - async def on_new_message(self, message : str) -> str | None: + async def _uninstall(self): + try: + self.log.info("Attempting to uninstall with plugin " + self.name + "'s \"_uninstall\" function.\n") + if hasattr(self.Plugin, "_uninstall"): + await self.Plugin._uninstall(self.Plugin) + self.log.info("Uninstalled " + self.name + "\n") + else: + self.log.info("Could not find \"_uninstall\" in " + self.name + "'s main.py" + "\n") + except: + self.log.error("Failed to uninstall " + self.name + "!\n" + format_exc()) + exit(0) + + async def on_new_message(self, message : str) -> str|None: data = loads(message) if "stop" in data: self.log.info("Calling Loader unload function.") await self._unload() + + if data.get('uninstall'): + self.log.info("Calling Loader uninstall function.") + await self._uninstall() + get_event_loop().stop() while get_event_loop().is_running(): await sleep(0) @@ -166,4 +183,4 @@ class SandboxedPlugin: d["res"] = str(e) d["success"] = False finally: - return dumps(d, ensure_ascii=False) \ No newline at end of file + return dumps(d, ensure_ascii=False) -- cgit v1.2.3