summaryrefslogtreecommitdiff
path: root/internal/client/ui
diff options
context:
space:
mode:
Diffstat (limited to 'internal/client/ui')
-rw-r--r--internal/client/ui/core/core.go24
-rw-r--r--internal/client/ui/core/networkjoin/networkjoin.go21
-rw-r--r--internal/client/ui/core/state/state.go3
3 files changed, 41 insertions, 7 deletions
diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go
index 3048375..ef31c27 100644
--- a/internal/client/ui/core/core.go
+++ b/internal/client/ui/core/core.go
@@ -46,7 +46,6 @@ const (
type Model struct {
name string
privKey ed25519.PrivateKey
- id snowflake.ID
loading loadscreen.Model
timer timer.Model
@@ -66,7 +65,6 @@ func New(privKey ed25519.PrivateKey, name string) Model {
m := Model{
name: name,
privKey: privKey,
- id: 0,
loading: loadscreen.New(connectingToServer),
timer: newTimer(initialTimeout),
timeout: initialTimeout,
@@ -134,7 +132,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
func (m *Model) updateNotConnected(msg tea.Msg) tea.Cmd {
switch msg := msg.(type) {
case gateway.ConnectionEstablished:
- m.id = snowflake.ID(msg)
+ state.State.UserID = (*snowflake.ID)(&msg)
m.connected = true
m.timeout = initialTimeout
return m.timer.Stop()
@@ -176,6 +174,7 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd {
gateway.Disconnect()
case gateway.ConnectionLost:
+ state.State.UserID = nil
m.connected = false
m.timeout = initialTimeout
return tea.Batch(gateway.Connect(m.privKey, connectionTimeout), m.loading.Init())
@@ -185,7 +184,24 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd {
state.State.Networks = msg.Networks
} else {
networks := state.State.Networks
- networks = append(networks, msg.Networks...)
+
+ for _, newNetwork := range msg.Networks {
+ add := true
+ for i, existingNetwork := range networks {
+ if existingNetwork.ID == newNetwork.ID {
+ add = false
+ if newNetwork.Position == -1 {
+ newNetwork.Position = existingNetwork.Position
+ }
+ networks[i] = newNetwork
+ break
+ }
+ }
+ if add {
+ networks = append(networks, newNetwork)
+ }
+ }
+
networks = slices.DeleteFunc(networks, func(network packet.FullNetwork) bool {
return slices.Contains(msg.RemoveNetworks, network.ID)
})
diff --git a/internal/client/ui/core/networkjoin/networkjoin.go b/internal/client/ui/core/networkjoin/networkjoin.go
index 1df0db3..8f8200b 100644
--- a/internal/client/ui/core/networkjoin/networkjoin.go
+++ b/internal/client/ui/core/networkjoin/networkjoin.go
@@ -2,16 +2,19 @@ package networkjoin
import (
"errors"
+ "strconv"
"strings"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/kyren223/eko/internal/client/gateway"
"github.com/kyren223/eko/internal/client/ui/colors"
+ "github.com/kyren223/eko/internal/client/ui/core/state"
"github.com/kyren223/eko/internal/client/ui/field"
"github.com/kyren223/eko/internal/client/ui/layouts/flex"
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/assert"
+ "github.com/kyren223/eko/pkg/snowflake"
)
var (
@@ -70,6 +73,9 @@ func New() Model {
if strings.TrimSpace(s) == "" {
return errors.New("cannot be empty")
}
+ if _, err := strconv.ParseInt(s, 10, 64); err != nil {
+ return err
+ }
return nil
}
@@ -154,10 +160,19 @@ func (m *Model) Select() tea.Cmd {
if m.name.Input.Err != nil {
return nil
}
+ name := m.name.Input.Value()
+ id, err := strconv.ParseInt(name, 10, 64)
+ assert.NoError(err, "input is already validated to be valid")
- // TODO: change this to actual invite packet
- request := packet.CreateNetwork{
- Name: m.name.Input.Value(),
+ yes := true
+ request := packet.SetNetworkUser{
+ Member: &yes,
+ Admin: nil,
+ Muted: nil,
+ Banned: nil,
+ BanReason: nil,
+ Network: snowflake.ID(id),
+ User: *state.State.UserID,
}
return gateway.Send(&request)
}
diff --git a/internal/client/ui/core/state/state.go b/internal/client/ui/core/state/state.go
index 3f9cb5a..1041d23 100644
--- a/internal/client/ui/core/state/state.go
+++ b/internal/client/ui/core/state/state.go
@@ -14,6 +14,8 @@ type Frequency struct {
}
type state struct {
+ UserID *snowflake.ID
+
// Key is either a frequency or receiver
FrequencyState map[snowflake.ID]Frequency
LastFrequency map[snowflake.ID]snowflake.ID // key is network
@@ -23,6 +25,7 @@ type state struct {
}
var State state = state{
+ UserID: nil,
FrequencyState: map[snowflake.ID]Frequency{},
LastFrequency: map[snowflake.ID]snowflake.ID{},
Messages: map[snowflake.ID]*btree.BTreeG[data.Message]{},