package server import ( "context" "io" "log/slog" "go.neonxp.ru/qchat/internal/chat" "golang.org/x/term" ) func (s *Server) serveClient(ctx context.Context, rw io.ReadWriteCloser, user *chat.User) { t := term.NewTerminal(rw, "[] ") go func() { // defer s.bus.Unsubscribe(evCh) for { select { case <-ctx.Done(): return default: } if user.CurrentChan != nil { t.SetPrompt("[" + user.CurrentChan.Name + "] ") } line, err := t.ReadLine() if err != nil { s.chat.RemoveUser(user) if err != io.EOF { slog.Error("failed read line", slog.Any("err", err)) } return } if len(line) == 0 { continue } s.chat.Input(ctx, user, line) } }() for message := range user.Events { switch message := message.(type) { case chat.Message: displayMessage(t, message, user) case chat.SelfMessage: displaySelfMessage(t, message) case chat.SystemMessage: displaySystemMessage(t, message) case chat.UserJoined: displayUserJoined(t, message) case chat.UserLeft: displayUserLeft(t, message) } } }