summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbt <bt@rctt.net>2026-03-19 14:33:47 +0100
committerbt <bt@rctt.net>2026-03-19 14:33:47 +0100
commit505d81a6fb79bf93f03518d49f83458c2d8deb8c (patch)
treec06dee32c83f108cc811a307585b18f5f71f216b
parent7988694e9ba8a949e6aee0998cd72bd7b1934bc1 (diff)
downloadsolec-private-messages.tar.gz
solec-private-messages.zip
WIP: Implement private messagesprivate-messages
-rw-r--r--cmd/client/main.go10
-rw-r--r--cmd/daemon/main.go10
-rw-r--r--server/server.go62
3 files changed, 46 insertions, 36 deletions
diff --git a/cmd/client/main.go b/cmd/client/main.go
index 2612267..8c2258a 100644
--- a/cmd/client/main.go
+++ b/cmd/client/main.go
@@ -18,7 +18,7 @@ var (
)
func main() {
- prompt.Commands["*"] = broadcast
+ prompt.Commands["send"] = sendMessage
flag.StringVar(&serverAddr, "a", "localhost:9999", "Server address:port")
flag.StringVar(&user, "u", "user", "username")
@@ -74,16 +74,14 @@ func handleMessage(conn net.Conn, msg core.Message) {
log.Println("received message", msg.Source, "->", msg.Target, msg.Content)
}
-func broadcast(args []string) {
+func sendMessage(args []string) {
msg := core.Message{
Source: user,
- Target: "*",
+ Target: args[0],
Timestamp: time.Now(),
- Content: strings.Join(args[0:], " "),
+ Content: strings.Join(args[1:], " "),
}
- log.Println(msg.Content)
-
if err := core.Send(conn, msg); err != nil {
panic(err)
}
diff --git a/cmd/daemon/main.go b/cmd/daemon/main.go
index 56b7c16..aa142d9 100644
--- a/cmd/daemon/main.go
+++ b/cmd/daemon/main.go
@@ -14,7 +14,7 @@ import (
var (
cmds = map[string]func(args []string){
- "ping": sendPing,
+ "broadcast": sendBroadcast,
}
serv = server.NewServer("localhost:9999")
@@ -24,10 +24,11 @@ func main() {
fmt.Println("SOLEC MOCK SERVER")
fmt.Println("Commands:", slices.Sorted(maps.Keys(cmds)))
+ go readCmds()
+
if err := serv.Start(); err != nil {
panic(err)
}
- readCmds()
}
func readCmds() {
@@ -48,6 +49,7 @@ func readCmds() {
}
}
-func sendPing(args []string) {
-
+func sendBroadcast(args []string) {
+ msg := strings.Join(args[0:], " ")
+ serv.SendBroadcast(msg)
}
diff --git a/server/server.go b/server/server.go
index 51e71b1..d87411e 100644
--- a/server/server.go
+++ b/server/server.go
@@ -6,6 +6,7 @@ import (
"log"
"net"
"sync"
+ "time"
"git.sr.ht/~rctt/solec/core"
)
@@ -21,6 +22,16 @@ type User struct {
Conns map[net.Conn]struct{}
}
+func (u *User) Send(payload core.Wrapper) error {
+ for c := range u.Conns {
+ if err := core.Send(c, payload); err != nil{
+ return err
+ }
+ }
+
+ return nil
+}
+
func NewServer(listenAddr string) *Server {
return &Server{
listenAddr: listenAddr,
@@ -46,6 +57,27 @@ func (s *Server) Start() error {
}
}
+func (s *Server) SendBroadcast(msg string) {
+ payload := core.Message{
+ Source: "op@example.org",
+ Target: "*@example.org",
+ Timestamp: time.Now(),
+ Content: msg,
+ }
+ data, err := core.Encode(payload)
+ if err != nil {
+ panic(err)
+ }
+
+ for _, u := range s.users {
+ for c := range u.Conns {
+ if _, err := c.Write(data); err != nil {
+ log.Println("cannot send", err)
+ }
+ }
+ }
+}
+
func (s *Server) handleConn(conn net.Conn) {
if err := s.performHandshake(conn); err != nil {
log.Println("handshake error", err)
@@ -157,32 +189,10 @@ func (s *Server) handlePayload(conn net.Conn, user User, payload any) error {
func (s *Server) handleMessage(conn net.Conn, user User, msg core.Message) error {
log.Println("message:", user.Name, "->", msg.Target, msg.Content)
- if msg.Target == "*" {
- return s.broadcastMessage(conn, user, msg)
- }
-
- return nil
-}
-
-func (s *Server) broadcastMessage(conn net.Conn, user User, msg core.Message) error {
- for _, u := range s.users {
- if u.Name == user.Name {
- continue
- }
-
- for c := range u.Conns {
- if err := core.Send(c, msg); err != nil {
- log.Println("cannot send", err)
- }
- }
- }
-
- // Forward message for other connections from the same user
- for c := range s.users[user.Name].Conns {
- if err := core.Send(c, msg); err != nil {
- log.Println("cannot send", err)
- }
+ user, ok := s.users[msg.Target]
+ if !ok {
+ return errors.New("target not found")
}
- return nil
+return user.Send(msg)
}