summaryrefslogtreecommitdiffstats
path: root/server/message.go
diff options
context:
space:
mode:
authorbt <bt@rctt.net>2026-04-19 21:32:53 +0200
committerbt <bt@rctt.net>2026-05-03 17:52:37 +0200
commiteec10d41af62fb9a93cd5fd79dcf94616701cc2a (patch)
treed72068dcc4cb1aa43c2e0a2fae8ff094d41ed9c6 /server/message.go
parentc00e7dd589921e6be45918d4cd589e52e2b77036 (diff)
downloadsolec-eec10d41af62fb9a93cd5fd79dcf94616701cc2a.tar.gz
solec-eec10d41af62fb9a93cd5fd79dcf94616701cc2a.zip
[common] Basic group channels supportv0.3.0
Diffstat (limited to 'server/message.go')
-rw-r--r--server/message.go40
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)
}