mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-02 03:55:55 +00:00
feat: 增加prevent_default和prevent_postorder的支持
This commit is contained in:
@@ -7,7 +7,11 @@ import sys
|
||||
import pkg.utils.context as context
|
||||
|
||||
__plugins__ = {}
|
||||
"""{
|
||||
"""
|
||||
插件列表
|
||||
|
||||
示例:
|
||||
{
|
||||
"example": {
|
||||
"name": "example",
|
||||
"description": "example",
|
||||
@@ -68,15 +72,42 @@ def unload_plugins():
|
||||
logging.error("插件{}卸载时发生错误: {}".format(plugin['name'], sys.exc_info()))
|
||||
|
||||
|
||||
def emit(event: str, **kwargs):
|
||||
class EventContext:
|
||||
""" 事件上下文 """
|
||||
eid = 0
|
||||
|
||||
name = ""
|
||||
|
||||
__prevent_default__ = False
|
||||
""" 是否阻止默认行为 """
|
||||
|
||||
__prevent_postorder__ = False
|
||||
""" 是否阻止后续插件的执行 """
|
||||
|
||||
def prevent_default(self):
|
||||
"""阻止默认行为"""
|
||||
self.__prevent_default__ = True
|
||||
|
||||
def prevent_postorder(self):
|
||||
"""阻止后续插件执行"""
|
||||
self.__prevent_postorder__ = True
|
||||
|
||||
def is_prevented_default(self):
|
||||
return self.__prevent_default__
|
||||
|
||||
def is_prevented_postorder(self):
|
||||
return self.__prevent_postorder__
|
||||
|
||||
def __init__(self, name: str):
|
||||
self.name = name
|
||||
self.eid = EventContext.eid
|
||||
EventContext.eid += 1
|
||||
|
||||
|
||||
def emit(event_name: str, **kwargs) -> EventContext:
|
||||
""" 触发事件 """
|
||||
for plugin in __plugins__.values():
|
||||
for hook in plugin['hooks'].get(event, []):
|
||||
try:
|
||||
kwargs['plugin_host'] = context.get_plugin_host()
|
||||
hook(plugin['instance'], **kwargs)
|
||||
except:
|
||||
logging.error("插件{}触发事件{}时发生错误: {}".format(plugin['name'], event, sys.exc_info()))
|
||||
import pkg.utils.context as context
|
||||
return context.get_plugin_host().emit(event_name, **kwargs)
|
||||
|
||||
|
||||
class PluginHost:
|
||||
@@ -85,9 +116,6 @@ class PluginHost:
|
||||
def __init__(self):
|
||||
context.set_plugin_host(self)
|
||||
|
||||
def prevent_default(self):
|
||||
"""阻止默认行为"""
|
||||
|
||||
def get_runtime_context(self) -> context:
|
||||
"""获取运行时上下文"""
|
||||
return context
|
||||
@@ -99,3 +127,25 @@ class PluginHost:
|
||||
def notify_admin(self, message):
|
||||
"""通知管理员"""
|
||||
context.get_qqbot_manager().notify_admin(message)
|
||||
|
||||
def emit(self, event_name: str, **kwargs) -> EventContext:
|
||||
""" 触发事件 """
|
||||
event_context = EventContext(event_name)
|
||||
for plugin in __plugins__.values():
|
||||
for hook in plugin['hooks'].get(event_name, []):
|
||||
try:
|
||||
kwargs['host'] = context.get_plugin_host()
|
||||
kwargs['event'] = event_context
|
||||
hook(plugin['instance'], **kwargs)
|
||||
|
||||
if event_context.is_prevented_default():
|
||||
logging.debug("插件 {} 要求阻止事件{}的默认行为".format(plugin['name'], event_name))
|
||||
|
||||
if event_context.is_prevented_postorder():
|
||||
logging.debug("插件 {} 阻止了后序插件的执行".format(plugin['name']))
|
||||
break
|
||||
|
||||
except:
|
||||
logging.error("插件{}触发事件{}时发生错误: {}".format(plugin['name'], event_name, sys.exc_info()))
|
||||
|
||||
return event_context
|
||||
|
||||
Reference in New Issue
Block a user