summaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/decky_loader/browser.py7
-rw-r--r--backend/decky_loader/loader.py12
-rw-r--r--backend/decky_loader/plugin/plugin.py19
-rw-r--r--backend/decky_loader/plugin/sandboxed_plugin.py29
4 files changed, 41 insertions, 26 deletions
diff --git a/backend/decky_loader/browser.py b/backend/decky_loader/browser.py
index fe8ae71a..09788a40 100644
--- a/backend/decky_loader/browser.py
+++ b/backend/decky_loader/browser.py
@@ -152,11 +152,12 @@ class PluginBrowser:
# logger.debug("current plugins: %s", snapshot_string)
if name in self.plugins:
- logger.debug("Plugin %s was found", name)
+ plugin_display = self.plugins[name].get_display_name()
+ logger.debug(f"Plugin {plugin_display} was found")
await self.plugins[name].stop(uninstall=True)
- logger.debug("Plugin %s was stopped", name)
+ logger.debug(f"Plugin {plugin_display} was stopped")
del self.plugins[name]
- logger.debug("Plugin %s was removed from the dictionary", name)
+ logger.debug(f"Plugin {plugin_display} was removed from the dictionary")
self.cleanup_plugin_settings(name)
logger.debug("removing files %s" % str(name))
rmtree(plugin_dir)
diff --git a/backend/decky_loader/loader.py b/backend/decky_loader/loader.py
index 4574cd1d..297fc202 100644
--- a/backend/decky_loader/loader.py
+++ b/backend/decky_loader/loader.py
@@ -171,16 +171,16 @@ class Loader:
return
if plugin.name in self.plugins:
if not "debug" in plugin.flags and refresh:
- self.logger.info(f"Plugin {plugin.name} is already loaded and has requested to not be re-loaded")
+ self.logger.info(f"Plugin {plugin.get_display_name()} is already loaded and has requested to not be re-loaded")
return
else:
await self.plugins[plugin.name].stop()
self.plugins.pop(plugin.name, None)
if plugin.passive:
- self.logger.info(f"Plugin {plugin.name} is passive")
+ self.logger.info(f"Plugin {plugin.get_display_name()} is passive")
self.plugins[plugin.name] = plugin.start()
- self.logger.info(f"Loaded {plugin.name}")
+ self.logger.info(f"Loaded {plugin.get_display_name()}")
if not batch:
self.loop.create_task(self.dispatch_plugin(plugin.name, plugin.version, plugin.load_type))
except Exception as e:
@@ -208,7 +208,7 @@ class Loader:
plugin = self.plugins[plugin_name]
try:
if method_name.startswith("_"):
- raise RuntimeError(f"Plugin {plugin.name} tried to call private method {method_name}")
+ raise RuntimeError(f"Plugin {plugin.get_display_name()} tried to call private method {method_name}")
res["result"] = await plugin.execute_legacy_method(method_name, kwargs)
res["success"] = True
except Exception as e:
@@ -220,10 +220,10 @@ class Loader:
plugin = self.plugins[plugin_name]
try:
if method_name.startswith("_"):
- raise RuntimeError(f"Plugin {plugin.name} tried to call private method {method_name}")
+ raise RuntimeError(f"Plugin {plugin.get_display_name()} tried to call private method {method_name}")
result = await plugin.execute_method(method_name, *args)
except Exception as e:
- self.logger.error(f"Method {method_name} of plugin {plugin.name} failed with the following exception:\n{format_exc()}")
+ self.logger.error(f"Method {method_name} of plugin {plugin.get_display_name()} failed with the following exception:\n{format_exc()}")
raise e # throw again to pass the error to the frontend
return result
diff --git a/backend/decky_loader/plugin/plugin.py b/backend/decky_loader/plugin/plugin.py
index 8648a5d6..bed92f34 100644
--- a/backend/decky_loader/plugin/plugin.py
+++ b/backend/decky_loader/plugin/plugin.py
@@ -81,6 +81,13 @@ class PluginWrapper:
def __str__(self) -> str:
return self.name
+ def get_display_name(self) -> str:
+ """Returns plugin name with version if available, formatted for logging."""
+ if self.version:
+ return f"{self.name} (v{self.version})"
+
+ return self.name
+
async def _response_listener(self):
while self._socket.active:
try:
@@ -92,7 +99,7 @@ class PluginWrapper:
elif res["type"] == SocketMessageType.RESPONSE.value:
self._method_call_requests.pop(res["id"]).set_result(res)
except CancelledError:
- self.log.info(f"Stopping response listener for {self.name}")
+ self.log.info(f"Stopping response listener for {self.get_display_name()}")
await self._socket.close_socket_connection()
# Cancel the request so that WSRouter can perform cleanup
@@ -107,7 +114,7 @@ class PluginWrapper:
async def execute_legacy_method(self, method_name: str, kwargs: Dict[Any, Any]):
if not self.legacy_method_warning:
self.legacy_method_warning = True
- self.log.warning(f"Plugin {self.name} is using legacy method calls. This will be removed in a future release.")
+ self.log.warning(f"Plugin {self.get_display_name()} is using legacy method calls. This will be removed in a future release.")
if self.passive:
raise RuntimeError("This plugin is passive (aka does not implement main.py)")
@@ -142,7 +149,7 @@ class PluginWrapper:
start_time = time()
if self.passive:
return
- self.log.info(f"Shutting down {self.name}")
+ self.log.info(f"Shutting down {self.get_display_name()}")
pending: set[Task[None]] | None = None;
@@ -162,16 +169,16 @@ class PluginWrapper:
for pending_task in pending:
pending_task.cancel()
- self.log.info(f"Plugin {self.name} has been stopped in {time() - start_time:.1f}s")
+ self.log.info(f"Plugin {self.get_display_name()} has been stopped in {time() - start_time:.1f}s")
except Exception as e:
- self.log.error(f"Error during shutdown for plugin {self.name}: {str(e)}\n{format_exc()}")
+ self.log.error(f"Error during shutdown for plugin {self.get_display_name()}: {str(e)}\n{format_exc()}")
async def kill_if_still_running(self):
start_time = time()
while self.proc and self.proc.is_alive():
elapsed_time = time() - start_time
if elapsed_time >= 5:
- self.log.warning(f"Plugin {self.name} still alive 5 seconds after stop request! Sending SIGKILL!")
+ self.log.warning(f"Plugin {self.get_display_name()} still alive 5 seconds after stop request! Sending SIGKILL!")
self.terminate(True)
await sleep(0.1)
diff --git a/backend/decky_loader/plugin/sandboxed_plugin.py b/backend/decky_loader/plugin/sandboxed_plugin.py
index 20da747e..675eb464 100644
--- a/backend/decky_loader/plugin/sandboxed_plugin.py
+++ b/backend/decky_loader/plugin/sandboxed_plugin.py
@@ -45,6 +45,13 @@ class SandboxedPlugin:
self.log = getLogger("sandboxed_plugin")
+ def get_display_name(self) -> str:
+ """Returns plugin name with version if available, formatted for logging."""
+ if self.version:
+ return f"{self.name} (v{self.version})"
+
+ return self.name
+
def initialize(self, socket: LocalSocket):
self._socket = socket
@@ -125,51 +132,51 @@ class SandboxedPlugin:
get_event_loop().create_task(self.Plugin._main(self.Plugin))
get_event_loop().create_task(socket.setup_server(self.on_new_message))
except:
- self.log.error("Failed to start " + self.name + "!\n" + format_exc())
+ self.log.error(f"Failed to start {self.get_display_name()}!\n{format_exc()}")
sys.exit(0)
try:
get_event_loop().run_forever()
except SystemExit:
pass
except:
- self.log.error("Loop exited for " + self.name + "!\n" + format_exc())
+ self.log.error(f"Loop exited for {self.get_display_name()}!\n{format_exc()}")
finally:
get_event_loop().close()
async def _unload(self):
try:
- self.log.info("Attempting to unload with plugin " + self.name + "'s \"_unload\" function.\n")
+ self.log.info(f"Attempting to unload with plugin {self.get_display_name()}'s \"_unload\" function.\n")
if hasattr(self.Plugin, "_unload"):
if self.api_version > 0:
await self.Plugin._unload()
else:
await self.Plugin._unload(self.Plugin)
- self.log.info("Unloaded " + self.name + "\n")
+ self.log.info(f"Unloaded {self.get_display_name()}\n")
else:
- self.log.info("Could not find \"_unload\" in " + self.name + "'s main.py" + "\n")
+ self.log.info(f"Could not find \"_unload\" in {self.get_display_name()}'s main.py\n")
except:
- self.log.error("Failed to unload " + self.name + "!\n" + format_exc())
+ self.log.error(f"Failed to unload {self.get_display_name()}!\n{format_exc()}")
pass
async def _uninstall(self):
try:
- self.log.info("Attempting to uninstall with plugin " + self.name + "'s \"_uninstall\" function.\n")
+ self.log.info(f"Attempting to uninstall with plugin {self.get_display_name()}'s \"_uninstall\" function.\n")
if hasattr(self.Plugin, "_uninstall"):
if self.api_version > 0:
await self.Plugin._uninstall()
else:
await self.Plugin._uninstall(self.Plugin)
- self.log.info("Uninstalled " + self.name + "\n")
+ self.log.info(f"Uninstalled {self.get_display_name()}\n")
else:
- self.log.info("Could not find \"_uninstall\" in " + self.name + "'s main.py" + "\n")
+ self.log.info(f"Could not find \"_uninstall\" in {self.get_display_name()}'s main.py\n")
except:
- self.log.error("Failed to uninstall " + self.name + "!\n" + format_exc())
+ self.log.error(f"Failed to uninstall {self.get_display_name()}!\n{format_exc()}")
pass
async def shutdown(self):
if not self.shutdown_running:
self.shutdown_running = True
- self.log.info(f"Calling Loader unload function for {self.name}.")
+ self.log.info(f"Calling Loader unload function for {self.get_display_name()}.")
await self._unload()
if self.uninstalling: