summaryrefslogtreecommitdiffstats
path: root/server/user.go
diff options
context:
space:
mode:
authorbt <bt@rctt.net>2026-04-19 21:32:53 +0200
committerbt <bt@rctt.net>2026-05-03 17:52:37 +0200
commiteec10d41af62fb9a93cd5fd79dcf94616701cc2a (patch)
treed72068dcc4cb1aa43c2e0a2fae8ff094d41ed9c6 /server/user.go
parentc00e7dd589921e6be45918d4cd589e52e2b77036 (diff)
downloadsolec-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.go69
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
+}