cchat-discord/internal/discord/session/channel/messenger/messenger.go

138 lines
3.8 KiB
Go
Raw Normal View History

2021-03-15 04:30:05 +00:00
package messenger
2020-10-07 01:53:15 +00:00
import (
"context"
2020-12-20 05:44:26 +00:00
"github.com/diamondburned/arikawa/v2/discord"
"github.com/diamondburned/arikawa/v2/gateway"
2020-10-07 01:53:15 +00:00
"github.com/diamondburned/cchat"
"github.com/diamondburned/cchat-discord/internal/discord/message"
2021-03-15 04:30:05 +00:00
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/actioner"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/backlogger"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/editor"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/indicator"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/memberlister"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/messenger/sender"
"github.com/diamondburned/cchat-discord/internal/discord/session/channel/shared"
2020-10-07 01:53:15 +00:00
"github.com/diamondburned/cchat-discord/internal/funcutil"
"github.com/diamondburned/cchat/utils/empty"
)
type Messenger struct {
empty.Messenger
shared.Channel
2020-10-07 01:53:15 +00:00
}
var _ cchat.Messenger = (*Messenger)(nil)
2020-12-19 05:46:12 +00:00
func New(ch shared.Channel) *Messenger {
return &Messenger{Channel: ch}
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) JoinServer(ctx context.Context, ct cchat.MessagesContainer) (func(), error) {
2020-10-07 01:53:15 +00:00
state := msgr.State.WithContext(ctx)
m, err := state.Messages(msgr.ID)
if err != nil {
return nil, err
}
2021-05-01 07:24:34 +00:00
addcancel := funcutil.NewCancels()
2020-10-07 01:53:15 +00:00
if msgr.GuildID.IsValid() {
// Subscribe to typing events.
msgr.State.MemberState.Subscribe(msgr.GuildID)
// Listen to new members before creating the backlog and requesting members.
addcancel(msgr.State.AddHandler(func(c *gateway.GuildMembersChunkEvent) {
if c.GuildID != msgr.GuildID {
return
}
2021-01-06 04:53:49 +00:00
messages, _ := msgr.Messages()
2020-10-07 01:53:15 +00:00
2021-01-06 04:53:49 +00:00
for _, m := range c.Members {
for _, msg := range messages {
if msg.Author.ID == m.User.ID {
ct.UpdateMessage(message.NewAuthorUpdate(msg, m, msgr.State))
2020-10-07 01:53:15 +00:00
}
}
}
}))
}
2021-05-01 07:24:34 +00:00
// Iterate from the earliest messages to the latest messages.
for _, m := range m {
ct.CreateMessage(message.NewBacklogMessage(m, msgr.State))
2020-10-07 01:53:15 +00:00
}
// Bind the handler.
addcancel(
msgr.State.AddHandler(func(m *gateway.MessageCreateEvent) {
if m.ChannelID == msgr.ID {
2020-12-19 05:46:12 +00:00
ct.CreateMessage(message.NewGuildMessageCreate(m, msgr.State))
2020-10-07 01:53:15 +00:00
}
}),
msgr.State.AddHandler(func(m *gateway.MessageUpdateEvent) {
// If the updated content is empty. TODO: add embed support.
if m.ChannelID == msgr.ID {
2021-01-06 04:53:49 +00:00
ct.UpdateMessage(message.NewContentUpdate(m.Message, msgr.State))
2020-10-07 01:53:15 +00:00
}
}),
msgr.State.AddHandler(func(m *gateway.MessageDeleteEvent) {
if m.ChannelID == msgr.ID {
ct.DeleteMessage(message.NewHeaderDelete(m))
}
}),
)
return funcutil.JoinCancels(addcancel()...), nil
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsSender() cchat.Sender {
2020-10-07 01:53:15 +00:00
if !msgr.HasPermission(discord.PermissionSendMessages) {
return nil
}
2021-03-15 04:30:05 +00:00
return sender.New(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsEditor() cchat.Editor {
2020-10-07 01:53:15 +00:00
if !msgr.HasPermission(discord.PermissionSendMessages) {
return nil
}
2021-03-15 04:30:05 +00:00
return editor.New(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsActioner() cchat.Actioner {
2021-03-15 04:30:05 +00:00
return actioner.New(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsNicknamer() cchat.Nicknamer {
2021-03-15 04:30:05 +00:00
return NewMeNicknamer(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsMemberLister() cchat.MemberLister {
2020-10-07 01:53:15 +00:00
if !msgr.GuildID.IsValid() {
return nil
}
2021-03-15 04:30:05 +00:00
return memberlister.New(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsBacklogger() cchat.Backlogger {
2020-10-07 01:53:15 +00:00
if !msgr.HasPermission(discord.PermissionViewChannel, discord.PermissionReadMessageHistory) {
return nil
}
2021-03-15 04:30:05 +00:00
return backlogger.New(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsTypingIndicator() cchat.TypingIndicator {
2021-03-15 04:30:05 +00:00
return indicator.NewTyping(msgr.Channel)
2020-10-07 01:53:15 +00:00
}
2020-12-19 05:46:12 +00:00
func (msgr *Messenger) AsUnreadIndicator() cchat.UnreadIndicator {
2021-03-15 04:30:05 +00:00
return indicator.NewUnread(msgr.Channel)
2020-10-07 01:53:15 +00:00
}