""" 事件处理器模块 该模块定义了用于处理不同类型事件的处理器类。 每个处理器都负责注册和分发特定类型的事件。 """ import inspect from abc import ABC, abstractmethod from typing import Any, Callable, Dict, List, Optional, Tuple from ..bot import Bot from ..config_loader import global_config from ..permission import Permission from ..utils.executor import run_in_thread_pool class BaseHandler(ABC): """ 事件处理器抽象基类 """ def __init__(self): self.handlers: List[Dict[str, Any]] = [] @abstractmethod async def handle(self, bot: Bot, event: Any): """ 处理事件 """ raise NotImplementedError async def _run_handler( self, func: Callable, bot: Bot, event: Any, args: Optional[List[str]] = None, permission_granted: Optional[bool] = None ): """ 智能执行事件处理器,并注入所需参数 """ sig = inspect.signature(func) params = sig.parameters kwargs: Dict[str, Any] = {} if "bot" in params: kwargs["bot"] = bot if "event" in params: kwargs["event"] = event if "args" in params and args is not None: kwargs["args"] = args if "permission_granted" in params and permission_granted is not None: kwargs["permission_granted"] = permission_granted if inspect.iscoroutinefunction(func): result = await func(**kwargs) else: # 如果是同步函数,则放入线程池执行 result = await run_in_thread_pool(func, **kwargs) return result is True class MessageHandler(BaseHandler): """ 消息事件处理器 """ def __init__(self, prefixes: Tuple[str, ...]): super().__init__() self.prefixes = prefixes self.commands: Dict[str, Dict] = {} self.message_handlers: List[Dict[str, Any]] = [] def clear(self): """ 清空所有已注册的消息和命令处理器 """ self.commands.clear() self.message_handlers.clear() def unregister_by_plugin_name(self, plugin_name: str): """ 根据插件名卸载相关的消息和命令处理器 """ # 卸载命令 commands_to_remove = [name for name, info in self.commands.items() if info["plugin_name"] == plugin_name] for name in commands_to_remove: del self.commands[name] # 卸载通用消息处理器 self.message_handlers = [h for h in self.message_handlers if h["plugin_name"] != plugin_name] def on_message(self) -> Callable: """ 注册通用消息处理器 """ def decorator(func: Callable) -> Callable: module = inspect.getmodule(func) plugin_name = module.__name__ if module else "Unknown" self.message_handlers.append({"func": func, "plugin_name": plugin_name}) return func return decorator def command( self, *names: str, permission: Optional[Permission] = None, override_permission_check: bool = False ) -> Callable: """ 注册命令处理器 """ def decorator(func: Callable) -> Callable: module = inspect.getmodule(func) plugin_name = module.__name__ if module else "Unknown" for name in names: self.commands[name] = { "func": func, "permission": permission, "override_permission_check": override_permission_check, "plugin_name": plugin_name, } return func return decorator async def handle(self, bot: Bot, event: Any): """ 处理消息事件,分发给命令处理器或通用消息处理器 """ from ..managers import permission_manager for handler_info in self.message_handlers: consumed = await self._run_handler(handler_info["func"], bot, event) if consumed: return if not event.raw_message: return raw_text = event.raw_message.strip() prefix_found = next((p for p in self.prefixes if raw_text.startswith(p)), None) if not prefix_found: return command_parts = raw_text[len(prefix_found):].split() if not command_parts: return command_name = command_parts[0] args = command_parts[1:] if command_name in self.commands: command_info = self.commands[command_name] func = command_info["func"] permission = command_info.get("permission") override_check = command_info.get("override_permission_check", False) permission_granted = True if permission: permission_granted = await permission_manager.check_permission(event.user_id, permission) if not permission_granted and not override_check: permission_name = permission.name if isinstance(permission, Permission) else permission message_template = global_config.bot.permission_denied_message await bot.send(event, message_template.format(permission_name=permission_name)) return await self._run_handler( func, bot, event, args=args, permission_granted=permission_granted ) class NoticeHandler(BaseHandler): """ 通知事件处理器 """ def clear(self): self.handlers.clear() def unregister_by_plugin_name(self, plugin_name: str): """ 根据插件名卸载相关的通知处理器 """ self.handlers = [h for h in self.handlers if h["plugin_name"] != plugin_name] def register(self, notice_type: Optional[str] = None) -> Callable: """ 注册通知处理器 """ def decorator(func: Callable) -> Callable: module = inspect.getmodule(func) plugin_name = module.__name__ if module else "Unknown" self.handlers.append({"type": notice_type, "func": func, "plugin_name": plugin_name}) return func return decorator async def handle(self, bot: Bot, event: Any): """ 处理通知事件 """ for handler in self.handlers: if handler["type"] is None or handler["type"] == event.notice_type: await self._run_handler(handler["func"], bot, event) class RequestHandler(BaseHandler): """ 请求事件处理器 """ def clear(self): self.handlers.clear() def unregister_by_plugin_name(self, plugin_name: str): """ 根据插件名卸载相关的请求处理器 """ self.handlers = [h for h in self.handlers if h["plugin_name"] != plugin_name] def register(self, request_type: Optional[str] = None) -> Callable: """ 注册请求处理器 """ def decorator(func: Callable) -> Callable: module = inspect.getmodule(func) plugin_name = module.__name__ if module else "Unknown" self.handlers.append({"type": request_type, "func": func, "plugin_name": plugin_name}) return func return decorator async def handle(self, bot: Bot, event: Any): """ 处理请求事件 """ for handler in self.handlers: if handler["type"] is None or handler["type"] == event.request_type: await self._run_handler(handler["func"], bot, event)