diff options
Diffstat (limited to 'server/server.go')
| -rw-r--r-- | server/server.go | 62 |
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) } |
