diff --git a/config/keybindings.go b/config/keybindings.go index 3633055..d9715ec 100644 --- a/config/keybindings.go +++ b/config/keybindings.go @@ -7,17 +7,12 @@ type KeybindingsConfig struct { ToggleMessageInputField string `toml:"toggle_message_input_field"` OpenMessageActionsList string `toml:"open_message_actions_list"` - OpenExternalEditor string `toml:"open_external_editor"` - OpenAttachment string `toml:"open_attachment"` - DownloadAttachment string `toml:"download_attachment"` - SelectPreviousMessage string `toml:"select_previous_message"` SelectNextMessage string `toml:"select_next_message"` SelectFirstMessage string `toml:"select_first_message"` SelectLastMessage string `toml:"select_last_message"` - } func newKeybindingsConfig() KeybindingsConfig { @@ -30,9 +25,6 @@ func newKeybindingsConfig() KeybindingsConfig { OpenMessageActionsList: "Rune[a]", OpenExternalEditor: "Ctrl+E", - OpenAttachment: "Rune[o]", - DownloadAttachment: "Rune[d]", - SelectPreviousMessage: "Up", SelectNextMessage: "Down", SelectFirstMessage: "Home", diff --git a/ui/messages.go b/ui/messages.go index 7cb2f0e..a78c5f1 100644 --- a/ui/messages.go +++ b/ui/messages.go @@ -95,83 +95,6 @@ func (mtv *MessagesTextView) onInputCapture(e *tcell.EventKey) *tcell.EventKey { ScrollToHighlight() return nil - - case mtv.app.Config.Keybindings.OpenAttachment: - if ms[mtv.app.SelectedMessage].Attachments != nil { - for _, a := range ms[mtv.app.SelectedMessage].Attachments { - // We are caching the files, but files with the same name can still exist, so it ultimately does not matter - t, _ := os.UserCacheDir() - f, err := os.Create(filepath.Join(t, a.Filename)) - if err != nil { - f.Close() - return nil - } - response, err := http.Get(a.URL) - if err != nil { - f.Close() - return nil - } - - d, err := ioutil.ReadAll(response.Body) - if err != nil { - f.Close() - return nil - } - f.Write(d) - f.Close() - if runtime.GOOS == "windows" { - // On windows, `start` can do all the heavy lifting through `cmd` - cmd := exec.Command("cmd", "/C start "+f.Name()) - err := cmd.Run() - if err != nil { - return nil - } - } else if runtime.GOOS == "linux" { - // On linux, we'll assume xdg-open exists and try using that - cmd := exec.Command("xdg-open", f.Name()) - err := cmd.Run() - if err != nil { - return nil - } - } else if runtime.GOOS == "darwin" { - // On MacOS open should do the trick - cmd := exec.Command("open", f.Name()) - err := cmd.Run() - if err != nil { - return nil - } - } else { - // If we're on none of those platforms, I think I made some sort of fatal mistake - return nil - } - } - } - return nil - case mtv.app.Config.Keybindings.DownloadAttachment: - if ms[mtv.app.SelectedMessage].Attachments != nil { - // Download the files to the configured location - for _, a := range ms[mtv.app.SelectedMessage].Attachments { - f, err := os.Create(filepath.Join(mtv.app.Config.General.AttachmentDownloadsDir + a.Filename)) - if err != nil { - f.Close() - return nil - } - - response, err := http.Get(a.URL) - if err != nil { - f.Close() - return nil - } - - d, err := ioutil.ReadAll(response.Body) - if err != nil { - f.Close() - return nil - } - f.Write(d) - f.Close() - } - } case mtv.app.Config.Keybindings.OpenMessageActionsList: messageActionsList := tview.NewList() @@ -186,15 +109,19 @@ func (mtv *MessagesTextView) onInputCapture(e *tcell.EventKey) *tcell.EventKey { } if discord.HasPermission(mtv.app.Session.State, mtv.app.SelectedChannel.ID, discordgo.PermissionSendMessages) { - messageActionsList. - AddItem("Reply", "", 'r', nil). - AddItem("Mention Reply", "", 'R', nil) + messageActionsList.AddItem("Reply", "", 'r', nil) + messageActionsList.AddItem("Mention Reply", "", 'R', nil) } if m.ReferencedMessage != nil { messageActionsList.AddItem("Select Reply", "", 'm', nil) } + if len(m.Attachments) != 0 { + messageActionsList.AddItem("Download Attachment", "", 'd', nil) + messageActionsList.AddItem("Open Attachment", "", 'o', nil) + } + messageActionsList. ShowSecondaryText(false). AddItem("Copy Content", "", 'c', nil). @@ -258,6 +185,77 @@ func onMessageActionsListSelected(app *App, mainText string, m *discordgo.Messag app. SetRoot(app.MainFlex, false). SetFocus(app.MessagesTextView) + case "Download Attachment": + for _, a := range m.Attachments { + f, err := os.Create(filepath.Join(app.Config.General.AttachmentDownloadsDir, a.Filename)) + if err != nil { + f.Close() + return + } + defer f.Close() + + resp, err := http.Get(a.URL) + if err != nil { + return + } + + d, err := ioutil.ReadAll(resp.Body) + if err != nil { + return + } + + f.Write(d) + } + + app.SetRoot(app.MainFlex, false) + case "Open Attachment": + for _, a := range m.Attachments { + // We are caching the files, but files with the same name can still exist, so it ultimately does not matter + cachePath, _ := os.UserCacheDir() + f, err := os.Create(filepath.Join(cachePath, a.Filename)) + if err != nil { + return + } + defer f.Close() + + resp, err := http.Get(a.URL) + if err != nil { + return + } + + d, err := ioutil.ReadAll(resp.Body) + if err != nil { + return + } + + f.Write(d) + go Open(f.Name()) + } + + app.SetRoot(app.MainFlex, false) + } +} + +func Open(input string) { + switch runtime.GOOS { + case "windows": + cmd := exec.Command("cmd", "/C start "+input) + err := cmd.Run() + if err != nil { + return + } + case "darwin": + cmd := exec.Command("open", input) + err := cmd.Run() + if err != nil { + return + } + default: // Unix + cmd := exec.Command("xdg-open", input) + err := cmd.Run() + if err != nil { + return + } } }