diff --git a/internal/ui/chat/state.go b/internal/ui/chat/state.go index 45b46de..c317ae1 100644 --- a/internal/ui/chat/state.go +++ b/internal/ui/chat/state.go @@ -5,6 +5,8 @@ import ( "log/slog" "github.com/ayn2op/discordo/internal/http" + "github.com/ayn2op/discordo/internal/notifications" + "github.com/ayn2op/tview" "github.com/diamondburned/arikawa/v3/gateway" "github.com/diamondburned/arikawa/v3/session" "github.com/diamondburned/arikawa/v3/state" @@ -76,6 +78,79 @@ func (v *View) onRaw(event *ws.RawEvent) { ) } +func (v *View) onReady(r *gateway.ReadyEvent) { + dmNode := tview.NewTreeNode("Direct Messages") + root := v.guildsTree. + GetRoot(). + ClearChildren(). + AddChild(dmNode) + + for _, folder := range r.UserSettings.GuildFolders { + if folder.ID == 0 && len(folder.GuildIDs) == 1 { + guild, err := v.state.Cabinet.Guild(folder.GuildIDs[0]) + if err != nil { + slog.Error( + "failed to get guild from state", + "guild_id", + folder.GuildIDs[0], + "err", + err, + ) + continue + } + + v.guildsTree.createGuildNode(root, *guild) + } else { + v.guildsTree.createFolderNode(folder) + } + } + + v.guildsTree.SetCurrentNode(root) + v.app.SetFocus(v.guildsTree) + v.app.Draw() +} + +func (v *View) onMessageCreate(message *gateway.MessageCreateEvent) { + selectedChannel := v.SelectedChannel() + if selectedChannel != nil && selectedChannel.ID == message.ChannelID { + v.removeTyper(message.Author.ID) + v.messagesList.drawMessage(v.messagesList, message.Message) + v.app.Draw() + } else { + if err := notifications.Notify(v.state, message, v.cfg); err != nil { + slog.Error("failed to notify", "err", err, "channel_id", message.ChannelID, "message_id", message.ID) + } + } +} + +func (v *View) onMessageUpdate(message *gateway.MessageUpdateEvent) { + if selected := v.SelectedChannel(); selected != nil && selected.ID == message.ChannelID { + v.onMessageDelete(&gateway.MessageDeleteEvent{ID: message.ID, ChannelID: message.ChannelID, GuildID: message.GuildID}) + } +} + +func (v *View) onMessageDelete(message *gateway.MessageDeleteEvent) { + if selected := v.SelectedChannel(); selected != nil && selected.ID == message.ChannelID { + messages, err := v.state.Cabinet.Messages(message.ChannelID) + if err != nil { + slog.Error("failed to get messages from state", "err", err, "channel_id", message.ChannelID) + return + } + + v.messagesList.reset() + v.messagesList.drawMessages(messages) + v.app.Draw() + } +} + +func (v *View) onGuildMembersChunk(event *gateway.GuildMembersChunkEvent) { + v.messagesList.setFetchingChunk(false, uint(len(event.Members))) +} + +func (v *View) onGuildMemberRemove(event *gateway.GuildMemberRemoveEvent) { + v.messageInput.cache.Invalidate(event.GuildID.String()+" "+event.User.Username, v.state.MemberState.SearchLimit) +} + func (v *View) onTypingStart(event *gateway.TypingStartEvent) { selectedChannel := v.SelectedChannel() if selectedChannel == nil { diff --git a/internal/ui/chat/view.go b/internal/ui/chat/view.go index ded3772..9c73fd4 100644 --- a/internal/ui/chat/view.go +++ b/internal/ui/chat/view.go @@ -8,11 +8,9 @@ import ( "github.com/ayn2op/discordo/internal/config" "github.com/ayn2op/discordo/internal/keyring" - "github.com/ayn2op/discordo/internal/notifications" "github.com/ayn2op/discordo/internal/ui" "github.com/ayn2op/tview" "github.com/diamondburned/arikawa/v3/discord" - "github.com/diamondburned/arikawa/v3/gateway" "github.com/diamondburned/ningen/v3" "github.com/diamondburned/ningen/v3/states/read" "github.com/gdamore/tcell/v3" @@ -253,79 +251,6 @@ func (v *View) onReadUpdate(event *read.UpdateEvent) { v.app.Draw() } -func (v *View) onReady(r *gateway.ReadyEvent) { - dmNode := tview.NewTreeNode("Direct Messages") - root := v.guildsTree. - GetRoot(). - ClearChildren(). - AddChild(dmNode) - - for _, folder := range r.UserSettings.GuildFolders { - if folder.ID == 0 && len(folder.GuildIDs) == 1 { - guild, err := v.state.Cabinet.Guild(folder.GuildIDs[0]) - if err != nil { - slog.Error( - "failed to get guild from state", - "guild_id", - folder.GuildIDs[0], - "err", - err, - ) - continue - } - - v.guildsTree.createGuildNode(root, *guild) - } else { - v.guildsTree.createFolderNode(folder) - } - } - - v.guildsTree.SetCurrentNode(root) - v.app.SetFocus(v.guildsTree) - v.app.Draw() -} - -func (v *View) onMessageCreate(message *gateway.MessageCreateEvent) { - selectedChannel := v.SelectedChannel() - if selectedChannel != nil && selectedChannel.ID == message.ChannelID { - v.removeTyper(message.Author.ID) - v.messagesList.drawMessage(v.messagesList, message.Message) - v.app.Draw() - } else { - if err := notifications.Notify(v.state, message, v.cfg); err != nil { - slog.Error("failed to notify", "err", err, "channel_id", message.ChannelID, "message_id", message.ID) - } - } -} - -func (v *View) onMessageUpdate(message *gateway.MessageUpdateEvent) { - if selected := v.SelectedChannel(); selected != nil && selected.ID == message.ChannelID { - v.onMessageDelete(&gateway.MessageDeleteEvent{ID: message.ID, ChannelID: message.ChannelID, GuildID: message.GuildID}) - } -} - -func (v *View) onMessageDelete(message *gateway.MessageDeleteEvent) { - if selected := v.SelectedChannel(); selected != nil && selected.ID == message.ChannelID { - messages, err := v.state.Cabinet.Messages(message.ChannelID) - if err != nil { - slog.Error("failed to get messages from state", "err", err, "channel_id", message.ChannelID) - return - } - - v.messagesList.reset() - v.messagesList.drawMessages(messages) - v.app.Draw() - } -} - -func (v *View) onGuildMembersChunk(event *gateway.GuildMembersChunkEvent) { - v.messagesList.setFetchingChunk(false, uint(len(event.Members))) -} - -func (v *View) onGuildMemberRemove(event *gateway.GuildMemberRemoveEvent) { - v.messageInput.cache.Invalidate(event.GuildID.String()+" "+event.User.Username, v.state.MemberState.SearchLimit) -} - func (v *View) clearTypers() { v.typersMu.Lock() for _, timer := range v.typers {