using System.Collections.Generic; using System.Net.Http; using Newtonsoft.Json; using Amazon.Runtime.Internal.Endpoints.StandardLibrary; using ServerCore; using ServerBase; using ServerCommon; using MetaAssets; using UGQDatabase.Models; namespace GameServer; public class UgqInfoAction : EntityActionBase { public UgqInfoAction(EntityBase owner) : base(owner) {} public override void onClear() { return; } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public async Task<(Result, UgqBoardSearchResult?)> getPagedUgqFromBoard(UgqSearchCategoryType searchCategoryType = UgqSearchCategoryType.GradeAmateur, UgqSortType sortType = UgqSortType.New, Int32 pageNumber = 1, string searchText = "", UgqSearchType searchType = UgqSearchType.Title) { //TODO : 최대 입력 글자수 체크 //TODO : paging 된 데이터에 대해서 갱신 시간을 그때 처리 안하는게 좋을것 같긴 한데... 리프레시 타임 Meta로 빼서 처리 var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var language_type = player.getLanguageType(); var user_guid = player.getUserGuid(); var search_result = new UgqBoardSearchResult(); var result = new Result(); var page_size = MetaHelper.GameConfigMeta.UGQBoardMaxListAmount; switch (searchCategoryType) { case UgqSearchCategoryType.GradeAmateur: case UgqSearchCategoryType.GradeRisingStar: case UgqSearchCategoryType.GradeMaster: UgqUICategoryGradeType grade_type = UgqApiHelper.convertSearchCategoryTypeToUICategoryGradeType(searchCategoryType); var dict = UgqApiHelper.makeDictionaryFromSearchQuestBoard(pageNumber, grade_type, searchType, searchText, sortType, language_type, page_size); (result, search_result) = await ugq_api_manager.getPagedGradeUgqFromBoard(dict, language_type); break; case UgqSearchCategoryType.Bookmark: dict = UgqApiHelper.makeDictionaryFromSearchQuestBoard(pageNumber, UgqUICategoryGradeType.None, UgqSearchType.None, string.Empty, sortType, language_type, page_size); (result, search_result) = await ugq_api_manager.getPagedBookmarkUgqFromBoard(dict, user_guid); break; case UgqSearchCategoryType.SpotLight: default: var err_msg = $"getPagedUgqFromBoard Invalid searchCategoryType : {searchCategoryType} !!!"; result.setFail(ServerErrorCode.UgqApiServerInvaildSearchCategoryType, err_msg); Log.getLogger().info(result.toBasicString()); break; } if (result.isFail()) { return (result, null); } return (result, search_result); } public async Task<(Result, UgqBoardSportlightResult?)> getUgqSpotlightFromBoard() { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var dict = UgqApiHelper.makeDictionaryFromLanguageType(language_type); var (result, search_result) = await ugq_api_manager.getPagedSpotLightUgqFromBoard(dict); return (result, search_result); } public async Task<(Result, UgqBoardItemDetail?)> getUgqDetailFromBoard(UInt32 questId, UInt32 questRevision) { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryForUgqQuestId(questId, questRevision); (var result, var board_item_detail) = await ugq_api_manager.getUgqDetailFromBoard(dict, user_guid, language_type); return (result, board_item_detail); } public (Result, List) getUgqFromNpc(string npcGuid) { var result = new Result(); var ugqs = new List(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); return (result, ugqs); } public async Task ugqRegisterBookmark(UInt32 questId) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryFromLanguageTypeWithMediaType(language_type); result = await ugq_api_manager.ugqRegisterBookmark(dict, questId, user_guid); return result; } public async Task ugqDeregisterBookmark(UInt32 questId) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryFromLanguageTypeWithMediaType(language_type); result = await ugq_api_manager.ugqDeRegisterBookmark(dict, questId, user_guid); return result; } public async Task ugqRegisterLike(UInt32 questId, UInt32 questRevision) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryFromLanguageTypeWithMediaType(language_type); result = await ugq_api_manager.ugqRegisterLike(dict, questId, questRevision, user_guid); return result; } public async Task ugqDeregisterLike(UInt32 questId, UInt32 questRevision) { var result = new Result(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryFromLanguageTypeWithMediaType(language_type); result = await ugq_api_manager.ugqDeregisterLike(dict, questId, questRevision, user_guid); return result; } public async Task getUgqReport(UInt32 questId, UInt32 questRevision, string reportText) { var result = new Result(); //몇자 이상 넘어가면 에러 처리, 빈값이어도 에러 처리 if (MetaHelper.GameConfigMeta.MinReportContentNum > reportText.Length || MetaHelper.GameConfigMeta.MaxReportContentNum < reportText.Length) { var err_msg = $"fail to report ugc !!! : invalid report text length - {reportText.Length}"; result.setFail(ServerErrorCode.UgqReportInvalidTextLength, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; var user_guid = player.getUserGuid(); var dict = UgqApiHelper.makeDictionaryFromLanguageTypeWithMediaType(language_type); result = await ugq_api_manager.ugqReport(dict, questId, questRevision, user_guid, reportText); return result; } public async Task<(Result, List)> reloadUgqCurrentState() { var result = new Result(); var states = new List(); var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var quest_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}"); var quests = quest_action.getQuests(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; foreach (var quest in quests) { var quest_attribute = quest.Value.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}"); var quest_revision = quest_attribute.UgqInfo.QuestRevision; if (quest_revision == 0) continue; var quest_id = quest.Key.Item2; (result, var state, _) = await makeUgqCurrentState(quest_id, quest_revision, language_type); if (result.isFail()) { continue; } NullReferenceCheckHelper.throwIfNull(state, () => $"state is null !!! - {player.toBasicString()}"); states.Add(state); } return (result, states); } public async Task<(Result, UgqCurrentState?, UgqGradeType)> makeUgqCurrentState(UInt32 questId, UInt32 questRevision, LanguageType languageType) { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var state = new UgqCurrentState(); state.ComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision); //state.UgqQuestId.QuestRevision = questRevision; var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager(); (var result, var latest_game_quest_data) = await ugq_api_manager.getUgqLatestQuestData(questId, languageType); if (result.isFail()) { var err_msg = $"fail to getUgqLatestQuestData !!! questId : {questId}, {player.getUserGuid()}"; Log.getLogger().error(err_msg); return (result, null, UgqGradeType.None); } NullReferenceCheckHelper.throwIfNull(latest_game_quest_data, () => $"latest_game_quest_data is null !!! - {player.toBasicString()}"); var grade = latest_game_quest_data.GradeType; if (questRevision < latest_game_quest_data.Revision) { if (false == latest_game_quest_data.Shutdown) { state.UgqState = UgqStateType.Shutdown; } else { state.UgqState = UgqStateType.RevisionChanged; } } else if (questRevision == latest_game_quest_data.Revision) { if (true == latest_game_quest_data.Shutdown) { state.UgqState = UgqStateType.Shutdown; } else { state.UgqState = UgqStateType.Live; } } else if (latest_game_quest_data.UgqGameQuestDataForClient.UgqStateType == UgqStateType.Standby) { state.UgqState = UgqStateType.Standby; } else { var err_msg = $"UgqQuestData Invalid questId : {questId}, questRevision : {questRevision}, latest_game_quest_data.Revision :{latest_game_quest_data.Revision}, {player.getUserGuid()}"; result.setFail(ServerErrorCode.UgqQuestDataInvalidRevision, err_msg); Log.getLogger().error(err_msg); return (result, null, grade); } return (result, state, grade); } public async Task> makeUqgInfosForClient() { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var ugq_api_manager = server_logic.GetUqgApiManager(); var user_guid = player.getUserGuid(); var quest_action = player!.getEntityAction(); var quests = quest_action.getUgqQuests(); List all_ugq_infos = new(); foreach (var quest in quests) { var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}"); if (quest_attribute.UgqInfo.QuestRevision == 0) continue; var quest_id = quest_attribute.QuestId; var quest_revision = quest_attribute.UgqInfo.QuestRevision; var ugq_info_action = player!.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ugq_info_action, () => $"ugq_info_action is null !!! - {player.toBasicString()}"); (var result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, quest_id, quest_revision, quest_attribute.UgqInfo.UqgState); if (result.isFail()) continue; NullReferenceCheckHelper.throwIfNull(quest_meta_all_base_info, () => $"quest_meta_all_base_info is null !!! - {player.toBasicString()}"); var game_quest_data = quest_meta_all_base_info.m_quest_data_entity; NullReferenceCheckHelper.throwIfNull(game_quest_data, () => $"game_quest_data is null !!! - {player.toBasicString()}"); var quest_base_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!! - {player.toBasicString()}"); game_quest_data.UgqGameQuestDataForClient.UgqGradeType = game_quest_data.GradeType; List ugq_quests = new(); List meta_infos = new(); List ugq_game_quest_data_for_clients = new(); var quest_infos = await QuestMetaHelper.makeQuestInfoData(new List { quest }); meta_infos.AddRange(game_quest_data.QuestScriptMetas); ugq_game_quest_data_for_clients.AddRange(new List() { game_quest_data.UgqGameQuestDataForClient }); var all_info = new AllUgqInfos(); all_info.Quests.AddRange(quest_infos); all_info.QuestMetaInfos.AddRange(meta_infos); all_info.UgqGameQuestDataForClients.AddRange(ugq_game_quest_data_for_clients); all_ugq_infos.Add(all_info); } return all_ugq_infos; } public async Task> makeUqgInfoForClient(UInt32 questId, UInt32 questRevision) { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var ugq_api_manager = server_logic.GetUqgApiManager(); var user_guid = player.getUserGuid(); var all_ugq_infos = new List(); var quest_action = player!.getEntityAction(); NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}"); (var result, var quest) = await quest_action.getQuest(questId, questRevision); if (result.isFail()) return all_ugq_infos; NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!! - {player.toBasicString()}"); var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}"); if (questRevision == 0) return all_ugq_infos; //var quest_id = quest_attribute.QuestId; //var quest_revision = quest_attribute.UgqInfo.QuestRevision; var ugq_info_action = player!.getEntityAction(); NullReferenceCheckHelper.throwIfNull(ugq_info_action, () => $"ugq_info_action is null !!! - {player.toBasicString()}"); (result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision, quest_attribute.UgqInfo.UqgState); if (result.isFail()) return all_ugq_infos; var game_quest_data = quest_meta_all_base_info.m_quest_data_entity; NullReferenceCheckHelper.throwIfNull(game_quest_data, () => $"game_quest_data is null !!! - {player.toBasicString()}"); var quest_base_info = quest_meta_all_base_info.m_quest_base_info; NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!! - {player.toBasicString()}"); List ugq_quests = new(); List meta_infos = new(); List ugq_game_quest_data_for_clients = new(); var quest_infos = await QuestMetaHelper.makeQuestInfoData(new List { quest }); meta_infos.AddRange(game_quest_data.QuestScriptMetas); ugq_game_quest_data_for_clients.AddRange(new List() { game_quest_data.UgqGameQuestDataForClient }); var all_info = new AllUgqInfos(); all_info.Quests.AddRange(quest_infos); all_info.QuestMetaInfos.AddRange(meta_infos); all_info.UgqGameQuestDataForClients.AddRange(ugq_game_quest_data_for_clients); all_ugq_infos.Add(all_info); return all_ugq_infos; } public async Task ugqLatestRevisionCheck(UInt32 questId, UInt32 questRevision) { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var ugq_api_manager = server_logic.GetUqgApiManager(); var account_attribute = player!.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var language_type = account_attribute.LanguageType; (var result, var latest_quest_data) = await ugq_api_manager.getUgqLatestQuestData(questId, language_type); if (result.isFail()) return result; NullReferenceCheckHelper.throwIfNull(latest_quest_data, () => $"latest_quest_data is null !!! - {player.toBasicString()}"); if (latest_quest_data.Revision > questRevision) { var err_msg = $"ugq revision updateed !!! : questId : {questId}, requestedquestRevision : {questRevision}, latest_quest_data.Revision : {latest_quest_data.Revision}"; result.setFail(ServerErrorCode.UgqQuestDataRevisionUpdated, err_msg); //Log.getLogger().error(err_msg); return result; } if (latest_quest_data.Revision < questRevision) { var err_msg = $"ugq revision updateed !!! : questId : {questId}, requestedquestRevision : {questRevision}, latest_quest_data.Revision : {latest_quest_data.Revision}"; result.setFail(ServerErrorCode.UgqRevisionCannotSmallerThanRequestedRevision, err_msg); return result; } if (latest_quest_data.State != QuestContentState.Live) { var err_msg = $"ugq state is not live !!! : questId : {questId}, requestedquestRevision : {questRevision}, latest_quest_data.state : {latest_quest_data.State}"; result.setFail(ServerErrorCode.UgqRevisionStateNotLive, err_msg); return result; } return result; } }