From 6e791e6498a8967fe9414e0686e097c9f432040d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=A4=9C?= Date: Wed, 5 Jun 2024 18:07:14 +0800 Subject: [PATCH 1/3] feat: onPluginReloadEvent --- cdps/plugin/events.py | 7 +++++++ cdps/plugin/manager.py | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/cdps/plugin/events.py b/cdps/plugin/events.py index cce5ff3..63f1021 100644 --- a/cdps/plugin/events.py +++ b/cdps/plugin/events.py @@ -21,3 +21,10 @@ class onCommandEvent(Event): def __init__(self, command): self.command = command + + +class onPluginReloadEvent(Event): + """ 當 擴充 將被 重新讀取 """ + + def __init__(self, name): + self.name = name diff --git a/cdps/plugin/manager.py b/cdps/plugin/manager.py index 06283b2..e37667f 100644 --- a/cdps/plugin/manager.py +++ b/cdps/plugin/manager.py @@ -7,6 +7,7 @@ import threading import zipfile +from cdps.plugin.events import onPluginReloadEvent from cdps.utils.logger import Log from cdps.utils.version import Version @@ -18,7 +19,7 @@ def on_event(self, event): raise NotImplementedError("You must implement the on_event method.") -def event_listener(event_type): +def event_listener(event_type, name = ""): def decorator(listener_class): if not hasattr(listener_class, 'on_event'): raise ValueError( @@ -27,7 +28,7 @@ def decorator(listener_class): manager = Manager._instance if manager is None: manager = Manager() - manager.register_listener(listener_class()) + manager.register_listener(listener_class(), name) return listener_class return decorator @@ -42,23 +43,42 @@ def __new__(cls): cls._instance.listeners = {} return cls._instance - def register_listener(self, listener): + def register_listener(self, listener, name = ""): event_type = getattr(listener, 'event', None) if event_type is None: raise ValueError( "Listener must have an 'event' attribute defined.") - if event_type not in self.listeners: + if name != "": + if name not in self.listeners: + self.listeners[name] = [] + self.listeners[name].append(listener) + elif event_type not in self.listeners: self.listeners[event_type] = [] - self.listeners[event_type].append(listener) + self.listeners[event_type].append(listener) - def call_event(self, event): + def unregister_listener(self, listener, name = ""): + event_type = getattr(listener, 'event', None) + if event_type is None: + raise ValueError( + "Listener must have an 'event' attribute defined.") + + if name != "": + if name in self.listeners: + self.listeners[name] = [] + elif event_type in self.listeners: + self.listeners[event_type] = [] + + def call_event(self, event, name = ""): event_type = type(event) - if event_type in self.listeners: + if name != "": + if name in self.listeners: + for listener in self.listeners[name]: + listener.on_event(event) + elif event_type in self.listeners: for listener in self.listeners[event_type]: listener.on_event(event) - class Plugin(): _instance = None @@ -207,6 +227,7 @@ def load_plugins(self): self.log.logger.error(f"Error Loading Plugins: {e}") def reload_load_plugins(self, name): + self.event_manager.call_event(onPluginReloadEvent(name), name) if name in self.loaded_plugins_list: config_path = os.path.join("./config/", "{}.json".format(name)) full_path = os.path.join(directory_path, name) From a2adbcd7d31b5a71bad6d73f8f6ec463fdbc7fd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=A4=9C?= Date: Wed, 5 Jun 2024 18:29:36 +0800 Subject: [PATCH 2/3] fix: docs --- docs/zh/developer/plugin.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/zh/developer/plugin.md b/docs/zh/developer/plugin.md index 3899a8c..0231dfc 100644 --- a/docs/zh/developer/plugin.md +++ b/docs/zh/developer/plugin.md @@ -38,3 +38,18 @@ class onServerStartListener(Listener): def on_event(self, event): print(event.pid) ``` + +### New event_listener + +```py +from cdps.plugin.events import onPluginReloadEvent +from cdps.plugin.manager import Listener, event_listener + + +@event_listener(onPluginReloadEvent, "這裡可以放擴充名或其他") # 裝飾器 +class onPluginReloadEventListener(Listener): + def on_event(self, event): + if event.name == "這裡對照上面(這裡可以放擴充名或其他)": + event_manager.unregister_listener(onPluginReloadEventListener(), "這裡對照上面(這裡可以放擴充名或其他)") # 解除 裝飾器 + # 放你的擴充重載前該做的事 +``` \ No newline at end of file From 466ea74d65255043d6fc52357d12ef67e05b7984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=A4=9C?= Date: Thu, 6 Jun 2024 02:40:58 +0800 Subject: [PATCH 3/3] fix: onPluginReloadEvent --- cdps/plugin/manager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cdps/plugin/manager.py b/cdps/plugin/manager.py index e37667f..fe32465 100644 --- a/cdps/plugin/manager.py +++ b/cdps/plugin/manager.py @@ -52,9 +52,11 @@ def register_listener(self, listener, name = ""): if name != "": if name not in self.listeners: self.listeners[name] = [] + elif name in self.listeners: self.listeners[name].append(listener) elif event_type not in self.listeners: self.listeners[event_type] = [] + elif event_type in self.listeners: self.listeners[event_type].append(listener) def unregister_listener(self, listener, name = ""):