gkd
gkd copied to clipboard
[BUG] `preKeys` 非空时 `actionCd` 等限制条件失效
日志文件
BUG描述(文字/截图/视频)
规则有preKeys
时,状态机不受其他设置影响,导致actionCd
等限制无效。
Bug 范围
涉及代码:ResolvedRule.status
, GkdAbService.newQueryTask
, ResolvedRule.checkDelay
完全失效的设置:actionCd
, matchDelay
, matchTime
部分失效的设置:actionDelay
示例
如下规则的key=1
的规则的actionCd
实际是无效的,key=2
的actionDelay
也只在第一次query时有效,只要key=0
规则再次触发,1号规则即可无视触发间隔立刻触发,2号进入延迟状态,但延迟期间只要其它规则触发了newQueryTask
,2号即可无视延迟触发(因为本次已设置actionDelayTriggerTime
和actionDelayJob
,而有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