Ice9Coffee / HoshinoBot

A qqbot for Princess Connect Re:Dive (and other usage :)
GNU General Public License v3.0
1.41k stars 411 forks source link

匹配增强的触发条件貌似有点问题 #260

Closed azmiao closed 1 year ago

azmiao commented 1 year ago

此问题涉及两个小问题

  1. rex正则匹配在部分情况下匹配的文本内容会有问题
  2. 匹配到多个增强的触发条件会被raise影响只响应一个

具体问题的说明

问题1

rex正则匹配在部分情况下匹配的文本内容会有问题

举个栗子:一个fullmatch匹配“早”这个字,另一个rex匹配“早上啊啊啊.+?”

预期:发送“早上啊啊啊”,service_funcs服务列表里应该同时匹配到这个fullmatch和rex

注意:fullmatch能匹配到我看了下代码好像代码里是用的前缀匹配,所以是正常能匹配到的,但是因为不完全会被跳过执行

实际:只匹配到了fullmatch

分析:通过查看trigger.py内的RexTrigger类,发现他获取到的event会因为先匹配了fullmatch而变成如下图,即拿到的text不全 image

临时解决方案:我这边直接考虑拿raw_message,因为懒没有排查fullmatch为什么对event有影响。且修改未进行全面的测试,不确定CQHTTP的event.raw_message会不会有其他问题 image

问题2

匹配到多个增强的触发条件会被raise影响只响应一个

举个栗子:仍然是上面的栗子,现在我们假设两个服务都被匹配到了,即service_funcs服务列表里同时有fullmatch对应的那个服务和rex对应的那个服务

预期:将这俩服务里的函数都运行

实际:只运行了列表里的第一个服务

分析:最后这句raise CanceledException('Handled by Hoshino')在for循环内调用,调用完第一个服务后直接被强制raise了

临时解决方案:将这行raise缩进一下,放到for循环外面,我这图里的代码可能不是最新,最新的也同理左缩进一格 image

azmiao commented 1 year ago

具体的在实际中遇到的问题早安晚安插件#10

azmiao commented 1 year ago

方便起见已提交PR,若咖啡佬觉得修改后逻辑上有问题可直接关闭PR

Ice9Coffee commented 1 year ago

问题1已于 https://github.com/Ice-Cirno/HoshinoBot/commit/2c5553b0acd1f2b25369adae5ae17c7d397c8398 修复(5个月前) 涉及fullmatch未触发,的确仍有bug,https://github.com/Ice-Cirno/HoshinoBot/commit/265f933f53ff940d2932613d34afbbc3aa8eda8d 这个commit已修复。

问题2设计如此,一条消息最多只能触发一个功能(否则用户很容易构造出触发多个功能的消息,容易误执行/风控),优先级为fullmatch = prefix > suffix > keyword > rex > command/neurallanguage。

azmiao commented 1 year ago

后续信息在 265f933f53ff940d2932613d34afbbc3aa8eda8d 已同步

azmiao commented 1 year ago

OK, 2eca008eeb4b16b5279d2011794a1fb1a302e3ae