package messagehook import ( "net/http" "strings" "github.com/go-irc/irc" "github.com/pkg/errors" "github.com/Luzifer/twitch-bot/v3/plugins" ) type slackCompatibleActor struct { plugins.ActorKit } func (s slackCompatibleActor) Execute(_ *irc.Client, m *irc.Message, r *plugins.Rule, eventData *plugins.FieldCollection, attrs *plugins.FieldCollection) (preventCooldown bool, err error) { text, err := formatMessage(attrs.MustString("text", nil), m, r, eventData) if err != nil { return false, errors.Wrap(err, "parsing text") } return sendPayload( s.fixHookURL(attrs.MustString("hook_url", ptrStringEmpty)), map[string]string{ "text": text, }, http.StatusOK, ) } func (slackCompatibleActor) IsAsync() bool { return false } func (slackCompatibleActor) Name() string { return "slackhook" } func (s slackCompatibleActor) Validate(tplValidator plugins.TemplateValidatorFunc, attrs *plugins.FieldCollection) (err error) { if err = s.ValidateRequireNonEmpty(attrs, "hook_url", "text"); err != nil { return err } return s.ValidateRequireValidTemplate(tplValidator, attrs, "text") } func (slackCompatibleActor) fixHookURL(hookURL string) string { if strings.HasPrefix(hookURL, "https://discord.com/api/webhooks/") && !strings.HasSuffix(hookURL, "/slack") { hookURL = strings.Join([]string{ strings.TrimRight(hookURL, "/"), "slack", }, "/") } return hookURL } func (slackCompatibleActor) register(args plugins.RegistrationArguments) { args.RegisterActor("slackhook", func() plugins.Actor { return &slackCompatibleActor{} }) args.RegisterActorDocumentation(plugins.ActionDocumentation{ Description: "Sends a message to a Slack(-compatible) Web-hook", Name: "Slack Message-Webhook", Type: "slackhook", Fields: []plugins.ActionDocumentationField{ { Description: "URL to send the POST request to", Key: "hook_url", Name: "Hook URL", Optional: false, SupportTemplate: false, Type: plugins.ActionDocumentationFieldTypeString, }, { Description: "Text to send to the web-hook", Key: "text", Name: "Message", Optional: false, SupportTemplate: true, Type: plugins.ActionDocumentationFieldTypeString, }, }, }) }