wdvxdr1123 / ZeroBot

一个基于onebot协议的机器人Go开发框架
GNU General Public License v3.0
326 stars 71 forks source link

关于同优先级Handler不可控的问题 #82

Closed graydovee closed 2 months ago

graydovee commented 2 months ago

背景

比如zerobot-plugin的aireply插件,有时候会出现设置指令无法识别的情况 a31c9b37c4f41bbcf8deb9b539c2da13 观察调试的到如下结果 b9b87729ff71b579e60b9c222e849077 func1为enr.OnMessage(zero.OnlyToMe).SetBlock(true).Limit(ctxext.LimitByUser)事件,这个事件阻断了后续的指令事件匹配,导致指令无法生效

问题

分析存在两个问题

  1. sortMatcher方法中没有使用稳定的排序方法,导致顺序不可控
  2. 先注册一个priority为0的matcher进行排序,再设置优先级,重新进行排序,两次排序使行为变得很奇怪

讨论

如果单纯sortMatcher中改为SliceStable,可以修复上面这个bug,但也会存在奇怪的行为(也可以当成是feature🤣)

  1. 如果所有Handler没有设置优先级
    • 行为:添加一个handler到最后,因为已经有序,不再进行排序
    • 最终结果:先注册先执行,后注册后执行
  2. 如果有设置优先级
    • 行为:添加一个优先级为0的handler, 排到最前面,再使用排序方法,使他排到同优先级的最前面
    • 最终结果:优先级小于等于0的,先注册先执行,优先级大于0的,先注册后执行(aireply符合这个要求)