using Amazon.Runtime.Internal.Endpoints.StandardLibrary; using GameServer.PacketHandler; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static ClientToGameRes.Types; namespace GameServer { public class CharacterProfileAction : EntityActionBase { public CharacterProfileAction(EntityBase owner) : base(owner) { } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } public override void onClear() { return; } public async Task saveCharacterProfile(string sns_link, string message) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var fn_save_character_profile = async delegate () { var result = new Result(); var err_msg = string.Empty; var invokers = new List(); var character_profile_attribute = player.getEntityAttribute(); if (character_profile_attribute == null) { err_msg = $"Failed to get character profile attribute : {nameof(CharacterProfileAttribute)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); SaveCharacterProfilePacketHandler.send_S2C_ACK_SAVE_CHARACTER_PROFILE(player, result); return result; } character_profile_attribute.SNSLick = sns_link; character_profile_attribute.Message = message; character_profile_attribute.modifiedEntityAttribute(); var task_log_data = CharacterProfileBusinessLogHelper.toLogInfo(character_profile_attribute); invokers.Add(new CharacterProfileBusinessLog(task_log_data)); var batch = new QueryBatchEx(player, LogActionType.UpdateCharacterProfile , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } batch.appendBusinessLogs(invokers); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { SaveCharacterProfilePacketHandler.send_S2C_ACK_SAVE_CHARACTER_PROFILE(player, result); return result; } SaveCharacterProfilePacketHandler.send_S2C_ACK_SAVE_CHARACTER_PROFILE(player, result); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "SaveCharacterProfile", fn_save_character_profile); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); } return result; } public async Task getTargetCharacterProfile(string target_nickname) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var player_manager = server_logic.getPlayerManager(); player_manager.tryGetUserBySubKey(target_nickname, out var target_player); GetCharProfileRes? res = null; if (target_player == null) { (result, res) = await getOtherServerCharacterProfile(target_nickname); if (result.isFail()) { GetCharacterProfilePacketHandler.send_S2C_ACK_GET_CHARACTER_PROFILE(player, result, null); return result; } } else { (result, res) = getSameServerCharacterProfile(target_player); if (result.isFail()) { GetCharacterProfilePacketHandler.send_S2C_ACK_GET_CHARACTER_PROFILE(player, result, null); return result; } } GetCharacterProfilePacketHandler.send_S2C_ACK_GET_CHARACTER_PROFILE(player, result, res); return result; } private async Task<(Result, GetCharProfileRes?)> getOtherServerCharacterProfile(string target_nickname) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); (result, var nickname_attrib) = await NicknameHelper.findNickname(target_nickname); if (result.isFail()) return (result, null); NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!"); (result, var found_account_attrib) = await dynamo_db_client.simpleQueryDocTypeToAttrib(nickname_attrib.AccountId); if (result.isFail()) return (result, null); NullReferenceCheckHelper.throwIfNull(found_account_attrib, () => $"found_account_attrib is null !!!"); (result, var found_character_profile_attrib) = await dynamo_db_client.simpleQueryDocTypeToAttrib(nickname_attrib.UserGuid); if (result.isFail()) return (result, null); NullReferenceCheckHelper.throwIfNull(found_character_profile_attrib, () => $"found_character_profile_attrib is null !!!"); var res = new GetCharProfileRes(); res.PublicGuid = ServerCore.EncryptionHelper.encryptTextByDES(found_account_attrib.UserGuid, EncryptData.DESEncryptKey, EncryptData.DESEncryptIv); res.NickName = target_nickname; res.SNSLink = found_character_profile_attrib.SNSLick; res.Message = found_character_profile_attrib.Message; res.Language = (int)found_account_attrib.LanguageType; return (result, res); } private (Result, GetCharProfileRes?) getSameServerCharacterProfile(Player target_player) { var result = new Result(); var err_msg = string.Empty; var character_profile_attribute = target_player.getEntityAttribute(); if (character_profile_attribute == null) { err_msg = $"Failed to get character profile attribute : {nameof(CharacterProfileAttribute)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); return (result, null); } var account_attribute = target_player.getEntityAttribute(); if (account_attribute == null) { err_msg = $"Failed to get account attribute : {nameof(AccountAttribute)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); return (result, null); } var ability_action = target_player.getEntityAction(); if (ability_action == null) { err_msg = $"Failed to get ability action : {nameof(AbilityAction)}"; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); return (result, null); } var target_abilities = ability_action.getAbilities(); var res = new GetCharProfileRes(); res.PublicGuid = EncryptionHelper.encryptTextByDES(account_attribute.UserGuid, EncryptData.DESEncryptKey, EncryptData.DESEncryptIv); res.NickName = target_player.getUserNickname(); res.SNSLink = character_profile_attribute.SNSLick; res.Message = character_profile_attribute.Message; res.Language = (int)account_attribute.LanguageType; foreach(var ability in target_abilities) { res.Attributeinfo.Add(new AttributeInfo() { Attributeid = (int)ability.Key, Value = ability.Value }); } return (result, res); } } }