summaryrefslogtreecommitdiff
path: root/internal/client/ui/core/state
diff options
context:
space:
mode:
Diffstat (limited to 'internal/client/ui/core/state')
-rw-r--r--internal/client/ui/core/state/state.go100
1 files changed, 53 insertions, 47 deletions
diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go
index 1115c13..c1dd4cd 100644
--- a/internal/client/ui/core/state/state.go
+++ b/internal/client/ui/core/state/state.go
@@ -1,9 +1,11 @@
package state
import (
+ "context"
"crypto/ed25519"
"encoding/json"
"slices"
+ "time"
"github.com/google/btree"
"github.com/kyren223/eko/internal/client/gateway"
@@ -20,8 +22,8 @@ type ChatState struct {
}
type state struct {
- ChatState map[snowflake.ID]ChatState // key is frequency id or receiver id
- LastFrequency map[snowflake.ID]snowflake.ID // key is network id
+ ChatState map[snowflake.ID]ChatState // key is frequency id or receiver id
+ LastFrequency map[snowflake.ID]snowflake.ID // key is network id
Messages map[snowflake.ID]*btree.BTreeG[data.Message] // key is frequency id or receiver id
Networks map[snowflake.ID]data.Network // key is network id
@@ -30,41 +32,35 @@ type state struct {
Users map[snowflake.ID]data.User // key is user id
Trusteds map[snowflake.ID]ed25519.PublicKey // key is user id
- Notifications map[snowflake.ID]int // key is frequency id or receiver id
+ LastReadMessages map[snowflake.ID]*snowflake.ID // key is frequency id or receiver id
+ Notifications map[snowflake.ID]int // key is frequency id or receiver id
}
var State state = state{
- ChatState: map[snowflake.ID]ChatState{},
- LastFrequency: map[snowflake.ID]snowflake.ID{},
- Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{},
- Networks: map[snowflake.ID]data.Network{},
- Frequencies: map[snowflake.ID][]data.Frequency{},
- Members: map[snowflake.ID]map[snowflake.ID]data.Member{},
- Users: map[snowflake.ID]data.User{},
- Trusteds: map[snowflake.ID]ed25519.PublicKey{},
- Notifications: map[snowflake.ID]int{},
+ ChatState: map[snowflake.ID]ChatState{},
+ LastFrequency: map[snowflake.ID]snowflake.ID{},
+ Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{},
+ Networks: map[snowflake.ID]data.Network{},
+ Frequencies: map[snowflake.ID][]data.Frequency{},
+ Members: map[snowflake.ID]map[snowflake.ID]data.Member{},
+ Users: map[snowflake.ID]data.User{},
+ Trusteds: map[snowflake.ID]ed25519.PublicKey{},
+ Notifications: map[snowflake.ID]int{},
+ LastReadMessages: map[snowflake.ID]*snowflake.ID{},
}
type UserData struct {
- LastReadMessage map[snowflake.ID]*snowflake.ID
- Networks []snowflake.ID
- Peers []snowflake.ID
+ Networks []snowflake.ID
+ Peers []snowflake.ID
}
var Data UserData = UserData{
- LastReadMessage: map[snowflake.ID]*snowflake.ID{},
- Networks: []snowflake.ID{},
- Peers: []snowflake.ID{},
+ Networks: []snowflake.ID{},
+ Peers: []snowflake.ID{},
}
var UserID *snowflake.ID = nil
-var (
- ReceivedData = false
- ReceivedNetworks = false
- AskedForNotifs = false
-)
-
func UpdateNetworks(info *packet.NetworksInfo) {
networks := State.Networks
@@ -117,8 +113,6 @@ func UpdateNetworks(info *packet.NetworksInfo) {
Data: &data,
User: nil,
})
-
- ReceivedNetworks = true
}
func UpdateFrequencies(info *packet.FrequenciesInfo) {
@@ -232,11 +226,6 @@ func FromJsonUserData(s string) {
return
}
Data = data
- if Data.LastReadMessage == nil {
- Data.LastReadMessage = map[snowflake.ID]*snowflake.ID{}
- }
-
- ReceivedData = true
}
func UpdateTrusteds(info *packet.TrustInfo) {
@@ -280,29 +269,46 @@ func UpdateNotifications(info *packet.NotificationsInfo) {
}
}
-func AskForNotifs() {
- source := []snowflake.ID{}
+func SendFinalData() {
+ data := JsonUserData()
+ ch1 := gateway.SendAsync(&packet.SetUserData{
+ Data: &data,
+ User: nil,
+ })
+
+ sources := []snowflake.ID{}
- source = append(source, Data.Peers...)
- for networkId := range State.Networks {
- for _, frequency := range State.Frequencies[networkId] {
- source = append(source, frequency.ID)
+ sources = append(sources, Data.Peers...)
+ for _, frequencies := range State.Frequencies {
+ for _, frequency := range frequencies {
+ sources = append(sources, frequency.ID)
}
}
- lastReadId := make([]snowflake.ID, 0, len(source))
-
- for _, source := range source {
- id := Data.LastReadMessage[source]
- if id == nil {
- lastReadId = append(lastReadId, 0)
+ lastReads := make([]int64, 0, len(sources))
+ for _, source := range sources {
+ if lastRead := State.LastReadMessages[source]; lastRead != nil {
+ lastReads = append(lastReads, int64(*lastRead))
} else {
- lastReadId = append(lastReadId, *id)
+ lastReads = append(lastReads, 0)
}
}
- gateway.SendAsync(&packet.GetNotifications{
- Source: source,
- LastReadId: lastReadId,
+ ch2 := gateway.SendAsync(&packet.SetLastReadMessages{
+ Source: sources,
+ LastRead: lastReads,
})
+
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
+ defer cancel()
+
+ select {
+ case <-ctx.Done():
+ case <-ch1:
+ }
+
+ select {
+ case <-ctx.Done():
+ case <-ch2:
+ }
}