grim/wasdead
Clone
Summary
Browse
Changes
Graph
Don't output errors directly to the channel, commands should be handling that themselves
draft
2020-09-26, Gary Kramlich
c6d101eb5c05
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
}