using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameMessage.Types; using static ClientToGameRes.Types; using SESSION_ID = System.Int32; using WORLD_META_ID = System.UInt32; using META_ID = System.UInt32; using ENTITY_GUID = System.String; using ACCOUNT_ID = System.String; using OWNER_GUID = System.String; using USER_GUID = System.String; using CHARACTER_GUID = System.String; using ITEM_GUID = System.String; using NICKNAME = System.String; using Org.BouncyCastle.Asn1.Ocsp; using Amazon.S3.Model; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ChangeNickNameReq), typeof(NicknameChangePacketHandler), typeof(GameLoginListener))] public class NicknameChangePacketHandler : PacketRecvHandler { public static bool send_S2C_ACK_NICKNAME_CHANGE(Player owner, Result result) { ArgumentNullException.ThrowIfNull(owner, $"owner is null !!!"); ArgumentNullException.ThrowIfNull(result, $"result is null !!! - {owner.toBasicString()}" ); var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!! - {owner.toBasicString()}"); var err_msg = string.Empty; var ack_packet = new ClientToGame(); ack_packet.Response = new(); var nickname_attribute = owner.getOriginEntityAttribute(); ArgumentNullException.ThrowIfNull(nickname_attribute, $"nickname_attribute is null !!! - {owner.toBasicString()}"); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.ChangeNickNameRes = new(); ack_packet.Response.ChangeNickNameRes.NickName = nickname_attribute.Nickname; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; } return true; } public override async Task onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage) { var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var login_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(login_msg, () => $"login_msg is null !!! - {player.toBasicString()}"); var request = login_msg.Request.ChangeNickNameReq; NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}"); var server_config = server_logic.getServerConfig(); NullReferenceCheckHelper.throwIfNull(server_config, () => $"server_config is null !!! - {player.toBasicString()}"); var user_create_or_load_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {player.toBasicString()}"); var nickname_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(nickname_action, () => $"nickname_action is null !!! - {player.toBasicString()}"); if (false == user_create_or_load_action.isCreatedUserNickname()) { result = await tryCreateUserNickname(player, request.NickName); if (result.isFail()) { err_msg = $"Failed to tryCreateUserNickname() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_NICKNAME_CHANGE(player, result); return result; } if (true == server_config.AuthRule.TestUserAllow) { // 테스트 유저일 경우 초기화 설정을 적용 한다. result = await user_create_or_load_action.initializeUser4Test(); if (result.isFail()) { send_S2C_ACK_NICKNAME_CHANGE(player, result); return result; } } result = await user_create_or_load_action.tryLoadUser(); if (result.isFail()) { err_msg = $"Failed to tryLoadUser() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_NICKNAME_CHANGE(player, result); return result; } user_create_or_load_action.updateCompletedLoadUser(); send_S2C_ACK_NICKNAME_CHANGE(player, result); if (result.isSuccess()) { nickname_action.send_GS2C_NTF_NICKNAME_CHANGE(request.NickName); //캐릭터 생성후 최초 1번 보내주는 Noties player.send_GS2C_NTF_SYSTEM_QUEST_METAS(); await player.send_GS2C_NTF_SYSTEM_QUESTS(); await QuestManager.It.PeriodRepeatQuestCheck(player); } } else { result = await tryChangeUserNickname(player, request.NickName); if (result.isFail()) { err_msg = $"Failed to tryChangeUserNickname() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_NICKNAME_CHANGE(player, result); return result; } nickname_action.send_GS2C_NTF_NICKNAME_CHANGE(request.NickName); } return result; } private async Task tryCreateUserNickname(Player player, NICKNAME newNickname) { var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}"); var user_create_or_load_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; var fn_user_nickname_create = async delegate () { var result = new Result(); result = await user_create_or_load_action.tryCreateNickname(newNickname); if (result.isFail()) { err_msg = $"Failed to tryCreateNickname() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UserNicknameCreate", fn_user_nickname_create); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; } private async Task tryChangeUserNickname(Player player, NICKNAME newNickname) { var player_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}"); var selected_character = player_action.getSelectedCharacter(); NullReferenceCheckHelper.throwIfNull(selected_character, () => $"selected_character is null !!! - {player.toBasicString()}"); var character_action = selected_character.getEntityAction(); NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; // 캐릭터 외형 설정이 완료 상태일 경우 닉네임 변경을 허용하지 않는다 !!! - kangms if (true == character_action.isCompletedApprearance()) { err_msg = $"Already Customizing Completed !!! - {selected_character.toBasicString()}"; result.setFail(ServerErrorCode.CharacterCustomizingAlreadyCompleted, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var nickname_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(nickname_action, () => $"nickname_action is null !!! - {player.toBasicString()}"); var fn_user_nickname_change = async delegate () { result = await nickname_action.tryChangeNickname(newNickname); if (result.isFail()) { err_msg = $"Failed to tryChangeNickname() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UserNicknameChange", fn_user_nickname_change); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; } }