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