66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package discord
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/diamondburned/arikawa/discord"
|
|
"github.com/diamondburned/arikawa/gateway"
|
|
"github.com/diamondburned/cchat"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type Typer struct {
|
|
Author
|
|
time discord.UnixTimestamp
|
|
}
|
|
|
|
var _ cchat.Typer = (*Typer)(nil)
|
|
|
|
func NewTyperAuthor(author Author, ev *gateway.TypingStartEvent) Typer {
|
|
return Typer{
|
|
Author: author,
|
|
time: ev.Timestamp,
|
|
}
|
|
}
|
|
|
|
func NewTyper(s *Session, ev *gateway.TypingStartEvent) (*Typer, error) {
|
|
if ev.GuildID.IsValid() {
|
|
g, err := s.Store.Guild(ev.GuildID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if ev.Member == nil {
|
|
ev.Member, err = s.Store.Member(ev.GuildID, ev.UserID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return &Typer{
|
|
Author: NewGuildMember(*ev.Member, *g, s),
|
|
time: ev.Timestamp,
|
|
}, nil
|
|
}
|
|
|
|
c, err := s.Store.Channel(ev.ChannelID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, user := range c.DMRecipients {
|
|
if user.ID == ev.UserID {
|
|
return &Typer{
|
|
Author: 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()
|
|
}
|