Преглед на файлове

Revert "feat: replace slog with charmbracelet/log"

This reverts commit a5c55401472f63e5b258c1e6dd51259ac694ed60.
ayn2op преди 1 година
родител
ревизия
4b47c68962
променени са 9 файла, в които са добавени 69 реда и са изтрити 86 реда
  1. 7 8
      cmd/guilds_tree.go
  2. 5 5
      cmd/layout.go
  3. 16 15
      cmd/message_input.go
  4. 14 14
      cmd/messages_text.go
  5. 2 2
      cmd/state.go
  6. 1 8
      go.mod
  7. 2 19
      go.sum
  8. 19 12
      internal/logger/logger.go
  9. 3 3
      main.go

+ 7 - 8
cmd/guilds_tree.go

@@ -2,11 +2,11 @@ package cmd
 
 import (
 	"fmt"
+	"log/slog"
 	"sort"
 	"strings"
 
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/diamondburned/arikawa/v3/gateway"
 	"github.com/gdamore/tcell/v2"
@@ -64,7 +64,7 @@ func (gt *GuildsTree) createFolderNode(folder gateway.GuildFolder) {
 	for _, gID := range folder.GuildIDs {
 		g, err := discordState.Cabinet.Guild(gID)
 		if err != nil {
-			log.Error("failed to get guild from state", "guild_id", gID, "err", err)
+			slog.Info("guild not found in state", "err", err, "guild", g)
 			continue
 		}
 
@@ -110,10 +110,9 @@ func (gt *GuildsTree) channelToString(c discord.Channel) string {
 
 func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) *tview.TreeNode {
 	if c.Type != discord.DirectMessage && c.Type != discord.GroupDM {
-		userID := discordState.Ready().User.ID
-		ps, err := discordState.Permissions(c.ID, userID)
+		ps, err := discordState.Permissions(c.ID, discordState.Ready().User.ID)
 		if err != nil {
-			log.Error("failed to get permissions for user in channel", "user_id", userID, "channel_id", c.ID, "err", err)
+			slog.Error("failed to get permissions", "err", err, "channel_id", c.ID)
 			return nil
 		}
 
@@ -187,7 +186,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
 	case discord.GuildID:
 		cs, err := discordState.Cabinet.Channels(ref)
 		if err != nil {
-			log.Error("failed to get channels in the guild", "guild_id", ref, "err", err)
+			slog.Error("failed to get channels", "err", err, "guild_id", ref)
 			return
 		}
 
@@ -202,7 +201,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
 
 		c, err := discordState.Cabinet.Channel(ref)
 		if err != nil {
-			log.Error("channel not found in state", "channel_id", ref, "err", err)
+			slog.Error("failed to get channel", "channel_id", ref)
 			return
 		}
 
@@ -213,7 +212,7 @@ func (gt *GuildsTree) onSelected(n *tview.TreeNode) {
 	case nil: // Direct messages
 		cs, err := discordState.PrivateChannels()
 		if err != nil {
-			log.Error("failed to get private channels", "err", err)
+			slog.Error("failed to get private channels", "err", err)
 			return
 		}
 

+ 5 - 5
cmd/layout.go

@@ -1,8 +1,9 @@
 package cmd
 
 import (
+	"log/slog"
+
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
 	"github.com/gdamore/tcell/v2"
 	"github.com/rivo/tview"
 	"github.com/zalando/go-keyring"
@@ -42,13 +43,12 @@ func (l *Layout) show(token string) error {
 	if token == "" {
 		loginForm := newLoginForm(func(token string, err error) {
 			if err != nil {
-				log.Error(err)
+				slog.Error("failed to login", "err", err)
 				return
 			}
 
 			if err := l.show(token); err != nil {
-				log.Error("failed to show app", "err", err)
-				return
+				slog.Error("failed to show app", "err", err)
 			}
 		}, l.cfg)
 		l.app.SetRoot(loginForm, true)
@@ -110,7 +110,7 @@ func (l *Layout) onFlexInputCapture(event *tcell.EventKey) *tcell.EventKey {
 		l.app.Stop()
 
 		if err := keyring.Delete(config.Name, "token"); err != nil {
-			log.Error("failed to delete token from keyring", "err", err)
+			slog.Error("failed to delete token from keyring", "err", err)
 			return nil
 		}
 

+ 16 - 15
cmd/message_input.go

@@ -1,13 +1,13 @@
 package cmd
 
 import (
+	"log/slog"
 	"os"
 	"os/exec"
 	"strings"
 
 	"github.com/atotto/clipboard"
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
 	"github.com/diamondburned/arikawa/v3/api"
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/diamondburned/arikawa/v3/utils/json/option"
@@ -85,12 +85,12 @@ func (mi *MessageInput) send() {
 		return
 	}
 
-	data := api.SendMessageData{
-		Content: text,
-	}
 	if mi.replyMessageID != 0 {
-		data.Reference = &discord.MessageReference{MessageID: mi.replyMessageID}
-		data.AllowedMentions = &api.AllowedMentions{RepliedUser: option.False}
+		data := api.SendMessageData{
+			Content:         text,
+			Reference:       &discord.MessageReference{MessageID: mi.replyMessageID},
+			AllowedMentions: &api.AllowedMentions{RepliedUser: option.False},
+		}
 
 		if strings.HasPrefix(mi.GetTitle(), "[@]") {
 			data.AllowedMentions.RepliedUser = option.True
@@ -98,16 +98,17 @@ func (mi *MessageInput) send() {
 
 		go func() {
 			if _, err := discordState.SendMessageComplex(layout.guildsTree.selectedChannelID, data); err != nil {
+				slog.Error("failed to send message", "err", err)
+			}
+		}()
+	} else {
+		go func() {
+			if _, err := discordState.SendMessage(layout.guildsTree.selectedChannelID, text); err != nil {
+				slog.Error("failed to send message", "err", err)
 			}
 		}()
 	}
 
-	go func() {
-		if _, err := discordState.SendMessageComplex(layout.guildsTree.selectedChannelID, data); err != nil {
-			log.Error("failed to send message in channel", "channel_id", layout.guildsTree.selectedChannelID, "err", err)
-		}
-	}()
-
 	mi.replyMessageID = 0
 	mi.reset()
 
@@ -123,7 +124,7 @@ func (mi *MessageInput) editor() {
 
 	f, err := os.CreateTemp("", tmpFilePattern)
 	if err != nil {
-		log.Error("failed to create temporary file", "err", err)
+		slog.Error("failed to create temporary file", "err", err)
 		return
 	}
 	_, _ = f.WriteString(mi.GetText())
@@ -139,14 +140,14 @@ func (mi *MessageInput) editor() {
 	mi.app.Suspend(func() {
 		err := cmd.Run()
 		if err != nil {
-			log.Error("failed to run command", "args", cmd.Args, "err", err)
+			slog.Error("failed to run command", "err", err, "command", cmd)
 			return
 		}
 	})
 
 	msg, err := os.ReadFile(f.Name())
 	if err != nil {
-		log.Error("failed to read temporary file", "name", f.Name(), "err", err)
+		slog.Error("failed to read temporary file", "err", err, "name", f.Name())
 		return
 	}
 

+ 14 - 14
cmd/messages_text.go

@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"io"
+	"log/slog"
 	"slices"
 	"strconv"
 	"time"
@@ -11,7 +12,6 @@ import (
 	"github.com/atotto/clipboard"
 	"github.com/ayn2op/discordo/internal/config"
 	"github.com/ayn2op/discordo/internal/markdown"
-	"github.com/charmbracelet/log"
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/diamondburned/ningen/v3/discordmd"
 	"github.com/gdamore/tcell/v2"
@@ -68,7 +68,7 @@ func newMessagesText(app *tview.Application, cfg *config.Config) *MessagesText {
 func (mt *MessagesText) drawMsgs(cID discord.ChannelID) {
 	ms, err := discordState.Messages(cID, uint(mt.cfg.MessagesLimit))
 	if err != nil {
-		log.Error("failed to get messages in channel", "channel_id", cID, "err", err)
+		slog.Error("failed to get messages", "err", err, "channel_id", cID)
 		return
 	}
 
@@ -223,13 +223,13 @@ func (mt *MessagesText) onInputCapture(event *tcell.EventKey) *tcell.EventKey {
 func (mt *MessagesText) _select(name string) {
 	ms, err := discordState.Cabinet.Messages(layout.guildsTree.selectedChannelID)
 	if err != nil {
-		log.Error("failed to get messages in channel", "channel_id", layout.guildsTree.selectedChannelID, "err", err)
+		slog.Error("failed to get messages", "err", err, "channel_id", layout.guildsTree.selectedChannelID)
 		return
 	}
 
 	messageIdx, err := mt.getSelectedMessageIndex()
 	if err != nil {
-		log.Error("failed to get selected message", "err", err)
+		slog.Error("failed to get selected message", "err", err)
 		return
 	}
 
@@ -290,7 +290,7 @@ func (mt *MessagesText) onHighlighted(added, removed, remaining []string) {
 	if len(added) > 0 {
 		mID, err := strconv.ParseInt(added[0], 10, 64)
 		if err != nil {
-			log.Error("failed to parse region ID", "id", added[0], "err", err)
+			slog.Error("Failed to parse region id as int to use as message id.", "err", err)
 			return
 		}
 		mt.selectedMessageID = discord.MessageID(mID)
@@ -300,13 +300,13 @@ func (mt *MessagesText) onHighlighted(added, removed, remaining []string) {
 func (mt *MessagesText) yank() {
 	msg, err := mt.getSelectedMessage()
 	if err != nil {
-		log.Error("failed to get selected message", "err", err)
+		slog.Error("failed to get selected message", "err", err)
 		return
 	}
 
 	err = clipboard.WriteAll(msg.Content)
 	if err != nil {
-		log.Error("failed to write to clipboard", "err", err)
+		slog.Error("failed to write to clipboard", "err", err)
 		return
 	}
 }
@@ -314,7 +314,7 @@ func (mt *MessagesText) yank() {
 func (mt *MessagesText) open() {
 	msg, err := mt.getSelectedMessage()
 	if err != nil {
-		log.Error("failed to get selected message", "err", err)
+		slog.Error("failed to get selected message", "err", err)
 		return
 	}
 
@@ -326,7 +326,7 @@ func (mt *MessagesText) open() {
 	for _, a := range attachments {
 		go func() {
 			if err := open.Start(a.URL); err != nil {
-				log.Error("failed to open url", "content_type", a.ContentType, "url", a.URL, "err", err)
+				slog.Error("failed to open URL", "err", err, "url", a.URL)
 			}
 		}()
 	}
@@ -342,7 +342,7 @@ func (mt *MessagesText) reply(mention bool) {
 
 	msg, err := mt.getSelectedMessage()
 	if err != nil {
-		log.Error("failed to get selected message", "err", err)
+		slog.Error("failed to get selected message", "err", err)
 		return
 	}
 
@@ -355,7 +355,7 @@ func (mt *MessagesText) reply(mention bool) {
 func (mt *MessagesText) delete() {
 	msg, err := mt.getSelectedMessage()
 	if err != nil {
-		log.Error("failed to get selected message", "err", err)
+		slog.Error("failed to get selected message", "err", err)
 		return
 	}
 
@@ -376,18 +376,18 @@ func (mt *MessagesText) delete() {
 	}
 
 	if err := discordState.DeleteMessage(layout.guildsTree.selectedChannelID, msg.ID, ""); err != nil {
-		log.Error("failed to delete message in channel", "channel_id", layout.guildsTree.selectedChannelID, "message_id", msg.ID, "err", err)
+		slog.Error("failed to delete message", "err", err, "channel_id", layout.guildsTree.selectedChannelID, "message_id", msg.ID)
 		return
 	}
 
 	if err := discordState.MessageRemove(layout.guildsTree.selectedChannelID, msg.ID); err != nil {
-		log.Error("failed to delete message in channel", "channel_id", layout.guildsTree.selectedChannelID, "message_id", msg.ID, "err", err)
+		slog.Error("failed to delete message", "err", err, "channel_id", layout.guildsTree.selectedChannelID, "message_id", msg.ID)
 		return
 	}
 
 	ms, err := discordState.Cabinet.Messages(layout.guildsTree.selectedChannelID)
 	if err != nil {
-		log.Error("failed to get messages in channel", "channel_id", layout.guildsTree.selectedChannelID, "err", err)
+		slog.Error("failed to delete message", "err", err, "channel_id", layout.guildsTree.selectedChannelID)
 		return
 	}
 

+ 2 - 2
cmd/state.go

@@ -2,11 +2,11 @@ package cmd
 
 import (
 	"context"
+	"log/slog"
 	"runtime"
 	"slices"
 
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
 	"github.com/diamondburned/arikawa/v3/api"
 	"github.com/diamondburned/arikawa/v3/discord"
 	"github.com/diamondburned/arikawa/v3/gateway"
@@ -54,7 +54,7 @@ func openState(token string, app *tview.Application, cfg *config.Config) error {
 func (s *State) onRequest(r httpdriver.Request) error {
 	req, ok := r.(*httpdriver.DefaultRequest)
 	if ok {
-		log.Info("new HTTP request", "method", req.Method, "path", req.URL.Path)
+		slog.Info("new HTTP request", "method", req.Method, "path", req.URL.Path)
 	}
 
 	return nil

+ 1 - 8
go.mod

@@ -5,10 +5,10 @@ go 1.23.2
 require (
 	github.com/BurntSushi/toml v1.4.0
 	github.com/atotto/clipboard v0.1.4
-	github.com/charmbracelet/log v0.4.0
 	github.com/diamondburned/arikawa/v3 v3.4.0
 	github.com/diamondburned/ningen/v3 v3.0.1-0.20240808103805-f1a24c0da3d8
 	github.com/gdamore/tcell/v2 v2.7.4
+	github.com/lmittmann/tint v1.0.5
 	github.com/rivo/tview v0.0.0-20241103174730-c76f7879f592
 	github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
 	github.com/yuin/goldmark v1.7.8
@@ -17,24 +17,17 @@ require (
 
 require (
 	al.essio.dev/pkg/shellescape v1.5.1 // indirect
-	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
-	github.com/charmbracelet/lipgloss v0.10.0 // indirect
 	github.com/danieljoos/wincred v1.2.2 // indirect
 	github.com/gdamore/encoding v1.0.1 // indirect
-	github.com/go-logfmt/logfmt v0.6.0 // indirect
 	github.com/godbus/dbus/v5 v5.1.0 // indirect
 	github.com/gorilla/schema v1.4.1 // indirect
 	github.com/gorilla/websocket v1.5.3 // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
-	github.com/mattn/go-isatty v0.0.18 // indirect
 	github.com/mattn/go-runewidth v0.0.16 // indirect
-	github.com/muesli/reflow v0.3.0 // indirect
-	github.com/muesli/termenv v0.15.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/twmb/murmur3 v1.1.8 // indirect
 	go4.org v0.0.0-20230225012048-214862532bf5 // indirect
-	golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
 	golang.org/x/sys v0.28.0 // indirect
 	golang.org/x/term v0.27.0 // indirect
 	golang.org/x/text v0.21.0 // indirect

+ 2 - 19
go.sum

@@ -23,13 +23,7 @@ github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
-github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
-github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s=
-github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE=
-github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM=
-github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -52,8 +46,6 @@ github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAY
 github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
-github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
-github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
 github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -98,18 +90,13 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 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/lmittmann/tint v1.0.5 h1:NQclAutOfYsqs2F1Lenue6OoWCajs5wJcP3DfWVpePw=
+github.com/lmittmann/tint v1.0.5/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
 github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
-github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
-github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
 github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
 github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
-github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
-github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
-github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -117,7 +104,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/rivo/tview v0.0.0-20241103174730-c76f7879f592 h1:YIJ+B1hePP6AgynC5TcqpO0H9k3SSoZa2BGyL6vDUzM=
 github.com/rivo/tview v0.0.0-20241103174730-c76f7879f592/go.mod h1:02iFIz7K/A9jGCvrizLPvoqr4cEIx7q54RH5Qudkrss=
-github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
@@ -158,8 +144,6 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
 golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
-golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -226,7 +210,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
 golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=

+ 19 - 12
internal/logger/logger.go

@@ -1,36 +1,43 @@
 package logger
 
 import (
+	"log/slog"
 	"os"
 	"path/filepath"
-	"time"
 
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
+	"github.com/lmittmann/tint"
 )
 
-// Opens the log file and configures the default logger.
-func Load() error {
-	log.SetReportTimestamp(true)
-	log.SetReportCaller(true)
-	log.SetTimeFormat(time.Kitchen)
-
+// Recursively creates the log directory if it does not exist already and returns the path to the log file.
+func initialize() (string, error) {
 	path, err := os.UserCacheDir()
 	if err != nil {
-		return err
+		return "", err
 	}
 
 	path = filepath.Join(path, config.Name)
 	if err := os.MkdirAll(path, os.ModePerm); err != nil {
+		return "", err
+	}
+
+	return filepath.Join(path, "logs.txt"), nil
+}
+
+// Opens the log file and configures standard logger.
+func Load() error {
+	path, err := initialize()
+	if err != nil {
 		return err
 	}
 
-	path = filepath.Join(path, "logs.txt")
-	file, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND, os.ModePerm)
+	file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, os.ModePerm)
 	if err != nil {
 		return err
 	}
 
-	log.SetOutput(file)
+	h := tint.NewHandler(file, nil)
+	l := slog.New(h)
+	slog.SetDefault(l)
 	return nil
 }

+ 3 - 3
main.go

@@ -2,10 +2,10 @@ package main
 
 import (
 	"flag"
+	"log/slog"
 
 	"github.com/ayn2op/discordo/cmd"
 	"github.com/ayn2op/discordo/internal/config"
-	"github.com/charmbracelet/log"
 	"github.com/zalando/go-keyring"
 )
 
@@ -17,13 +17,13 @@ func main() {
 	if *token == "" {
 		t, err := keyring.Get(config.Name, "token")
 		if err != nil {
-			log.Info("failed to get token from keyring", "err", err)
+			slog.Info("failed to get token from keyring", "err", err)
 		} else {
 			*token = t
 		}
 	}
 
 	if err := cmd.Run(*token); err != nil {
-		log.Fatal(err)
+		slog.Error("failed to run", "err", err)
 	}
 }