aboutsummaryrefslogtreecommitdiff
path: root/internal/server/client.go
diff options
context:
space:
mode:
author2025-12-30 19:33:39 +0300
committer2025-12-30 19:33:39 +0300
commitd317e8f6df0e0e16445db606da1d683a6b35f531 (patch)
tree4b80de04e17a137cff2dc309508b5f841f48c994 /internal/server/client.go
downloadqchat-d317e8f6df0e0e16445db606da1d683a6b35f531.tar.gz
qchat-d317e8f6df0e0e16445db606da1d683a6b35f531.tar.bz2
qchat-d317e8f6df0e0e16445db606da1d683a6b35f531.tar.xz
qchat-d317e8f6df0e0e16445db606da1d683a6b35f531.zip
начальный коммит
Diffstat (limited to 'internal/server/client.go')
-rw-r--r--internal/server/client.go58
1 files changed, 58 insertions, 0 deletions
diff --git a/internal/server/client.go b/internal/server/client.go
new file mode 100644
index 0000000..dbea5a9
--- /dev/null
+++ b/internal/server/client.go
@@ -0,0 +1,58 @@
+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)
+ }
+ }
+}