cchat-discord/internal/discord/channel/message/nickname/nicknamer.go

93 lines
2.3 KiB
Go
Raw Normal View History

2020-10-07 01:53:15 +00:00
package nickname
2020-09-08 04:44:09 +00:00
import (
"context"
2020-12-20 05:44:26 +00:00
"fmt"
2020-09-08 04:44:09 +00:00
2020-12-20 05:44:26 +00:00
"github.com/diamondburned/arikawa/v2/discord"
"github.com/diamondburned/arikawa/v2/gateway"
2020-09-08 04:44:09 +00:00
"github.com/diamondburned/cchat"
2020-10-07 01:53:15 +00:00
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
2020-12-20 05:44:26 +00:00
"github.com/diamondburned/cchat-discord/internal/funcutil"
2020-10-07 01:53:15 +00:00
"github.com/diamondburned/cchat-discord/internal/segments/colored"
2020-09-08 04:44:09 +00:00
"github.com/diamondburned/cchat/text"
)
2020-10-07 01:53:15 +00:00
type Nicknamer struct {
2020-12-20 05:44:26 +00:00
userID discord.UserID
shared.Channel
2020-10-07 01:53:15 +00:00
}
2020-09-08 04:44:09 +00:00
func New(ch shared.Channel) cchat.Nicknamer {
2020-12-20 05:44:26 +00:00
return NewMember(ch.State.UserID, ch)
}
func NewMember(userID discord.UserID, ch shared.Channel) cchat.Nicknamer {
return Nicknamer{userID, ch}
2020-09-08 04:44:09 +00:00
}
2020-10-07 01:53:15 +00:00
func (nn Nicknamer) Nickname(ctx context.Context, labeler cchat.LabelContainer) (func(), error) {
2020-09-08 04:44:09 +00:00
// We don't have a nickname if we're not in a guild.
2020-10-07 01:53:15 +00:00
if !nn.GuildID.IsValid() {
2020-12-20 05:44:26 +00:00
// Use the current user.
u, err := nn.State.Cabinet.Me()
if err == nil {
labeler.SetLabel(text.Plain(fmt.Sprintf("%s#%s", u.Username, u.Discriminator)))
}
2020-09-08 04:44:09 +00:00
return func() {}, nil
}
nn.tryNicknameLabel(ctx, labeler)
2020-12-20 05:44:26 +00:00
return funcutil.JoinCancels(
nn.State.AddHandler(func(chunks *gateway.GuildMembersChunkEvent) {
if chunks.GuildID != nn.GuildID {
return
}
for _, member := range chunks.Members {
if member.User.ID == nn.userID {
nn.setMember(labeler, member)
break
}
}
}),
nn.State.AddHandler(func(g *gateway.GuildMemberUpdateEvent) {
if g.GuildID == nn.GuildID && g.User.ID == nn.userID {
nn.setMember(labeler, discord.Member{
User: g.User,
Nick: g.Nick,
RoleIDs: g.RoleIDs,
})
}
}),
), nil
}
func (nn Nicknamer) tryNicknameLabel(ctx context.Context, labeler cchat.LabelContainer) {
2020-10-07 01:53:15 +00:00
state := nn.State.WithContext(ctx)
2020-09-08 04:44:09 +00:00
2020-12-20 05:44:26 +00:00
m, err := state.Cabinet.Member(nn.GuildID, nn.userID)
if err == nil {
nn.setMember(labeler, *m)
2020-09-08 04:44:09 +00:00
}
2020-12-20 05:44:26 +00:00
}
2020-09-08 04:44:09 +00:00
2020-12-20 05:44:26 +00:00
func (nn Nicknamer) setMember(labeler cchat.LabelContainer, m discord.Member) {
2020-09-08 04:44:09 +00:00
var rich = text.Rich{Content: m.User.Username}
if m.Nick != "" {
rich.Content = m.Nick
}
2020-12-20 05:44:26 +00:00
guild, err := nn.State.Cabinet.Guild(nn.GuildID)
if err == nil {
if color := discord.MemberColor(*guild, m); color > 0 {
2020-09-08 04:44:09 +00:00
rich.Segments = []text.Segment{
2020-12-20 05:44:26 +00:00
colored.New(len(rich.Content), color.Uint32()),
2020-09-08 04:44:09 +00:00
}
}
2020-12-20 05:44:26 +00:00
}
2020-09-08 04:44:09 +00:00
2020-12-20 05:44:26 +00:00
labeler.SetLabel(rich)
2020-09-08 04:44:09 +00:00
}