Ice9Coffee / HoshinoBot

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

rex触发器在有多个匹配时ev['match']可能会混乱 #193

Closed LHXnois closed 2 years ago

LHXnois commented 3 years ago
ret = []
for rex, sfs in self.allrex.items():
    for sf in sfs:
        text = event.norm_text if sf.normalize_text else event.plain_text
        match = rex.search(text)
        if match:
            event["match"] = match
            ret.append(sf)
return ret

在有多个匹配的时候event['match']是最后一个匹配的match 实际触发的是排在前面的匹配的时候就会出问题

把find_handler全改成生成器是否可行呢,匹配到一个返回一个

Ice9Coffee commented 3 years ago

生成器确实更好一些,下个版本修复

AkiraXie commented 3 years ago

这个在用for循环匹配的时候,每次传入的是当前event的拷贝即可,要对每个处理器的event做隔离

Ice9Coffee commented 3 years ago

@AkiraXie 拷贝的性能消耗有点大,改成yeild吧,yeild后还原之前的处理即可

AkiraXie commented 3 years ago

阿哲....其实我觉得吧,既然是异步处理,可以把check和run打包成一个异步函数,然后放在一个list里面,然后可以gather起来,gather的时候传拷贝就行,这样比for循环或者生成器要快..?

Ice9Coffee commented 3 years ago

走Service的功能,一条消息只触发一个指令,指令之间有优先级

AkiraXie commented 3 years ago

如果只能匹配一次那没办法了...本以为一个优先级gather一次就行...那就yield吧