-
-
Notifications
You must be signed in to change notification settings - Fork 575
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question: 如何在钩子函数“运行预处理”中修改message内容 #443
Comments
你这种写法思路看起来是正确的, 只要实现好 |
|
直接赋值即可,注意类型应为 |
通过一些测试,如下的方法是可以完成需求的,但总感觉特别别扭,大佬有没有更好的实现方法。。
|
如果你的代码编辑器足够智能, 你应该是不需要这一行的 @event_preprocessor
async def _(bot: Bot, event: Event, state: T_State):
if not isinstance(event, MessageEvent):
return
- event.__class__ = MessageEvent
event.message = Message(convert(str(event.message), "zh-cn")) 另外, 直接将 我推荐直接遍历 @event_preprocessor
async def _(bot: Bot, event: Event, state: T_State):
if not isinstance(event, MessageEvent):
return
for segment in event.message:
if not segment.is_text():
continue
segment.data['text'] = convert(segment.data['text'], 'zh-cn') # <-- 这个函数看起来不是异步函数, 有可能造成事件循环阻塞 大概是这样 |
@mnixry 多谢大佬, 另外我对convert稍微包装了一下,让其成为一个异步函数,应该可以避免阻塞事件循环。 再问几个问题
比如一个消息中,同时包含文本,图片等,是以这些消息的类型来划分的吗?
最后再贴上最终的代码 async def AsyncTranslate(text, dst):
return convert(text, dst)
@event_preprocessor
async def _(bot: Bot, event: Event, state: T_State):
if not isinstance(event, MessageEvent):
return
for segment in event.message:
if not segment.is_text():
continue
segment.data['text'] = await AsyncTranslate(str(event.message), "zh-cn") |
这是NoneBot的设计,可以同时包括多种形式的消息,能够对富文本等进行良好的支持, 同时能够规避由字符串转义带来的注入问题 这种数组消息格式同时也是OneBot标准所规范的
这个和OneBot协议的实现有关, 在大多数实现中, 它的确是按照消息类型和元素在消息中的位置决定的
一样的, 你只需要加上 顺带一提, 事件类型的转换是在 相关代码nonebot2/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py Lines 295 to 329 in 96d05cb
另外,在事件处理函数中, 我们还支持通过类型标记事件处理函数进行重载来简化代码
你这样并不能完成从同步到异步的转换, 如果想要实现这种转换, 请考虑使用 |
@mnixry 再次感谢 以前还真没发现 isinstance 有这种功能,试了一下,发现确实如果通过 not isinstance 判断之后,后面就可以使用相关的字段了。 剩下的我应该再去读读onebot的文档,我之前一直是用 websocket 裸连go-cqhttp,这和使用框架之间还是有一些区别
|
主要是想使用一个函数对消息进行预处理,将繁体字转为简体字,方便matcher的匹配
例如
The text was updated successfully, but these errors were encountered: