From a91411fde4911f6cef62bbc05d17638d08839389 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Tue, 21 Jan 2025 17:25:16 +0200 Subject: Added kicking client side --- internal/client/ui/core/core.go | 8 ++ .../client/ui/core/frequencylist/frequencylist.go | 7 +- internal/client/ui/core/memberlist/memberlist.go | 106 ++++++++++++++------- 3 files changed, 82 insertions(+), 39 deletions(-) (limited to 'internal') diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index b352226..3d4836c 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -262,6 +262,14 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd { case *packet.MembersInfo: state.UpdateMembers(msg) + networkId := state.NetworkId(m.networkList.Index()) + if networkId != nil { + members := state.State.Members[*networkId] + index := m.memberList.Index() + if index >= len(members) { + m.memberList.SetIndex(m.memberList.Index()) + } + } case *packet.FrequenciesInfo: state.UpdateFrequencies(msg) diff --git a/internal/client/ui/core/frequencylist/frequencylist.go b/internal/client/ui/core/frequencylist/frequencylist.go index 06f7c0a..5d99099 100644 --- a/internal/client/ui/core/frequencylist/frequencylist.go +++ b/internal/client/ui/core/frequencylist/frequencylist.go @@ -51,7 +51,7 @@ type Model struct { func New() Model { return Model{ networkIndex: -1, - base: -1, + base: 0, index: -1, focus: false, width: -1, @@ -233,7 +233,7 @@ func (m *Model) SetNetworkIndex(networkIndex int) { if networkIndex == -1 { m.networkIndex = -1 m.index = -1 - m.base = -1 + m.base = 0 return } @@ -288,9 +288,6 @@ func (m *Model) Index() int { } func (m *Model) SetIndex(index int) { - if m.base == -1 { - m.base = 0 - } m.index = min(max(index, 0), m.FrequenciesLength()-1) if m.index < m.base { m.base = m.index diff --git a/internal/client/ui/core/memberlist/memberlist.go b/internal/client/ui/core/memberlist/memberlist.go index 369fc9d..d18689d 100644 --- a/internal/client/ui/core/memberlist/memberlist.go +++ b/internal/client/ui/core/memberlist/memberlist.go @@ -6,6 +6,7 @@ import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/kyren223/eko/internal/client/gateway" "github.com/kyren223/eko/internal/client/ui" "github.com/kyren223/eko/internal/client/ui/colors" "github.com/kyren223/eko/internal/client/ui/core/state" @@ -80,34 +81,7 @@ func (m Model) View() string { builder.WriteString(m.renderHeader()) builder.WriteString("\n") - membersMap := m.Members() - members := make([]data.Member, 0, len(membersMap)) - for _, member := range membersMap { - members = append(members, member) - } - slices.SortFunc(members, func(a, b data.Member) int { - if a.UserID == ownerId { - return -1 - } else if b.UserID == ownerId { - return 1 - } - - if a.IsAdmin && !b.IsAdmin { - return -1 - } else if !a.IsAdmin && b.IsAdmin { - return 1 - } - - aName, bName := m.Users()[a.UserID].Name, m.Users()[b.UserID].Name - if aName == bName { - return int(a.UserID.Time()) - int(b.UserID.Time()) - } else if aName < bName { - return -1 - } else { - return 1 - } - }) - + members := m.Members() upper := min(m.base+m.height, len(members)) members = members[m.base:upper] @@ -185,6 +159,36 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { // Admin case "x", "K": // TODO: kick + networkId := state.NetworkId(m.networkIndex) + network := state.State.Networks[*networkId] + member := m.Members()[m.index] + + 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 + } + + if member.UserID == network.OwnerID { + return m, nil + } + + no := false + return m, gateway.Send(&packet.SetMember{ + Member: &no, + Admin: nil, + Muted: nil, + Banned: nil, + BanReason: nil, + Network: *state.NetworkId(m.networkIndex), + User: member.UserID, + }) case "b": // TODO: ban @@ -225,7 +229,7 @@ func (m *Model) SetNetworkAndFrequency(networkIndex, frequencyIndex int) { } m.networkIndex = networkIndex - if m.frequencyIndex != -1 { + if m.frequencyIndex != -1 && m.frequencyIndex < len(m.Frequencies()) { fromFrequency := m.Frequencies()[m.frequencyIndex] toFrequency := m.Frequencies()[frequencyIndex] @@ -241,7 +245,7 @@ func (m *Model) SetNetworkAndFrequency(networkIndex, frequencyIndex int) { m.frequencyIndex = frequencyIndex } -func (m Model) MembersLength() int { +func (m *Model) MembersLength() int { networkId := state.NetworkId(m.networkIndex) if networkId == nil { return 0 @@ -249,7 +253,7 @@ func (m Model) MembersLength() int { return len(state.State.Members[*networkId]) } -func (m Model) Network() *data.Network { +func (m *Model) Network() *data.Network { networkId := state.NetworkId(m.networkIndex) if networkId == nil { return nil @@ -258,7 +262,7 @@ func (m Model) Network() *data.Network { return &network } -func (m Model) Frequencies() []data.Frequency { +func (m *Model) Frequencies() []data.Frequency { networkId := state.NetworkId(m.networkIndex) if networkId == nil { return nil @@ -266,7 +270,41 @@ func (m Model) Frequencies() []data.Frequency { return state.State.Frequencies[*networkId] } -func (m Model) Members() map[snowflake.ID]data.Member { +func (m *Model) Members() []data.Member { + networkId := state.NetworkId(m.networkIndex) + ownerId := state.State.Networks[*networkId].OwnerID + membersMap := m.MembersMap() + members := make([]data.Member, 0, len(membersMap)) + for _, member := range membersMap { + members = append(members, member) + } + slices.SortFunc(members, func(a, b data.Member) int { + if a.UserID == ownerId { + return -1 + } else if b.UserID == ownerId { + return 1 + } + + if a.IsAdmin && !b.IsAdmin { + return -1 + } else if !a.IsAdmin && b.IsAdmin { + return 1 + } + + aName, bName := m.Users()[a.UserID].Name, m.Users()[b.UserID].Name + if aName == bName { + return int(a.UserID.Time()) - int(b.UserID.Time()) + } else if aName < bName { + return -1 + } else { + return 1 + } + }) + + return members +} + +func (m *Model) MembersMap() map[snowflake.ID]data.Member { networkId := state.NetworkId(m.networkIndex) if networkId == nil { return nil @@ -274,7 +312,7 @@ func (m Model) Members() map[snowflake.ID]data.Member { return state.State.Members[*networkId] } -func (m Model) Users() map[snowflake.ID]data.User { +func (m *Model) Users() map[snowflake.ID]data.User { networkId := state.NetworkId(m.networkIndex) if networkId == nil { return nil -- cgit v1.3.1