From eec10d41af62fb9a93cd5fd79dcf94616701cc2a Mon Sep 17 00:00:00 2001 From: bt Date: Sun, 19 Apr 2026 21:32:53 +0200 Subject: [common] Basic group channels support --- server/channel.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 server/channel.go (limited to 'server/channel.go') diff --git a/server/channel.go b/server/channel.go new file mode 100644 index 0000000..11969f2 --- /dev/null +++ b/server/channel.go @@ -0,0 +1,48 @@ +package server + +import ( + "log" + "net" + "sync" + + "go.rctt.net/solec/core" +) + +type Channel struct { + Name string + Users map[string]*User + UsersMu sync.RWMutex +} + +func NewChannel(name string) *Channel { + return &Channel{ + Name: name, + Users: make(map[string]*User), + } +} + +func (c *Channel) Add(u *User) { + c.UsersMu.Lock() + c.Users[u.Name] = u + u.Channels[c.Name] = c + c.UsersMu.Unlock() + + log.Println("user joined a channel") +} + +func (c *Channel) Remove(u *User) { + c.UsersMu.Lock() + delete(c.Users, u.Name) + delete(u.Channels, c.Name) + c.UsersMu.Unlock() + + log.Println("user left a channel") +} + +func (c *Channel) Send(senderConn net.Conn, msg core.Message) { + for _, u := range c.Users { + if err := u.Send(senderConn, msg); err != nil { + log.Print("cannot send a message to user on channel", err) + } + } +} -- cgit v1.2.3