gkd icon indicating copy to clipboard operation
gkd copied to clipboard

[BUG] `preKeys` 非空时 `actionCd` 等限制条件失效

Open panhongtao07 opened this issue 5 months ago • 7 comments

日志文件

log-1725885178425.zip

BUG描述(文字/截图/视频)

规则有preKeys时,状态机不受其他设置影响,导致actionCd等限制无效。

Bug 范围

涉及代码:ResolvedRule.status, GkdAbService.newQueryTask, ResolvedRule.checkDelay 完全失效的设置:actionCd, matchDelay, matchTime 部分失效的设置:actionDelay

示例

如下规则的key=1的规则的actionCd实际是无效的,key=2actionDelay也只在第一次query时有效,只要key=0规则再次触发,1号规则即可无视触发间隔立刻触发,2号进入延迟状态,但延迟期间只要其它规则触发了newQueryTask,2号即可无视延迟触发(因为本次已设置actionDelayTriggerTimeactionDelayJob,而有preKeys的规则状态机不会检查此两项是否满足条件):

{ key: 0 },
{
    preKeys: 0, key: 1,
    actionCd: 10000000,
},
{
    preKeys: 0, key: 2,
    actionDelay: 500,
},

期望行为(文字/截图/视频)

目标规则必须同时满足前置键要求和其他限制时,才能触发。

if (preRules.isNotEmpty()) { // 需要提前点击某个规则 
    if (!preRules.any { it === lastTriggerRule }) { 
        return RuleStatus.Status2
    } 
}

需注意的是,延迟后那次触发的query可能应该跳过本规则preRules的检查,因为根据status的顺序,初次触发定时时已经确保满足了前置条件。这可能应该通过调用newQueryTask时额外的上下文执行:

if (rule.checkDelay() && rule.actionDelayJob == null) {
    rule.actionDelayJob = scope.launch(actionThread) {
        delay(rule.actionDelay)
        rule.actionDelayJob = null
        rule.isDelayAction = true
        newQueryTask()
        rule.isDelayAction = false
    }
    continue
}

另外,应当注意上述类似的延迟任务中,可能先进行query再清空DelayJob更不易出错。

实际行为(文字/截图/视频)

preKeys非空时,只检查preKeys状态,若满足则可触发,否则不可。由于规则基本只检查status来判断能否执行,相关设置基本失效: https://github.com/gkd-kit/gkd/blob/9ee1bbb429d4d993f756fd618215386d02e741eb/app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt#L208-L224 ActionDelay在状态机外有额外检查,但这也会被第二次query时绕过: https://github.com/gkd-kit/gkd/blob/ea48edc5ac0ad8fd8d74e4807657f8143a980383/app/src/main/kotlin/li/songe/gkd/service/GkdAbService.kt#L222-L229 第二次时,由于属性已设置,检查通过。 https://github.com/gkd-kit/gkd/blob/ea48edc5ac0ad8fd8d74e4807657f8143a980383/app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt#L106-L112

panhongtao07 avatar Sep 09 '24 13:09 panhongtao07