aboutsummaryrefslogtreecommitdiff
path: root/internal/chat/chan.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/chat/chan.go')
-rw-r--r--internal/chat/chan.go38
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) {