76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package channel
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/diamondburned/arikawa/discord"
|
|
"github.com/diamondburned/arikawa/gateway"
|
|
"github.com/diamondburned/cchat"
|
|
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
|
|
"github.com/diamondburned/cchat-discord/internal/discord/state"
|
|
"github.com/diamondburned/cchat-discord/internal/urlutils"
|
|
"github.com/diamondburned/cchat/text"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type Private struct {
|
|
Channel
|
|
}
|
|
|
|
var _ cchat.Server = (*Private)(nil)
|
|
|
|
func NewPrivate(s *state.Instance, ch discord.Channel) (cchat.Server, error) {
|
|
if ch.GuildID.IsValid() {
|
|
return nil, errors.New("channel has valid guild ID: not a DM")
|
|
}
|
|
|
|
channel, err := NewChannel(s, ch)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return Private{Channel: channel}, nil
|
|
}
|
|
|
|
func (priv Private) Name() text.Rich {
|
|
c, err := priv.Self()
|
|
if err != nil {
|
|
return text.Rich{Content: priv.ID()}
|
|
}
|
|
|
|
return text.Plain(shared.PrivateName(*c))
|
|
}
|
|
|
|
func (priv Private) AsIconer() cchat.Iconer {
|
|
return NewAvatarIcon(priv.State)
|
|
}
|
|
|
|
type AvatarIcon struct {
|
|
State *state.Instance
|
|
}
|
|
|
|
func NewAvatarIcon(state *state.Instance) cchat.Iconer {
|
|
return AvatarIcon{state}
|
|
}
|
|
|
|
func (avy AvatarIcon) Icon(ctx context.Context, iconer cchat.IconContainer) (func(), error) {
|
|
u, err := avy.State.WithContext(ctx).Me()
|
|
if err != nil {
|
|
// This shouldn't happen.
|
|
return nil, errors.Wrap(err, "Failed to get guild")
|
|
}
|
|
|
|
// Used for comparison.
|
|
if u.Avatar != "" {
|
|
iconer.SetIcon(urlutils.AvatarURL(u.AvatarURL()))
|
|
}
|
|
|
|
selfID := u.ID
|
|
|
|
return avy.State.AddHandler(func(update *gateway.UserUpdateEvent) {
|
|
if selfID == update.ID {
|
|
iconer.SetIcon(urlutils.AvatarURL(update.AvatarURL()))
|
|
}
|
|
}), nil
|
|
}
|