cchat-discord/internal/discord/channel/private.go

65 lines
1.4 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/state"
"github.com/diamondburned/cchat-discord/internal/urlutils"
"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) 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
}