package backend import ( "errors" "strings" "github.com/bwmarrin/discordgo" "TerraOceanBot/db" "TerraOceanBot/discord/config" ) var ErrMemberNotFound = errors.New("discord/backend: the requested member was not found") func GetAllMembers(s *discordgo.Session) ([]*discordgo.Member, error) { err := s.RequestGuildMembers(config.GuildID, "", 0) if err != nil { return nil, err } guild, err := s.State.Guild(config.GuildID) if err != nil { guild, err = s.Guild(config.GuildID) } if err != nil { return nil, err } //TODO Deduplication hack until discordgo fixes this. deduplicationCache := make(map[string]bool) dedupedArray := make([]*discordgo.Member, 0) for _, v := range guild.Members { if deduplicationCache[v.User.ID] { continue } dedupedArray = append(dedupedArray, v) deduplicationCache[v.User.ID] = true } return dedupedArray, nil } func GetMemberFromUserFriendlyName(s *discordgo.Session, user string) (*discordgo.Member, error) { allMembers, err := GetAllMembers(s) if err != nil { return nil, err } if strings.HasPrefix(user, "@") { user = strings.TrimPrefix(user, "@") } else if strings.HasSuffix(user, ">") { if strings.HasPrefix(user, "<@!") { user = strings.TrimSuffix(strings.TrimPrefix(user, "<@!"), ">") } else if strings.HasPrefix(user, "<@") { user = strings.TrimSuffix(strings.TrimPrefix(user, "<@"), ">") } } if strings.ContainsRune(user, '#') { list := strings.Split(user, "#") username := strings.Join(list[:len(list)-1], "#") discriminator := list[len(list)-1] for _, v := range allMembers { if v.User.Username == username && v.User.Discriminator == discriminator { return v, nil } } } for _, v := range allMembers { if v.User.ID == user { return v, nil } } for _, v := range allMembers { if v.Nick == user { return v, nil } } for _, v := range allMembers { if v.User.Username == user { return v, nil } } for _, v := range allMembers { mcUsername, err := db.GetMinecraftUsername(v.User.ID) if err == db.ErrNotFound { continue } if err != nil { return nil, err } if mcUsername == user { return v, nil } } return nil, ErrMemberNotFound }