using System.Collections.Concurrent; using ServerCore; using ServerBase; using USER_GUID = System.String; namespace ServerCommon; public class ReservationMessageArgument { public ServerMessage.Types.GS2GS_REQ_RESERVATION_ENTER_TO_SERVER m_req_message { get; set; } = null!; public ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER? m_ack_message { get; set; } } public class ReservationMessageManager { private ConcurrentDictionary m_messages { get; set; } = new(); private ConcurrentDictionary m_tasks { get; set; } = new(); public bool addReservationMessage(USER_GUID userGuid, ServerMessage.Types.GS2GS_REQ_RESERVATION_ENTER_TO_SERVER reqMessage, Task action) { var args = new ReservationMessageArgument(); args.m_req_message = reqMessage; var is_add = m_tasks.TryAdd(userGuid, action); if (is_add) { m_messages[userGuid] = args; return true; } deleteReservationMessage(userGuid); return false; } public void deleteReservationMessage(USER_GUID userGuid) { m_messages.Remove(userGuid, out _); m_tasks.Remove(userGuid, out _); } private ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER? getMessage(USER_GUID userGuid) { return m_messages.TryGetValue(userGuid, out var args) ? args.m_ack_message : null; } public async Task onReceivedReservationEnterToServer(ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER message) { // 1. message 저장 await addAckMessage(message); // 2. task 찾기 if (!m_tasks.TryGetValue(message.ReservationUserGuid, out var task)) { Log.getLogger().error($"Failed to get reservation task !!! : userGuid - {message.ReservationUserGuid}"); return; } // 3. task 실행 task.Start(); } public ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER? ackTask(USER_GUID userGuid) { var message = getMessage(userGuid); deleteReservationMessage(userGuid); return message; } private async Task addAckMessage(ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER message) { if (!m_messages.TryGetValue(message.ReservationUserGuid, out var args)) { Log.getLogger().error($"Failed to get reservation task !!! : userGuid - {message.ReservationUserGuid}"); return; } args.m_ack_message = message; await Task.CompletedTask; } }