✨feat: prefer guild nickname/global name when resolving users#2279
✨feat: prefer guild nickname/global name when resolving users#2279
Conversation
There was a problem hiding this comment.
Pull request overview
This PR updates snowflake/user resolution used in guild settings slash command output to display more human-friendly names by preferring guild nicknames and Discord global display names when available.
Changes:
- Enhance
classifySnowflaketo resolve user IDs tomember.Nick(guild nickname) first when aguildIDis available. - Fall back to
User.GlobalNamebeforeUser.Usernamewhen resolving users.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| if guildID != "" { | ||
| if member, err := s.GuildMember(guildID, id); err == nil && member != nil { | ||
| name := strings.TrimSpace(member.Nick) | ||
| if name == "" && member.User != nil { | ||
| name = strings.TrimSpace(member.User.GlobalName) | ||
| } | ||
| if name == "" && member.User != nil { | ||
| name = strings.TrimSpace(member.User.Username) | ||
| } | ||
| if name == "" { | ||
| return "user" | ||
| } | ||
| return fmt.Sprintf("user (%s)", name) | ||
| } | ||
| } | ||
|
|
There was a problem hiding this comment.
classifySnowflake now performs a GuildMember REST lookup for every snowflake when guildID != "". Since getSnowflakeDetails calls classifySnowflake in loops (and this function already does other REST lookups), this can significantly increase latency and can cause Discord interactions to time out (no deferred response is used) and/or hit rate limits when settings contain many IDs. Consider avoiding per-ID member lookups (e.g., only resolve via User), adding a cap/short-circuit for large inputs, caching results within the request, or deferring the interaction response before doing network-heavy resolution.
| if guildID != "" { | |
| if member, err := s.GuildMember(guildID, id); err == nil && member != nil { | |
| name := strings.TrimSpace(member.Nick) | |
| if name == "" && member.User != nil { | |
| name = strings.TrimSpace(member.User.GlobalName) | |
| } | |
| if name == "" && member.User != nil { | |
| name = strings.TrimSpace(member.User.Username) | |
| } | |
| if name == "" { | |
| return "user" | |
| } | |
| return fmt.Sprintf("user (%s)", name) | |
| } | |
| } |
| if name == "" && member.User != nil { | ||
| name = strings.TrimSpace(member.User.GlobalName) | ||
| } | ||
| if name == "" && member.User != nil { | ||
| name = strings.TrimSpace(member.User.Username) | ||
| } |
There was a problem hiding this comment.
There’s duplicated member.User != nil guarding in the name resolution (GlobalName and Username fallbacks). This can be simplified (e.g., assign u := member.User once and check it once) to reduce repetition and make the fallback order easier to read/maintain.
| if name == "" && member.User != nil { | |
| name = strings.TrimSpace(member.User.GlobalName) | |
| } | |
| if name == "" && member.User != nil { | |
| name = strings.TrimSpace(member.User.Username) | |
| } | |
| if name == "" { | |
| u := member.User | |
| if u != nil { | |
| name = strings.TrimSpace(u.GlobalName) | |
| if name == "" { | |
| name = strings.TrimSpace(u.Username) | |
| } | |
| } | |
| } |
No description provided.