초기커밋
This commit is contained in:
102
ServerCommon/Contents/ReturnUserToServer/ReturnManagerBase.cs
Normal file
102
ServerCommon/Contents/ReturnUserToServer/ReturnManagerBase.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
|
||||
|
||||
using USER_GUID = System.String;
|
||||
|
||||
|
||||
namespace ServerCommon;
|
||||
|
||||
public class ReturnManagerBase
|
||||
{
|
||||
private ServerLogicBase? m_server_logic { get; set; }
|
||||
|
||||
private ReturnUserManager m_return_user_manager { get; set; } = new();
|
||||
|
||||
public void onInit(ServerLogicBase serverLogic)
|
||||
{
|
||||
m_server_logic = serverLogic;
|
||||
m_return_user_manager.setReturnKickTimeMinutes(MetaHelper.GameConfigMeta.ReturnKickTimeMinute);
|
||||
}
|
||||
|
||||
public int getReturnUserCount() => m_return_user_manager.Count;
|
||||
|
||||
public async Task checkLimitReturnUsers() => await m_return_user_manager.checkLimitReturnUsers();
|
||||
|
||||
public bool isReturnUser(USER_GUID userGuid) => m_return_user_manager.checkReturnUser(userGuid);
|
||||
|
||||
public bool addReturnUser(USER_GUID userGuid) => m_return_user_manager.addReturnUser(userGuid);
|
||||
|
||||
public async Task<Result> checkReturnUser(USER_GUID userGuid)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
var result = new Result();
|
||||
|
||||
var check = m_return_user_manager.checkReturnUser(userGuid);
|
||||
if (false == check)
|
||||
{
|
||||
var err_msg = $"not return user to server !!! : UserGuid - {userGuid}";
|
||||
Log.getLogger().info(err_msg);
|
||||
result.setFail(ServerErrorCode.InvalidReturnUser, err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
m_return_user_manager.deleteReturnUser(userGuid);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task notifyReturnUserLogout(EntityBase entityUser)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(m_server_logic, () => $"m_server_logic is null !!!");
|
||||
var rabbit_mq = m_server_logic.getRabbitMqConnector() as RabbitMqConnector;
|
||||
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null !!!");
|
||||
|
||||
var location_attribute = entityUser.getEntityAttribute<LocationAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"location_attribute is null !!!");
|
||||
var user_attribute = entityUser.getEntityAttribute<UserAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!!");
|
||||
|
||||
var redis_connector = m_server_logic.getRedisConnector();
|
||||
var redis_database = redis_connector.getDatabase();
|
||||
NullReferenceCheckHelper.throwIfNull(redis_database, () => $"redis_database is null !!!");
|
||||
|
||||
var message = new ServerMessage();
|
||||
message.NtfReturnUserLogout = new();
|
||||
message.NtfReturnUserLogout.ReturnUserGuid = user_attribute.UserGuid;
|
||||
|
||||
// 1. channel server 요청
|
||||
if (m_server_logic.getServerType().toServerType() != ServerType.Channel)
|
||||
{
|
||||
rabbit_mq.SendMessage(location_attribute.LastestChannelServerLocation.ServerName, message);
|
||||
}
|
||||
|
||||
// 2. indun server 요청
|
||||
foreach (var location in location_attribute.ReturnIndunLocations)
|
||||
{
|
||||
var roomId = location.InstanceRoomId;
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(redis_database, "");
|
||||
|
||||
InstanceRoomInfo? instanceRoom = await instance_room_storage.GetInstanceRoomInfo(roomId);
|
||||
if (instanceRoom == null)
|
||||
{
|
||||
var err_msg = $"Not found InstanceRoomInfo. roomId:{roomId}";
|
||||
Log.getLogger().error(err_msg);
|
||||
continue;
|
||||
}
|
||||
|
||||
var server_name = ServerBase.ServerHelper.makeServerNameByNetworkAddress(ServerType.Indun,
|
||||
instanceRoom.InstanceAddress, (ushort)instanceRoom.InstancePort);
|
||||
rabbit_mq.SendMessage(server_name, message);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task replyReturnUserLogout(ServerMessage.Types.GS2GS_NTF_RETURN_USER_LOGOUT notify)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
m_return_user_manager.deleteReturnUser(notify.ReturnUserGuid);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
|
||||
namespace ServerCommon;
|
||||
|
||||
public class ReturnUserManager
|
||||
{
|
||||
private ConcurrentDictionary<string, DateTime> m_return_user_ids { get; set; } = new();
|
||||
private int m_return_wait_time { get; set; } = 60;
|
||||
|
||||
public int Count => m_return_user_ids.Count;
|
||||
|
||||
public void setReturnKickTimeMinutes(int time) => m_return_wait_time = time;
|
||||
|
||||
public bool addReturnUser(string userGuid) =>
|
||||
m_return_user_ids.TryAdd(userGuid, DateTime.UtcNow.AddMinutes(m_return_wait_time));
|
||||
|
||||
public bool checkReturnUser(string userGuid) => m_return_user_ids.ContainsKey(userGuid);
|
||||
|
||||
public bool deleteReturnUser(string userGuid) => m_return_user_ids.Remove(userGuid, out _);
|
||||
|
||||
public async Task checkLimitReturnUsers()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var delete_list = (from user in m_return_user_ids
|
||||
where user.Value <= DateTime.UtcNow select user.Key).ToList();
|
||||
|
||||
foreach (var del in delete_list)
|
||||
{
|
||||
deleteReturnUser(del);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user