88 lines
2.7 KiB
C#
88 lines
2.7 KiB
C#
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<USER_GUID, ReservationMessageArgument> m_messages { get; set; } = new();
|
|
private ConcurrentDictionary<USER_GUID, Task> m_tasks { get; set; } = new();
|
|
|
|
public bool addReservationMessage(USER_GUID userGuid, ServerMessage.Types.GS2GS_REQ_RESERVATION_ENTER_TO_SERVER reqMessage, Task<ServerMessage.Types.GS2GS_ACK_RESERVATION_ENTER_TO_SERVER?> 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;
|
|
}
|
|
} |