Skip to content

Instantly share code, notes, and snippets.

@diamondburned
Last active August 31, 2020 03:22
Show Gist options
  • Save diamondburned/5081917dfd34402960ce3fc5cb8baacf to your computer and use it in GitHub Desktop.
Save diamondburned/5081917dfd34402960ce3fc5cb8baacf to your computer and use it in GitHub Desktop.
Querying Discord members from a guild by username
// findMembers finds a member with the given username from the state.
func findMembers(s state.Store, guild discord.GuildID, username string) *discord.Member {
m, err := s.Store.Members(guild)
if err != nil {
return nil
}
for _, m := range m {
if strings.HasPrefix(m.User.Username, username) {
return m
}
}
return nil
}
func queryState(s *state.State, guild discord.GuildID, username string) (*discord.Member, error) {
if m := findMembers(s.Store, guild, username); m != nil {
return m, nil
}
ev := make(chan *gateway.GuildMembersChunkEvent)
cc := s.AddHandler(ev)
defer cc()
err := s.RequestGuildMembers(gateway.RequestGuildMembersData{
GuildID: guildID,
Query: username,
})
if err != nil {
return nil, errors.Wrap(err, "Failed to request member from gateway")
}
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
defer cancel()
for {
select {
case <-ctx.Done():
return nil, ctx.Err()
case <-ev:
if ev.GuildID != guildID {
continue
}
if m := findMembers(s.Store, guild, username); m != nil {
return m, nil
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment