summaryrefslogtreecommitdiff
path: root/internal/client/ui/core/chat/chat.go
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-02-12 13:08:49 +0200
committerKyren223 <Kyren223@proton.me>2025-02-12 13:08:49 +0200
commit66983fb02847dc9b1c53916da0dc7ad5a09f6644 (patch)
tree897301226bcb87bf6a7d2b823e74abecabece680 /internal/client/ui/core/chat/chat.go
parent976d3683f963b6f9282a534e1b4fec2411b738a2 (diff)
Added blocking/unblocking of users using b/u (user settings are now s
instead of "u")
Diffstat (limited to 'internal/client/ui/core/chat/chat.go')
-rw-r--r--internal/client/ui/core/chat/chat.go224
1 files changed, 129 insertions, 95 deletions
diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go
index 4cba8e8..07fc679 100644
--- a/internal/client/ui/core/chat/chat.go
+++ b/internal/client/ui/core/chat/chat.go
@@ -29,10 +29,10 @@ var (
focusStyle = func() lipgloss.Style {
return lipgloss.NewStyle().Background(colors.Background).Foreground(colors.Focus)
}
- readOnlyStyle = func() lipgloss.Style {
+ grayStyle = func() lipgloss.Style {
return lipgloss.NewStyle().Background(colors.Background).Foreground(colors.Gray)
}
- mutedStyle = func() lipgloss.Style { return lipgloss.NewStyle().Background(colors.Background).Foreground(colors.Red) }
+ redStyle = func() lipgloss.Style { return lipgloss.NewStyle().Background(colors.Background).Foreground(colors.Red) }
editStyle = func() lipgloss.Style {
return lipgloss.NewStyle().Background(colors.Background).Foreground(colors.Gold)
}
@@ -45,8 +45,8 @@ var (
Padding(0, 1)
}
ViFocusedBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Focus) }
- ViReadOnlyBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Gray) }
- ViMutedBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Red) }
+ ViGrayBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Gray) }
+ ViRedBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Red) }
ViEditBorder = func() lipgloss.Style { return ViBlurredBorder().BorderForeground(colors.Gold) }
PaddingCount = 1
@@ -74,6 +74,8 @@ var (
ReadOnlyPlaceholder = "You do not have permission to send messages in this frequency"
MutedPlaceholder = "You have been muted by a network adminstrator"
SelectSignalOrFrequency = "Cannot send messages, select a signal or frequency first"
+ BlockedPlaceholder = "You have blocked this user"
+ BlockingPlaceholder = "You have been blocked by this user"
EditedIndicator = func(bg lipgloss.Color) string {
return lipgloss.NewStyle().Background(bg).
@@ -230,14 +232,14 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
if member.IsMuted {
m.vi.Placeholder = MutedPlaceholder
- m.borderStyle = ViMutedBorder()
- m.style = mutedStyle()
+ m.borderStyle = ViRedBorder()
+ m.style = redStyle()
m.vi.SetInactive(true)
m.locked = false
} else if frequency.Perms != packet.PermReadWrite && !member.IsAdmin {
m.vi.Placeholder = ReadOnlyPlaceholder
- m.borderStyle = ViReadOnlyBorder()
- m.style = readOnlyStyle()
+ m.borderStyle = ViGrayBorder()
+ m.style = grayStyle()
m.vi.SetInactive(true)
m.locked = false
} else if m.locked {
@@ -277,9 +279,23 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
}
m.hasReadAccess = true
- m.hasWriteAccess = true // TODO: implement blocking users
+ m.hasWriteAccess = true
- if m.locked {
+ if _, ok := state.State.BlockedUsers[receiverId]; ok {
+ m.hasWriteAccess = false
+ m.vi.Placeholder = BlockedPlaceholder
+ m.borderStyle = ViRedBorder()
+ m.style = redStyle()
+ m.vi.SetInactive(true)
+ m.locked = false
+ } else if _, ok := state.State.BlockingUsers[receiverId]; ok {
+ m.hasWriteAccess = false
+ m.vi.Placeholder = BlockingPlaceholder
+ m.borderStyle = ViRedBorder()
+ m.style = redStyle()
+ m.vi.SetInactive(true)
+ m.locked = false
+ } else if m.locked {
m.vi.Placeholder = SendMessagePlaceholder
m.borderStyle = ViFocusedBorder()
m.style = focusStyle()
@@ -301,8 +317,8 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
m.hasWriteAccess = false // TODO: implement blocking users
m.vi.Placeholder = SelectSignalOrFrequency
- m.borderStyle = ViReadOnlyBorder()
- m.style = readOnlyStyle()
+ m.borderStyle = ViGrayBorder()
+ m.style = grayStyle()
m.vi.SetInactive(true)
}
@@ -441,11 +457,55 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
_, isTrusting := state.State.TrustedUsers[senderId]
+ _, isBlocked := state.State.BlockedUsers[senderId]
+ if !isTrusting && isBlocked {
+ return m, nil
+ }
+
return m, gateway.Send(&packet.TrustUser{
User: senderId,
Trust: !isTrusting,
})
+ case "b":
+ if m.selectedMessage == nil {
+ return m, nil
+ }
+
+ userId := m.selectedMessage.SenderID
+
+ if userId == *state.UserID {
+ return m, nil
+ }
+
+ if _, ok := state.State.BlockedUsers[userId]; ok {
+ return m, nil
+ }
+
+ return m, gateway.Send(&packet.BlockUser{
+ User: userId,
+ Block: true,
+ })
+ case "u":
+ if m.selectedMessage == nil {
+ return m, nil
+ }
+
+ userId := m.selectedMessage.SenderID
+
+ if userId == *state.UserID {
+ return m, nil
+ }
+
+ if _, ok := state.State.BlockedUsers[userId]; !ok {
+ return m, nil
+ }
+
+ return m, gateway.Send(&packet.BlockUser{
+ User: userId,
+ Block: false,
+ })
+
// Admin
case "K":
if m.selectedMessage == nil || m.receiverIndex != -1 {
@@ -514,105 +574,69 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) {
User: member.UserID,
})
case "U":
- if m.selectedMessage == nil {
+ if m.selectedMessage == nil || m.receiverIndex != -1 {
return m, nil
}
+ networkId := state.NetworkId(m.networkIndex)
+ network := state.State.Networks[*networkId]
+ senderId := m.selectedMessage.SenderID
+ member := state.State.Members[*networkId][senderId]
- if m.receiverIndex != -1 {
- userId := state.Data.Signals[m.receiverIndex]
-
- if userId == *state.UserID {
- return m, nil
- }
-
- if _, ok := state.State.BlockedUsers[userId]; !ok {
- return m, nil
- }
-
- return m, gateway.Send(&packet.BlockUser{
- User: userId,
- Block: false,
- })
-
- } else {
- networkId := state.NetworkId(m.networkIndex)
- network := state.State.Networks[*networkId]
- senderId := m.selectedMessage.SenderID
- member := state.State.Members[*networkId][senderId]
+ if !member.IsMuted {
+ return m, nil
+ }
- if !member.IsMuted {
- return m, nil
- }
+ if !state.State.Members[*networkId][*state.UserID].IsAdmin {
+ return m, nil
+ }
- if !state.State.Members[*networkId][*state.UserID].IsAdmin {
- return m, nil
- }
+ if member.UserID == *state.UserID {
+ return m, nil
+ }
- if member.UserID == *state.UserID {
- return m, nil
- }
+ if member.IsAdmin && network.OwnerID != *state.UserID {
+ return m, nil
+ }
- if member.IsAdmin && network.OwnerID != *state.UserID {
- return m, nil
- }
+ no := false
+ return m, gateway.Send(&packet.SetMember{
+ Member: nil,
+ Admin: nil,
+ Muted: &no,
+ Banned: nil,
+ BanReason: nil,
+ Network: *state.NetworkId(m.networkIndex),
+ User: member.UserID,
+ })
- no := false
- return m, gateway.Send(&packet.SetMember{
- Member: nil,
- Admin: nil,
- Muted: &no,
- Banned: nil,
- BanReason: nil,
- Network: *state.NetworkId(m.networkIndex),
- User: member.UserID,
- })
- }
case "B":
- if m.selectedMessage == nil {
+ if m.selectedMessage == nil || m.receiverIndex != -1 {
return m, nil
}
- if m.receiverIndex != -1 {
- userId := state.Data.Signals[m.receiverIndex]
-
- if userId == *state.UserID {
- return m, nil
- }
-
- if _, ok := state.State.BlockedUsers[userId]; ok {
- return m, nil
- }
-
- return m, gateway.Send(&packet.BlockUser{
- User: userId,
- Block: true,
- })
-
- } else {
- networkId := state.NetworkId(m.networkIndex)
- network := state.State.Networks[*networkId]
- senderId := m.selectedMessage.SenderID
- member := state.State.Members[*networkId][senderId]
+ networkId := state.NetworkId(m.networkIndex)
+ network := state.State.Networks[*networkId]
+ senderId := m.selectedMessage.SenderID
+ member := state.State.Members[*networkId][senderId]
- if !state.State.Members[*networkId][*state.UserID].IsAdmin {
- return m, nil
- }
+ if !state.State.Members[*networkId][*state.UserID].IsAdmin {
+ return m, nil
+ }
- if member.UserID == *state.UserID {
- return m, nil
- }
+ if member.UserID == *state.UserID {
+ return m, nil
+ }
- if member.IsAdmin && network.OwnerID != *state.UserID {
- return m, nil
- }
+ if member.IsAdmin && network.OwnerID != *state.UserID {
+ return m, nil
+ }
- cmd := func() tea.Msg {
- return ui.BanReasonPopupMsg{
- Network: *state.NetworkId(m.networkIndex),
- User: member.UserID,
- }
+ cmd := func() tea.Msg {
+ return ui.BanReasonPopupMsg{
+ Network: *state.NetworkId(m.networkIndex),
+ User: member.UserID,
}
- return m, cmd
}
+ return m, cmd
// Owner
case "D":
@@ -1194,6 +1218,13 @@ func (m *Model) renderMessageGroup(group []data.Message, remaining *int, height
}
}
+ if _, ok := state.State.BlockedUsers[group[i].SenderID]; ok {
+ messageStyle = pingedMessageStyle.
+ BorderForeground(colors.Gray).
+ Background(colors.DarkGray)
+ backgroundStyle = backgroundStyle.Background(colors.DarkGray).Foreground(colors.DarkGray)
+ }
+
rawContent := extra + backgroundStyle.Render(group[i].Content)
content := messageStyle.Render(rawContent)
heights[i] = lipgloss.Height(content)
@@ -1400,6 +1431,10 @@ func (m *Model) renderHeader(message data.Message, selected bool) []byte {
buf = append(buf, []byte(MutedSymbol())...)
}
+ if _, ok := state.State.BlockedUsers[user.ID]; ok {
+ buf = append(buf, ui.BlockedSymbol()...)
+ }
+
} else if m.receiverIndex != -1 {
user := state.State.Users[message.SenderID]
trustedPublicKey, isTrusted := state.State.TrustedUsers[user.ID]
@@ -1420,7 +1455,6 @@ func (m *Model) renderHeader(message data.Message, selected bool) []byte {
buf = append(buf, sender...)
if _, ok := state.State.BlockedUsers[user.ID]; ok {
- buf = append(buf, ' ')
buf = append(buf, ui.BlockedSymbol()...)
}
}