diff options
| author | Kyren223 <Kyren223@proton.me> | 2025-01-13 18:39:48 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2025-01-13 18:39:48 +0200 |
| commit | 0df41fc0edac641c2927c518fa05c4380b27d984 (patch) | |
| tree | 3c51fe03828f96d61b32e8837bde86f21bbf4fab /internal/client/ui/core | |
| parent | bad60b37d0fe3100f3898bfd6a860ea4aa87256f (diff) | |
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
Diffstat (limited to 'internal/client/ui/core')
| -rw-r--r-- | internal/client/ui/core/chat/chat.go | 3 | ||||
| -rw-r--r-- | internal/client/ui/core/frequencylist/frequencylist.go | 46 | ||||
| -rw-r--r-- | internal/client/ui/core/networkjoin/networkjoin.go | 2 | ||||
| -rw-r--r-- | internal/client/ui/core/networklist/networklist.go | 6 | ||||
| -rw-r--r-- | internal/client/ui/core/state/state.go | 39 |
5 files changed, 41 insertions, 55 deletions
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) |
