summaryrefslogtreecommitdiffstats
path: root/server/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/server.go')
-rw-r--r--server/server.go62
1 files changed, 36 insertions, 26 deletions
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)
}