From 614cc4d9dabc0e058ee149fbc2fcff866ae62a41 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sat, 4 Jan 2025 18:35:44 +0200 Subject: Implemented joining functionality --- internal/client/ui/core/core.go | 24 ++++++++++++++++++---- internal/client/ui/core/networkjoin/networkjoin.go | 23 +++++++++++++++++---- internal/client/ui/core/state/state.go | 3 +++ 3 files changed, 42 insertions(+), 8 deletions(-) (limited to 'internal/client/ui/core') 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 } - - // TODO: change this to actual invite packet - request := packet.CreateNetwork{ - Name: m.name.Input.Value(), + name := m.name.Input.Value() + id, err := strconv.ParseInt(name, 10, 64) + assert.NoError(err, "input is already validated to be valid") + + 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]{}, -- cgit v1.3.1