Closed LiXDL closed 6 months ago
at bot的消息长啥样
QQ里面是这样的:
Chronocat日志里面是这样的:
我是说nb收到的,那个日志里面是怎么显示的
↑这个样子的,nb里面好像没法看到被at的用户。
又试了试,NB日志里也没法直接看到回复消息,如果带了at也会阻止触发本来可用的命令。
消息事件有一个original_message,你同时把get_message()的内容和original_message的内容打印一下看看 同时测试一下at bot和at他人
↑如图所示
log level设定到trace会提示Rule conditions not met for Matcher,对应上面构造的那个带有rule=to_me的事件响应器。
↑如图所示
log level设定到trace会提示Rule conditions not met for Matcher,对应上面构造的那个带有rule=to_me的事件响应器。
你是at的bot吗,你打印一下bot的self_id看看
是的哇,我这个测试群里只有我自己的号和这个bot了😭
你把消息事件数据发一下,转成dict(用event.dict())
如下
{'argv': None,
'button': None,
'channel': {'id': 测试群号,
'name': 'Backup',
'parent_id': None,
'type': <ChannelType.TEXT: 0>},
'guild': {'avatar': 'https://p.qlogo.cn/gh/测试群号/测试群号/640',
'id': 测试群号,
'name': 'Backup'},
'id': 54,
'login': None,
'member': {'avatar': None,
'joined_at': None,
'name': None,
'nick': None,
'user': None},
'message': {'channel': None,
'content': '<at id="3668701134" name="神秘虾头男"/> repeat_raw 打印dict',
'created_at': None,
'guild': None,
'id': '7361076614359645153',
'member': None,
'updated_at': None,
'user': None},
'operator': None,
'original_message': [{'data': {'id': '3668701134', 'name': '神秘虾头男'},
'type': 'at'},
{'data': {'styles': {}, 'text': ' repeat_raw 打印dict'},
'type': 'text'}],
'platform': 'chronocat',
'reply': None,
'role': None,
'self_id': '3668701134',
'timestamp': datetime.datetime(2024, 4, 23, 22, 56, 46),
'to_me': True,
'type': 'message-created',
'user': {'avatar': 'http://thirdqq.qlogo.cn/headimg_dl?dst_uin=我的QQ号&spec=640',
'id': 我的QQ号,
'is_bot': None,
'name': '潇洒',
'nick': None}}
如下
{'argv': None, 'button': None, 'channel': {'id': 测试群号, 'name': 'Backup', 'parent_id': None, 'type': <ChannelType.TEXT: 0>}, 'guild': {'avatar': 'https://p.qlogo.cn/gh/测试群号/测试群号/640', 'id': 测试群号, 'name': 'Backup'}, 'id': 54, 'login': None, 'member': {'avatar': None, 'joined_at': None, 'name': None, 'nick': None, 'user': None}, 'message': {'channel': None, 'content': '<at id="3668701134" name="神秘虾头男"/> repeat_raw 打印dict', 'created_at': None, 'guild': None, 'id': '7361076614359645153', 'member': None, 'updated_at': None, 'user': None}, 'operator': None, 'original_message': [{'data': {'id': '3668701134', 'name': '神秘虾头男'}, 'type': 'at'}, {'data': {'styles': {}, 'text': ' repeat_raw 打印dict'}, 'type': 'text'}], 'platform': 'chronocat', 'reply': None, 'role': None, 'self_id': '3668701134', 'timestamp': datetime.datetime(2024, 4, 23, 22, 56, 46), 'to_me': True, 'type': 'message-created', 'user': {'avatar': 'http://thirdqq.qlogo.cn/headimg_dl?dst_uin=我的QQ号&spec=640', 'id': 我的QQ号, 'is_bot': None, 'name': '潇洒', 'nick': None}}
?你这tome已经是True了啊
但是并不会触发带有rule=to_me()
的响应器,就是我最开始那个截图里面定义的repeat_raw;包括没有指定rule的普通响应器也没有办法通过@bot /cmd arg
这种形式触发。
莫非satori adapter设计的就是这样吗。
明天下班了我再测测
我这边to_me是正常的
太奇怪了,所有部分的event.is_tome()
evaluate出来都是true,但是就是无法通过rule checker。
我看nb官方实例是允许/cmd
和@bot cmd
这种调用方法的,在第一种我能用的情况下第二种就是用不了。
太奇怪了,所有部分的
event.is_tome()
evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd
和@bot cmd
这种调用方法的,在第一种我能用的情况下第二种就是用不了。
你不应该是@bot /cmd吗
太奇怪了,所有部分的
event.is_tome()
evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd
和@bot cmd
这种调用方法的,在第一种我能用的情况下第二种就是用不了。你不应该是@bot /cmd吗
但是也不行。
太奇怪了,所有部分的
event.is_tome()
evaluate出来都是true,但是就是无法通过rule checker。 我看nb官方实例是允许/cmd
和@bot cmd
这种调用方法的,在第一种我能用的情况下第二种就是用不了。你不应该是@bot /cmd吗
但是也不行。
你能debug吗,调试进tome的rule里看看
我之前在nb的源码这里放print测试了一下,确实拿到的就是satori的MessageEvent object,然后也调用的is_tome()
这个函数,结果为True。
我之前在nb的源码这里放print测试了一下,确实拿到的就是satori的MessageEvent object,然后也调用的
is_tome()
这个函数,结果为True。
event.get_message()得到的消息带了at吗
带了:
带了:
那就是这个问题了,at bot自己的话这个at应该要被去掉的
你去bot.py文件那里有个check_at_me,你调试一下看看
带了:
那就是这个问题了,at bot自己的话这个at应该要被去掉的
你去bot.py文件那里有个check_at_me,你调试一下看看
是satori adapter里的bot.py对_check_at_me的实现部分吗?
带了:
那就是这个问题了,at bot自己的话这个at应该要被去掉的 你去bot.py文件那里有个check_at_me,你调试一下看看
是satori adapter里的bot.py对_check_at_me的实现部分吗?
对 记得print(repr(message))
奇怪,看起来这部分调用确实是把前面的at移除了,但是进到我的自定义hook和最终插件里的时候又回来了
你hook怎么整的
你hook怎么整的
就是用来忽略bot自己发出去的消息,避免触发响应器(本来是预留给在部分群禁用bot的功能的
@event_preprocessor
async def silence_preprocessor(bot: SatoriBot, event: SatoriMessageEvent):
if event.user.id == bot.self_id:
raise IgnoredException("Self message. Ignored.")
# Only effective for group messages
if event.guild is None:
return
group_id = event.guild.id
logger.critical(f"In event_preprocessor: {repr(event.get_message())}")
# pprint.pprint(event.dict())
# print(event.is_tome())
好,我这边复现了
太强了大哥! 我明天上班,晚上再来继续努力。
太强了大哥! 我明天上班,晚上再来继续努力。
临时解决方案,async def silence_preprocessor(bot: SatoriBot, event):
把event的类型去掉就没有出现这个问题
确认项
操作系统
Windows
Python 版本
3.12.2
NoneBot 版本
2.2.1
适配器
0.10.5
协议端
Chronocat
描述问题
使用
on_command(..., rule=to_me(), ...)
构建的事件响应器无法被带有at机器人的命令消息触发我同时尝试使用用
@bot /cmd arg
和@bot cmd arg
的形式发送指令,都无法触发复现步骤
参见截图中的实例
期望的结果
No response
截图或日志
rule=to_me()
的事件响应器和处理函数:event.message.content)
:rule=to_me()
的事件响应器和处理函数:Nonebot 配置项
No response