summaryrefslogtreecommitdiff
path: root/internal/client/ui/core
diff options
context:
space:
mode:
Diffstat (limited to 'internal/client/ui/core')
-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)