Skip to content

Commit ec709b2

Browse files
committed
docs(start): 更新 plugin.md 文档
- 增加了如何获取用户信息的示例代码 - 添加了私聊和群聊场景的判断逻辑 - 示例中使用 QQRichText 创建了更复杂的回复消息 - 优化了代码注释,增加了对 CommandEvent 结构的解释
1 parent 438c398 commit ec709b2

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

docs/start/plugin.md

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ MRB2 的插件都存放在项目根目录下的 `/plugins` 文件夹中。一个
2121
**请务必将 `plugin_info` 的声明紧跟在 import 语句之后**,这是框架识别插件信息的关键。
2222

2323
```python
24-
from murainbot import CommandManager, QQRichText
24+
from murainbot import CommandManager, QQRichText, QQDataCacher
2525
from murainbot.core import PluginManager
2626

2727
plugin_info = PluginManager.PluginInfo(
@@ -73,26 +73,40 @@ matcher = CommandManager.on_command("echo", aliases={"复读"})
7373
# CommandManager.GreedySegments('text') 会捕获所有剩余的内容
7474
@matcher.register_command(f"echo {CommandManager.GreedySegments('text')}")
7575
def handler(event: CommandManager.CommandEvent, text: QQRichText.QQRichText):
76+
# 获取用户信息
77+
if event.is_private:
78+
user = QQDataCacher.get_user_info(event.user_id)
79+
else:
80+
# 说一下为什么group_id需要使用event["group_id"]的语法而非event.group_id,
81+
# 因为CommandEvent本质是对MessageEvent的封装,MessageEvent分为私聊和群聊两种,
82+
# 因为user_id是共有的,所以可以直接写成属性,但group_id只有群聊有,
83+
# 而获取键的语法是直接相当于从事件中取,所以需要这么写
84+
user = QQDataCacher.get_group_member_info(event["group_id"], event.user_id)
85+
# 生成回复文本
86+
message = QQRichText.QQRichText(f"{user.get_nickname()} 发送了:", text)
7687
# 使用 event.reply() 可以快速回复消息
77-
event.reply(text)
88+
event.reply(message)
7889
```
7990

8091
这段代码是新版框架的核心!让我们来解析一下:
8192

8293
- `@matcher.register_command(...)`: 这个装饰器将下面的 `handler` 函数注册为 `echo` 命令的具体处理器。
83-
- `echo`: 这是必须的,框架需要完整的命令定义,必须包含名称。
84-
- `CommandManager.GreedySegments('text')`: 这是一个特殊的参数类型,意思是“**贪婪地捕获所有剩余的消息段,并将其命名为 `text`**”。
94+
- `echo`: 这是必须的,框架需要完整的命令定义,必须包含名称。
95+
- `CommandManager.GreedySegments('text')`: 这是一个特殊的参数类型,意思是“**贪婪地捕获所有剩余的消息段,并将其命名为 `text`**”。
8596
- `def handler(event: CommandManager.CommandEvent, text: QQRichText.QQRichText):`:
8697
- **`event: CommandManager.CommandEvent`**: 这是框架传入的事件对象,它继承自消息事件,并增加了一些命令相关的便捷方法,比如 `reply()`
8798
- **`text: QQRichText.QQRichText`**: 这就是**依赖注入**的魔力!框架看到处理器需要一个名为 `text` 的参数,它会自动将上面 `GreedySegments('text')` 捕获到的内容作为 `QQRichText` 对象传递给这个参数。你无需手动解析消息。
88-
- `event.reply(text)`: `CommandEvent` 对象提供的便捷方法,可以直接引用并回复触发该命令的消息。
99+
- `event.is_private`: 判断消息是否为私聊
100+
- `QQDataCacher.get_user_info(event.user_id)`:从事件中拿出 `user_id`,然后通过 `QQDataCacher` 来获取用户信息
101+
- `message = QQRichText.QQRichText(f"{user.get_nickname()} 发送了:", text)`:使用 `QQRichText` 创建回复文本
102+
- `event.reply(message)`: `CommandEvent` 对象提供的便捷方法,可以直接引用并回复触发该命令的消息。
89103

90104
### 4. 最终代码
91105

92106
整合起来,你的 `plugins/Echo/__init__.py` 文件内容应该是这样的:
93107

94108
```python
95-
from murainbot import CommandManager, QQRichText
109+
from murainbot import CommandManager, QQRichText, QQDataCacher
96110
from murainbot.core import PluginManager
97111

98112
# 1. 声明插件信息
@@ -113,8 +127,19 @@ def handler(event: CommandManager.CommandEvent, text: QQRichText.QQRichText):
113127
"""
114128
处理 echo 命令, text 参数由框架通过依赖注入自动传入
115129
"""
116-
# 4. 执行回复操作
117-
event.reply(text)
130+
# 4. 获取用户信息
131+
if event.is_private:
132+
user = QQDataCacher.get_user_info(event.user_id)
133+
else:
134+
# 说一下为什么group_id需要使用event["group_id"]的语法而非event.group_id,
135+
# 因为CommandEvent本质是对MessageEvent的封装,MessageEvent分为私聊和群聊两种,
136+
# 因为user_id是共有的,所以可以直接写成属性,但group_id只有群聊有,
137+
# 而获取键的语法是直接相当于从事件中取,所以需要这么写
138+
user = QQDataCacher.get_group_member_info(event["group_id"], event.user_id)
139+
# 5. 生成回复文本
140+
message = QQRichText.QQRichText(f"{user.get_nickname()} 发送了:", text)
141+
# 6. 执行回复操作
142+
event.reply(message)
118143
```
119144

120145
至此,恭喜你已经完成了第一个插件的编写!现在可以启动 MRB2,然后对你的机器人发送 `/echo 你好世界` 或者 `/复读 你好世界` 来测试效果了。

0 commit comments

Comments
 (0)