diff options
| author | bt <bt@rctt.net> | 2026-03-19 14:33:47 +0100 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-03-19 14:33:47 +0100 |
| commit | 505d81a6fb79bf93f03518d49f83458c2d8deb8c (patch) | |
| tree | c06dee32c83f108cc811a307585b18f5f71f216b | |
| parent | 7988694e9ba8a949e6aee0998cd72bd7b1934bc1 (diff) | |
| download | solec-private-messages.tar.gz solec-private-messages.zip | |
WIP: Implement private messagesprivate-messages
| -rw-r--r-- | cmd/client/main.go | 10 | ||||
| -rw-r--r-- | cmd/daemon/main.go | 10 | ||||
| -rw-r--r-- | server/server.go | 62 |
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) } |
