grim/wasdead

Don't output errors directly to the channel, commands should be handling that themselves
package discord
import (
"time"
"github.com/bwmarrin/discordgo"
"github.com/dustin/go-humanize"
log "github.com/sirupsen/logrus"
"bitbucket.org/rw_grim/wasdead/database"
"bitbucket.org/rw_grim/wasdead/presence"
)
func (c *DiscordClient) presenceHandler(s *discordgo.Session, p *discordgo.PresenceUpdate) {
if p.Game == nil {
return
}
if p.Game.Type != discordgo.GameTypeStreaming {
return
}
guild, err := database.LoadGuild(p.GuildID)
if err != nil {
log.Errorf("error loading guild: %v", err)
return
}
if !guild.CanAnnounce() {
log.Infof("guild %s does not have an announcement channel set", guild.ID)
return
}
log.Infof("guild %s username %s is now streaming", guild.ID, p.Presence.User.Username)
presence, _ := presence.GetPresence(p.Game.URL)
if lastID, ok := guild.History[presence.UserID]; ok {
if lastID == presence.StreamID {
log.Infof("already sent presence for %q to guild %s", presence.Username, p.GuildID)
return
}
}
if err := c.sendEmbed(p.GuildID, presenceEmbed(presence)); err != nil {
log.Warnf("failed to send presence to guild %s: %v, %v", p.GuildID, err, presence)
return
}
// only save after we've successful send the message
guild.History[presence.UserID] = presence.StreamID
err = guild.Save()
if err != nil {
log.Warnf("failed to save stream update for %s: %v", presence.UserID, err)
}
}
func presenceEmbed(presence presence.Presence) *discordgo.MessageEmbed {
embed := &discordgo.MessageEmbed{
Author: &discordgo.MessageEmbedAuthor{
Name: presence.Username,
URL: presence.URL,
IconURL: presence.ThumbnailURL,
},
Thumbnail: &discordgo.MessageEmbedThumbnail{
URL: presence.ThumbnailURL,
},
Title: presence.Title,
URL: presence.URL,
}
if presence.Color != 0 {
embed.Color = presence.Color
}
embed.Title = presence.Title
embed.Image = &discordgo.MessageEmbedImage{
URL: presence.ProfileImageURL,
}
embed.Fields = append(
embed.Fields,
&discordgo.MessageEmbedField{
Name: "Game",
Value: presence.Game,
Inline: false,
},
&discordgo.MessageEmbedField{
Name: "Uptime",
Value: fmtDuration(time.Since(presence.Started)),
Inline: true,
},
&discordgo.MessageEmbedField{
Name: "Language",
Value: presence.Language,
Inline: true,
},
&discordgo.MessageEmbedField{
Name: "Viewers",
Value: humanize.Comma(presence.Viewers),
Inline: true,
},
)
return embed
}
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
}