Pārlūkot izejas kodu

Handle GUILD_EMOJI_UPDATE and track Emoji in state.

Chris Rhodes 9 gadi atpakaļ
vecāks
revīzija
cd01a34cdb
3 mainītis faili ar 73 papildinājumiem un 4 dzēšanām
  1. 54 2
      state.go
  2. 7 0
      structs.go
  3. 12 2
      wsapi.go

+ 54 - 2
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
+}

+ 7 - 0
structs.go

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

+ 12 - 2
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