40 lines
981 B
Go
40 lines
981 B
Go
package indicate
|
|
|
|
import (
|
|
"time"
|
|
|
|
"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/channel/typer"
|
|
)
|
|
|
|
type TypingIndicator struct {
|
|
*shared.Channel
|
|
}
|
|
|
|
func NewTyping(ch *shared.Channel) cchat.TypingIndicator {
|
|
return TypingIndicator{ch}
|
|
}
|
|
|
|
func (ti TypingIndicator) Typing() error {
|
|
return ti.State.Typing(ti.ID)
|
|
}
|
|
|
|
// TypingTimeout returns 10 seconds.
|
|
func (ti TypingIndicator) TypingTimeout() time.Duration {
|
|
return 10 * time.Second
|
|
}
|
|
|
|
func (ti TypingIndicator) TypingSubscribe(tc cchat.TypingContainer) (func(), error) {
|
|
return ti.State.AddHandler(func(t *gateway.TypingStartEvent) {
|
|
// Ignore channel mismatch or if the typing event is ours.
|
|
if t.ChannelID != ti.ID || t.UserID == ti.State.UserID {
|
|
return
|
|
}
|
|
if typer, err := typer.New(ti.State, t); err == nil {
|
|
tc.AddTyper(typer)
|
|
}
|
|
}), nil
|
|
}
|