68 lines
1.3 KiB
Go
68 lines
1.3 KiB
Go
package typer
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/diamondburned/arikawa/v2/discord"
|
|
"github.com/diamondburned/arikawa/v2/gateway"
|
|
"github.com/diamondburned/cchat"
|
|
"github.com/diamondburned/cchat-discord/internal/discord/message"
|
|
"github.com/diamondburned/cchat-discord/internal/discord/state"
|
|
)
|
|
|
|
type Typer struct {
|
|
message.Author
|
|
time discord.UnixTimestamp
|
|
}
|
|
|
|
var _ cchat.Typer = (*Typer)(nil)
|
|
|
|
func NewFromAuthor(author message.Author, ev *gateway.TypingStartEvent) Typer {
|
|
return Typer{
|
|
Author: author,
|
|
time: ev.Timestamp,
|
|
}
|
|
}
|
|
|
|
func New(s *state.Instance, ev *gateway.TypingStartEvent) (*Typer, error) {
|
|
if ev.GuildID.IsValid() {
|
|
g, err := s.Cabinet.Guild(ev.GuildID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if ev.Member == nil {
|
|
ev.Member, err = s.Cabinet.Member(ev.GuildID, ev.UserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return &Typer{
|
|
Author: message.NewGuildMember(*ev.Member, *g, s),
|
|
time: ev.Timestamp,
|
|
}, nil
|
|
}
|
|
|
|
c, err := s.Cabinet.Channel(ev.ChannelID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, user := range c.DMRecipients {
|
|
if user.ID == ev.UserID {
|
|
return &Typer{
|
|
Author: message.NewUser(user, s),
|
|
time: ev.Timestamp,
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
return nil, errors.New("typer not found in state")
|
|
}
|
|
|
|
func (t Typer) Time() time.Time {
|
|
return t.time.Time()
|
|
}
|