diff options
Diffstat (limited to 'internal/client/ui')
| -rw-r--r-- | internal/client/ui/core/chat/chat.go | 48 | ||||
| -rw-r--r-- | internal/client/ui/core/core.go | 3 | ||||
| -rw-r--r-- | internal/client/ui/core/memberlist/memberlist.go | 47 | ||||
| -rw-r--r-- | internal/client/ui/core/state/state.go | 13 | ||||
| -rw-r--r-- | internal/client/ui/ui.go | 10 |
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 |
