diff options
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) + } + } +} |
