cchat-discord/internal/discord/channel/message/memberlist/member.go

122 lines
2.8 KiB
Go
Raw Normal View History

2020-09-08 04:44:09 +00:00
package memberlist
import (
"context"
"fmt"
"strings"
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"
"github.com/diamondburned/cchat-discord/internal/segments/emoji"
"github.com/diamondburned/cchat-discord/internal/segments/mention"
2020-09-08 04:44:09 +00:00
"github.com/diamondburned/cchat/text"
)
type Member struct {
channel shared.Channel
mention mention.User
presence gateway.Presence
2020-09-08 04:44:09 +00:00
}
// New creates a new list member. it.Member must not be nil.
func NewMember(ch shared.Channel, opItem gateway.GuildMemberListOpItem) cchat.ListMember {
user := mention.NewUser(opItem.Member.User)
user.WithState(ch.State.State)
2021-01-06 04:53:49 +00:00
user.WithMember(opItem.Member.Member)
user.WithGuildID(ch.GuildID)
user.WithPresence(opItem.Member.Presence)
user.Prefetch()
2020-09-08 04:44:09 +00:00
return &Member{
2020-10-07 01:53:15 +00:00
channel: ch,
presence: opItem.Member.Presence,
mention: *user,
2020-09-08 04:44:09 +00:00
}
}
func (l *Member) ID() cchat.ID {
return l.mention.UserID().String()
2020-09-08 04:44:09 +00:00
}
func (l *Member) Name() text.Rich {
content := l.mention.DisplayName()
2020-09-08 04:44:09 +00:00
return text.Rich{
Content: content,
Segments: []text.Segment{
mention.NewSegment(0, len(content), &l.mention),
},
2020-09-08 04:44:09 +00:00
}
}
2020-10-07 01:53:15 +00:00
func (l *Member) AsIconer() cchat.Iconer { return l }
2020-09-08 04:44:09 +00:00
func (l *Member) Icon(ctx context.Context, c cchat.IconContainer) (func(), error) {
c.SetIcon(l.mention.Avatar())
2020-09-08 04:44:09 +00:00
return func() {}, nil
}
2020-10-07 01:53:15 +00:00
func (l *Member) Status() cchat.Status {
switch l.presence.Status {
2020-12-20 05:44:26 +00:00
case gateway.OnlineStatus:
2020-10-07 01:53:15 +00:00
return cchat.StatusOnline
2020-12-20 05:44:26 +00:00
case gateway.DoNotDisturbStatus:
2020-10-07 01:53:15 +00:00
return cchat.StatusBusy
2020-12-20 05:44:26 +00:00
case gateway.IdleStatus:
2020-10-07 01:53:15 +00:00
return cchat.StatusAway
2020-12-20 05:44:26 +00:00
case gateway.OfflineStatus, gateway.InvisibleStatus:
2020-10-07 01:53:15 +00:00
return cchat.StatusOffline
2020-09-08 04:44:09 +00:00
default:
2020-10-07 01:53:15 +00:00
return cchat.StatusUnknown
2020-09-08 04:44:09 +00:00
}
}
func (l *Member) Secondary() text.Rich {
if len(l.presence.Activities) == 0 {
return text.Rich{}
2020-09-08 04:44:09 +00:00
}
return formatSmallActivity(l.presence.Activities[0])
2020-09-08 04:44:09 +00:00
}
func formatSmallActivity(ac discord.Activity) text.Rich {
switch ac.Type {
case discord.GameActivity:
return text.Plain(fmt.Sprintf("Playing %s", ac.Name))
case discord.ListeningActivity:
return text.Plain(fmt.Sprintf("Listening to %s", ac.Name))
case discord.StreamingActivity:
return text.Plain(fmt.Sprintf("Streaming on %s", ac.Name))
case discord.CustomActivity:
var status strings.Builder
var segmts []text.Segment
if ac.Emoji != nil {
if !ac.Emoji.ID.IsValid() {
status.WriteString(ac.Emoji.Name)
status.WriteByte(' ')
} else {
2020-10-07 01:53:15 +00:00
segmts = append(segmts, emoji.Segment{
Start: status.Len(),
Emoji: emoji.EmojiFromDiscord(*ac.Emoji, ac.State == ""),
2020-09-08 04:44:09 +00:00
})
}
}
status.WriteString(ac.State)
return text.Rich{
Content: status.String(),
Segments: segmts,
}
default:
return text.Rich{}
}
}