Forráskód Böngészése

Merge remote-tracking branch 'bwmarrin/develop' into develop

Chris Rhodes 8 éve
szülő
commit
663abba05e
4 módosított fájl, 56 hozzáadás és 2 törlés
  1. 1 0
      events.go
  2. 2 2
      restapi.go
  3. 15 0
      structs.go
  4. 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{},

+ 2 - 2
restapi.go

@@ -362,8 +362,8 @@ func (s *Session) UserChannelCreate(recipientID string) (st *Channel, err error)
 	return
 }
 
-// UserGuilds returns an array of Guild structures for all guilds.
-func (s *Session) UserGuilds() (st []*Guild, err error) {
+// UserGuilds returns an array of UserGuild structures for all guilds.
+func (s *Session) UserGuilds() (st []*UserGuild, err error) {
 
 	body, err := s.Request("GET", EndpointUserGuilds("@me"), nil)
 	if err != nil {

+ 15 - 0
structs.go

@@ -223,6 +223,15 @@ type Guild struct {
 	Unavailable                 bool              `json:"unavailable"`
 }
 
+// A UserGuild holds a brief version of a Guild
+type UserGuild struct {
+	ID          string `json:"id"`
+	Name        string `json:"name"`
+	Icon        string `json:"icon"`
+	Owner       bool   `json:"owner"`
+	Permissions int    `json:"permissions"`
+}
+
 // A GuildParams stores all the data needed to update discord guild settings
 type GuildParams struct {
 	Name              string             `json:"name"`
@@ -415,6 +424,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

@@ -280,6 +280,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 that username starts with, leave empty to return all members
+// limit    : Max number of items to return, or 0 to request 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.
 //