Handle GUILD_EMOJI_UPDATE and track Emoji in state.

This commit is contained in:
Chris Rhodes 2016-01-03 11:56:46 -08:00
parent aa4d42199a
commit cd01a34cdb
3 changed files with 73 additions and 4 deletions

View file

@ -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
}

View file

@ -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.

View file

@ -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