|
|
#gq:
|
|
|
import logging
|
|
|
|
|
|
# 获取当前模块的日志记录器,用于输出钩子系统的日志
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
# 私有全局字典,用于存储所有注册的钩子
|
|
|
# 结构:{ "hook_name": [callback1, callback2, ...] }
|
|
|
_hooks = {}
|
|
|
|
|
|
|
|
|
def register(hook_name: str, callback: callable):
|
|
|
"""
|
|
|
注册一个钩子回调。
|
|
|
如果钩子名不存在,则初始化为空列表,再将回调函数追加进去。
|
|
|
"""
|
|
|
if hook_name not in _hooks:
|
|
|
_hooks[hook_name] = []
|
|
|
_hooks[hook_name].append(callback)
|
|
|
logger.debug(f"Registered hook '{hook_name}' with callback '{callback.__name__}'")
|
|
|
|
|
|
|
|
|
def run_action(hook_name: str, *args, **kwargs):
|
|
|
"""
|
|
|
执行一个 Action Hook(动作钩子)。
|
|
|
它会按顺序执行所有注册到该钩子上的回调函数,无返回值。
|
|
|
如果某个回调抛出异常,记录错误日志并继续执行下一个回调。
|
|
|
"""
|
|
|
if hook_name in _hooks:
|
|
|
logger.debug(f"Running action hook '{hook_name}'")
|
|
|
for callback in _hooks[hook_name]:
|
|
|
try:
|
|
|
callback(*args, **kwargs)
|
|
|
except Exception as e:
|
|
|
logger.error(f"Error running action hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True)
|
|
|
|
|
|
|
|
|
def apply_filters(hook_name: str, value, *args, **kwargs):
|
|
|
"""
|
|
|
执行一个 Filter Hook(过滤钩子)。
|
|
|
它会将 value 依次传递给所有注册的回调函数进行处理,每次处理结果作为下次输入。
|
|
|
如果某个回调抛出异常,记录错误日志并跳过该回调。
|
|
|
最后返回经过所有过滤器处理后的值。
|
|
|
"""
|
|
|
if hook_name in _hooks:
|
|
|
logger.debug(f"Applying filter hook '{hook_name}'")
|
|
|
for callback in _hooks[hook_name]:
|
|
|
try:
|
|
|
value = callback(value, *args, **kwargs)
|
|
|
except Exception as e:
|
|
|
logger.error(f"Error applying filter hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True)
|
|
|
return value |