go-watch/notifiers/discord.go

93 lines
2.6 KiB
Go

package notifiers
import (
"fmt"
"log"
"github.com/bwmarrin/discordgo"
"github.com/spf13/viper"
)
type DiscordNotifier struct {
Bot *discordgo.Session
Token string
UserID string
UserChannel *discordgo.Channel
ServerID string
ChannelID string
ServerChannel *discordgo.Channel
Debug bool
}
func (discord *DiscordNotifier) Open(configPath string) bool {
userIDPath := fmt.Sprintf("%s.userID", configPath)
serverPath := fmt.Sprintf("%s.server", configPath)
if !viper.IsSet(userIDPath) && !viper.IsSet(serverPath) {
log.Println("Net either 'serverID' or 'userID' for Discord")
return false
}
bot, err := discordgo.New("Bot " + viper.GetString("notifiers.discord.token"))
if err != nil {
log.Println("Could not start Discord notifier:\n", err)
return false
}
if viper.IsSet(userIDPath) {
discord.UserID = viper.GetString(userIDPath)
channel, err := bot.UserChannelCreate(discord.UserID)
if err != nil {
log.Println("Could not connect to user channel:", discord.UserID, err)
return false
}
discord.UserChannel = channel
log.Println("Authorized discord bot for:", channel.Recipients)
}
if viper.IsSet(serverPath) {
serverIDPath := fmt.Sprintf("%s.server.ID", configPath)
serverChannelPath := fmt.Sprintf("%s.server.channel", configPath)
discord.ServerID = viper.GetString(serverIDPath)
discord.ChannelID = viper.GetString(serverChannelPath)
channels, err := bot.GuildChannels(discord.ServerID)
if err != nil {
log.Println("Could not connect to server channel:", discord.ServerID, err)
return false
}
foundChannel := false
for i := range channels {
channel := channels[i]
if channel.ID == discord.ChannelID {
foundChannel = true
discord.ServerChannel = channel
break
}
}
if !foundChannel {
log.Println("Did not find channel with '"+discord.ChannelID+"' in server:", discord.ServerID)
return false
}
log.Println("Authorized discord bot for:", discord.ServerChannel.Name)
}
debugPath := fmt.Sprintf("%s.debug", configPath)
discord.Debug = viper.GetBool(debugPath)
if discord.Debug {
bot.LogLevel = discordgo.LogDebug
} else {
bot.LogLevel = discordgo.LogInformational
}
discord.Bot = bot
return true
}
func (discord *DiscordNotifier) Message(message string) bool {
if discord.UserChannel != nil {
discord.Bot.ChannelMessageSend(discord.UserChannel.ID, message)
}
if discord.ServerChannel != nil {
discord.Bot.ChannelMessageSend(discord.ServerChannel.ID, message)
}
return true
}
func (discord *DiscordNotifier) Close() bool {
discord.Bot.Close()
return true
}