summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-07-05 11:30:16 +0300
committerKyren223 <Kyren223@proton.me>2025-07-05 11:30:16 +0300
commit317bc967e64576744dbc4cda4ba5e34131187097 (patch)
tree940b35a56cd63881a81233b057b5dafd75b31e6e /internal
parent2d1408598ada38cb51412efe74b7c64466cb9057 (diff)
Added extra info in user settings, fixed typos in help popups and
refactored some log statements
Diffstat (limited to 'internal')
-rw-r--r--internal/client/ui/core/core.go11
-rw-r--r--internal/client/ui/core/helppopup.go6
-rw-r--r--internal/client/ui/core/usersettings/usersettings.go33
-rw-r--r--internal/server/api/api.go1
-rw-r--r--internal/server/server.go56
5 files changed, 71 insertions, 36 deletions
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()