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 e3b98c4..dcfb447 100644 --- a/structs.go +++ b/structs.go @@ -424,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"` diff --git a/wsapi.go b/wsapi.go index a19c384..6e69d95 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 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. //