diff options
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) { |
