基于LangBot的——为组件EventListener注册一个PersonMessageReceived的事件详解
在调试平台及lpb自动生成的EventListerer组件components文件夹下的default.py中:
事件类型
事件类定义在langbot_plugin.api.entities.events.py中,包括PersonMessageReceived、GroupMessageReceived等等

事件注册
@self.handler(PersonMessageReceived):注册一个PersonMessageReceived事件,其中self.handler全写为EventListener.handler,是在EventListener类中定义了handler注册。
源码截图如下:

但在另一个参考的插件中,其组件注册在main文件中,并且使用context类的handler注册


目前不知道两种方式有何不同。
上下文消息链
在触发一个PersonMessageReceived事件后,其事件信息保存在Eventcontext类中,包括请求id,事件编号等注册事件都会有的信息

而在EventContext类中的event成员保存着这次事件的详细信息,其类型为handler注册时指定的监听类型,意味着所有重要的信息都在这个对象里面。
其成员如下:包括qq号和消息等重要信息。

消息回复
在消息平台接收到消息后,可以利用EventContext.reply方法控制bot回复信息。

可以见得,reply需要传入一个message_chain类型的对象,而message_chain定义在langbot_plugin.api.entities.builtin.platform.message.py中

MessageChain同样需要传入一个list(MessageComponent)对象,同样在message.py文件中,定义了多种的MessageComponent对象,以实现丰富的消息类型回复。

包括Source关于邮件的信息,Plain纯文本,Quote引用信息等等。
其调用结构为:

所以最后的代码形式为ctx.reply(MessageChain([Plain(text=f"你好")]))
全部代码:
from __future__ import annotations
from langbot_plugin.api.definition.components.common.event_listener import EventListener
from langbot_plugin.api.entities.events import PersonMessageReceived
# 导入事件上下文api
from langbot_plugin.api.entities.builtin.platform.message import *
from langbot_plugin.api.entities.context import EventContext
class DefaultEventListener(EventListener):
async def initialize(self):
await super().initialize()
"Fill with your code here"
# 为组件EventListener注册一个 收到私聊消息 的事件
@self.handler(PersonMessageReceived)
# EventContext为事件信息类,保存着此次事件的信息
async def person_message_received(ctx: EventContext):
print("Received person message")
# 而ctx.event类型为handler注册时指定监听的类型,是此次事件的对象
handler_object = ctx.event
msg = str(handler_object.message_chain).strip()
print(msg)
await ctx.reply(MessageChain([Plain(text=f"你好")]))
浙公网安备 33010602011771号