// Package userstate traces the bot state and provides template // functions based on it package userstate import ( "github.com/Luzifer/go_helpers/v2/fieldcollection" "github.com/Luzifer/twitch-bot/v3/plugins" "github.com/pkg/errors" "gopkg.in/irc.v4" ) var userState = newTwitchUserStateStore() // Register provides the plugins.RegisterFunc func Register(args plugins.RegistrationArguments) error { if err := args.RegisterRawMessageHandler(rawMessageHandler); err != nil { return errors.Wrap(err, "registering raw message handler") } args.RegisterTemplateFunction("botHasBadge", func(m *irc.Message, _ *plugins.Rule, fields *fieldcollection.FieldCollection) interface{} { return func(badge string) bool { state := userState.Get(plugins.DeriveChannel(m, fields)) if state == nil { return false } return state.Badges.Has(badge) } }, plugins.TemplateFuncDocumentation{ Description: "Checks whether bot has the given badge in the current channel", Syntax: "botHasBadge ", Example: &plugins.TemplateFuncDocumentationExample{ Template: `{{ botHasBadge "moderator" }}`, ExpectedOutput: "false", }, }) return nil } func rawMessageHandler(m *irc.Message) error { if m.Command != "USERSTATE" { return nil } state, err := parseTwitchUserState(m) if err != nil { return errors.Wrap(err, "parsing state") } userState.Set(plugins.DeriveChannel(m, nil), state) return nil }