mirror of
https://github.com/Luzifer/twitch-bot.git
synced 2024-12-20 03:41:16 +00:00
[core] Parallelize rule execution
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
ee5e7359a2
commit
a07ad6fe83
1 changed files with 48 additions and 39 deletions
87
actions.go
87
actions.go
|
@ -71,44 +71,53 @@ func handleMessage(c *irc.Client, m *irc.Message, event *string, eventData *plug
|
|||
go notifyEventHandlers(*event, eventData)
|
||||
}
|
||||
|
||||
for _, r := range config.GetMatchingRules(m, event, eventData) {
|
||||
var (
|
||||
ruleEventData = plugins.NewFieldCollection()
|
||||
preventCooldown bool
|
||||
)
|
||||
|
||||
if eventData != nil {
|
||||
ruleEventData.SetFromData(eventData.Data())
|
||||
}
|
||||
|
||||
ActionsLoop:
|
||||
for _, a := range r.Actions {
|
||||
apc, err := triggerAction(c, m, r, a, ruleEventData)
|
||||
switch {
|
||||
case err == nil:
|
||||
// Rule execution did not cause an error, we store the
|
||||
// cooldown modifier and continue
|
||||
preventCooldown = preventCooldown || apc
|
||||
continue ActionsLoop
|
||||
|
||||
case errors.Is(err, plugins.ErrStopRuleExecution):
|
||||
// Action has asked to stop executing this rule so we store
|
||||
// the cooldown modifier and stop executing the actions stack
|
||||
preventCooldown = preventCooldown || apc
|
||||
break ActionsLoop
|
||||
|
||||
default:
|
||||
// Action experienced an error: We don't store the cooldown
|
||||
// state of this action and stop executing the actions stack
|
||||
// for this rule
|
||||
log.WithError(err).Error("Unable to trigger action")
|
||||
break ActionsLoop // Break execution for this rule when one action fails
|
||||
}
|
||||
}
|
||||
|
||||
// Lock command
|
||||
if !preventCooldown {
|
||||
r.SetCooldown(timerService, m, eventData)
|
||||
}
|
||||
matchingRules := config.GetMatchingRules(m, event, eventData)
|
||||
for i := range matchingRules {
|
||||
go handleMessageRuleExecution(c, m, matchingRules[i], eventData)
|
||||
}
|
||||
}
|
||||
|
||||
func handleMessageRuleExecution(c *irc.Client, m *irc.Message, r *plugins.Rule, eventData *plugins.FieldCollection) {
|
||||
var (
|
||||
ruleEventData = plugins.NewFieldCollection()
|
||||
preventCooldown bool
|
||||
)
|
||||
|
||||
if eventData != nil {
|
||||
ruleEventData.SetFromData(eventData.Data())
|
||||
}
|
||||
|
||||
ActionsLoop:
|
||||
for _, a := range r.Actions {
|
||||
apc, err := triggerAction(c, m, r, a, ruleEventData)
|
||||
switch {
|
||||
case err == nil:
|
||||
// Rule execution did not cause an error, we store the
|
||||
// cooldown modifier and continue
|
||||
|
||||
preventCooldown = preventCooldown || apc
|
||||
continue ActionsLoop
|
||||
|
||||
case errors.Is(err, plugins.ErrStopRuleExecution):
|
||||
// Action has asked to stop executing this rule so we store
|
||||
// the cooldown modifier and stop executing the actions stack
|
||||
// Action experienced an error: We don't store the cooldown
|
||||
// state of this action and stop executing the actions stack
|
||||
// for this rule
|
||||
|
||||
preventCooldown = preventCooldown || apc
|
||||
break ActionsLoop
|
||||
|
||||
default:
|
||||
// Break execution for this rule when one action fails
|
||||
// Lock command
|
||||
|
||||
log.WithError(err).Error("Unable to trigger action")
|
||||
break ActionsLoop
|
||||
}
|
||||
}
|
||||
|
||||
if !preventCooldown {
|
||||
r.SetCooldown(timerService, m, eventData)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue