summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/server.go71
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)
}