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) } } }