using System.Collections.Concurrent; using ServerCore; using ServerBase; namespace ServerCommon; public class ReservationUserManager { private ServerLogicBase? m_server_logic { get; set; } private ConcurrentDictionary m_reserved_user_ids { get; set; } = new(); public int Count => m_reserved_user_ids.Count; public void onInit(ServerLogicBase serverLogic) => m_server_logic = serverLogic; public bool AddReserved(string userGuid) { if (checkReserved(userGuid)) { return true; } NullReferenceCheckHelper.throwIfNull(m_server_logic, () => $"m_server_logic is null !!!"); var config = m_server_logic.getServerConfig(); return m_reserved_user_ids.TryAdd(userGuid, DateTime.UtcNow.AddMilliseconds(config.GameConfig.ReservationWaitTimeMSec)); } public bool checkReserved(string userGuid) => m_reserved_user_ids.ContainsKey(userGuid); public bool deleteReserved(string userGuid) => m_reserved_user_ids.Remove(userGuid, out _); public async Task checkLimitReservedUsers() { await Task.CompletedTask; var delete_list = (from user in m_reserved_user_ids where user.Value <= DateTime.UtcNow select user.Key).ToList(); foreach (var del in delete_list) { deleteReserved(del); } } }