[core] Parallelize rule execution

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2023-12-04 15:05:09 +01:00
parent ee5e7359a2
commit a07ad6fe83
Signed by: luzifer
GPG key ID: D91C3E91E4CAD6F5

View file

@ -71,7 +71,13 @@ func handleMessage(c *irc.Client, m *irc.Message, event *string, eventData *plug
go notifyEventHandlers(*event, eventData) go notifyEventHandlers(*event, eventData)
} }
for _, r := range config.GetMatchingRules(m, event, 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 ( var (
ruleEventData = plugins.NewFieldCollection() ruleEventData = plugins.NewFieldCollection()
preventCooldown bool preventCooldown bool
@ -81,34 +87,37 @@ func handleMessage(c *irc.Client, m *irc.Message, event *string, eventData *plug
ruleEventData.SetFromData(eventData.Data()) ruleEventData.SetFromData(eventData.Data())
} }
ActionsLoop: ActionsLoop:
for _, a := range r.Actions { for _, a := range r.Actions {
apc, err := triggerAction(c, m, r, a, ruleEventData) apc, err := triggerAction(c, m, r, a, ruleEventData)
switch { switch {
case err == nil: case err == nil:
// Rule execution did not cause an error, we store the // Rule execution did not cause an error, we store the
// cooldown modifier and continue // cooldown modifier and continue
preventCooldown = preventCooldown || apc preventCooldown = preventCooldown || apc
continue ActionsLoop continue ActionsLoop
case errors.Is(err, plugins.ErrStopRuleExecution): case errors.Is(err, plugins.ErrStopRuleExecution):
// Action has asked to stop executing this rule so we store // Action has asked to stop executing this rule so we store
// the cooldown modifier and stop executing the actions stack // 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 preventCooldown = preventCooldown || apc
break ActionsLoop break ActionsLoop
default: default:
// Action experienced an error: We don't store the cooldown // Break execution for this rule when one action fails
// state of this action and stop executing the actions stack // Lock command
// for this rule
log.WithError(err).Error("Unable to trigger action") log.WithError(err).Error("Unable to trigger action")
break ActionsLoop // Break execution for this rule when one action fails break ActionsLoop
} }
} }
// Lock command
if !preventCooldown { if !preventCooldown {
r.SetCooldown(timerService, m, eventData) r.SetCooldown(timerService, m, eventData)
} }
}
} }