Skip to content

Commit 28bfb3b

Browse files
PyuraMazoSoulter
andauthored
feat: add plugin load&unload hook (#5331)
* 添加了插件的加载完成和卸载完成的钩子事件 * 添加了插件的加载完成和卸载完成的钩子事件 * format code with ruff * ruff format --------- Co-authored-by: Soulter <905617992@qq.com>
1 parent 351895a commit 28bfb3b

5 files changed

Lines changed: 73 additions & 1 deletion

File tree

astrbot/api/event/filter/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
)
2626
from astrbot.core.star.register import register_on_platform_loaded as on_platform_loaded
2727
from astrbot.core.star.register import register_on_plugin_error as on_plugin_error
28+
from astrbot.core.star.register import register_on_plugin_loaded as on_plugin_loaded
29+
from astrbot.core.star.register import register_on_plugin_unloaded as on_plugin_unloaded
2830
from astrbot.core.star.register import register_on_using_llm_tool as on_using_llm_tool
2931
from astrbot.core.star.register import (
3032
register_on_waiting_llm_request as on_waiting_llm_request,
@@ -54,6 +56,8 @@
5456
"on_llm_request",
5557
"on_llm_response",
5658
"on_plugin_error",
59+
"on_plugin_loaded",
60+
"on_plugin_unloaded",
5761
"on_platform_loaded",
5862
"on_waiting_llm_request",
5963
"permission_type",

astrbot/core/star/register/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
register_on_llm_tool_respond,
1515
register_on_platform_loaded,
1616
register_on_plugin_error,
17+
register_on_plugin_loaded,
18+
register_on_plugin_unloaded,
1719
register_on_using_llm_tool,
1820
register_on_waiting_llm_request,
1921
register_permission_type,
@@ -34,6 +36,8 @@
3436
"register_on_llm_request",
3537
"register_on_llm_response",
3638
"register_on_plugin_error",
39+
"register_on_plugin_loaded",
40+
"register_on_plugin_unloaded",
3741
"register_on_platform_loaded",
3842
"register_on_waiting_llm_request",
3943
"register_permission_type",

astrbot/core/star/register/star_handler.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,40 @@ def decorator(awaitable):
357357
return decorator
358358

359359

360+
def register_on_plugin_loaded(**kwargs):
361+
"""当有插件加载完成时
362+
363+
Hook 参数:
364+
metadata
365+
366+
说明:
367+
当有插件加载完成时,触发该事件并获取到该插件的元数据
368+
"""
369+
370+
def decorator(awaitable):
371+
_ = get_handler_or_create(awaitable, EventType.OnPluginLoadedEvent, **kwargs)
372+
return awaitable
373+
374+
return decorator
375+
376+
377+
def register_on_plugin_unloaded(**kwargs):
378+
"""当有插件卸载完成时
379+
380+
Hook 参数:
381+
metadata
382+
383+
说明:
384+
当有插件卸载完成时,触发该事件并获取到该插件的元数据
385+
"""
386+
387+
def decorator(awaitable):
388+
_ = get_handler_or_create(awaitable, EventType.OnPluginUnloadedEvent, **kwargs)
389+
return awaitable
390+
391+
return decorator
392+
393+
360394
def register_on_waiting_llm_request(**kwargs):
361395
"""当等待调用 LLM 时的通知事件(在获取锁之前)
362396

astrbot/core/star/star_handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ def get_handlers_by_event_type(
144144
not in (
145145
EventType.OnAstrBotLoadedEvent,
146146
EventType.OnPlatformLoadedEvent,
147+
EventType.OnPluginLoadedEvent,
148+
EventType.OnPluginUnloadedEvent,
147149
)
148150
and not plugin.reserved
149151
):
@@ -201,6 +203,8 @@ class EventType(enum.Enum):
201203
OnLLMToolRespondEvent = enum.auto() # 调用函数工具后
202204
OnAfterMessageSentEvent = enum.auto() # 发送消息后
203205
OnPluginErrorEvent = enum.auto() # 插件处理消息异常时
206+
OnPluginLoadedEvent = enum.auto() # 插件加载完成
207+
OnPluginUnloadedEvent = enum.auto() # 插件卸载完成
204208

205209

206210
H = TypeVar("H", bound=Callable[..., Any])

astrbot/core/star/star_manager.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from .context import Context
3434
from .filter.permission import PermissionType, PermissionTypeFilter
3535
from .star import star_map, star_registry
36-
from .star_handler import star_handlers_registry
36+
from .star_handler import EventType, star_handlers_registry
3737
from .updator import PluginUpdator
3838

3939
try:
@@ -783,6 +783,19 @@ async def load(
783783
if hasattr(metadata.star_cls, "initialize") and metadata.star_cls:
784784
await metadata.star_cls.initialize()
785785

786+
# 触发插件加载事件
787+
handlers = star_handlers_registry.get_handlers_by_event_type(
788+
EventType.OnPluginLoadedEvent,
789+
)
790+
for handler in handlers:
791+
try:
792+
logger.info(
793+
f"hook(on_plugin_loaded) -> {star_map[handler.handler_module_path].name} - {handler.handler_name}",
794+
)
795+
await handler.handler(metadata)
796+
except Exception:
797+
logger.error(traceback.format_exc())
798+
786799
except BaseException as e:
787800
logger.error(f"----- 插件 {root_dir_name} 载入失败 -----")
788801
errors = traceback.format_exc()
@@ -1175,6 +1188,19 @@ async def _terminate_plugin(star_metadata: StarMetadata) -> None:
11751188
elif "terminate" in star_metadata.star_cls_type.__dict__:
11761189
await star_metadata.star_cls.terminate()
11771190

1191+
# 触发插件卸载事件
1192+
handlers = star_handlers_registry.get_handlers_by_event_type(
1193+
EventType.OnPluginUnloadedEvent,
1194+
)
1195+
for handler in handlers:
1196+
try:
1197+
logger.info(
1198+
f"hook(on_plugin_unloaded) -> {star_map[handler.handler_module_path].name} - {handler.handler_name}",
1199+
)
1200+
await handler.handler(star_metadata)
1201+
except Exception:
1202+
logger.error(traceback.format_exc())
1203+
11781204
async def turn_on_plugin(self, plugin_name: str) -> None:
11791205
plugin = self.context.get_registered_star(plugin_name)
11801206
if plugin is None:

0 commit comments

Comments
 (0)