1
0
mirror of https://github.com/nikoksr/notify.git synced 2025-01-26 03:20:21 +02:00
notify/service/discord/discord.go
Niko Köser 9acc5f6116
fix(discord): add gateway intent to discord client
The discord client was missing its gateway intent. Basically meaning the
API didn't know what the bot is allowed to do, so sending messages would
fail with 'Error 401: Unauthorized'.
Added only the intent to send messages (2048) and now everything is
working as intended.
2021-01-26 09:22:55 +01:00

103 lines
3.4 KiB
Go

package discord
import (
"github.com/bwmarrin/discordgo"
"github.com/pkg/errors"
)
// Discord struct holds necessary data to communicate with the Discord API.
type Discord struct {
client *discordgo.Session
channelIDs []string
}
// New returns a new instance of a Discord notification service.
func New() *Discord {
return &Discord{
client: &discordgo.Session{},
channelIDs: []string{},
}
}
// authenticate will try and authenticate to discord.
func (d *Discord) authenticate(credentials ...string) error {
client, err := discordgo.New(credentials)
if err != nil {
return err
}
client.Identify.Intents = discordgo.IntentsGuildMessageTyping
d.client = client
return nil
}
// AuthenticateWithCredentials authenticates you to Discord via your email and password. Note that this
// is highly discouraged by Discord. Please use an authentication token.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func (d *Discord) AuthenticateWithCredentials(email, password string) error {
return d.authenticate(email, password)
}
// AuthenticateWithCredentialsFull authenticates you to Discord via your email, password and access token.
// This is what discord recommends.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func (d *Discord) AuthenticateWithCredentialsFull(email, password, token string, isOAuthToken bool) error {
if isOAuthToken {
token = parseOAuthToken(token)
} else {
token = parseBotToken(token)
}
return d.authenticate(email, password, token)
}
// AuthenticateWithBotToken authenticates you as a bot to Discord via the given access token.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func (d *Discord) AuthenticateWithBotToken(token string) error {
token = parseBotToken(token)
return d.authenticate(token)
}
// AuthenticateWithOAuth2Token authenticates you to Discord via the given OAUTH2 token.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func (d *Discord) AuthenticateWithOAuth2Token(token string) error {
token = parseOAuthToken(token)
return d.authenticate(token)
}
// parseBotToken parses a regular token to a bot token that is understandable for discord.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func parseBotToken(token string) string {
return "Bot " + token
}
// parseBotToken parses a regular token to a OAUTH2 token that is understandable for discord.
// For more info, see here: https://pkg.go.dev/github.com/bwmarrin/discordgo@v0.22.1#New
func parseOAuthToken(token string) string {
return "Bearer " + token
}
// AddReceivers takes Telegram channel IDs and adds them to the internal channel ID list. The Send method will send
// a given message to all those channels.
func (d *Discord) AddReceivers(channelIDs ...string) {
d.channelIDs = append(d.channelIDs, channelIDs...)
}
// Send takes a message subject and a message body and sends them to all previously set chats.
func (d Discord) Send(subject, message string) error {
fullMessage := subject + "\n" + message // Treating subject as message title
for _, channelID := range d.channelIDs {
_, err := d.client.ChannelMessageSend(channelID, fullMessage)
if err != nil {
return errors.Wrapf(err, "failed to send message to Discord channel '%s'", channelID)
}
}
return nil
}