Log fatal and non-fatal errors to file (#226)

This commit is contained in:
ayntgl 2022-09-26 21:18:38 +05:30 • committed by GitHub
parent 3c507d4b34
commit 259b583712
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 47 additions and 8 deletions

22
main.go
View file

@ -3,6 +3,8 @@ package main
import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"github.com/ayntgl/discordo/config"
@ -14,6 +16,20 @@ import (
)
func init() {
cacheDir, err := os.UserCacheDir()
if err != nil {
log.Fatal(err)
}
f, err := os.Open(filepath.Join(cacheDir, config.Name, "out.log"))
if err != nil {
log.Fatal(err)
}
defer f.Close()
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile)
tview.Borders.TopLeftFocus = tview.Borders.TopLeft
tview.Borders.TopRightFocus = tview.Borders.TopRight
tview.Borders.BottomLeftFocus = tview.Borders.BottomLeft
@ -42,8 +58,12 @@ func main() {
log.Fatal(err)
}
token, err := keyring.Get(config.Name, "token")
if err != nil {
log.Println(err)
}
c := ui.NewCore(cfg)
token, _ := keyring.Get(config.Name, "token")
if token != "" {
err = c.Run(token)
if err != nil {

View file

@ -1,6 +1,7 @@
package ui
import (
"log"
"sort"
"github.com/diamondburned/arikawa/v3/discord"
@ -65,13 +66,15 @@ func (v *ChannelsView) onSelected(node *tview.TreeNode) {
// The returned slice will be sorted from latest to oldest.
ms, err := v.core.State.Messages(c.ID, v.core.Config.MessagesLimit)
if err != nil {
log.Println(err)
return
}
for i := len(ms) - 1; i >= 0; i-- {
_, err = v.core.MessagesView.Write(buildMessage(v.core, ms[i]))
if err != nil {
return
log.Println(err)
continue
}
}
@ -89,6 +92,7 @@ func (v *ChannelsView) createChannelNode(c discord.Channel) *tview.TreeNode {
func (v *ChannelsView) createPrivateChannelNodes(root *tview.TreeNode) {
cs, err := v.core.State.Cabinet.PrivateChannels()
if err != nil {
log.Println(err)
return
}
@ -104,6 +108,7 @@ func (v *ChannelsView) createPrivateChannelNodes(root *tview.TreeNode) {
func (v *ChannelsView) createGuildChannelNodes(root *tview.TreeNode, gID discord.GuildID) {
cs, err := v.core.State.Cabinet.Channels(gID)
if err != nil {
log.Println(err)
return
}

View file

@ -2,6 +2,7 @@ package ui
import (
"context"
"log"
"strings"
"github.com/ayntgl/discordo/config"
@ -147,7 +148,8 @@ func (c *Core) onReady(r *gateway.ReadyEvent) {
for _, gID := range gf.GuildIDs {
g, err := c.State.Cabinet.Guild(gID)
if err != nil {
return
log.Println(err)
continue
}
guildNode := tview.NewTreeNode(g.Name)
@ -179,7 +181,8 @@ func (c *Core) onReady(r *gateway.ReadyEvent) {
for _, gID := range gf.GuildIDs {
g, err := c.State.Cabinet.Guild(gID)
if err != nil {
return
log.Println(err)
continue
}
guildNode := tview.NewTreeNode(g.Name)

View file

@ -2,6 +2,7 @@ package ui
import (
"io"
"log"
"os"
"os/exec"
"strings"
@ -69,12 +70,14 @@ func (v *InputView) sendMessage() *tcell.EventKey {
ms, err := v.core.State.Messages(v.core.ChannelsView.selectedChannel.ID, v.core.Config.MessagesLimit)
if err != nil {
log.Println(err)
return nil
}
if len(v.core.MessagesView.GetHighlights()) != 0 {
mID, err := discord.ParseSnowflake(v.core.MessagesView.GetHighlights()[0])
if err != nil {
log.Println(err)
return nil
}
@ -105,7 +108,12 @@ func (v *InputView) sendMessage() *tcell.EventKey {
}
func (v *InputView) pasteClipboard() *tcell.EventKey {
text, _ := clipboard.ReadAll()
text, err := clipboard.ReadAll()
if err != nil {
log.Println(err)
return nil
}
text = v.GetText() + text
v.SetText(text)
return nil
@ -114,11 +122,13 @@ func (v *InputView) pasteClipboard() *tcell.EventKey {
func (v *InputView) openExternalEditor() *tcell.EventKey {
e := os.Getenv("EDITOR")
if e == "" {
log.Println("environment variable EDITOR is empty")
return nil
}
f, err := os.CreateTemp(os.TempDir(), "discordo-*.md")
if err != nil {
log.Println(err)
return nil
}
defer os.Remove(f.Name())
@ -130,12 +140,14 @@ func (v *InputView) openExternalEditor() *tcell.EventKey {
v.core.App.Suspend(func() {
err = cmd.Run()
if err != nil {
log.Println(err)
return
}
})
b, err := io.ReadAll(f)
if err != nil {
log.Println(err)
return nil
}

View file

@ -21,7 +21,7 @@ func NewLoginView(c *Core) *tview.Pages {
v.AddPage(emailViewPageName, newEmailView(c), true, true)
v.AddPage(tokenViewPageName, newTokenView(c), true, true)
// The email view is displayed on the screen first since it is the recommended method to login.
// Since the recommended method to login is using the email and password, it is displayed on the screen first.
v.SwitchToPage(emailViewPageName)
v.SetTitle("Login")
@ -40,6 +40,7 @@ func NewLoginView(c *Core) *tview.Pages {
}
v.SwitchToPage(name)
return nil
}
return event
@ -76,7 +77,6 @@ func (v *EmailView) onLoginButtonSelected() {
// Make a scratch HTTP client without a token
client := api.NewClient("").WithContext(context.Background())
// Try to login without TOTP
l, err := client.Login(email, password)
if err != nil {

View file

@ -47,7 +47,6 @@ func (v *MessagesView) onInputCapture(e *tcell.EventKey) *tcell.EventKey {
return nil
}
// Defaults
switch e.Name() {
case v.core.Config.Keys.MessagesView.OpenActionsView:
return v.openActionsView(ms)