From 317bc967e64576744dbc4cda4ba5e34131187097 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sat, 5 Jul 2025 11:30:16 +0300 Subject: Added extra info in user settings, fixed typos in help popups and refactored some log statements --- internal/client/ui/core/core.go | 11 +++-- internal/client/ui/core/helppopup.go | 6 +-- .../client/ui/core/usersettings/usersettings.go | 33 ++++++++++++- internal/server/api/api.go | 1 + internal/server/server.go | 56 +++++++++++----------- 5 files changed, 71 insertions(+), 36 deletions(-) (limited to 'internal') diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 34a75f5..37ce613 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -375,7 +375,8 @@ func (m *Model) updateConnected(message tea.Msg) tea.Cmd { message = ui.EmptyMsg{} } case FocusLeftSidebar: - if !m.HasPopup() && m.networkList.Index() != networklist.SignalsIndex { + IsFrequenciesSidebar := m.networkList.Index() != networklist.SignalsIndex + if !m.HasPopup() && IsFrequenciesSidebar { networkId := state.NetworkId(m.networkList.Index()) if networkId == nil { return nil @@ -397,7 +398,8 @@ func (m *Model) updateConnected(message tea.Msg) tea.Cmd { m.networkJoinPopup = &popup message = ui.EmptyMsg{} } - if m.focus == FocusLeftSidebar && m.networkList.Index() == networklist.SignalsIndex { + IsSignalsSidebar := m.networkList.Index() == networklist.SignalsIndex + if m.focus == FocusLeftSidebar && IsSignalsSidebar { popup := signaladd.New() m.signalAddPopup = &popup message = ui.EmptyMsg{} @@ -406,8 +408,9 @@ func (m *Model) updateConnected(message tea.Msg) tea.Cmd { case "i": index := m.networkList.Index() - networkFocus := m.focus == FocusNetworkList - if !m.HasPopup() && networkFocus && index != networklist.SignalsIndex { + isNetworkListFocused := m.focus == FocusNetworkList + isFrequenciesSidebar := index != networklist.SignalsIndex + if !m.HasPopup() && isNetworkListFocused && isFrequenciesSidebar { networkId := state.NetworkId(index) if networkId != nil { _ = clipboard.WriteAll(networkId.String()) diff --git a/internal/client/ui/core/helppopup.go b/internal/client/ui/core/helppopup.go index ac411ee..2fbb830 100644 --- a/internal/client/ui/core/helppopup.go +++ b/internal/client/ui/core/helppopup.go @@ -173,9 +173,9 @@ func (m HelpPopup) Title() string { func (m HelpPopup) HelpGlobal() [][]Keymap { return [][]Keymap{{ {"ctrl+c", "Exit eko"}, - {"H", "Move focus to the right"}, - {"L", "Move focus to the left"}, - {"u", "Edit your user profile"}, + {"H", "Move focus to the left"}, + {"L", "Move focus to the right"}, + {"s", "User profile settings"}, {"?", "Show a help popup"}, }, { {"esc", "Close popup"}, diff --git a/internal/client/ui/core/usersettings/usersettings.go b/internal/client/ui/core/usersettings/usersettings.go index 92e0a1c..9afafe3 100644 --- a/internal/client/ui/core/usersettings/usersettings.go +++ b/internal/client/ui/core/usersettings/usersettings.go @@ -6,6 +6,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/kyren223/eko/internal/client/config" "github.com/kyren223/eko/internal/client/gateway" "github.com/kyren223/eko/internal/client/ui/colors" "github.com/kyren223/eko/internal/client/ui/core/state" @@ -28,6 +29,11 @@ var ( Background(colors.Blue).Foreground(colors.White). Render("Update User Settings") } + + highlightedStyle = func() lipgloss.Style { + return lipgloss.NewStyle().Padding(0, 0). + Background(colors.BackgroundHighlight).Foreground(colors.White) + } ) const ( @@ -136,7 +142,32 @@ func (m Model) View() string { Align(lipgloss.Center). Render(m.update) - content := flex.NewVertical(name, description, private, update).WithGap(1).View() + configFile := "Config File: " + highlightedStyle().Render(config.ConfigFile) + configFile = lipgloss.NewStyle(). + Width(m.nameWidth). + Render(configFile) + + option := highlightedStyle().Render("\"anonymous_device_analytics\": false") + analyticsOptOut := "Anonymous device analytics can be disabled by setting " + option + " in your config file" + analyticsOptOut = lipgloss.NewStyle(). + Width(m.nameWidth). + Render(analyticsOptOut) + + legalNote := "Official instance Terms of Service & Privacy Policy: " + highlightedStyle().Render("https://kyren.codes/eko/legal") + legalNote = lipgloss.NewStyle(). + Width(m.nameWidth). + Render(legalNote) + + // content := flex.NewVertical( + // name, description, private, + // configFile, analyticsOptOut, legalNote, + // update, + // ).WithGap(1).View() + + content := flex.NewVertical( + legalNote, analyticsOptOut, + configFile, name, description, private, update, + ).WithGap(1).View() return lipgloss.NewStyle(). Border(lipgloss.ThickBorder()). diff --git a/internal/server/api/api.go b/internal/server/api/api.go index 49b3428..c0bf3cb 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -270,6 +270,7 @@ func RequestMessages(ctx context.Context, sess *session.Session, request *packet func CreateOrGetUser(ctx context.Context, node *snowflake.Node, pubKey ed25519.PublicKey) (data.User, error) { queries := data.New(db) + user, err := queries.GetUserByPublicKey(ctx, pubKey) if err == sql.ErrNoRows { id := node.Generate() diff --git a/internal/server/server.go b/internal/server/server.go index 8accb14..adcde77 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "log" + "log/slog" "net" "os" "strconv" @@ -121,15 +122,20 @@ func (s *server) Run() error { _ = listener.Close() }() - log.Println("started listening on port", s.Port) + slog.Info("server started accepting new connections", "port", s.Port) var wg sync.WaitGroup for { conn, err := listener.Accept() if err != nil { if !errors.Is(err, net.ErrClosed) { - log.Println("error accepting connection:", err) + slog.Error("failed accepting new connection", "error", err) } - break + + if s.ctx.Err() != nil { + slog.Info("server context expired", "error", s.ctx.Err()) + break + } + continue // Ignore and skip (don't connect) } wg.Add(1) go func() { @@ -137,11 +143,11 @@ func (s *server) Run() error { wg.Done() }() } - log.Println("stopped listening on port", s.Port) + slog.Info("server stopped accepting new connections", "port", s.Port) - log.Println("waiting for all active connections to close...") + slog.Info("waiting for all active connections to close...") wg.Wait() - log.Println("server shutdown complete") + slog.Info("completed server shutdown") return nil } @@ -149,41 +155,38 @@ func (server *server) handleConnection(conn net.Conn) { addr, ok := conn.RemoteAddr().(*net.TCPAddr) assert.Assert(ok, "getting tcp address should never fail as we are using tcp connections") - log.Println(addr, "accepted") + ctx, cancel := context.WithCancel(server.ctx) + defer cancel() + + ctx = context.WithValue(ctx, ctxkeys.IpAddr, addr) - initialCtx, initialCancel := context.WithTimeout(server.ctx, 5*time.Second) - initialCtx = context.WithValue(initialCtx, ctxkeys.IpAddr, addr) - deadline, _ := initialCtx.Deadline() - err := conn.SetDeadline(deadline) - assert.NoError(err, "setting read deadline should not error") + slog.InfoContext(ctx, "connection accepted") + defer slog.InfoContext(ctx, "connection closed") - err = conn.SetDeadline(time.Time{}) - assert.NoError(err, "unsetting read deadline should not error") + // Set deadline before auth + deadline := time.Now().Add(5 * time.Second) + err := conn.SetDeadline(deadline) + assert.NoError(err, "setting deadline should not error") pubKey, err := handleAuth(conn) if err != nil { - initialCancel() - log.Println(addr, "auth error:", err) + slog.Info("user authentication failed", "error", err) _ = conn.Close() - log.Println(addr, "disconnected") return } - user, err := api.CreateOrGetUser(initialCtx, server.Node(), pubKey) + // Reset deadline after auth + err = conn.SetDeadline(time.Time{}) + assert.NoError(err, "unsetting deadline should not error") + + user, err := api.CreateOrGetUser(ctx, server.Node(), pubKey) if err != nil { - initialCancel() log.Println(addr, "user creation/fetching error:", err) _ = conn.Close() - log.Println(addr, "disconnected") return } - ctx, cancel := context.WithCancel(server.ctx) - defer cancel() - ctx = context.WithValue(ctx, ctxkeys.UserID, user.ID) - ctx = context.WithValue(ctx, ctxkeys.IpAddr, addr) - sess := session.NewSession(server, addr, cancel, user.ID, pubKey) server.AddSession(sess) framer := packet.NewFramer() @@ -193,15 +196,12 @@ func (server *server) handleConnection(conn net.Conn) { binary.BigEndian.PutUint64(id[:], uint64(user.ID)) // #nosec G115 -- sign bit is always 0 in snowflake IDs _, err = conn.Write(id[:]) if err != nil { - initialCancel() log.Println(addr, "failed to write user id") _ = conn.Close() log.Println(addr, "disconnected") return } - initialCancel() - go func() { <-ctx.Done() _ = conn.Close() -- cgit v1.3.1