초기커밋
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user