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/channel.go | |
| parent | c00e7dd589921e6be45918d4cd589e52e2b77036 (diff) | |
| download | solec-0.3.0.tar.gz solec-0.3.0.zip | |
[common] Basic group channels supportv0.3.0
Diffstat (limited to 'server/channel.go')
| -rw-r--r-- | server/channel.go | 48 |
1 files changed, 48 insertions, 0 deletions
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) + } + } +} |
