build(deps): upgrade deps to latest

This commit is contained in:
ayn2op 2026-04-03 00:18:50 -04:00
parent adda09d1ca
commit 51beca67e9
18 changed files with 102 additions and 101 deletions

8
go.mod
View file

@ -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

16
go.sum
View file

@ -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=

View file

@ -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 {

View file

@ -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() {

View file

@ -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}
}

View file

@ -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

View file

@ -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 {

View file

@ -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)

View file

@ -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)) {

View file

@ -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)

View file

@ -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)

View file

@ -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()

View file

@ -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")

View file

@ -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

View file

@ -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}
}

View file

@ -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)
}

View file

@ -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)

View file

@ -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
}