39 lines
1.4 KiB
Go
39 lines
1.4 KiB
Go
|
|
package gateway
|
||
|
|
|
||
|
|
// Присутствие в Gateway: кто прямо сейчас держит соединение. Нужно Web Push
|
||
|
|
// (AGENT.md 7.16, Фаза 7): если у получателя есть активная сессия, уведомление
|
||
|
|
// покажет сам клиент по своим правилам, и дублировать его на телефон не нужно.
|
||
|
|
//
|
||
|
|
// Файл отдельный, чтобы не трогать горячий gateway.go: логика читает те же
|
||
|
|
// поля и под тем же мьютексом, что и рассылка.
|
||
|
|
|
||
|
|
// IsUserOnline сообщает, есть ли у пользователя хотя бы одно соединение.
|
||
|
|
func (s *Service) IsUserOnline(userID uint64) bool {
|
||
|
|
if s == nil || userID == 0 {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
s.mu.RLock()
|
||
|
|
defer s.mu.RUnlock()
|
||
|
|
for _, session := range s.sessions {
|
||
|
|
if session.userID == userID {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
// OnlineUsers возвращает количество уникальных пользователей с соединением —
|
||
|
|
// используется в тестах и диагностике.
|
||
|
|
func (s *Service) OnlineUsers() int {
|
||
|
|
if s == nil {
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
s.mu.RLock()
|
||
|
|
defer s.mu.RUnlock()
|
||
|
|
seen := make(map[uint64]struct{}, len(s.sessions))
|
||
|
|
for _, session := range s.sessions {
|
||
|
|
seen[session.userID] = struct{}{}
|
||
|
|
}
|
||
|
|
return len(seen)
|
||
|
|
}
|