Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cdps/plugin/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,10 @@ class onCommandEvent(Event):

def __init__(self, command):
self.command = command


class onPluginReloadEvent(Event):
""" 當 擴充 將被 重新讀取 """

def __init__(self, name):
self.name = name
39 changes: 31 additions & 8 deletions cdps/plugin/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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(
Expand All @@ -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
Expand All @@ -42,23 +43,44 @@ 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] = []
elif name in self.listeners:
self.listeners[name].append(listener)
elif event_type not in self.listeners:
self.listeners[event_type] = []
self.listeners[event_type].append(listener)
elif event_type in self.listeners:
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

Expand Down Expand Up @@ -207,6 +229,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)
Expand Down
15 changes: 15 additions & 0 deletions docs/zh/developer/plugin.md
Original file line number Diff line number Diff line change
Expand Up @@ -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(), "這裡對照上面(這裡可以放擴充名或其他)") # 解除 裝飾器
# 放你的擴充重載前該做的事
```