summaryrefslogtreecommitdiff
path: root/internal/client/ui
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-22 17:23:18 +0200
committerKyren223 <Kyren223@proton.me>2025-01-22 17:23:18 +0200
commita6ea05146050a8b2ae5963d4ea96434dc3005f37 (patch)
tree09128a6f90a0aae8159e0575e11562409f525a1d /internal/client/ui
parent645247f4ef489c9084a7d8d30db89b083287f0c6 (diff)
Added the ability to trust/untrust users
Diffstat (limited to 'internal/client/ui')
-rw-r--r--internal/client/ui/core/chat/chat.go48
-rw-r--r--internal/client/ui/core/core.go3
-rw-r--r--internal/client/ui/core/memberlist/memberlist.go47
-rw-r--r--internal/client/ui/core/state/state.go13
-rw-r--r--internal/client/ui/ui.go10
5 files changed, 104 insertions, 17 deletions
diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go
index d1c9671..3b30c1b 100644
--- a/internal/client/ui/core/chat/chat.go
+++ b/internal/client/ui/core/chat/chat.go
@@ -1,6 +1,7 @@
package chat
import (
+ "bytes"
"log"
"strconv"
"strings"
@@ -330,6 +331,23 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
m.style = editStyle
}
+ case "T":
+ if m.selectedMessage == nil {
+ return m, nil
+ }
+ senderId := m.selectedMessage.SenderID
+
+ if senderId == *state.UserID {
+ return m, nil
+ }
+
+ _, isTrusting := state.State.Trusteds[senderId]
+
+ return m, gateway.Send(&packet.TrustUser{
+ User: senderId,
+ Trust: !isTrusting,
+ })
+
// Admin
case "K":
if m.selectedMessage == nil {
@@ -492,8 +510,6 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
Network: *state.NetworkId(m.networkIndex),
User: member.UserID,
})
- case "T":
- // TODO: transfer ownership
}
}
@@ -936,12 +952,30 @@ func (m *Model) renderHeader(message data.Message, selected bool) []byte {
members := state.State.Members[*networkId]
member := members[message.SenderID]
user := state.State.Users[message.SenderID]
+ trustedPublicKey, isTrusted := state.State.Trusteds[user.ID]
+ keysMatch := bytes.Equal(trustedPublicKey, user.PublicKey)
- senderStyle := ui.NormalMemberStyle
- if ownerId == member.UserID {
- senderStyle = ui.OwnerMemberStyle
- } else if member.IsAdmin {
- senderStyle = ui.AdminMemberStyle
+ if isTrusted && !keysMatch {
+ buf = append(buf, ui.UntrustedSymbol...)
+ }
+
+ senderStyle := lipgloss.NewStyle()
+ if isTrusted && keysMatch {
+ if ownerId == member.UserID {
+ senderStyle = ui.TrustedOwnerMemberStyle
+ } else if member.IsAdmin {
+ senderStyle = ui.TrustedAdminMemberStyle
+ } else {
+ senderStyle = ui.TrustedNormalMemberStyle
+ }
+ } else {
+ if ownerId == member.UserID {
+ senderStyle = ui.OwnerMemberStyle
+ } else if member.IsAdmin {
+ senderStyle = ui.AdminMemberStyle
+ } else {
+ senderStyle = ui.NormalMemberStyle
+ }
}
sender := senderStyle.Render(user.Name)
diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go
index 3d4836c..c099473 100644
--- a/internal/client/ui/core/core.go
+++ b/internal/client/ui/core/core.go
@@ -288,6 +288,9 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd {
case *packet.MessagesInfo:
state.UpdateMessages(msg)
+ case *packet.TrustInfo:
+ state.UpdateTrusteds(msg)
+
case tea.KeyMsg:
switch msg.String() {
case "n":
diff --git a/internal/client/ui/core/memberlist/memberlist.go b/internal/client/ui/core/memberlist/memberlist.go
index 5f380dc..1485e1e 100644
--- a/internal/client/ui/core/memberlist/memberlist.go
+++ b/internal/client/ui/core/memberlist/memberlist.go
@@ -1,6 +1,7 @@
package memberlist
import (
+ "bytes"
"slices"
"strings"
@@ -91,14 +92,33 @@ func (m Model) View() string {
memberStyle = memberStyle.Background(colors.BackgroundHighlight)
}
- userStyle := ui.NormalMemberStyle
- if ownerId == member.UserID {
- userStyle = ui.OwnerMemberStyle
- } else if member.IsAdmin {
- userStyle = ui.AdminMemberStyle
+ user := state.State.Users[member.UserID]
+ trustedPublicKey, isTrusted := state.State.Trusteds[user.ID]
+ keysMatch := bytes.Equal(trustedPublicKey, user.PublicKey)
+
+ userStyle := lipgloss.NewStyle()
+ if isTrusted && keysMatch {
+ if ownerId == member.UserID {
+ userStyle = ui.TrustedOwnerMemberStyle
+ } else if member.IsAdmin {
+ userStyle = ui.TrustedAdminMemberStyle
+ } else {
+ userStyle = ui.TrustedNormalMemberStyle
+ }
+ } else {
+ if ownerId == member.UserID {
+ userStyle = ui.OwnerMemberStyle
+ } else if member.IsAdmin {
+ userStyle = ui.AdminMemberStyle
+ } else {
+ userStyle = ui.NormalMemberStyle
+ }
}
memberName := m.Users()[member.UserID].Name
memberName = userStyle.Render(memberName)
+ if isTrusted && !keysMatch {
+ memberName = ui.UntrustedSymbol + memberName
+ }
if lipgloss.Width(memberName) <= maxMemberWidth {
memberName = lipgloss.NewStyle().
@@ -156,6 +176,21 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
case "p":
// TODO: profile
+ // Normal
+ case "T":
+ member := m.Members()[m.index]
+
+ if member.UserID == *state.UserID {
+ return m, nil
+ }
+
+ _, isTrusting := state.State.Trusteds[member.UserID]
+
+ return m, gateway.Send(&packet.TrustUser{
+ User: member.UserID,
+ Trust: !isTrusting,
+ })
+
// Admin
case "x", "K":
networkId := state.NetworkId(m.networkIndex)
@@ -298,8 +333,6 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
Network: *state.NetworkId(m.networkIndex),
User: member.UserID,
})
- case "T":
- // TODO: transfer ownership
}
}
diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go
index 182a957..03b7b9d 100644
--- a/internal/client/ui/core/state/state.go
+++ b/internal/client/ui/core/state/state.go
@@ -1,6 +1,7 @@
package state
import (
+ "crypto/ed25519"
"encoding/json"
"slices"
@@ -28,6 +29,7 @@ type state struct {
Frequencies map[snowflake.ID][]data.Frequency // key is network id
Members map[snowflake.ID]map[snowflake.ID]data.Member // key is network id then user id
Users map[snowflake.ID]data.User // key is user id
+ Trusteds map[snowflake.ID]ed25519.PublicKey // key is user id
}
var State state = state{
@@ -38,6 +40,7 @@ var State state = state{
Frequencies: map[snowflake.ID][]data.Frequency{},
Members: map[snowflake.ID]map[snowflake.ID]data.Member{},
Users: map[snowflake.ID]data.User{},
+ Trusteds: map[snowflake.ID]ed25519.PublicKey{},
}
type UserData struct {
@@ -195,3 +198,13 @@ func FromJsonUserData(s string) {
}
Data = data
}
+
+func UpdateTrusteds(info *packet.TrustInfo) {
+ for _, removed := range info.RemovedTrusteds {
+ delete(State.Trusteds, removed)
+ }
+
+ for i, trusted := range info.Trusteds {
+ State.Trusteds[trusted] = info.TrustedPublicKeys[i]
+ }
+}
diff --git a/internal/client/ui/ui.go b/internal/client/ui/ui.go
index 26a39b1..61bf7bf 100644
--- a/internal/client/ui/ui.go
+++ b/internal/client/ui/ui.go
@@ -28,9 +28,13 @@ var (
Height int
Program *tea.Program
- NormalMemberStyle = lipgloss.NewStyle().Foreground(colors.Purple).SetString("󰀉")
- AdminMemberStyle = lipgloss.NewStyle().Foreground(colors.Red).Bold(true).SetString("󰓏")
- OwnerMemberStyle = AdminMemberStyle.Foreground(colors.Gold).SetString("󱟜")
+ NormalMemberStyle = lipgloss.NewStyle().Foreground(colors.Purple).SetString("󰀉")
+ AdminMemberStyle = lipgloss.NewStyle().Foreground(colors.Red).Bold(true).SetString("󰓏")
+ OwnerMemberStyle = AdminMemberStyle.Foreground(colors.Gold).SetString("󱟜")
+ TrustedNormalMemberStyle = NormalMemberStyle.SetString("󰢏")
+ TrustedAdminMemberStyle = AdminMemberStyle.SetString("󱄻")
+ TrustedOwnerMemberStyle = OwnerMemberStyle.SetString("󱢼")
+ UntrustedSymbol = lipgloss.NewStyle().Foreground(colors.Red).Render("󱈸")
)
var NewAuth func() tea.Model