summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2024-11-02 20:12:18 +0200
committerKyren223 <Kyren223@proton.me>2024-11-02 20:12:18 +0200
commita637ea9c335c385985a23510a4174d837fb51faf (patch)
tree211dac907d4cfcf67d4d994fd6dae7928d90e240
parent996840205417820e3928b724b20bfed152048fda (diff)
feat: client can now send messages and the server saves thme in DB
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--internal/client/api/api.go32
-rw-r--r--internal/client/client.go12
-rw-r--r--internal/server/api/api.go9
-rw-r--r--internal/server/api/database.go36
6 files changed, 88 insertions, 4 deletions
diff --git a/go.mod b/go.mod
index 2495298..0387b1d 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,7 @@ require (
github.com/charmbracelet/bubbles v0.20.0
github.com/charmbracelet/bubbletea v1.1.1
github.com/charmbracelet/lipgloss v0.13.0
+ github.com/mattn/go-sqlite3 v1.14.24
github.com/stretchr/testify v1.7.0
github.com/vmihailenco/msgpack/v5 v5.4.1
)
diff --git a/go.sum b/go.sum
index 24305e7..73223d3 100644
--- a/go.sum
+++ b/go.sum
@@ -26,6 +26,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
+github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
diff --git a/internal/client/api/api.go b/internal/client/api/api.go
index 9cfa1d4..d52b727 100644
--- a/internal/client/api/api.go
+++ b/internal/client/api/api.go
@@ -11,6 +11,7 @@ import (
"github.com/kyren223/eko/internal/data"
"github.com/kyren223/eko/internal/packet"
"github.com/kyren223/eko/pkg/assert"
+ "github.com/kyren223/eko/pkg/snowflake"
)
type AppendMessage data.Message
@@ -18,7 +19,11 @@ type AppendMessage data.Message
func SendMessage(message string) tea.Cmd {
return func() tea.Msg {
log.Println("request SendMessage sent")
- request := packet.SendMessage{Content: message}
+ frequencyId := snowflake.ID(1852771536100921344)
+ request := packet.SendMessage{
+ Content: message,
+ FrequencyID: &frequencyId,
+ }
response, ok := <-gateway.Send(&request)
if !ok {
log.Println()
@@ -36,3 +41,28 @@ func SendMessage(message string) tea.Cmd {
return fmt.Errorf("received invalid response from server: %v", response.Type())
}
}
+
+func GetMessages() tea.Msg {
+ log.Println("request GetMessages sent")
+ frequencyId := snowflake.ID(1852771536100921344)
+ request := packet.GetMessagesRange{
+ FrequencyID: &frequencyId,
+ ReceiverID: nil,
+ From: nil,
+ To: nil,
+ }
+ response, ok := <-gateway.Send(&request)
+ if !ok {
+ log.Println()
+ return errors.New("request timeout")
+ }
+ log.Println("request GetMessages received response")
+
+ switch response := response.(type) {
+ case *packet.ErrorMessage:
+ return errors.New(response.Error)
+ case *packet.Messages:
+ return response
+ }
+ return fmt.Errorf("received invalid response from server: %v", response.Type())
+}
diff --git a/internal/client/client.go b/internal/client/client.go
index b091343..2dc432c 100644
--- a/internal/client/client.go
+++ b/internal/client/client.go
@@ -83,7 +83,7 @@ func initialModel() model {
}
func (m model) Init() tea.Cmd {
- return textarea.Blink
+ return tea.Batch(textarea.Blink, api.GetMessages)
}
func (m model) View() string {
@@ -158,6 +158,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, nil
}
+ case api.AppendMessage:
+ m.messages = append(m.messages, msg.Content)
+
+ m.viewport.SetContent(strings.Join(m.messages, "\n"))
+ m.viewport.GotoBottom()
+
+ var cmd tea.Cmd
+ m.viewport, cmd = m.viewport.Update(msg)
+ return m, cmd
+
case cursor.BlinkMsg:
var cmd tea.Cmd
m.textarea, cmd = m.textarea.Update(msg)
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index 8f9e6c6..3d4d274 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -15,7 +15,7 @@ func SendMessage(ctx context.Context, request *packet.SendMessage) packet.Payloa
sess, ok := session.FromContext(ctx)
assert.Assert(ok, "context in process packet should always have a session")
- if (request.ReceiverID != nil) != (request.FrequencyID != nil) {
+ if (request.ReceiverID != nil) == (request.FrequencyID != nil) {
return &packet.ErrorMessage{Error: "either receiver id or frequency id must exist"}
}
@@ -43,4 +43,11 @@ func SendMessage(ctx context.Context, request *packet.SendMessage) packet.Payloa
}
func GetMessages(ctx context.Context, request *packet.GetMessagesRange) packet.Payload {
+ queries := data.New(db)
+ messages, err := queries.ListMessages(ctx)
+ if err != nil {
+ log.Println("database error when retrieving messages:", err)
+ return &packet.ErrorMessage{Error: "internal server error"}
+ }
+ return &packet.Messages{Messages: messages}
}
diff --git a/internal/server/api/database.go b/internal/server/api/database.go
index 7057393..3546395 100644
--- a/internal/server/api/database.go
+++ b/internal/server/api/database.go
@@ -1,16 +1,23 @@
package api
import (
+ "context"
+ "crypto/ed25519"
"database/sql"
"log"
+ _ "github.com/mattn/go-sqlite3"
+
+ "github.com/kyren223/eko/internal/data"
"github.com/kyren223/eko/pkg/assert"
+ "github.com/kyren223/eko/pkg/snowflake"
)
var db *sql.DB
func ConnectToDatabase() {
- db, err := sql.Open("sqlite3", "server.db")
+ var err error
+ db, err = sql.Open("sqlite3", "file:server.db?cache=shared")
assert.NoError(err, "DB should always be accessible")
assert.AddFlush(db)
log.Println("established connection with the database")
@@ -30,6 +37,33 @@ func ConnectToDatabase() {
}
func CloseDatabase() {
+ assert.NotNil(db, "db should only be closed if it exists")
db.Close()
log.Println("connection with database closed")
}
+
+func demo() {
+ ctx := context.Background()
+ node := snowflake.NewNode(1)
+ pubKey, _, _ := ed25519.GenerateKey(nil)
+
+ queries := data.New(db)
+ user, _ := queries.CreateUser(ctx, data.CreateUserParams{
+ ID: node.Generate(),
+ PublicKey: pubKey,
+ })
+ user, _ = queries.SetUserName(ctx, data.SetUserNameParams{
+ ID: user.ID,
+ Name: "admin",
+ })
+ network, _ := queries.CreateNetwork(ctx, data.CreateNetworkParams{
+ ID: node.Generate(),
+ Name: "global",
+ OwnerID: user.ID,
+ })
+ _, _ = queries.CreateFrequency(ctx, data.CreateFrequencyParams{
+ ID: node.Generate(),
+ NetworkID: network.ID,
+ Name: "general",
+ })
+}