forked from pothtonswer/discordmuffin
Handle GUILD_EMOJI_UPDATE and track Emoji in state.
This commit is contained in:
parent
aa4d42199a
commit
cd01a34cdb
3 changed files with 73 additions and 4 deletions
56
state.go
56
state.go
|
@ -129,7 +129,7 @@ func (s *State) MemberRemove(member *Member) error {
|
|||
}
|
||||
|
||||
// Member gets a member by ID from a guild.
|
||||
func (s *State) Member(guildID string, userID string) (*Member, error) {
|
||||
func (s *State) Member(guildID, userID string) (*Member, error) {
|
||||
if s == nil {
|
||||
return nil, nilError
|
||||
}
|
||||
|
@ -216,7 +216,7 @@ func (s *State) ChannelRemove(channel *Channel) error {
|
|||
}
|
||||
|
||||
// GuildChannel gets a channel by ID from a guild.
|
||||
func (s *State) GuildChannel(guildID string, channelID string) (*Channel, error) {
|
||||
func (s *State) GuildChannel(guildID, channelID string) (*Channel, error) {
|
||||
if s == nil {
|
||||
return nil, nilError
|
||||
}
|
||||
|
@ -270,3 +270,55 @@ func (s *State) Channel(channelID string) (*Channel, error) {
|
|||
|
||||
return nil, errors.New("Channel not found.")
|
||||
}
|
||||
|
||||
// Emoji returns an emoji for a guild and emoji id.
|
||||
func (s *State) Emoji(guildID, emojiID string) (*Emoji, error) {
|
||||
if s == nil {
|
||||
return nil, nilError
|
||||
}
|
||||
|
||||
guild, err := s.Guild(guildID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, e := range guild.Emojis {
|
||||
if e.ID == emojiID {
|
||||
return &e, nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, errors.New("Emoji not found.")
|
||||
}
|
||||
|
||||
// EmojiAdd adds an emoji to the current world state.
|
||||
func (s *State) EmojiAdd(guildID string, emoji *Emoji) error {
|
||||
if s == nil {
|
||||
return nilError
|
||||
}
|
||||
|
||||
guild, err := s.Guild(guildID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i, e := range guild.Emojis {
|
||||
if e.ID == emoji.ID {
|
||||
guild.Emojis[i] = *emoji
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
guild.Emojis = append(guild.Emojis, *emoji)
|
||||
return nil
|
||||
}
|
||||
|
||||
// EmojisAdd adds multiple emojis to the world state.
|
||||
func (s *State) EmojisAdd(guildID string, emojis []Emoji) error {
|
||||
for _, e := range emojis {
|
||||
if err := s.EmojiAdd(guildID, &e); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -58,6 +58,7 @@ type Session struct {
|
|||
OnGuildIntegrationsUpdate func(*Session, GuildIntegrationsUpdate)
|
||||
OnGuildBanAdd func(*Session, GuildBan)
|
||||
OnGuildBanRemove func(*Session, GuildBan)
|
||||
OnGuildEmojisUpdate func(*Session, GuildEmojisUpdate)
|
||||
OnUserSettingsUpdate func(*Session, map[string]interface{}) // TODO: Find better way?
|
||||
|
||||
// Exposed but should not be modified by User.
|
||||
|
@ -372,6 +373,12 @@ type GuildBan struct {
|
|||
GuildID string `json:"guild_id"`
|
||||
}
|
||||
|
||||
// A GuildEmojisUpdate stores data for a guild emoji update event.
|
||||
type GuildEmojisUpdate struct {
|
||||
GuildID string `json:"guild_id"`
|
||||
Emojis []Emoji `json:"emojis"`
|
||||
}
|
||||
|
||||
// A State contains the current known state.
|
||||
// As discord sends this in a READY blob, it seems reasonable to simply
|
||||
// use that struct as the data store.
|
||||
|
|
14
wsapi.go
14
wsapi.go
|
@ -384,6 +384,17 @@ func (s *Session) event(messageType int, message []byte) (err error) {
|
|||
}
|
||||
return
|
||||
}
|
||||
case "GUILD_EMOJIS_UPDATE":
|
||||
var st GuildEmojisUpdate
|
||||
if err = unmarshalEvent(e, &st); err == nil {
|
||||
if s.StateEnabled {
|
||||
s.State.EmojisAdd(st.GuildID, st.Emojis)
|
||||
}
|
||||
if s.OnGuildEmojisUpdate != nil {
|
||||
s.OnGuildEmojisUpdate(s, st)
|
||||
}
|
||||
}
|
||||
return
|
||||
case "USER_SETTINGS_UPDATE":
|
||||
if s.OnUserSettingsUpdate != nil {
|
||||
var st map[string]interface{}
|
||||
|
@ -394,8 +405,7 @@ func (s *Session) event(messageType int, message []byte) (err error) {
|
|||
}
|
||||
default:
|
||||
fmt.Println("UNKNOWN EVENT: ", e.Type)
|
||||
// TODO learn the log package
|
||||
// log.print type and JSON data
|
||||
printJSON(message)
|
||||
}
|
||||
|
||||
// if still here, send to generic OnEvent
|
||||
|
|
Loading…
Reference in a new issue