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/user.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/user.go')
| -rw-r--r-- | server/user.go | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/server/user.go b/server/user.go index 5d2731c..4f78b6a 100644 --- a/server/user.go +++ b/server/user.go @@ -8,22 +8,27 @@ import ( ) type User struct { - Name string - Conns map[net.Conn]struct{} + Name string + Conns map[net.Conn]struct{} + Channels map[string]*Channel } func NewUser(conn net.Conn, name string) User { u := User{ - Name: name, - Conns: make(map[net.Conn]struct{}), + Name: name, + Conns: make(map[net.Conn]struct{}), + Channels: make(map[string]*Channel), } u.Conns[conn] = struct{}{} return u } -func (u *User) Send(payload core.Wrapper) error { +func (u *User) Send(senderConn net.Conn, payload core.Wrapper) error { for c := range u.Conns { + if c == senderConn { + continue + } if err := core.Send(c, payload); err != nil { return err } @@ -62,7 +67,7 @@ func (s *Server) handleUserConn(conn net.Conn) { s.usersMu.Unlock() }() - if err := s.readInput(conn); err != nil { + if err := s.readUserInput(&user, conn); err != nil { log.Println(err) } } @@ -94,3 +99,55 @@ func (s *Server) performUserAuth(conn net.Conn) (string, error) { return clientAuth.Name, nil } + +func (s *Server) readUserInput(user *User, conn net.Conn) error { + for { + payload, err := core.Decode(conn) + if err != nil { + return err + } + if err := s.handleUserPayload(user, conn, payload); err != nil { + log.Print("handler error: ", err) + } + } +} + +func (s *Server) handleUserPayload(user *User, sender net.Conn, payload any) error { + switch v := payload.(type) { + case core.Message: + return s.handleMessage(sender, v) + case core.Usermode: + return s.handleUsermode(user, sender, v) + default: + return core.ErrUnexpectedPayloadType + } +} + +func (s *Server) handleUsermode(user *User, conn net.Conn, mode core.Usermode) error { + addr, err := core.ReadAddr(mode.UserAddr) + if err != nil { + return err + } + + if user.Name != addr.Channel { + log.Println("unauthorized") + return user.Send(conn, core.Error{core.ErrorUnauthorized}) + } + + s.channelsMu.RLock() + channel, ok := s.channels[mode.ChannelName] + if !ok { + log.Println("not found", addr.Channel) + return user.Send(conn, core.Error{core.ErrorNotFound}) + } + s.channelsMu.RUnlock() + + switch mode.Mode { + case core.UsermodeNone: + channel.Remove(user) + case core.UsermodeInChannel: + channel.Add(user) + } + + return nil +} |
