diff options
| author | bt <bt@rctt.net> | 2026-04-19 21:32:53 +0200 |
|---|---|---|
| committer | bt <bt@rctt.net> | 2026-05-03 17:52:37 +0200 |
| commit | eec10d41af62fb9a93cd5fd79dcf94616701cc2a (patch) | |
| tree | d72068dcc4cb1aa43c2e0a2fae8ff094d41ed9c6 /server/message.go | |
| parent | c00e7dd589921e6be45918d4cd589e52e2b77036 (diff) | |
| download | solec-eec10d41af62fb9a93cd5fd79dcf94616701cc2a.tar.gz solec-eec10d41af62fb9a93cd5fd79dcf94616701cc2a.zip | |
[common] Basic group channels supportv0.3.0
Diffstat (limited to 'server/message.go')
| -rw-r--r-- | server/message.go | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/server/message.go b/server/message.go index 2487abd..58f2908 100644 --- a/server/message.go +++ b/server/message.go @@ -1,9 +1,9 @@ package server import ( - "errors" "fmt" "log" + "net" "time" "go.rctt.net/solec/core" @@ -30,34 +30,44 @@ func (s *Server) SendBroadcast(msg string) { } } -func (s *Server) handleMessage(msg core.Message) error { +func (s *Server) handleMessage(sender net.Conn, msg core.Message) error { log.Println("message:", msg.Source, "->", msg.Target, msg.Content) - channel, host, err := core.ReadAddr(msg.Target) + addr, err := core.ReadAddr(msg.Target) if err != nil { return err } - if host == s.name { - return s.handleLocalMessage(channel, msg) + if addr.Host == s.name { + return s.handleLocalMessage(sender, addr, msg) } - return s.handleOutboundMessage(channel, host, msg) + return s.handleOutboundMessage(sender, addr, 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") +func (s *Server) handleLocalMessage(sender net.Conn, addr core.Addr, msg core.Message) error { + if addr.Type == core.AddrUser { + s.usersMu.RLock() + user, ok := s.users[addr.Channel] + if !ok { + return core.Send(sender, core.Error{core.ErrorNotFound}) + } + s.usersMu.RUnlock() + return user.Send(sender, msg) } - s.usersMu.RUnlock() - return user.Send(msg) + s.channelsMu.RLock() + channel, ok := s.channels[addr.Channel] + if !ok { + return core.Send(sender, core.Error{core.ErrorNotFound}) + } + s.channelsMu.RUnlock() + channel.Send(sender, msg) + return nil } -func (s *Server) handleOutboundMessage(channel, host string, msg core.Message) error { - remote, err := s.getRemote(host) +func (s *Server) handleOutboundMessage(sender net.Conn, addr core.Addr, msg core.Message) error { + remote, err := s.getRemote(addr.Host) if err != nil { return fmt.Errorf("cannot access remote server: %w", err) } |
