@@ -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
2525from murainbot.core import PluginManager
2626
2727plugin_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' )} " )
7575def 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
96110from 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