From 9c7c9d3fd2650aa0ff95fb11dc1816e2b551c69a Mon Sep 17 00:00:00 2001 From: jonas747 Date: Sun, 25 Sep 2016 21:29:59 +0200 Subject: [PATCH] Added RequestGuildMembers to request guild members from the gateway --- events.go | 1 + structs.go | 6 ++++++ wsapi.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/events.go b/events.go index b1a9b09..49f12ad 100644 --- a/events.go +++ b/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{}, diff --git a/structs.go b/structs.go index 7fcf44b..dcf6fa0 100644 --- a/structs.go +++ b/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"` diff --git a/wsapi.go b/wsapi.go index a19c384..3bf2c93 100644 --- a/wsapi.go +++ b/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. //