using System.Collections.Concurrent; using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Utils; namespace SPTarkov.Server.Core.Services; [Injectable(InjectionType.Singleton)] public class ProfileActivityService( TimeUtil timeUtil ) { private readonly ConcurrentDictionary _profileActivityTimestamps = new(); /// /// Was the requested profile active within the last x minutes /// /// Profile to check /// Minutes to check for activity in /// True when profile was active within past x minutes public bool ActiveWithinLastMinutes(string sessionId, int minutes) { if (!_profileActivityTimestamps.TryGetValue(sessionId, out var storedActivityTimestamp)) { // No record, exit early return false; } return timeUtil.GetTimeStamp() - storedActivityTimestamp < minutes * 60; } /// /// Get a list of profile ids that were active in the last x minutes /// /// How many minutes from now to search for profiles /// List of active profile ids public List GetActiveProfileIdsWithinMinutes(int minutes) { var currentTimestamp = timeUtil.GetTimeStamp(); var result = new List(); foreach (var (sessionId, lastActivityTimestamp) in _profileActivityTimestamps) { // Profile was active in last x minutes, add to return list if (currentTimestamp - lastActivityTimestamp < minutes * 60) { result.Add(sessionId); } } return result; } /// /// Update the timestamp a profile was last observed active /// /// Profile to update public void SetActivityTimestamp(string sessionId) { if(!_profileActivityTimestamps.TryAdd(sessionId, timeUtil.GetTimeStamp())) { _profileActivityTimestamps[sessionId] = timeUtil.GetTimeStamp(); } } }