diff options
| author | 2025-12-31 14:15:42 +0300 | |
|---|---|---|
| committer | 2025-12-31 14:15:42 +0300 | |
| commit | 8c0b8ad931045c70845f662238230edb81f8cd94 (patch) | |
| tree | 3bfa44e03bae220fc1233c02d716d0baa27efa3d /internal/chat/chan.go | |
| parent | немного поправил отображение (diff) | |
| download | qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.gz qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.bz2 qchat-8c0b8ad931045c70845f662238230edb81f8cd94.tar.xz qchat-8c0b8ad931045c70845f662238230edb81f8cd94.zip | |
Сделал корректную работу с терминалом и историю
Diffstat (limited to 'internal/chat/chan.go')
| -rw-r--r-- | internal/chat/chan.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/internal/chat/chan.go b/internal/chat/chan.go index bc2b70f..be9ae71 100644 --- a/internal/chat/chan.go +++ b/internal/chat/chan.go @@ -11,6 +11,7 @@ type Channel struct { Name string Users map[*User]struct{} Events chan any + Log Logs mu sync.RWMutex } @@ -21,6 +22,7 @@ func (c *Channel) Listen(ctx context.Context) { return case ev := <-c.Events: c.processEvent(ev) + c.processLog(ev) } } } @@ -42,6 +44,37 @@ func (c *Channel) processEvent(ev any) { } } +func (c *Channel) processLog(ev any) { + switch ev := ev.(type) { + case UserJoined: + c.Log.Append(LogEntry{ + Username: ev.User.NUsername(), + Time: ev.Time, + Type: TypeJoined, + }) + case UserLeft: + c.Log.Append(LogEntry{ + Username: ev.User.NUsername(), + Time: ev.Time, + Type: TypeLeft, + }) + case Message: + c.Log.Append(LogEntry{ + Username: ev.User.NUsername(), + Time: ev.Time, + Message: ev.Message, + Type: TypeMessage, + }) + case SelfMessage: + c.Log.Append(LogEntry{ + Username: ev.User.NUsername(), + Time: time.Now(), + Message: "/me " + ev.Message, + Type: TypeMessage, + }) + } +} + func (c *Channel) Join(u *User) { c.mu.Lock() defer c.mu.Unlock() @@ -56,6 +89,11 @@ func (c *Channel) Join(u *User) { } c.Users[u] = struct{}{} + + // Отправляем при подключении последние 20 сообщений + u.Events <- UserLogs{ + Logs: c.Log.Get(), + } } func (c *Channel) Leave(u *User) { |
