grim/wasdead

make the status command require a mention
draft
2019-06-08, Gary Kramlich
947250a2da50
make the status command require a mention
package discord
import (
"errors"
"strings"
"time"
"github.com/bwmarrin/discordgo"
log "github.com/sirupsen/logrus"
"bitbucket.org/rw_grim/wasdead/database"
)
type DiscordClient struct {
client *discordgo.Session
started time.Time
userID string
mentionString string
}
var (
ErrAnnouncementChannelNotSet = errors.New("no announcement channel set")
)
func New(token string) (*DiscordClient, error) {
client, err := discordgo.New("Bot " + strings.TrimSpace(token))
if err != nil {
return nil, err
}
dc := &DiscordClient{
client: client,
started: time.Now().UTC(),
}
client.AddHandler(dc.messageHandler)
client.AddHandler(dc.presenceHandler)
return dc, nil
}
func (c *DiscordClient) Start(errChan chan error) {
err := c.client.Open()
if err != nil {
errChan <- err
return
}
c.userID = c.client.State.Ready.User.ID
c.mentionString = "<@" + c.userID + "> "
c.client.UpdateStatus(0, "Use - @"+c.client.State.Ready.User.Username+" help")
}
func (c *DiscordClient) Shutdown() error {
return c.client.Close()
}
func (c *DiscordClient) send(guildID, message string) error {
guild, err := database.LoadGuild(guildID)
if err != nil {
return err
}
if guild.Channel == "" {
return ErrAnnouncementChannelNotSet
}
return c.sendChannel(guild.Channel, message)
}
func (c *DiscordClient) sendChannel(channelID, message string) error {
// ignore the message that we sent
_, err := c.client.ChannelMessageSend(channelID, message)
return err
}
func (c *DiscordClient) sendEmbed(guildId string, embed *discordgo.MessageEmbed) error {
guild, err := database.LoadGuild(guildId)
if err != nil {
return err
}
if guild.Channel == "" {
return ErrAnnouncementChannelNotSet
}
return c.sendEmbedChannel(guild.Channel, embed)
}
func (c *DiscordClient) sendEmbedChannel(channelID string, embed *discordgo.MessageEmbed) error {
_, err := c.client.ChannelMessageSendEmbed(
channelID,
embed,
)
return err
}
func (c *DiscordClient) getPresence(guildId, userId string) *discordgo.Presence {
p, err := c.client.State.Presence(guildId, userId)
if err != nil {
log.Warnf("failed to get discord presence for %d: %v", userId, err)
return nil
}
return p
}