Files
2025-05-01 07:20:41 +09:00

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