优化codepy插件
This commit is contained in:
@@ -36,13 +36,15 @@ class CommandManager:
|
||||
Args:
|
||||
prefixes (Tuple[str, ...]): 一个包含所有合法命令前缀的元组。
|
||||
"""
|
||||
# --- 初始化所有处理器列表 ---
|
||||
self.prefixes = prefixes
|
||||
self.commands: Dict[str, Callable] = {} # 存储消息指令处理器
|
||||
self.notice_handlers: List[Dict] = [] # 存储通知事件处理器
|
||||
self.request_handlers: List[Dict] = [] # 存储请求事件处理器
|
||||
self.plugins: Dict[str, Dict[str, Any]] = {} # 存储已加载插件的元数据
|
||||
self.commands: Dict[str, Callable] = {}
|
||||
self.message_handlers: List[Callable] = []
|
||||
self.notice_handlers: List[Dict] = []
|
||||
self.request_handlers: List[Dict] = []
|
||||
self.plugins: Dict[str, Dict[str, Any]] = {}
|
||||
|
||||
# --- 注册内置 help 指令 ---
|
||||
# --- 注册内置指令 ---
|
||||
self.commands["help"] = self._help_command
|
||||
self.plugins["core.help"] = {
|
||||
"name": "帮助",
|
||||
@@ -50,6 +52,26 @@ class CommandManager:
|
||||
"usage": "/help",
|
||||
}
|
||||
|
||||
def on_message(self) -> Callable:
|
||||
"""
|
||||
装饰器:用于注册一个通用的消息处理器。
|
||||
|
||||
被此装饰器注册的函数,会在每次收到消息时(在指令匹配前)被调用。
|
||||
如果函数返回 True,则表示该消息已被“消费”,后续的指令匹配将不会进行。
|
||||
|
||||
Example:
|
||||
@matcher.on_message()
|
||||
async def code_input_handler(bot, event):
|
||||
if is_waiting_for_code(event.user_id):
|
||||
await process_code(event.raw_message)
|
||||
return True # 消费事件
|
||||
"""
|
||||
def decorator(func: Callable) -> Callable:
|
||||
self.message_handlers.append(func)
|
||||
return func
|
||||
return decorator
|
||||
|
||||
|
||||
async def _help_command(self, bot, event):
|
||||
"""
|
||||
内置的 `/help` 命令的实现。
|
||||
@@ -164,21 +186,21 @@ class CommandManager:
|
||||
|
||||
async def handle_message(self, bot, event):
|
||||
"""
|
||||
处理消息事件,解析并分发指令。
|
||||
|
||||
该方法会检查消息是否以已配置的命令前缀开头,如果是,则解析出
|
||||
指令名称和参数,并调用对应的处理器。
|
||||
|
||||
Args:
|
||||
bot: Bot 实例。
|
||||
event: 消息事件对象。
|
||||
处理消息事件,优先执行通用处理器,然后解析并分发指令。
|
||||
"""
|
||||
# --- 1. 执行通用消息处理器 ---
|
||||
for handler in self.message_handlers:
|
||||
# 如果任何一个处理器返回 True,则中断后续处理
|
||||
consumed = await self._run_handler(handler, bot, event)
|
||||
if consumed:
|
||||
return
|
||||
|
||||
# --- 2. 检查并执行指令 ---
|
||||
if not event.raw_message:
|
||||
return
|
||||
|
||||
raw_text = event.raw_message.strip()
|
||||
|
||||
# 1. 检查前缀
|
||||
prefix_found = None
|
||||
for p in self.prefixes:
|
||||
if raw_text.startswith(p):
|
||||
@@ -188,7 +210,6 @@ class CommandManager:
|
||||
if not prefix_found:
|
||||
return
|
||||
|
||||
# 2. 拆分指令和参数
|
||||
full_cmd = raw_text[len(prefix_found) :].split()
|
||||
if not full_cmd:
|
||||
return
|
||||
@@ -196,7 +217,6 @@ class CommandManager:
|
||||
cmd_name = full_cmd[0]
|
||||
args = full_cmd[1:]
|
||||
|
||||
# 3. 查找并执行
|
||||
if cmd_name in self.commands:
|
||||
func = self.commands[cmd_name]
|
||||
await self._run_handler(func, bot, event, args)
|
||||
@@ -227,7 +247,7 @@ class CommandManager:
|
||||
|
||||
async def _run_handler(self, func: Callable, bot, event, args: List[str] = None):
|
||||
"""
|
||||
智能执行事件处理器。
|
||||
智能执行事件处理器,并返回事件是否被消费。
|
||||
|
||||
该方法会检查目标处理器的函数签名,并根据签名动态地传入所需的参数
|
||||
(如 `bot`, `event`, `args`),实现了依赖注入。
|
||||
@@ -237,7 +257,9 @@ class CommandManager:
|
||||
bot: Bot 实例。
|
||||
event: 事件对象。
|
||||
args (List[str], optional): 指令参数列表(仅对消息事件有效)。
|
||||
Defaults to None.
|
||||
|
||||
Returns:
|
||||
bool: 如果处理器函数返回 True,则返回 True,否则返回 False。
|
||||
"""
|
||||
sig = inspect.signature(func)
|
||||
params = sig.parameters
|
||||
@@ -250,8 +272,9 @@ class CommandManager:
|
||||
if "args" in params and args is not None:
|
||||
kwargs["args"] = args
|
||||
|
||||
# 执行函数
|
||||
await func(**kwargs)
|
||||
# 执行函数并获取返回值
|
||||
result = await func(**kwargs)
|
||||
return result is True
|
||||
|
||||
|
||||
# --- 全局单例 ---
|
||||
|
||||
Reference in New Issue
Block a user