From 51beca67e95478f5aed352debe0d065c956e8c49 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Fri, 3 Apr 2026 00:18:50 -0400 Subject: [PATCH] build(deps): upgrade deps to latest --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- internal/ui/chat/attachments_picker.go | 7 ++++--- internal/ui/chat/channels_picker.go | 6 +++--- internal/ui/chat/events.go | 10 +++++----- internal/ui/chat/guilds_tree.go | 12 ++++++------ internal/ui/chat/message_input.go | 20 ++++++++++---------- internal/ui/chat/messages_list.go | 22 +++++++++++----------- internal/ui/chat/model.go | 26 +++++++++++++------------- internal/ui/chat/state.go | 6 +++--- internal/ui/login/events.go | 2 +- internal/ui/login/model.go | 6 +++--- internal/ui/login/qr/events.go | 22 +++++++++++----------- internal/ui/login/qr/model.go | 6 +++--- internal/ui/login/token/events.go | 2 +- internal/ui/login/token/model.go | 4 ++-- internal/ui/root/events.go | 10 +++++----- internal/ui/root/model.go | 18 +++++++++--------- 18 files changed, 102 insertions(+), 101 deletions(-) diff --git a/go.mod b/go.mod index 8a38f42..ac56ab2 100644 --- a/go.mod +++ b/go.mod @@ -9,13 +9,13 @@ go 1.26.0 require ( github.com/BurntSushi/toml v1.6.0 github.com/alecthomas/chroma/v2 v2.23.1 - github.com/andybalholm/brotli v1.2.0 + github.com/andybalholm/brotli v1.2.1 github.com/ayn2op/clipboard v0.0.0-20260308203959-c5ad7df3fc97 - github.com/ayn2op/tview v0.0.0-20260326160057-77694f6ae219 + github.com/ayn2op/tview v0.0.0-20260403035755-f7ed1703d9a9 github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb github.com/diamondburned/arikawa/v3 v3.6.1-0.20260311205148-176ad9b9440f github.com/diamondburned/ningen/v3 v3.0.1-0.20260306213430-5a08d3a709b4 - github.com/gdamore/tcell/v3 v3.1.2 + github.com/gdamore/tcell/v3 v3.2.0 github.com/gen2brain/beeep v0.11.2 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 @@ -43,7 +43,7 @@ require ( github.com/gorilla/schema v1.4.1 // indirect github.com/jackmordaunt/icns/v3 v3.0.1 // indirect github.com/josephspurrier/goversioninfo v1.5.0 // indirect - github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/lucasb-eyer/go-colorful v1.4.0 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/randall77/makefat v0.0.0-20210315173500-7ddd0e42c844 // indirect diff --git a/go.sum b/go.sum index 2067981..34bb4da 100644 --- a/go.sum +++ b/go.sum @@ -10,12 +10,12 @@ github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o= github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs= github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro= +github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/ayn2op/clipboard v0.0.0-20260308203959-c5ad7df3fc97 h1:WujETUV+v0DEJyZgjeLzQvihWyL80c0Tg4qf0dDo+Io= github.com/ayn2op/clipboard v0.0.0-20260308203959-c5ad7df3fc97/go.mod h1:3kFnpNCa3dF6WryzOMCDao7PfZ7DTCh+pievlfuwV80= -github.com/ayn2op/tview v0.0.0-20260326160057-77694f6ae219 h1:LqDo0lLS9qcaEkfUGqu9AB0usCLLj9SluxqbNO2gAOs= -github.com/ayn2op/tview v0.0.0-20260326160057-77694f6ae219/go.mod h1:xgkca32kuEswK7Kzkfk3Pk24WHcKPjqK4xGmDi9QqOY= +github.com/ayn2op/tview v0.0.0-20260403035755-f7ed1703d9a9 h1:BshyCL/u4/8nUULtn+iPUoSONbz4btdAlmZJOUaSdBk= +github.com/ayn2op/tview v0.0.0-20260403035755-f7ed1703d9a9/go.mod h1:xgkca32kuEswK7Kzkfk3Pk24WHcKPjqK4xGmDi9QqOY= github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ= github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -35,8 +35,8 @@ github.com/esiqveland/notify v0.13.3 h1:QCMw6o1n+6rl+oLUfg8P1IIDSFsDEb2WlXvVvIJb github.com/esiqveland/notify v0.13.3/go.mod h1:hesw/IRYTO0x99u1JPweAl4+5mwXJibQVUcP0Iu5ORE= github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= -github.com/gdamore/tcell/v3 v3.1.2 h1:qEaXnDaYZpCIMDfa3XFHkxrwFBINUuDiePwj39vErZ8= -github.com/gdamore/tcell/v3 v3.1.2/go.mod h1:MikpZpivMtggrw1kL999dI2VuXw6Wya4724VAh3DzIg= +github.com/gdamore/tcell/v3 v3.2.0 h1:/NRk7A9ENZXdjXer8+hsPamISWOASUQRledW9XgwGgI= +github.com/gdamore/tcell/v3 v3.2.0/go.mod h1:JjuMGzo/n6rS+lTVDmg2ft9qQnKS/11HrlU5R7a4UDw= github.com/gen2brain/beeep v0.11.2 h1:+KfiKQBbQCuhfJFPANZuJ+oxsSKAYNe88hIpJuyKWDA= github.com/gen2brain/beeep v0.11.2/go.mod h1:jQVvuwnLuwOcdctHn/uyh8horSBNJ8uGb9Cn2W4tvoc= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= @@ -62,8 +62,8 @@ github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBF github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= -github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= +github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/ncruces/zenity v0.10.14 h1:OBFl7qfXcvsdo1NUEGxTlZvAakgWMqz9nG38TuiaGLI= github.com/ncruces/zenity v0.10.14/go.mod h1:ZBW7uVe/Di3IcRYH0Br8X59pi+O6EPnNIOU66YHpOO4= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= diff --git a/internal/ui/chat/attachments_picker.go b/internal/ui/chat/attachments_picker.go index 6da2681..52bb916 100644 --- a/internal/ui/chat/attachments_picker.go +++ b/internal/ui/chat/attachments_picker.go @@ -45,12 +45,13 @@ func (ap *attachmentsPicker) SetItems(items []attachmentItem) { ap.Model.SetItems(pickerItems) } -func (ap *attachmentsPicker) close() tview.Command { +func (ap *attachmentsPicker) close() tview.Cmd { + ap.chatView.RemoveLayer(attachmentsPickerLayerName) return tview.SetFocus(ap.chatView.messagesList) } -func (ap *attachmentsPicker) HandleEvent(event tview.Event) tview.Command { +func (ap *attachmentsPicker) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *picker.SelectedEvent: index, ok := event.Reference.(int) @@ -66,7 +67,7 @@ func (ap *attachmentsPicker) HandleEvent(event tview.Event) tview.Command { return ap.close() } - return ap.Model.HandleEvent(event) + return ap.Model.Update(event) } func (ap *attachmentsPicker) ShortHelp() []keybind.Keybind { diff --git a/internal/ui/chat/channels_picker.go b/internal/ui/chat/channels_picker.go index eac0155..8b4a7ca 100644 --- a/internal/ui/chat/channels_picker.go +++ b/internal/ui/chat/channels_picker.go @@ -26,7 +26,7 @@ func newChannelsPicker(cfg *config.Config, chatView *Model) *channelsPicker { return cp } -func (cp *channelsPicker) HandleEvent(event tview.Event) tview.Command { +func (cp *channelsPicker) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *picker.SelectedEvent: channelID, ok := event.Reference.(discord.ChannelID) @@ -48,7 +48,7 @@ func (cp *channelsPicker) HandleEvent(event tview.Event) tview.Command { cp.chatView.guildsTree.expandPathToNode(node) cp.chatView.guildsTree.SetCurrentNode(node) - var selectCmd tview.Command + var selectCmd tview.Cmd if channel.Type != discord.GuildCategory { selectCmd = cp.chatView.guildsTree.onSelected(node) } @@ -58,7 +58,7 @@ func (cp *channelsPicker) HandleEvent(event tview.Event) tview.Command { cp.chatView.closePicker() return nil } - return cp.Model.HandleEvent(event) + return cp.Model.Update(event) } func (cp *channelsPicker) update() { diff --git a/internal/ui/chat/events.go b/internal/ui/chat/events.go index 6682086..7863240 100644 --- a/internal/ui/chat/events.go +++ b/internal/ui/chat/events.go @@ -10,7 +10,7 @@ import ( "github.com/gdamore/tcell/v3" ) -func (m *Model) openState() tview.Command { +func (m *Model) openState() tview.Cmd { return func() tview.Event { if err := m.state.Open(context.Background()); err != nil { slog.Error("failed to open chat state", "err", err) @@ -20,7 +20,7 @@ func (m *Model) openState() tview.Command { } } -func (m *Model) closeState() tview.Command { +func (m *Model) closeState() tview.Cmd { return func() tview.Event { if m.state != nil { if err := m.state.Close(); err != nil { @@ -37,7 +37,7 @@ type gatewayEvent struct { gateway.Event } -func (m *Model) listen() tview.Command { +func (m *Model) listen() tview.Cmd { return func() tview.Event { return &gatewayEvent{Event: <-m.events} } @@ -65,7 +65,7 @@ func newOlderMessagesLoadedEvent(channelID discord.ChannelID, older []discord.Me type LogoutEvent struct{ tcell.EventTime } -func (m *Model) logout() tview.Command { +func (m *Model) logout() tview.Cmd { return func() tview.Event { return &LogoutEvent{} } @@ -78,7 +78,7 @@ type closeLayerEvent struct { name string } -func closeLayer(name string) tview.Command { +func closeLayer(name string) tview.Cmd { return func() tview.Event { return &closeLayerEvent{name: name} } diff --git a/internal/ui/chat/guilds_tree.go b/internal/ui/chat/guilds_tree.go index 8f12b6c..5b8b48a 100644 --- a/internal/ui/chat/guilds_tree.go +++ b/internal/ui/chat/guilds_tree.go @@ -299,7 +299,7 @@ func (gt *guildsTree) createChannelNodes(node *tview.TreeNode, channels []discor } } -func (gt *guildsTree) onSelected(node *tview.TreeNode) tview.Command { +func (gt *guildsTree) onSelected(node *tview.TreeNode) tview.Cmd { if len(node.GetChildren()) != 0 { node.SetExpanded(!node.IsExpanded()) return nil @@ -371,7 +371,7 @@ func (gt *guildsTree) onSelected(node *tview.TreeNode) tview.Command { return nil } -func (gt *guildsTree) loadChannel(channel discord.Channel) tview.Command { +func (gt *guildsTree) loadChannel(channel discord.Channel) tview.Cmd { limit := uint(gt.cfg.MessagesLimit) return func() tview.Event { messages, err := gt.chat.state.Messages(channel.ID, limit) @@ -404,12 +404,12 @@ func (gt *guildsTree) collapseParentNode(node *tview.TreeNode) { }) } -func (gt *guildsTree) HandleEvent(event tview.Event) tview.Command { +func (gt *guildsTree) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tview.TreeViewSelectedEvent: return gt.onSelected(event.Node) case *tview.KeyEvent: - handler := gt.TreeView.HandleEvent + handler := gt.TreeView.Update switch { case keybind.Matches(event, gt.cfg.Keybinds.GuildsTree.CollapseParentNode.Keybind): @@ -435,10 +435,10 @@ func (gt *guildsTree) HandleEvent(event tview.Event) tview.Command { // Do not fall through to TreeView defaults for unmatched keys. return nil } - return gt.TreeView.HandleEvent(event) + return gt.TreeView.Update(event) } -func (gt *guildsTree) yankID() tview.Command { +func (gt *guildsTree) yankID() tview.Cmd { node := gt.GetCurrentNode() if node == nil { return nil diff --git a/internal/ui/chat/message_input.go b/internal/ui/chat/message_input.go index 21b72ff..32e95be 100644 --- a/internal/ui/chat/message_input.go +++ b/internal/ui/chat/message_input.go @@ -103,8 +103,8 @@ func (mi *messageInput) stopTypingTimer() { } } -func (mi *messageInput) HandleEvent(event tview.Event) tview.Command { - handler := mi.TextArea.HandleEvent +func (mi *messageInput) Update(event tview.Event) tview.Cmd { + handler := mi.TextArea.Update switch event := event.(type) { case *tview.KeyEvent: switch { @@ -119,8 +119,8 @@ func (mi *messageInput) HandleEvent(event tview.Event) tview.Command { } return nil case keybind.Matches(event, mi.cfg.Keybinds.MessageInput.OpenEditor.Keybind): - var cmds []tview.Command - mi.stopTabCompletion(func(next tview.Command) { + var cmds []tview.Cmd + mi.stopTabCompletion(func(next tview.Cmd) { if next != nil { cmds = append(cmds, next) } @@ -128,8 +128,8 @@ func (mi *messageInput) HandleEvent(event tview.Event) tview.Command { mi.editor() return tview.Batch(cmds...) case keybind.Matches(event, mi.cfg.Keybinds.MessageInput.OpenFilePicker.Keybind): - var cmds []tview.Command - mi.stopTabCompletion(func(next tview.Command) { + var cmds []tview.Cmd + mi.stopTabCompletion(func(next tview.Cmd) { if next != nil { cmds = append(cmds, next) } @@ -137,9 +137,9 @@ func (mi *messageInput) HandleEvent(event tview.Event) tview.Command { mi.openFilePicker() return tview.Batch(cmds...) case keybind.Matches(event, mi.cfg.Keybinds.MessageInput.Cancel.Keybind): - var cmds []tview.Command + var cmds []tview.Cmd if mi.chat.GetVisible(mentionsListLayerName) { - mi.stopTabCompletion(func(next tview.Command) { + mi.stopTabCompletion(func(next tview.Cmd) { if next != nil { cmds = append(cmds, next) } @@ -174,7 +174,7 @@ func (mi *messageInput) HandleEvent(event tview.Event) tview.Command { keybind.Matches(event, keybinds.Down.Keybind) || keybind.Matches(event, keybinds.Top.Keybind) || keybind.Matches(event, keybinds.Bottom.Keybind) { - return mi.mentionsList.HandleEvent(event) + return mi.mentionsList.Update(event) } } @@ -619,7 +619,7 @@ func (mi *messageInput) removeMentionsList() { } } -func (mi *messageInput) stopTabCompletion(emit func(tview.Command)) { +func (mi *messageInput) stopTabCompletion(emit func(tview.Cmd)) { if mi.cfg.AutocompleteLimit > 0 { mi.mentionsList.clear() if emit != nil { diff --git a/internal/ui/chat/messages_list.go b/internal/ui/chat/messages_list.go index 0958fe0..48ac306 100644 --- a/internal/ui/chat/messages_list.go +++ b/internal/ui/chat/messages_list.go @@ -844,7 +844,7 @@ func (ml *messagesList) selectedMessage() (*discord.Message, error) { return &ml.messages[cursor], nil } -func (ml *messagesList) HandleEvent(event tview.Event) tview.Command { +func (ml *messagesList) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tview.KeyEvent: switch { @@ -889,7 +889,7 @@ func (ml *messagesList) HandleEvent(event tview.Event) tview.Command { ml.confirmDelete() return nil } - return ml.Model.HandleEvent(event) + return ml.Model.Update(event) case *olderMessagesLoadedEvent: selectedChannel := ml.chatView.SelectedChannel() @@ -917,10 +917,10 @@ func (ml *messagesList) HandleEvent(event tview.Event) tview.Command { } return nil } - return ml.Model.HandleEvent(event) + return ml.Model.Update(event) } -func (ml *messagesList) selectUp() tview.Command { +func (ml *messagesList) selectUp() tview.Cmd { messages := ml.messages if len(messages) == 0 { return nil @@ -992,7 +992,7 @@ func (ml *messagesList) selectReply() { } } -func (ml *messagesList) fetchOlderMessages() tview.Command { +func (ml *messagesList) fetchOlderMessages() tview.Cmd { selectedChannel := ml.chatView.SelectedChannel() if selectedChannel == nil { return nil @@ -1021,7 +1021,7 @@ func (ml *messagesList) fetchOlderMessages() tview.Command { } } -func (ml *messagesList) yankMessageID() tview.Command { +func (ml *messagesList) yankMessageID() tview.Cmd { msg, err := ml.selectedMessage() if err != nil { slog.Error("failed to get selected message", "err", err) @@ -1036,7 +1036,7 @@ func (ml *messagesList) yankMessageID() tview.Command { } } -func (ml *messagesList) yankContent() tview.Command { +func (ml *messagesList) yankContent() tview.Cmd { msg, err := ml.selectedMessage() if err != nil { slog.Error("failed to get selected message", "err", err) @@ -1051,7 +1051,7 @@ func (ml *messagesList) yankContent() tview.Command { } } -func (ml *messagesList) yankURL() tview.Command { +func (ml *messagesList) yankURL() tview.Cmd { msg, err := ml.selectedMessage() if err != nil { slog.Error("failed to get selected message", "err", err) @@ -1279,8 +1279,8 @@ func (ml *messagesList) editSelectedMessage() { func (ml *messagesList) confirmDelete() { onChoice := func(choice string) { if choice == "Yes" { - if command := ml.deleteSelectedMessage(); command != nil { - command() + if cmd := ml.deleteSelectedMessage(); cmd != nil { + cmd() } } } @@ -1292,7 +1292,7 @@ func (ml *messagesList) confirmDelete() { ) } -func (ml *messagesList) deleteSelectedMessage() tview.Command { +func (ml *messagesList) deleteSelectedMessage() tview.Cmd { selectedMessage, err := ml.selectedMessage() if err != nil { slog.Error("failed to get selected message", "err", err) diff --git a/internal/ui/chat/model.go b/internal/ui/chat/model.go index 8fed081..b153371 100644 --- a/internal/ui/chat/model.go +++ b/internal/ui/chat/model.go @@ -166,10 +166,10 @@ func (m *Model) openPicker() { func (m *Model) closePicker() { m.RemoveLayer(channelsPickerLayerName) - m.channelsPicker.Update() + m.channelsPicker.Refresh() } -func (m *Model) toggleGuildsTree() tview.Command { +func (m *Model) toggleGuildsTree() tview.Cmd { // The guilds tree is visible if the number of items is two. if m.mainFlex.GetItemCount() == 2 { m.mainFlex.RemoveItem(m.guildsTree) @@ -183,7 +183,7 @@ func (m *Model) toggleGuildsTree() tview.Command { return nil } -func (m *Model) focusGuildsTree() tview.Command { +func (m *Model) focusGuildsTree() tview.Cmd { // The guilds tree is not hidden if the number of items is two. if m.mainFlex.GetItemCount() == 2 { return tview.SetFocus(m.guildsTree) @@ -191,18 +191,18 @@ func (m *Model) focusGuildsTree() tview.Command { return nil } -func (m *Model) focusMessageInput() tview.Command { +func (m *Model) focusMessageInput() tview.Cmd { if !m.messageInput.GetDisabled() { return tview.SetFocus(m.messageInput) } return nil } -func (m *Model) focusMessagesList() tview.Command { +func (m *Model) focusMessagesList() tview.Cmd { return tview.SetFocus(m.messagesList) } -func (m *Model) focusPrevious() tview.Command { +func (m *Model) focusPrevious() tview.Cmd { switch m.app.Focused() { case m.guildsTree: if cmd := m.focusMessageInput(); cmd != nil { @@ -224,7 +224,7 @@ func (m *Model) focusPrevious() tview.Command { return nil } -func (m *Model) focusNext() tview.Command { +func (m *Model) focusNext() tview.Cmd { switch m.app.Focused() { case m.guildsTree: return m.focusMessagesList() @@ -245,7 +245,7 @@ func (m *Model) focusNext() tview.Command { return nil } -func (m *Model) HandleEvent(event tview.Event) tview.Command { +func (m *Model) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tview.InitEvent: return tview.Batch(m.openState(), m.listen()) @@ -301,14 +301,14 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { m.messageInput.SetDisabled(hasNoPerm) text := "Message..." - var focusCommand tview.Command + var focusCmd tview.Cmd if hasNoPerm { text = "You do not have permission to send messages in this channel." } else if m.cfg.AutoFocus { - focusCommand = m.focusMessageInput() + focusCmd = m.focusMessageInput() } m.messageInput.SetPlaceholder(tview.NewLine(tview.NewSegment(text, tcell.StyleDefault.Dim(true)))) - return focusCommand + return focusCmd case *QuitEvent: return tview.Batch( m.closeState(), @@ -317,7 +317,7 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { case *tview.ModalDoneEvent: if m.HasLayer(confirmModalLayerName) { m.RemoveLayer(confirmModalLayerName) - var focusCmd tview.Command + var focusCmd tview.Cmd if m.confirmModalPreviousFocus != nil { focusCmd = tview.SetFocus(m.confirmModalPreviousFocus) } @@ -360,7 +360,7 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { } return nil } - return m.Layers.HandleEvent(event) + return m.Layers.Update(event) } func (m *Model) showConfirmModal(prompt string, buttons []string, onDone func(label string)) { diff --git a/internal/ui/chat/state.go b/internal/ui/chat/state.go index 94d5ff3..447a1a3 100644 --- a/internal/ui/chat/state.go +++ b/internal/ui/chat/state.go @@ -31,7 +31,7 @@ func (m *Model) onRaw(event *ws.RawEvent) { ) } -func (m *Model) onReady(event *gateway.ReadyEvent) tview.Command { +func (m *Model) onReady(event *gateway.ReadyEvent) tview.Cmd { // Rebuild indexes from scratch so reconnects and account switches do not // retain pointers to detached tree nodes. m.guildsTree.resetNodeIndex() @@ -97,7 +97,7 @@ func (m *Model) onReady(event *gateway.ReadyEvent) tview.Command { return tview.SetFocus(m.guildsTree) } -func (m *Model) onMessageCreate(message *gateway.MessageCreateEvent) tview.Command { +func (m *Model) onMessageCreate(message *gateway.MessageCreateEvent) tview.Cmd { selectedChannel := m.SelectedChannel() if selectedChannel != nil && selectedChannel.ID == message.ChannelID { m.removeTyper(message.Author.ID) @@ -108,7 +108,7 @@ func (m *Model) onMessageCreate(message *gateway.MessageCreateEvent) tview.Comma return m.notify(*message) } -func (m *Model) notify(message gateway.MessageCreateEvent) tview.Command { +func (m *Model) notify(message gateway.MessageCreateEvent) tview.Cmd { return func() tview.Event { if err := notifications.Notify(m.state, message, m.cfg); err != nil { slog.Error("failed to notify", "err", err, "channel_id", message.ChannelID, "message_id", message.ID) diff --git a/internal/ui/login/events.go b/internal/ui/login/events.go index 1e3508b..ab35b1f 100644 --- a/internal/ui/login/events.go +++ b/internal/ui/login/events.go @@ -8,7 +8,7 @@ import ( "github.com/gdamore/tcell/v3" ) -func setClipboard(content string) tview.Command { +func setClipboard(content string) tview.Cmd { return func() tview.Event { if err := clipboard.Write(clipboard.FmtText, []byte(content)); err != nil { slog.Error("failed to copy error message", "err", err) diff --git a/internal/ui/login/model.go b/internal/ui/login/model.go index a6edcd8..b5ada00 100644 --- a/internal/ui/login/model.go +++ b/internal/ui/login/model.go @@ -41,7 +41,7 @@ func NewModel(cfg *config.Config) *Model { } } -func (m *Model) HandleEvent(event tview.Event) tview.Command { +func (m *Model) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tcell.EventError: if m.HasLayer(errorLayerName) { @@ -59,10 +59,10 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { m.errorModalText = "" return nil } - return m.Layers.HandleEvent(event) + return m.Layers.Update(event) } -func (m *Model) showErrorDialog(err error) tview.Command { +func (m *Model) showErrorDialog(err error) tview.Cmd { slog.Error("failed to login", "err", err) message := err.Error() diff --git a/internal/ui/login/qr/events.go b/internal/ui/login/qr/events.go index d254fca..f755955 100644 --- a/internal/ui/login/qr/events.go +++ b/internal/ui/login/qr/events.go @@ -33,7 +33,7 @@ type connCreateEvent struct { type connCloseEvent struct{ tcell.EventTime } -func (m *Model) connect() tview.Command { +func (m *Model) connect() tview.Cmd { return func() tview.Event { headers := http.Headers() headers.Set("User-Agent", http.BrowserUserAgent) @@ -45,7 +45,7 @@ func (m *Model) connect() tview.Command { } } -func (m *Model) close() tview.Command { +func (m *Model) close() tview.Cmd { return func() tview.Event { if m.conn != nil { if err := m.conn.Close(); err != nil { @@ -84,7 +84,7 @@ type pendingLoginEvent struct { type cancelEvent struct{ tcell.EventTime } -func (m *Model) listen() tview.Command { +func (m *Model) listen() tview.Cmd { return func() tview.Event { if m.conn == nil { return nil @@ -154,14 +154,14 @@ func (m *Model) listen() tview.Command { type heartbeatTickEvent struct{ tcell.EventTime } -func (m *Model) heartbeat() tview.Command { +func (m *Model) heartbeat() tview.Cmd { return func() tview.Event { time.Sleep(m.heartbeatInterval) return &heartbeatTickEvent{} } } -func (m *Model) sendHeartbeat() tview.Command { +func (m *Model) sendHeartbeat() tview.Cmd { return func() tview.Event { if m.conn == nil { return nil @@ -181,7 +181,7 @@ type privateKeyEvent struct { privateKey *rsa.PrivateKey } -func (m *Model) generatePrivateKey() tview.Command { +func (m *Model) generatePrivateKey() tview.Cmd { return func() tview.Event { privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { @@ -191,7 +191,7 @@ func (m *Model) generatePrivateKey() tview.Command { } } -func (m *Model) sendInit() tview.Command { +func (m *Model) sendInit() tview.Cmd { return func() tview.Event { if m.privateKey == nil { return tcell.NewEventError(errors.New("missing private key")) @@ -212,7 +212,7 @@ func (m *Model) sendInit() tview.Command { } } -func (m *Model) sendNonceProof(encryptedNonce string) tview.Command { +func (m *Model) sendNonceProof(encryptedNonce string) tview.Cmd { return func() tview.Event { decodedNonce, err := base64.StdEncoding.DecodeString(encryptedNonce) if err != nil { @@ -241,7 +241,7 @@ type qrCodeEvent struct { qrCode *qrcode.QRCode } -func (m *Model) generateQRCode(fingerprint string) tview.Command { +func (m *Model) generateQRCode(fingerprint string) tview.Cmd { return func() tview.Event { content := "https://discord.com/ra/" + fingerprint qrCode, err := qrcode.New(content, qrcode.Low) @@ -259,7 +259,7 @@ type userEvent struct { username string } -func (m *Model) decryptUserPayload(encryptedPayload string) tview.Command { +func (m *Model) decryptUserPayload(encryptedPayload string) tview.Cmd { return func() tview.Event { decodedPayload, err := base64.StdEncoding.DecodeString(encryptedPayload) if err != nil { @@ -280,7 +280,7 @@ func (m *Model) decryptUserPayload(encryptedPayload string) tview.Command { } } -func (m *Model) exchangeTicket(ticket string) tview.Command { +func (m *Model) exchangeTicket(ticket string) tview.Cmd { return func() tview.Event { headers := http.Headers() headers.Set("Referer", "https://discord.com/login") diff --git a/internal/ui/login/qr/model.go b/internal/ui/login/qr/model.go index 221404f..a156ae4 100644 --- a/internal/ui/login/qr/model.go +++ b/internal/ui/login/qr/model.go @@ -44,7 +44,7 @@ func (m *Model) Label() string { return "QR" } -func (m *Model) HandleEvent(event tview.Event) tview.Command { +func (m *Model) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tview.InitEvent: m.msg = "Connecting to Remote Auth Gateway..." @@ -54,7 +54,7 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { m.msg = "Canceled" return tview.Batch(m.close(), nil) } - return m.TextView.HandleEvent(event) + return m.TextView.Update(event) case *connCreateEvent: m.conn = event.conn @@ -103,7 +103,7 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { case *tcell.EventError: m.msg = event.Error() - return tview.Batch(m.close(), tview.Command(func() tview.Event { return event })) + return tview.Batch(m.close(), tview.Cmd(func() tview.Event { return event })) } return nil diff --git a/internal/ui/login/token/events.go b/internal/ui/login/token/events.go index e906393..b57585c 100644 --- a/internal/ui/login/token/events.go +++ b/internal/ui/login/token/events.go @@ -10,7 +10,7 @@ type TokenEvent struct { Token string } -func tokenCommand(token string) tview.Command { +func tokenCommand(token string) tview.Cmd { return func() tview.Event { return &TokenEvent{Token: token} } diff --git a/internal/ui/login/token/model.go b/internal/ui/login/token/model.go index 72256d1..700153c 100644 --- a/internal/ui/login/token/model.go +++ b/internal/ui/login/token/model.go @@ -22,7 +22,7 @@ func (m *Model) Label() string { return "Token" } -func (m *Model) HandleEvent(event tview.Event) tview.Command { +func (m *Model) Update(event tview.Event) tview.Cmd { switch event.(type) { case *tview.FormSubmitEvent: token := m.GetFormItem(0).(*tview.InputField).GetText() @@ -31,5 +31,5 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { } return tokenCommand(token) } - return m.Form.HandleEvent(event) + return m.Form.Update(event) } diff --git a/internal/ui/root/events.go b/internal/ui/root/events.go index 87627b9..3f3e0a6 100644 --- a/internal/ui/root/events.go +++ b/internal/ui/root/events.go @@ -14,7 +14,7 @@ type tokenEvent struct { token string } -func tokenCommand(token string) tview.Command { +func tokenCommand(token string) tview.Cmd { return func() tview.Event { return &tokenEvent{token: token} } @@ -22,7 +22,7 @@ func tokenCommand(token string) tview.Command { type loginEvent struct{ tcell.EventTime } -func getToken() tview.Command { +func getToken() tview.Cmd { return func() tview.Event { token, err := keyring.GetToken() if err != nil { @@ -33,7 +33,7 @@ func getToken() tview.Command { } } -func setToken(token string) tview.Command { +func setToken(token string) tview.Cmd { return func() tview.Event { if err := keyring.SetToken(token); err != nil { slog.Error("failed to set token to keyring", "err", err) @@ -43,7 +43,7 @@ func setToken(token string) tview.Command { } } -func deleteToken() tview.Command { +func deleteToken() tview.Cmd { return func() tview.Event { if err := keyring.DeleteToken(); err != nil { slog.Error("failed to delete token from keyring", "err", err) @@ -53,7 +53,7 @@ func deleteToken() tview.Command { } } -func initClipboard() tview.Command { +func initClipboard() tview.Cmd { return func() tview.Event { if err := clipboard.Init(); err != nil { slog.Error("failed to init clipboard", "err", err) diff --git a/internal/ui/root/model.go b/internal/ui/root/model.go index 5b4e2b5..0f85231 100644 --- a/internal/ui/root/model.go +++ b/internal/ui/root/model.go @@ -53,16 +53,16 @@ func NewModel(cfg *config.Config, app *tview.Application) *Model { return m } -func (m *Model) showLogin() tview.Command { +func (m *Model) showLogin() tview.Cmd { m.inner = login.NewModel(m.cfg) m.buildLayout() - return tview.Batch(m.inner.HandleEvent(&tview.InitEvent{}), tview.SetFocus(m)) + return tview.Batch(m.inner.Update(&tview.InitEvent{}), tview.SetFocus(m)) } -func (m *Model) showChat(token string) tview.Command { +func (m *Model) showChat(token string) tview.Cmd { m.inner = chat.NewModel(m.app, m.cfg, token) m.buildLayout() - return tview.Batch(m.inner.HandleEvent(&tview.InitEvent{}), tview.SetFocus(m)) + return tview.Batch(m.inner.Update(&tview.InitEvent{}), tview.SetFocus(m)) } func (m *Model) buildLayout() { @@ -80,10 +80,10 @@ func (m *Model) Draw(screen tcell.Screen) { m.rootFlex.Draw(screen) } -func (m *Model) HandleEvent(event tview.Event) tview.Command { +func (m *Model) Update(event tview.Event) tview.Cmd { switch event := event.(type) { case *tview.InitEvent: - var cmd tview.Command + var cmd tview.Cmd if token := os.Getenv(tokenEnvVarKey); token != "" { cmd = tokenCommand(token) } else { @@ -121,16 +121,16 @@ func (m *Model) HandleEvent(event tview.Event) tview.Command { m.suspend() return nil case keybind.Matches(event, m.cfg.Keybinds.Quit.Keybind): - var innerCmd tview.Command + var innerCmd tview.Cmd if m.inner != nil { - innerCmd = m.inner.HandleEvent(&chat.QuitEvent{}) + innerCmd = m.inner.Update(&chat.QuitEvent{}) } return tview.Batch(innerCmd, tview.Quit()) } } if m.inner != nil { - return m.inner.HandleEvent(event) + return m.inner.Update(event) } return nil }