using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using META_ID = System.UInt32; namespace GameServer; public class TestUserInitializer : SimpleEventTriggerBase { private readonly Player m_owner; private bool m_is_completed_prepare_intialize = false; private readonly List m_query_executor_bases = new(); private bool m_is_test_user = false; private ServerCommon.BusinessLogDomain.UserInitialLogInfo m_user_initial_log = new(); private ServerCommon.BusinessLogDomain.UserLogInfo m_user_log = new(); public TestUserInitializer(Player owner) { m_owner = owner; } public async Task onPrepareInitializer() { var owner = getOwner(); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_connector = server_logic.getDynamoDbClient(); var result = new Result(); var err_msg = string.Empty; var account_attribute = owner.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}"); var user_attribute = owner.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}"); var inventory_action_base = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !!! - {owner.toBasicString()}"); var account_id = account_attribute.AccountId; var user_guid = user_attribute.UserGuid; var selected_character_guid = user_attribute.SelectedCharacterGuid; foreach (var meta_data in MetaData.Instance.m_test_user_initial_meta_datas.Values) { if (false == account_id.StartsWith(meta_data.IdPattern, StringComparison.OrdinalIgnoreCase)) { continue; } //================================================================================= // Intialize Items of Inventories //================================================================================= if (true == meta_data.IsInventoryInitialize) { inventory_action_base.onClear(); m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); await inventory_action.clearItemAllFromMemory(); } //================================================================================= // Intialize Mails //================================================================================= if (meta_data.IsMailInitialize) { m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); } //================================================================================= // Intialize SocialActionDoc //================================================================================= if (meta_data.IsSocialActionInitialize) { m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); } //================================================================================= // Intialize Customize State of CharacterBaseDoc //================================================================================= if (meta_data.IsAvatarCustomize) { if (true == selected_character_guid.isNullOrWhiteSpace()) { err_msg = $"Not selected Character !!!, to Customize - {toBasicString()}, {owner.toBasicString()}"; Log.getLogger().error(err_msg); } else { DBQEntityWriteAfterRead.FnEntityWrite entity_write_func = async delegate (List readCharacterBaseDocs) { var result = new Result(); var err_msg = string.Empty; if (0 >= readCharacterBaseDocs.Count) { err_msg = $"No read CharacterBaseDoc !!!"; Log.getLogger().warn(err_msg); } else { var found_character_base_doc = readCharacterBaseDocs.Find(x => x.getAttrib()?.CharacterGuid == selected_character_guid); if (null == found_character_base_doc) { err_msg = $"Not found CharacterBaseDoc !!! - {owner.toBasicString()}"; result.setFail(ServerErrorCode.CharacterNotFound, err_msg); return result; } var character_base_attrib = found_character_base_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(character_base_attrib, () => $"character_base_attrib is null - {owner.toBasicString()}"); character_base_attrib.ApperanceProfileValue.IsCustomCompleted = false; await found_character_base_doc.updateDoc4Query(); } return result; }; m_query_executor_bases.Add(new DBQEntityWriteAfterRead(user_guid, selected_character_guid, entity_write_func)); } } //================================================================================= // Create Items of TestUserCreate Meta //================================================================================= if (meta_data.IsResetToItemsOfTestUserCreate) { if(false == meta_data.IsInventoryInitialize) { m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll(user_guid)); var inventory_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}"); await inventory_action.clearItemAllFromMemory(); } (result, var found_test_user_create_data) = await MetaHelper.getTestUserCreateDataByAccountId(account_id); if (result.isSuccess()) { NullReferenceCheckHelper.throwIfNull(found_test_user_create_data, () => $"found_test_user_create_data is null !!! - {owner.toBasicString()}"); (result, var created_item_docs) = await TestUserCreator.createItemDocsByTestUserCreateData(owner, found_test_user_create_data); if(result.isFail()) { return result; } NullReferenceCheckHelper.throwIfNull(created_item_docs, () => $"created_item_docs is null - {owner.toBasicString()}"); m_query_executor_bases.Add(new DBQEntityWrite(created_item_docs)); } } //================================================================================= // Intialize MoneyDoc //================================================================================= { DBQEntityWriteAfterRead.FnEntityWrite entity_write_func = async delegate (List readMoneyDocs) { var result = new Result(); var err_msg = string.Empty; if (0 >= readMoneyDocs.Count) { err_msg = $"No read readMoneyDocs !!!"; Log.getLogger().warn(err_msg); } else { var found_money_doc = readMoneyDocs.Find(x => x.getAttrib()?.OwnerGuid == user_guid); if (null == found_money_doc) { err_msg = $"Not found found_money_doc !!! - {owner.toBasicString()}"; result.setFail(ServerErrorCode.UserMoneyDocEmpty, err_msg); return result; } var money_attrib = found_money_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(money_attrib, () => $"money_attrib is null - {owner.toBasicString()}"); if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.CurrencyGold)) { money_attrib.Gold = meta_data.CurrencyGold; } if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_sapphire)) { money_attrib.Sapphire = meta_data.currency_sapphire; } if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_calium)) { money_attrib.Calium = meta_data.currency_calium; } if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_ruby)) { money_attrib.Ruby = meta_data.currency_ruby; } await found_money_doc.updateDoc4Query(); } return result; }; m_query_executor_bases.Add(new DBQEntityWriteAfterRead(user_guid, "", entity_write_func)); } //================================================================================= // Intialize LocationDoc //================================================================================= { DBQEntityWriteAfterRead.FnEntityWrite entity_write_func = async delegate (List readLocationDocs) { var result = new Result(); var err_msg = string.Empty; if (0 >= readLocationDocs.Count) { err_msg = $"No read readLocationDocs !!!"; Log.getLogger().warn(err_msg); } else { if (readLocationDocs.Count > 1) { err_msg = $"More than One registered LocationDoc !!! : TgtDoc:{typeof(LocationDoc).Name} - {owner.toBasicString()}"; Log.getLogger().warn(result.toBasicString()); } var found_location_doc = readLocationDocs[0]; var location_attrib = found_location_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(location_attrib, () => $"location_attrib is null - {owner.toBasicString()}"); location_attrib.LastConnectedChannelServerLocation.fromPos(new Pos() { X = meta_data.StartX, Y = meta_data.StartY, Z = meta_data.StartZ, Angle = meta_data.StartAngle }); await found_location_doc.updateDoc4Query(); // 테스트 유저 입장 처리를 위해 설정 한다. !!! setTestUser(true); } return result; }; m_query_executor_bases.Add(new DBQEntityWriteAfterRead(user_guid, "", entity_write_func)); } //================================================================================= // Intialize Myhomes //================================================================================= if (meta_data.IsMyHomeInitialize) { MyhomeUgcInfo? myhome_ugc_info; if (meta_data.MyhomeFile == string.Empty) { var default_myhome_ugc_info_file_name = MetaHelper.GameConfigMeta.MyHomeDefaultSaveFileName; if (!MapManager.Instance.getDefaultMyhomeUgcInfo(default_myhome_ugc_info_file_name, out myhome_ugc_info)) { err_msg = $"Failed to getDefaultMyhomeUgcInfo() !!! : {default_myhome_ugc_info_file_name} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyhomeUgcInfoFileNotFoune, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } else { if (!MapManager.Instance.getDefaultMyhomeUgcInfo(meta_data.MyhomeFile, out myhome_ugc_info)) { err_msg = $"Failed to getDefaultMyhomeUgcInfo() !!! : {meta_data.MyhomeFile} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyhomeUgcInfoFileNotFoune, err_msg); Log.getLogger().error(result.toBasicString()); return result; } } m_query_executor_bases.Add(new DBQMyhomeInitializeForTestUser(user_guid, myhome_ugc_info)); } (result, var user_doc) = await user_attribute.toDocBase(false); if (result.isFail()) { err_msg = $"Failed to toDocBase() !!! : {result.toBasicString()} - {owner.toBasicString()}"; Log.getLogger().warn(err_msg); return result; } NullReferenceCheckHelper.throwIfNull(user_doc, () => $"user_doc is null !!! - {owner.toBasicString()}"); // UserCreate 로그 설정 m_user_initial_log.UserGuid = user_attribute.UserGuid; m_user_initial_log.UserPK = user_doc.getPK(); m_user_initial_log.UserSK = user_doc.getSK(); m_user_initial_log.UserInitialMetaType = meta_data.getTypeName(); m_user_initial_log.UserInitialMetaId = (META_ID)meta_data.MetaId; break; } setCompetedPrepareInitialize(true); return result; } public override async Task onTriggerEffect() { var owner = getOwner(); ArgumentNullException.ThrowIfNull(owner, $"owner is null"); var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {owner.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; if (false == isCompletedPrepareInitialize()) { err_msg = $"Not completed isCompletedPrepareLoad() !!! - {toBasicString()}, {owner.toBasicString()}"; result.setFail(ServerErrorCode.UserPrepareLoadNotCompleted, err_msg); return result; } var batch = new QueryBatchEx( owner, LogActionType.TestUserInitial , server_logic.getDynamoDbClient() , false ); { foreach(var query_executor in m_query_executor_bases) { batch.addQuery(query_executor); } batch.addQuery(new QueryFinal(), completedTestUserInitial); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } setCompleted(); return result; } public async Task completedTestUserInitial(QueryExecutorBase queryExecutorBase) { await Task.CompletedTask; var owner = getOwner(); var err_msg = string.Empty; setCompleted(); // 생성시 DBEntityWrite 처리 후 DB 에서 다시 로딩하게 되어있다. // 나중에 최적화 목적으로 DBEntityWrite 처리 후 각각의 EntityAttribute 에 적재하는 방안도 고려 하자 !!! - kangms var query_batch = queryExecutorBase.getQueryBatch(); NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}"); var log_action = query_batch.getLogAction(); NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}"); m_user_log.setInfo(owner.toUserLogInfo()); // 비즈니스 로그 추가 query_batch.appendBusinessLog(new UserInitialBusinessLog(log_action, m_user_initial_log)); query_batch.appendBusinessLog(new UserBusinessLog(log_action, m_user_log)); return QueryBatchBase.QueryResultType.Success; } public bool isCompletedPrepareInitialize() => m_is_completed_prepare_intialize; public void setCompetedPrepareInitialize(bool isTrue) => m_is_completed_prepare_intialize = isTrue; public bool isTestUser() => m_is_test_user; public void setTestUser(bool isTrue) => m_is_test_user = isTrue; public Player getOwner() => m_owner; }