Browse Source

Added RequestGuildMembers to request guild members from the gateway

jonas747 8 years ago
parent
commit
9c7c9d3fd2
3 changed files with 45 additions and 0 deletions
  1. 1 0
      events.go
  2. 6 0
      structs.go
  3. 38 0
      wsapi.go

+ 1 - 0
events.go

@@ -30,6 +30,7 @@ var eventToInterface = map[string]interface{}{
 	"GUILD_ROLE_DELETE":          GuildRoleDelete{},
 	"GUILD_INTEGRATIONS_UPDATE":  GuildIntegrationsUpdate{},
 	"GUILD_EMOJIS_UPDATE":        GuildEmojisUpdate{},
+	"GUILD_MEMBERS_CHUNK":        GuildMembersChunk{},
 	"MESSAGE_ACK":                MessageAck{},
 	"MESSAGE_CREATE":             MessageCreate{},
 	"MESSAGE_UPDATE":             MessageUpdate{},

+ 6 - 0
structs.go

@@ -412,6 +412,12 @@ type GuildEmojisUpdate struct {
 	Emojis  []*Emoji `json:"emojis"`
 }
 
+// A GuildMembersChunk stores data for the Guild Members Chunk websocket event.
+type GuildMembersChunk struct {
+	GuildID string    `json:"guild_id"`
+	Members []*Member `json:"members"`
+}
+
 // A GuildIntegration stores data for a guild integration.
 type GuildIntegration struct {
 	ID                string                   `json:"id"`

+ 38 - 0
wsapi.go

@@ -269,6 +269,44 @@ func (s *Session) UpdateStatus(idle int, game string) (err error) {
 	return s.UpdateStreamingStatus(idle, game, "")
 }
 
+type requestGuildMembersData struct {
+	GuildID string `json:"guild_id"`
+	Query   string `json:"query"`
+	Limit   int    `json:"limit"`
+}
+
+type requestGuildMembersOp struct {
+	Op   int                     `json:"op"`
+	Data requestGuildMembersData `json:"d"`
+}
+
+// RequestGuildMembers requests guild members from the gateway
+// The gateway responds with GuildMembersChunk events
+// guildID  : the ID of the guild to request members of
+// query    : string hat username sarts with, leave empty to return all members
+// limit    : max number of items to return, or 0 o reques all members matched
+func (s *Session) RequestGuildMembers(guildID, query string, limit int) (err error) {
+	s.log(LogInformational, "called")
+
+	s.RLock()
+	defer s.RUnlock()
+	if s.wsConn == nil {
+		return errors.New("no websocket connection exists")
+	}
+
+	data := requestGuildMembersData{
+		GuildID: guildID,
+		Query:   query,
+		Limit:   limit,
+	}
+
+	s.wsMutex.Lock()
+	err = s.wsConn.WriteJSON(requestGuildMembersOp{8, data})
+	s.wsMutex.Unlock()
+
+	return
+}
+
 // onEvent is the "event handler" for all messages received on the
 // Discord Gateway API websocket connection.
 //