From 0df41fc0edac641c2927c518fa05c4380b27d984 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Mon, 13 Jan 2025 18:39:48 +0200 Subject: Implemented frequency syncing client-side, removed the history mechanism for frequency swapping, this will add delay when swapping frequencies but it prevents issues when the swapping packet gets received as part of the propagation --- internal/client/ui/core/chat/chat.go | 3 ++ .../client/ui/core/frequencylist/frequencylist.go | 46 +++++++++------------- internal/client/ui/core/networkjoin/networkjoin.go | 2 +- internal/client/ui/core/networklist/networklist.go | 6 +-- internal/client/ui/core/state/state.go | 39 ++++++++---------- 5 files changed, 41 insertions(+), 55 deletions(-) (limited to 'internal') diff --git a/internal/client/ui/core/chat/chat.go b/internal/client/ui/core/chat/chat.go index dac4937..8130910 100644 --- a/internal/client/ui/core/chat/chat.go +++ b/internal/client/ui/core/chat/chat.go @@ -259,6 +259,9 @@ func (m *Model) ResetBeforeSwitch() { networkId := state.NetworkId(m.networkIndex) if m.frequencyIndex != -1 && networkId != nil { frequencies := state.State.Frequencies[*networkId] + if len(frequencies) >= m.frequencyIndex { + return + } frequencyId := frequencies[m.frequencyIndex].ID log.Println("Saving", frequencyId) state.State.FrequencyState[frequencyId] = state.FrequencyState{ diff --git a/internal/client/ui/core/frequencylist/frequencylist.go b/internal/client/ui/core/frequencylist/frequencylist.go index b49accb..b7bbd8c 100644 --- a/internal/client/ui/core/frequencylist/frequencylist.go +++ b/internal/client/ui/core/frequencylist/frequencylist.go @@ -12,6 +12,7 @@ import ( "github.com/kyren223/eko/internal/client/ui/core/state" "github.com/kyren223/eko/internal/data" "github.com/kyren223/eko/internal/packet" + "github.com/kyren223/eko/pkg/assert" ) var ( @@ -29,7 +30,6 @@ var ( ) type Model struct { - history []func(m *Model) networkIndex int base int index int @@ -39,7 +39,6 @@ type Model struct { func New() Model { return Model{ - history: []func(m *Model){}, networkIndex: -1, base: -1, index: -1, @@ -98,16 +97,11 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { switch msg := msg.(type) { case *packet.SwapFrequencies: - // Pop first by shifting to the left - copy(m.history, m.history[1:]) - m.history = m.history[:len(m.history)-1] - case *packet.Error: - if msg.PktType == packet.PacketSwapFrequencies { - // Server failed, revert! - undo := m.history[len(m.history)-1] - m.history = m.history[:len(m.history)-1] - undo(&m) - } + tmp := m.Frequencies()[msg.Pos1] + m.Frequencies()[msg.Pos1] = m.Frequencies()[msg.Pos2] + m.Frequencies()[msg.Pos2] = tmp + m.Frequencies()[msg.Pos1].Position = int64(msg.Pos1) + m.Frequencies()[msg.Pos2].Position = int64(msg.Pos2) case tea.KeyMsg: if !m.focus { @@ -166,22 +160,19 @@ func (m *Model) Blur() { m.focus = false } -func (m Model) Swap(dir int) (Model, tea.Cmd) { - cmd := gateway.Send(&packet.SwapFrequencies{ - Network: m.Network().ID, - Pos1: m.index, - Pos2: m.index + dir, - }) - tmp := m.Frequencies()[m.index] - m.Frequencies()[m.index] = m.Frequencies()[m.index+dir] - m.Frequencies()[m.index+dir] = tmp +func (m Model) Swap(dir int) (model Model, cmd tea.Cmd) { + cmd = nil + networkId := state.NetworkId(m.networkIndex) + assert.NotNil(networkId, "if frequency can swap it must mean the network id is valid") + member := state.State.Members[*networkId][*state.UserID] + if member.IsAdmin { + cmd = gateway.Send(&packet.SwapFrequencies{ + Network: m.Network().ID, + Pos1: m.index, + Pos2: m.index + dir, + }) + } m.SetIndex(m.index + dir) - m.history = append(m.history, func(m *Model) { - m.SetIndex(m.index - dir) - tmp := m.Frequencies()[m.index] - m.Frequencies()[m.index] = m.Frequencies()[m.index+dir] - m.Frequencies()[m.index+dir] = tmp - }) return m, cmd } @@ -261,7 +252,6 @@ func (m *Model) SetIndex(index int) { m.base = 0 } m.index = min(max(index, 0), m.FrequenciesLength()-1) - log.Println("Index:", m.index, "base:", m.base, "height", m.height) if m.index < m.base { m.base = m.index } else if m.index >= m.base+m.height { diff --git a/internal/client/ui/core/networkjoin/networkjoin.go b/internal/client/ui/core/networkjoin/networkjoin.go index 347d69d..f4ddf11 100644 --- a/internal/client/ui/core/networkjoin/networkjoin.go +++ b/internal/client/ui/core/networkjoin/networkjoin.go @@ -172,7 +172,7 @@ func (m *Model) Select() tea.Cmd { Banned: nil, BanReason: nil, Network: snowflake.ID(id), - User: *state.State.UserID, + User: *state.UserID, } return gateway.Send(&request) } diff --git a/internal/client/ui/core/networklist/networklist.go b/internal/client/ui/core/networklist/networklist.go index 5e3780f..a0cc0e6 100644 --- a/internal/client/ui/core/networklist/networklist.go +++ b/internal/client/ui/core/networklist/networklist.go @@ -127,7 +127,7 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { m.index = min(len(state.State.Networks)-1, m.index+1) case "Q": - if state.State.UserID == nil || m.index == PeersIndex { + if state.UserID == nil || m.index == PeersIndex { return m, nil } no := false @@ -138,11 +138,11 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { Banned: nil, BanReason: nil, Network: *state.NetworkId(m.index), - User: *state.State.UserID, + User: *state.UserID, }) case "D": - if state.State.UserID == nil || m.index == PeersIndex { + if state.UserID == nil || m.index == PeersIndex { return m, nil } return m, gateway.Send(&packet.DeleteNetwork{ diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go index 9b8c053..d8d47b9 100644 --- a/internal/client/ui/core/state/state.go +++ b/internal/client/ui/core/state/state.go @@ -19,8 +19,6 @@ type FrequencyState struct { } type state struct { - UserID *snowflake.ID - // Key is either a frequency or receiver FrequencyState map[snowflake.ID]FrequencyState // key is frequency id LastFrequency map[snowflake.ID]snowflake.ID // key is network id @@ -33,7 +31,6 @@ type state struct { } var State state = state{ - UserID: nil, FrequencyState: map[snowflake.ID]FrequencyState{}, LastFrequency: map[snowflake.ID]snowflake.ID{}, Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{}, @@ -51,6 +48,8 @@ var Data UserData = UserData{ Networks: []snowflake.ID{}, } +var UserID *snowflake.ID = nil + func UpdateNetworks(info *packet.NetworksInfo) { networks := State.Networks @@ -94,29 +93,23 @@ func UpdateNetworks(info *packet.NetworksInfo) { func UpdateFrequencies(info *packet.FrequenciesInfo) { frequencies := State.Frequencies[info.Network] - for _, newFrequency := range info.Frequencies { - add := true - for i, existingFrequency := range frequencies { - if existingFrequency.ID == newFrequency.ID { - add = false - if newFrequency.Position == -1 { - newFrequency.Position = existingFrequency.Position - } - frequencies[i] = newFrequency - break - } - } - if add { - frequencies = append(frequencies, newFrequency) - } - } frequencies = slices.DeleteFunc(frequencies, func(frequency data.Frequency) bool { return slices.Contains(info.RemovedFrequencies, frequency.ID) }) - slices.SortFunc(frequencies, func(a, b data.Frequency) int { - return int(a.Position - b.Position) - }) + for i, frequency := range frequencies { + frequency.Position = int64(i) + frequencies[i] = frequency + } + + for _, newFrequency := range info.Frequencies { + position := int(newFrequency.Position) + if len(frequencies) == position { + frequencies = append(frequencies, newFrequency) + } else if position < len(frequencies) { + frequencies[position] = newFrequency + } + } State.Frequencies[info.Network] = frequencies } @@ -154,7 +147,7 @@ func UpdateMembers(info *packet.MembersInfo) { for _, removedMember := range info.RemovedMembers { delete(State.Members[info.Network], removedMember) - if removedMember != *State.UserID { + if removedMember != *UserID { continue } delete(State.Networks, info.Network) -- cgit v1.3.1