Explorar el Código

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

ayntgl hace 3 años
padre
commit
259b583712
Se han modificado 6 ficheros con 47 adiciones y 8 borrados
  1. 21 1
      main.go
  2. 6 1
      ui/channels_view.go
  3. 5 2
      ui/core.go
  4. 13 1
      ui/input_view.go
  5. 2 2
      ui/login_view.go
  6. 0 1
      ui/messages_view.go

+ 21 - 1
main.go

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

+ 6 - 1
ui/channels_view.go

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

+ 5 - 2
ui/core.go

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

+ 13 - 1
ui/input_view.go

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

+ 2 - 2
ui/login_view.go

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

+ 0 - 1
ui/messages_view.go

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