diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/server.go | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/server/server.go b/server/server.go index 51e71b1..bbfb676 100644 --- a/server/server.go +++ b/server/server.go @@ -6,12 +6,14 @@ import ( "log" "net" "sync" + "time" "git.sr.ht/~rctt/solec/core" ) type Server struct { listenAddr string + name string users map[string]User mu sync.Mutex } @@ -21,9 +23,20 @@ type User struct { Conns map[net.Conn]struct{} } -func NewServer(listenAddr string) *Server { +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, name string) *Server { return &Server{ listenAddr: listenAddr, + name: name, users: make(map[string]User), } } @@ -46,6 +59,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 +191,23 @@ 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) + channel, host, err := core.ReadAddr(msg.Target) + if err != nil { + return err } - 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) - } - } + if host == s.name { + return s.handleLocalMessage(channel, msg) } - // 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) - } + return fmt.Errorf("not supported") +} + +func (s *Server) handleLocalMessage(channel string, msg core.Message) error { + user, ok := s.users[channel] + if !ok { + return errors.New("target not found") } - return nil + return user.Send(msg) } |
