Files
NeoBot/docs/plugin-development/command-handling.md
K2cr2O1 56b1014419 refactor(core): 重构核心模块结构并添加开发文档
将核心模块按功能重新组织为更清晰的结构,包括 managers、handlers 和 utils 目录
添加完整的开发文档,涵盖快速开始、项目结构、核心概念和插件开发指南
更新所有相关模块的导入路径以匹配新的结构
将单例模式实现提取到单独的 singleton.py 文件
2026-01-07 22:51:27 +08:00

100 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 插件开发:指令处理
`@matcher.command()` 是插件开发中使用最频繁的装饰器。本节将深入介绍它的高级用法,帮助您构建功能更强大的指令。
## 1. 获取指令参数
在很多场景下,指令都需要接收用户提供的参数,例如 `/weather 北京`。框架会自动解析这些参数,并通过函数签名注入到您的处理器中。
您只需要在处理函数的参数列表中添加一个名为 `args` 的参数,并指定其类型为 `list[str]`
```python
# plugins/weather.py
from core.managers.command_manager import matcher
from models.events.message import MessageEvent
@matcher.command("weather")
async def handle_weather_command(event: MessageEvent, args: list[str]):
"""
处理 /weather 指令
:param event: 消息事件对象
:param args: 用户发送的参数列表 (已按空格分割)
"""
if not args:
await event.reply("请输入城市名,例如:/weather 北京")
return
# args[0] 就是 "北京"
city = args[0]
# ...后续逻辑...
await event.reply(f"正在查询 {city} 的天气...")
```
* 如果用户发送 `/weather 北京``args` 将是 `['北京']`
* 如果用户发送 `/weather 上海 浦东``args` 将是 `['上海', '浦东']`
* 如果用户只发送 `/weather``args` 将是一个空列表 `[]`
## 2. 设置指令别名
同一个功能,用户可能习惯使用不同的指令名称来触发,例如 `天气``weather``@matcher.command()` 允许您为一个处理器设置多个别名。
只需在装饰器中传入多个名称即可:
```python
@matcher.command("weather", "天气")
async def handle_weather_command(event: MessageEvent, args: list[str]):
# ...
```
现在,用户发送 `/weather 北京``/天气 北京` 都可以触发这个函数。
## 3. 权限控制
某些敏感指令只希望特定权限的用户才能执行,例如 `/reload` (重载插件) 或 `/ban` (禁言用户)。
`@matcher.command()` 装饰器提供了一个 `permission` 参数,可以轻松实现权限控制。
首先,从 `permission_manager` 导入预设的权限等级:
```python
from core.managers.permission_manager import ADMIN, OP, USER
```
然后,在装饰器中指定所需的权限:
```python
# plugins/admin_tools.py
from core.managers.command_manager import matcher
from core.managers.permission_manager import ADMIN
from models.events.message import MessageEvent
__plugin_meta__ = {
"name": "管理工具",
"description": "提供机器人管理功能",
"usage": "/reload - 重载所有插件 (仅管理员)",
}
@matcher.command("reload", permission=ADMIN)
async def handle_reload_command(event: MessageEvent):
"""
重载所有插件,仅限管理员使用。
"""
# 这里的逻辑只有在权限检查通过后才会执行
await event.reply("正在重载所有插件...")
# ... 执行重载逻辑 ...
```
* **工作原理**: 在调用您的处理函数之前,`CommandManager` 会自动调用 `PermissionManager` 来检查用户的权限。
* **失败响应**: 如果用户权限不足,框架会自动回复一条权限不足的消息(该消息内容可在 `config.toml` 中配置),并且**不会**执行您的处理函数。
可用的权限等级:
* `ADMIN`: 机器人超级管理员。
* `OP`: 管理员Operator权限低于 `ADMIN`
* `USER`: 普通用户,默认权限。
权限关系是 `ADMIN > OP > USER`。设置 `permission=OP` 意味着 `OP``ADMIN` 都可以使用该指令。
通过组合使用参数处理、别名和权限控制,您可以构建出既灵活又安全的指令来满足各种复杂的需求。