package server import ( "errors" "fmt" "log" "time" "go.rctt.net/solec/core" ) 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) handleMessage(msg core.Message) error { log.Println("message:", msg.Source, "->", msg.Target, msg.Content) channel, host, err := core.ReadAddr(msg.Target) if err != nil { return err } if host == s.name { return s.handleLocalMessage(channel, msg) } return s.handleOutboundMessage(channel, host, msg) } func (s *Server) handleLocalMessage(channel string, msg core.Message) error { s.usersMu.RLock() user, ok := s.users[channel] if !ok { return errors.New("target not found") } s.usersMu.RUnlock() return user.Send(msg) } func (s *Server) handleOutboundMessage(channel, host string, msg core.Message) error { remote, err := s.getRemote(host) if err != nil { return fmt.Errorf("cannot access remote server: %w", err) } return core.Send(remote.Conn, msg) }