diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index 888ecd1..d1c9671 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -72,6 +72,9 @@ var ( Background(colors.BackgroundDim). AlignHorizontal(lipgloss.Center). Border(lipgloss.ThickBorder(), false, false, true) + + MutedSymbol = lipgloss.NewStyle(). + Foreground(colors.Red).Render(" 󱡣") ) const ( @@ -200,6 +203,7 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { m.borderStyle = ViFocusedBorder m.style = focusStyle m.vi.SetInactive(false) + m.vi.Focus() if m.editingMessage != nil { m.borderStyle = ViEditBorder m.style = editStyle @@ -358,6 +362,76 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { Network: *state.NetworkId(m.networkIndex), User: member.UserID, }) + case "M": + if m.selectedMessage == nil { + return m, nil + } + 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 !state.State.Members[*networkId][*state.UserID].IsAdmin { + return m, nil + } + + if member.UserID == *state.UserID { + return m, nil + } + + if member.IsAdmin && network.OwnerID != *state.UserID { + return m, nil + } + + yes := true + return m, gateway.Send(&packet.SetMember{ + Member: nil, + Admin: nil, + Muted: &yes, + Banned: nil, + BanReason: nil, + Network: *state.NetworkId(m.networkIndex), + User: member.UserID, + }) + case "U": + if m.selectedMessage == nil { + return m, nil + } + 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 !state.State.Members[*networkId][*state.UserID].IsAdmin { + return m, nil + } + + if member.UserID == *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, + }) case "B": // TODO: ban @@ -872,6 +946,11 @@ func (m *Model) renderHeader(message data.Message, selected bool) []byte { sender := senderStyle.Render(user.Name) buf = append(buf, sender...) + + if member.IsMuted { + buf = append(buf, []byte(MutedSymbol)...) + } + } else if m.receiverIndex != -1 { // TODO: receiver } diff --git a/internal/client/ui/core/memberlist/memberlist.go b/internal/client/ui/core/memberlist/memberlist.go index b531b14..5f380dc 100644 --- a/internal/client/ui/core/memberlist/memberlist.go +++ b/internal/client/ui/core/memberlist/memberlist.go @@ -184,6 +184,68 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { Network: *state.NetworkId(m.networkIndex), User: member.UserID, }) + case "M": + networkId := state.NetworkId(m.networkIndex) + network := state.State.Networks[*networkId] + member := m.Members()[m.index] + + if member.IsMuted { + return m, nil + } + + if !m.MembersMap()[*state.UserID].IsAdmin { + return m, nil + } + + if member.UserID == *state.UserID { + return m, nil + } + + if member.IsAdmin && network.OwnerID != *state.UserID { + return m, nil + } + + yes := true + return m, gateway.Send(&packet.SetMember{ + Member: nil, + Admin: nil, + Muted: &yes, + Banned: nil, + BanReason: nil, + Network: *state.NetworkId(m.networkIndex), + User: member.UserID, + }) + case "U": + networkId := state.NetworkId(m.networkIndex) + network := state.State.Networks[*networkId] + member := m.Members()[m.index] + + if !member.IsMuted { + return m, nil + } + + if !m.MembersMap()[*state.UserID].IsAdmin { + return m, nil + } + + if member.UserID == *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, + }) case "B": // TODO: ban