discord: Deprecate MemberColor

Also fix State failing to fill up GuildID fields in Messages().
This commit is contained in:
diamondburned 2022-04-01 04:42:03 -07:00
parent aee547fa1f
commit 406171d7a9
No known key found for this signature in database
GPG Key ID: D78C4471CE776659
2 changed files with 41 additions and 47 deletions

View File

@ -522,6 +522,9 @@ type GuildWidgetSettings struct {
// MemberColor computes the effective color of the Member, taking into account
// the role colors.
//
// Deprecated: MemberColor relies on Guild, which may not have a []Role if it
// comes from the state. Use State's MemberColor instead.
func MemberColor(guild Guild, member Member) (Color, bool) {
c := NullColor
var pos int

View File

@ -212,66 +212,57 @@ func (s *State) MemberDisplayName(guildID discord.GuildID, userID discord.UserID
return member.Nick, nil
}
// AuthorColor is a variant of MemberColor that possibly uses the existing
// Member field inside MessageCreateEvent.
func (s *State) AuthorColor(message *gateway.MessageCreateEvent) (discord.Color, bool) {
if !message.GuildID.IsValid() { // this is a dm
return discord.NullColor, false
}
if message.Member != nil {
guild, err := s.Guild(message.GuildID)
if err != nil {
return discord.NullColor, false
}
return discord.MemberColor(*guild, *message.Member)
return MemberColor(message.Member, func(id discord.RoleID) *discord.Role {
r, _ := s.Role(message.GuildID, id)
return r
})
}
return s.MemberColor(message.GuildID, message.Author.ID)
}
// MemberColor fetches the color of the member with the given user ID inside the
// guild with the given ID.
func (s *State) MemberColor(guildID discord.GuildID, userID discord.UserID) (discord.Color, bool) {
var wg sync.WaitGroup
var (
g *discord.Guild
m *discord.Member
gerr = store.ErrNotFound
merr = store.ErrNotFound
)
if s.HasIntents(gateway.IntentGuilds) {
g, gerr = s.Cabinet.Guild(guildID)
}
if s.HasIntents(gateway.IntentGuildMembers) {
m, merr = s.Cabinet.Member(guildID, userID)
}
switch {
case gerr != nil && merr != nil:
wg.Add(1)
go func() {
g, gerr = s.fetchGuild(guildID)
wg.Done()
}()
m, merr = s.fetchMember(guildID, userID)
case gerr != nil:
g, gerr = s.fetchGuild(guildID)
case merr != nil:
m, merr = s.fetchMember(guildID, userID)
}
wg.Wait()
if gerr != nil {
return discord.NullColor, false
}
if merr != nil {
m, err := s.Member(guildID, userID)
if err != nil {
return discord.NullColor, false
}
return discord.MemberColor(*g, *m)
return MemberColor(m, func(id discord.RoleID) *discord.Role {
r, _ := s.Role(guildID, id)
return r
})
}
// MemberColor is a weird variant of State's MemberColor method that allows a
// custom Role getter. If m is nil, then NullColor is returned.
func MemberColor(m *discord.Member, role func(discord.RoleID) *discord.Role) (discord.Color, bool) {
c := discord.NullColor
pos := -1
if m == nil {
return c, false
}
for _, roleID := range m.RoleIDs {
if r := role(roleID); r != nil {
if r.Color > 0 && r.Position > pos {
c = r.Color
pos = r.Position
}
}
}
return c, pos != -1
}
////
@ -673,8 +664,8 @@ func (s *State) Messages(channelID discord.ChannelID, limit uint) ([]discord.Mes
}
}
for _, m := range apiMessages {
m.GuildID = guildID
for i := range apiMessages {
apiMessages[i].GuildID = guildID
}
if s.tracksMessage(&apiMessages[0]) && len(storeMessages) < s.MaxMessages() {