Files
glchat/internal/gateway/presence.go
T

39 lines
1.4 KiB
Go
Raw Normal View History

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)
}