twitch-bot/internal/actors/messagehook/actor.go
2023-08-18 18:10:02 +02:00

70 lines
1.6 KiB
Go

package messagehook
import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
"time"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/Luzifer/twitch-bot/v3/plugins"
)
const (
postTimeout = 5 * time.Second
)
var (
formatMessage plugins.MsgFormatter
ptrBoolFalse = func(v bool) *bool { return &v }(false)
ptrStringEmpty = func(s string) *string { return &s }("")
)
func Register(args plugins.RegistrationArguments) error {
formatMessage = args.FormatMessage
discordActor{}.register(args)
slackCompatibleActor{}.register(args)
return nil
}
func sendPayload(hookURL string, payload any, expRespCode int) (preventCooldown bool, err error) {
body := new(bytes.Buffer)
if err = json.NewEncoder(body).Encode(payload); err != nil {
return false, errors.Wrap(err, "marshalling payload")
}
logrus.WithField("payload", body.String()).Trace("sending webhook payload")
ctx, cancel := context.WithTimeout(context.Background(), postTimeout)
defer cancel()
req, err := http.NewRequestWithContext(ctx, http.MethodPost, hookURL, body)
if err != nil {
return false, errors.Wrap(err, "creating request")
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return false, errors.Wrap(err, "executing request")
}
defer resp.Body.Close()
if resp.StatusCode != expRespCode {
body, err := io.ReadAll(resp.Body)
if err != nil {
body = []byte(errors.Wrap(err, "reading body").Error())
}
return false, errors.Errorf("unexpected response code %d (Body: %s)", resp.StatusCode, body)
}
return false, nil
}