summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-13 18:39:48 +0200
committerKyren223 <Kyren223@proton.me>2025-01-13 18:39:48 +0200
commit0df41fc0edac641c2927c518fa05c4380b27d984 (patch)
tree3c51fe03828f96d61b32e8837bde86f21bbf4fab /internal
parentbad60b37d0fe3100f3898bfd6a860ea4aa87256f (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')
-rw-r--r--internal/client/ui/core/chat/chat.go3
-rw-r--r--internal/client/ui/core/frequencylist/frequencylist.go46
-rw-r--r--internal/client/ui/core/networkjoin/networkjoin.go2
-rw-r--r--internal/client/ui/core/networklist/networklist.go6
-rw-r--r--internal/client/ui/core/state/state.go39
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)