초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,240 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using UGQDatabase.Models;
namespace GameServer;
public class UgqAbortAction : EntityActionBase
{
public UgqAbortAction(EntityBase owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
}
public async Task<Result> ugqAbort(UInt32 questId, UInt32 questRevision)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!");
//내가 들고 있는 퀘스트 리비전기준으로 apiserver 에서 정보를 가져와서 shutdown 상태가 아니면 환불 취소를 할수없다.
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
var owned_quest_revision = quest_attribute.UgqInfo.QuestRevision;
var ugq_info_action = player.getEntityAction<UgqInfoAction>();
NullReferenceCheckHelper.throwIfNull(ugq_info_action, () => $"ugq_info_action is null !!! - {player.toBasicString()}");
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
(result, var state, _) = await ugq_info_action.makeUgqCurrentState(questId, owned_quest_revision, language_type);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(state, () => $"state is null !!! - {player.toBasicString()}");
//리비전 변경된 상태도 아니고, 셧다운 상태도 아니, 스탠바이 상태도 아니면 포기할수 없다.
if (state.UgqState != UgqStateType.Shutdown && state.UgqState != UgqStateType.RevisionChanged && state.UgqState != UgqStateType.Standby)
{
var err_msg = $"can't abort ugq, cause ugqState Invalid () !!! questId : {questId}, revision : {owned_quest_revision}, state : {state.UgqState} - {player.toBasicString()}";
result.setFail(ServerErrorCode.UgqAbortCannotCauseInvalidState, err_msg);
Log.getLogger().error(err_msg);
return result;
}
var fn_transaction_runner = async delegate ()
{
var result = new Result();
quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
quest_attribute.deleteEntityAttribute();
(result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision);
if (result.isFail()) return result;
NullReferenceCheckHelper.throwIfNull(quest_meta_all_base_info, () => $"quest_meta_all_base_info is null !!! - {player.toBasicString()}");
NullReferenceCheckHelper.throwIfNull(quest_meta_all_base_info.m_quest_data_entity, () => $"quest_meta_all_base_info.m_quest_data_entity is null !!! - {player.toBasicString()}");
var cost = UgqMetaHelper.getUgqCost(quest_meta_all_base_info.m_quest_data_entity.GradeType);
var end_quest_action = player.getEntityAction<EndQuestAction>();
NullReferenceCheckHelper.throwIfNull(end_quest_action, () => $"end_quest_action is null !!! - {player.toBasicString()}");
var has_end_quest = end_quest_action.hasEndQuest(questId, questRevision);
//이미 깬 이력이 있으면 환불할 것도 없다.
if (cost > 0 && has_end_quest == false)
{
var currency_type = UgqMetaHelper.getUgqUsageFeeType(quest_meta_all_base_info.m_quest_data_entity.GradeType);
var money_action = player.getEntityAction<MoneyAction>();
result = await money_action.changeMoney(currency_type, cost);
if (result.isFail()) return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqAbort, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var log_invoker = new UgqAbortBusinessLog(questId, questRevision, UgqAbortType.Revision_Changed);
batch.appendBusinessLog(log_invoker);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
var common_result = found_transaction_runner.getCommonResult();
QuestNotifyHelper.send_GS2C_NTF_QUEST_REWARD(player, common_result);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqAbort", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
UGQAbortReason reason = state.UgqState.convertUGQAbortReason();
var ugq_api_manager = server_logic.GetUqgApiManager();
var api_result = await ugq_api_manager.setUgqQuestAborted(player.getUserGuid(), questId, owned_quest_revision, reason, language_type);
if (api_result.isFail())
{
//로그만 남긴다.
Log.getLogger().error($"Failed to setUgqQuestAborted : {api_result.toBasicString()} - {player.toBasicString()}");
}
return result;
}
public async Task<Result> ugqAbortBySelf(UInt32 questId, UInt32 questRevision)
{
//셀프 포기는 재화를 환불해 주지 않는다.
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
var ugq_api_manager = server_logic.GetUqgApiManager();
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
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()}");
var latest_revision = latest_quest_data.Revision;
result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!");
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
if (quest_attribute.UgqInfo.QuestRevision != latest_revision || latest_quest_data.State != QuestContentState.Live)
{
var err_msg = $"can't abort ugq by self, cause quest revision changed !!! questId : {questId}, revision : {quest_attribute.UgqInfo.QuestRevision}, latest_revision : {latest_revision} - {player.toBasicString()}";
result.setFail(ServerErrorCode.UgqAbortCannotCauseInvalidState, err_msg);
Log.getLogger().error(err_msg);
return result;
}
var fn_transaction_runner = async delegate ()
{
var result = new Result();
quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
quest_attribute.deleteEntityAttribute();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.None, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var log_invoker = new UgqAbortBusinessLog(questId, questRevision, UgqAbortType.Self);
batch.appendBusinessLog(log_invoker);
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqAbortBySelf", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
var api_result = await ugq_api_manager.setUgqQuestAborted(player.getUserGuid(), questId, questRevision, UGQAbortReason.Player, language_type);
if (api_result.isFail())
{
//로그만 남긴다.
Log.getLogger().error($"Failed to setUgqQuestAborted by self : {api_result.toBasicString()} - {player.toBasicString()}");
}
return result;
}
}

View File

@@ -0,0 +1,293 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using ServerCore; using ServerBase;
using ServerCommon;
using MetaAssets;
using UGQDatabase.Models;
using static ClientToGameRes.Types;
namespace GameServer;
public class UgqAssignAction : EntityActionBase
{
public UgqAssignAction(EntityBase owner)
: base(owner)
{ }
public override void onClear()
{
return;
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public async Task<(Result, ClientToGameRes.Types.GS2C_ACK_UGQ_ASSIGN)> ugqAssign(UInt32 questId, UInt32 questRevision)
{
//Ugq 정보 호출해서 가져온다. questID로만 가져와서 처리
var player = getOwner() as Player;
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var user_guid = player.getUserGuid();
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
var ack = new ClientToGameRes.Types.GS2C_ACK_UGQ_ASSIGN();
//해당 퀘스트에 대한 정보를 가지고 있는지 체크
var quest_action = player!.getEntityAction<QuestAction>();
var owned_ugq_quests = quest_action.getUgqQuests();
var result = new Result();
foreach (var owned_quest in owned_ugq_quests)
{
var owned_quest_attribute = owned_quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(owned_quest_attribute, () => $"owned_quest_attribute is null !!! - {player.toBasicString()}");
if (owned_quest_attribute.QuestId == questId && owned_quest_attribute.UgqInfo.QuestRevision > 0)
{
result.setFail(ServerErrorCode.UgqAlreadyOwnedOldRevisionQuest, $"Ugq already owned, requestQuest : {questId}, {questRevision}, ownedQuest : {owned_quest_attribute.QuestId}, {owned_quest_attribute.UgqInfo.QuestRevision}");
return (result, ack);
}
}
//호출했는데 Revision 에 해당하는 퀘스트가 사라졌을 수도 있다. (오너가 비활성화 처리 ) 이때 에러 처리
var ugq_info_action = player!.getEntityAction<UgqInfoAction>();
NullReferenceCheckHelper.throwIfNull(ugq_info_action, () => $"ugq_info_action is null !!! - {player.toBasicString()}");
result = await ugq_info_action.ugqLatestRevisionCheck(questId, questRevision);
if (result.isFail()) return (result, ack);
(result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision, QuestContentState.Live);
if (result.isFail()) return (result, ack);
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()}");
if (true == game_quest_data.Shutdown)
{
result.setFail(ServerErrorCode.UgqQuestShutdowned, $"Quest is shutdowned : {questId}, {questRevision}");
return (result, ack);
}
if (player.getUserGuid().Equals(game_quest_data.UserGuid))
{
result.setFail(ServerErrorCode.UgqAssignCannotOwnedQuest, $"owned Ugq cannot assign : {questId}, {questRevision}");
return (result, ack);
}
var new_quest = new ServerCommon.Quest(player, player.getUserGuid());
var accept_quest_var = new AcceptQuestVariable(quest_base_info, false, new_quest);
var fn_ugc_quest_assign = async delegate ()
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var user_guid = player.getUserGuid();
var grade = game_quest_data.GradeType;
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqAssign, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
batch.addQuery(new QueryFinal());
}
var language_type = account_attribute.LanguageType;
var cost = UgqMetaHelper.getUgqCost(grade);
var end_quest_action = player.getEntityAction<EndQuestAction>();
NullReferenceCheckHelper.throwIfNull(end_quest_action, () => $"end_quest_action is null !!! - {player.toBasicString()}");
var has_end_quest = end_quest_action.hasEndQuest(questId, questRevision);
if (cost > 0 && has_end_quest == false)
{
//등급별 UgqUsageFeeType 가져온다.
var currency_type = UgqMetaHelper.getUgqUsageFeeType(grade);
var money_action = player.getEntityAction<MoneyAction>();
var change_result = await money_action.changeMoney(currency_type, -cost);
if (change_result.isFail()) return change_result;
accept_quest_var.m_quest_cost = cost;
}
//퀘스트 정보 만들어서 저장
var quest_accept_action = player.getEntityAction<QuestAcceptAction>();
NullReferenceCheckHelper.throwIfNull(end_quest_action, () => $"quest_accept_action is null !!! - {player.toBasicString()}");
var result = quest_accept_action.newQuestAssign(ref accept_quest_var);
if (result.isFail()) return result;
ArgumentNullReferenceCheckHelper.throwIfNull(accept_quest_var, () => $"accept_quest_var is null !!! - {player.toBasicString()}");
batch.appendBusinessLog(new UgqAssignBusinessLog(questId, questRevision));
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail()) return result;
ArgumentNullReferenceCheckHelper.throwIfNull(accept_quest_var.m_new_quest_nullable, () => $"accept_quest_var.m_new_quest_nullable is null !!! - {player.toBasicString()}");
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
quest_action.addNewQuest(questId, accept_quest_var.m_new_quest_nullable);
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
var common_result = found_transaction_runner.getCommonResult();
//여기서 데이터 만든다
ack.QuestMetaInfos.AddRange(game_quest_data.QuestScriptMetas);
ack.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(new List<ServerCommon.Quest> { accept_quest_var.m_new_quest_nullable }));
ack.UgqGameQuestDataForClients.AddRange(new List<UgqGameQuestDataForClient>() { game_quest_data.UgqGameQuestDataForClient });
ack.CommonResult = common_result;
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqQuestAssign", fn_ugc_quest_assign);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, ack);
}
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
//퀘스트 assign 후 api 서버 쪽으로 set-quest-accepted 전달
var api_result = await ugq_api_manager.setUgqQuestAccepted(user_guid, questId, questRevision, language_type); //임시 테스트 를 위해서 TestQeustData를 가져온다.
if(api_result.isFail())
{
//로그만 남긴다.
Log.getLogger().error($"Failed to setUgqQuestAccepted : {api_result.toBasicString()} - {player.toBasicString()}");
}
return (result, ack);
}
public async Task<(Result, GS2C_ACK_UGQ_REASSIGN?, UInt32 newQuestRevision)> ugqReAssign(UInt32 questId, UInt32 questRevision)
{
var ack = new GS2C_ACK_UGQ_REASSIGN();
//api server에서 최신 정보를 가져온다.
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var old_quest);
if (result.isFail()) return (result, null, 0);
NullReferenceCheckHelper.throwIfNull(old_quest, () => $"old_quest is null !!! - {player.toBasicString()}");
(result, var new_quest_data) = await ugq_api_manager.getUgqLatestQuestData(questId, language_type);
if (result.isFail()) return (result, null, 0);
NullReferenceCheckHelper.throwIfNull(new_quest_data, () => $"new_quest_data is null !!! - {player.toBasicString()}");
(result, var new_quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, (UInt32)new_quest_data.Revision, QuestContentState.Live);
if (result.isFail()) return (result, ack, 0);
NullReferenceCheckHelper.throwIfNull(new_quest_meta_all_base_info, () => $"new_quest_meta_all_base_info is null !!! - {player.toBasicString()}");
var new_game_quest_data = new_quest_meta_all_base_info.m_quest_data_entity;
var new_quest_base_info = new_quest_meta_all_base_info.m_quest_base_info;
NullReferenceCheckHelper.throwIfNull(new_quest_base_info, () => $"new_quest_base_info is null !!! - {player.toBasicString()}");
var new_quest = new ServerCommon.Quest(player, player.getUserGuid());
var fn_transaction_runner = async delegate ()
{
var result = new Result();
var old_quest_attribute = old_quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(old_quest_attribute, () => $"old_quest_attribute is null !!! - {player.toBasicString()}");
old_quest_attribute.deleteEntityAttribute();
var new_accept_quest_var = new AcceptQuestVariable(new_quest_base_info, false, new_quest);
new_accept_quest_var.m_quest_cost = 0;
new_accept_quest_var.m_quest_type = EQuestType.UGQ;
var quest_accept_action = player.getEntityAction<QuestAcceptAction>();
NullReferenceCheckHelper.throwIfNull(quest_accept_action, () => $"quest_accept_action is null !!! - {player.toBasicString()}");
result = quest_accept_action.newQuestAssign(ref new_accept_quest_var);
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqReAssign, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
batch.appendBusinessLog(new UgqReAssignBusinessLog(questId, (UInt32)new_quest_data.Revision));
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(new_accept_quest_var.m_new_quest_nullable, () => $"new_accept_quest_var.m_new_quest_nullable is null !!! - {player.toBasicString()}");
var quest_type = EnumHelper.convertEnumTypeAndValueStringToEnum(new_quest_base_info.QuestType, EQuestType.NORMAL);
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
quest_action.deleteQuest(quest_type, questId);
quest_action.addNewQuest(questId, new_accept_quest_var.m_new_quest_nullable);
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqReAssign", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null, 0);
}
//여기서 데이터 만든다
//ack.QuestMetaInfos.AddRange(new_game_quest_data.QuestScriptMetas);
//ack.Quests.AddRange(await QuestMetaHelper.makeQuestInfoData(new List<ServerCommon.Quest> { new_quest }));
//ack.UgqGameQuestDataForClients.AddRange(new List<UgqGameQuestDataForClient>() { new_game_quest_data.UgqGameQuestDataForClient });
ack.DeletedComposedQuestId = QuestHelper.convertQuestIdAndRevisionToUgqQuestId(questId, questRevision);
return (result, ack, (UInt32)new_quest_data.Revision);
}
}

View File

@@ -0,0 +1,531 @@
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<Result> 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<AccountAttribute>();
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<AccountAttribute>();
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<string>) getUgqFromNpc(string npcGuid)
{
var result = new Result();
var ugqs = new List<string>();
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var ugq_api_manager = GameServerApp.getServerLogic().GetUqgApiManager();
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
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<Result> 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<AccountAttribute>();
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<Result> 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<AccountAttribute>();
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<Result> 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<AccountAttribute>();
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<Result> 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<AccountAttribute>();
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<Result> 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<AccountAttribute>();
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<UgqCurrentState>)> reloadUgqCurrentState()
{
var result = new Result();
var states = new List<UgqCurrentState>();
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
var quests = quest_action.getQuests();
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
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<QuestAttribute>();
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<List<AllUgqInfos>> 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<QuestAction>();
var quests = quest_action.getUgqQuests();
List<AllUgqInfos> all_ugq_infos = new();
foreach (var quest in quests)
{
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
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<UgqInfoAction>();
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<ServerCommon.Quest> ugq_quests = new();
List<QuestMetaInfo> meta_infos = new();
List<UgqGameQuestDataForClient> ugq_game_quest_data_for_clients = new();
var quest_infos = await QuestMetaHelper.makeQuestInfoData(new List<ServerCommon.Quest> { quest });
meta_infos.AddRange(game_quest_data.QuestScriptMetas);
ugq_game_quest_data_for_clients.AddRange(new List<UgqGameQuestDataForClient>() { 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<List<AllUgqInfos>> 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<AllUgqInfos>();
var quest_action = player!.getEntityAction<QuestAction>();
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<QuestAttribute>();
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<UgqInfoAction>();
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<ServerCommon.Quest> ugq_quests = new();
List<QuestMetaInfo> meta_infos = new();
List<UgqGameQuestDataForClient> ugq_game_quest_data_for_clients = new();
var quest_infos = await QuestMetaHelper.makeQuestInfoData(new List<ServerCommon.Quest> { quest });
meta_infos.AddRange(game_quest_data.QuestScriptMetas);
ugq_game_quest_data_for_clients.AddRange(new List<UgqGameQuestDataForClient>() { 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<Result> 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<AccountAttribute>();
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;
}
}

View File

@@ -0,0 +1,106 @@
using ServerCore; using ServerBase;
using ServerCommon;
namespace GameServer;
public class UgqRewardAction : EntityActionBase
{
public UgqRewardAction(EntityBase owner)
: base(owner)
{
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
}
public async Task<Result> uggDailyRewardRefreshWithoutTransaction()
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var ugq_daily_reward_attribute = player.getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_attribute, () => $"ugq_daily_reward_attribute is null !!! - {player.toBasicString()}");
var current_time = DateTimeHelper.Current;
if (ugq_daily_reward_attribute.m_next_refresh_time > current_time) return result;
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Amature, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.RisingStar, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master1, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master2, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master3, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_next_refresh_time = DateTimeHelper.Current.Date.AddDays(1);
ugq_daily_reward_attribute.modifiedEntityAttribute(true);
return await Task.FromResult(result);
}
public async Task<Result> uggDailyRewardRefresh()
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var fn_transaction_runner = async delegate ()
{
var ugq_daily_reward_attribute = player.getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_attribute, () => $"ugq_daily_reward_attribute is null !!! - {player.toBasicString()}");
var fn_result = new Result();
var current_time = DateTimeHelper.Current;
if (ugq_daily_reward_attribute.m_next_refresh_time > current_time) return fn_result;
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Amature, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.RisingStar, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master1, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master2, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_ugq_daily_reward_count.AddOrUpdate(UgqGradeType.Master3, 0, (key, old) => 0);
ugq_daily_reward_attribute.m_next_refresh_time = DateTimeHelper.Current.Date.AddDays(1);
ugq_daily_reward_attribute.modifiedEntityAttribute(true);
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqDailyRewardCountRefresh, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
var log_invoker = new UgqDailyRewardBusinessLog(ugq_daily_reward_attribute.m_next_refresh_time, ugq_daily_reward_attribute.m_ugq_daily_reward_count);
batch.appendBusinessLog(log_invoker);
fn_result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (fn_result.isFail())
{
return fn_result;
}
return fn_result;
};
var result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqDailyRewardCountRefresh", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
}

View File

@@ -0,0 +1,465 @@
using System.Collections.Concurrent;
using ServerCore; using ServerBase;
using ServerCommon;
using MetaAssets;
using UGQDatabase.Models;
using static ClientToGameRes.Types;
using Org.BouncyCastle.Asn1.Ocsp;
namespace GameServer;
public class UgqTestAction : EntityActionBase
{
private Lazy<ConcurrentDictionary<(UInt32, UInt32), QuestMetaAllBaseInfo>> m_ugq_test_quest_data = new Lazy<ConcurrentDictionary<(UInt32, UInt32), QuestMetaAllBaseInfo>>();
public UgqTestAction(EntityBase owner)
: base(owner)
{}
public override void onClear()
{
return;
}
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public async Task<(Result, GS2C_ACK_UGQ_TEST_ASSIGN?)> ugqTestAssign(UInt32 questId, UInt32 questRevision)
{
//Ugq 정보 호출해서 가져온다. questID로만 가져와서 처리
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
GS2C_ACK_UGQ_TEST_ASSIGN ack = new();
var ugq_api_manager = server_logic.GetUqgApiManager();
var user_guid = player.getUserGuid();
var ugq_info_action = player.getEntityAction<UgqInfoAction>();
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, questId, questRevision, QuestContentState.Test);
if (result.isFail()) return (result, null);
var game_quest_data = quest_meta_all_base_info.m_quest_data_entity;
var quest_base_info = quest_meta_all_base_info.m_quest_base_info;
if (result.isFail())
{
var err_msg = $"Test UgqData Not Exist uger_guid : {user_guid}, questId : {questId}, revision : {questRevision}";
Log.getLogger().error(err_msg);
return (result, null);
}
NullReferenceCheckHelper.throwIfNull(game_quest_data, () => $"game_quest_data is null !!! - {player.toBasicString()}");
NullReferenceCheckHelper.throwIfNull(quest_base_info, () => $"quest_base_info is null !!! - {player.toBasicString()}");
var new_quest = new ServerCommon.Quest(player, player.getUserGuid());
var accept_quest_var = new AcceptQuestVariable(quest_base_info, false, new_quest);
result = await ugqTestQuestAssignAsync(game_quest_data, accept_quest_var);
if (result.isFail()) return (result, null);
new_quest = accept_quest_var.m_new_quest_nullable;
NullReferenceCheckHelper.throwIfNull(new_quest, () => $"new_quest is null !!! - {player.toBasicString()}");
var quest_action = player.getEntityAction<QuestAction>();
quest_action.addNewQuest(questId, new_quest);
return (result, ack);
}
public async Task<Result> ugqTestDelete(UInt32 questId)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
if (result.isFail())
{
return result;
}
ArgumentNullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!! - {player.toBasicString()}");
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
var quest_doc = new QuestDoc(player.getUserGuid(), quest_attribute.QuestId, quest_attribute.UgqInfo.QuestRevision);
(result, var copy_doc) = await quest_doc.onCopyToDocument();
if (result.isFail())
{
var err_msg = $"Failed to onCopyToDocument() !!! : {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var dynamo_db_client = server_logic.getDynamoDbClient();
var table = dynamo_db_client.getTableByDoc<QuestDoc>();
result = await table.simpleDeleteDocumentsWithBatchWrite([copy_doc]);
if (result.isFail())
{
var err_msg = $"Failed to ugqTestDelete !!! id = {quest_attribute.QuestId}, revision = {quest_attribute.UgqInfo.QuestRevision} - {toBasicString()}";
result.setFail(ServerErrorCode.DynamoDbDocCopyFailedToDocument, err_msg);
Log.getLogger().error(err_msg);
return result;
}
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
return result;
}
public async Task<Result> ugqTestDelete(QuestAttribute attribute)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
var dynamo_db_client = server_logic.getDynamoDbClient();
var result = new Result();
//(bool ret, var copy_doc) = await attribute.m_quest_doc_nullable.onCopyToDocument();
//attribute.m_quest_doc_nullable.onApplyPKSK();
var quest_doc = new QuestDoc(player.getUserGuid(), attribute.QuestId, attribute.UgqInfo.QuestRevision);
(result, var copy_doc) = await quest_doc.onCopyToDocument();
if (result.isFail())
{
var err_msg = $"Failed to onCopyToDocument() !!! : {result.toBasicString()} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var table = dynamo_db_client.getTableByDoc<QuestDoc>();
result = await table.simpleDeleteDocumentsWithBatchWrite([copy_doc]);
if (result.isFail())
{
var err_msg = $"Failed to ugqTestDelete !!! : {result.toBasicString()}, id:{attribute.QuestId}, revision:{attribute.UgqInfo.QuestRevision} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
private async Task<Result> ugqTestQuestAssignAsync(GameQuestDataEntity gameQuestData, AcceptQuestVariable acceptQuestVar)
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var user_guid = player.getUserGuid();
var cost = gameQuestData.Cost;
var account_attribute = player.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
//퀘스트 정보 만들어서 저장
var quest_accept_action = player.getEntityAction<QuestAcceptAction>();
NullReferenceCheckHelper.throwIfNull(quest_accept_action, () => $"quest_accept_action is null !!! - {player.toBasicString()}");
result = quest_accept_action.newQuestAssign(ref acceptQuestVar);
if (result.isFail()) return result;
ArgumentNullReferenceCheckHelper.throwIfNull(acceptQuestVar, () => $"acceptQuestVar is null !!! - {player.toBasicString()}");
var new_quest = acceptQuestVar.m_new_quest_nullable;
ArgumentNullReferenceCheckHelper.throwIfNull(new_quest, () => $"new_quest is null !!! - {player.toBasicString()}");
var quest_attribute = new_quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
(result, var new_quest_docbase) = await quest_attribute.toDocBase();
if (result.isFail()) return result;
NullReferenceCheckHelper.throwIfNull(new_quest_docbase, () => $"new_quest_docbase is null !!! - {player.toBasicString()}");
var dynamo_db_client = server_logic.getDynamoDbClient();
ArgumentNullException.ThrowIfNull(dynamo_db_client, $"dynamo_db_client is null !!!");
(result, var new_quest_doc) = await new_quest_docbase.onCopyToDocument();
if (result.isFail())
{
var err_msg = $"Failed to onCopyToDocument() !!! : {result.toBasicString()}, id:{quest_attribute.QuestId}, revision:{quest_attribute.UgqInfo.QuestRevision} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var table = dynamo_db_client.getTableByDoc<QuestDoc>();
result = await table.simpleUpsertDocumentsWithBatchWrite([new_quest_doc]);
if (result.isFail())
{
var err_msg = $"Failed to simpleUpsertDocumentsWithBatchWrite() !!! : {result.toBasicString()}, id:{quest_attribute.QuestId}, revision:{quest_attribute.UgqInfo.QuestRevision} - {toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
//batch.appendBusinessLog(new UgqAssignBusinessLog(acceptQuestVar.m_quest_base_info_nullable.QuestId, acceptQuestVar.m_quest_base_info_nullable.QuestRevision));
//result = await QueryHelper.sendQueryAndBusinessLog(batch);
//if (result.isFail()) return result;
return result;
}
public async Task<Result> ugqTestAbort(UInt32 questId, UInt32 questRevision)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!!");
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
if (result.isFail())
{
return result;
}
ArgumentNullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!! - {player.toBasicString()}");
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
if (quest_attribute.IsComplete == 1)
{
var err_msg = $"can't abort ugq test cause alredy completed player = {player.toBasicString()}, questId = {questId}";
result.setFail(ServerErrorCode.UgqTestQuestAlreadyCompleted, err_msg);
Log.getLogger().warn(err_msg);
return result;
}
var fn_transaction_runner = async delegate ()
{
var result = new Result();
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
quest_attribute.deleteEntityAttribute();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqTestAbort, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
batch.appendBusinessLog(new UgqTestAbortBusinessLog(questId, questRevision));
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqTestAbort", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
var ugq_api_manager = server_logic.GetUqgApiManager();
var account_attribute = player.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
var api_result = await ugq_api_manager.setTestUgqQuestAborted(player.getUserGuid(), questId, questRevision, language_type);
if (api_result.isFail())
{
Log.getLogger().error($"Failed to setTestUgqQuestAborted() !!! : {api_result.toBasicString()} - {player.toBasicString()}");
}
return result;
}
public async Task<Result> ugqTestComplete(UInt32 questId, UInt32 questRevision)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var server_logic = GameServerApp.getServerLogic();
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
if (result.isFail())
{
return result;
}
ArgumentNullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!! - {player.toBasicString()}");
var fn_transaction_runner = async delegate ()
{
var result = new Result();
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
quest_attribute.deleteEntityAttribute();
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.None, server_logic.getDynamoDbClient());
{
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
}
batch.appendBusinessLog(new UgqTestCompleteBusinessLog(questId, questRevision));
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
};
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqTestComplete", fn_transaction_runner);
if (result.isFail())
{
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
var ugq_api_manager = server_logic.GetUqgApiManager();
var account_attribute = player.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
var api_result = await ugq_api_manager.setTestUgqQuestCompleted(player.getUserGuid(), questId, questRevision, language_type);
if(api_result.isFail())
{
Log.getLogger().error($"Failed to setTestUgqQuestCompleted() !!! : {api_result.toBasicString()} - {player.toBasicString()}");
}
return result;
}
public async Task<Result> makeQuestFromTestUgq()
{
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 account_attribute = player.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var language_type = account_attribute.LanguageType;
(var result, var user_quests_in_test_state) = await ugq_api_manager.getTestUgqIds(user_guid, language_type);
if (result.isFail()) return result;
NullReferenceCheckHelper.throwIfNull(user_quests_in_test_state, () => $"user_quests_in_test_state is null !!! - {player.toBasicString()}");
var quest_action = player.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {player.toBasicString()}");
var owned_test_ugqs = quest_action.getTestUgqs();
HashSet<UInt32> contain_checked_ugq_ids = new();
foreach (var user_quest_in_test_state in user_quests_in_test_state)
{
(var quest_id, var quest_revision) = QuestHelper.convertUgqQuestIdToQuestIdAndRevision(user_quest_in_test_state.ComposedQuestId);
if (false == owned_test_ugqs.TryGetValue(quest_id, out var owned_test_ugq))
{
//없는 테스트 퀘스트니까 만들어줘야된다.
(var assing_resul, var ack) = await ugqTestAssign(quest_id, quest_revision);
continue;
}
//있는 테스트 퀘스트 리비전 체크
var quest_attribute = owned_test_ugq.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
if (quest_attribute.UgqInfo.QuestRevision != quest_revision)
{
//다르면 삭제후 생성
_= await ugqTestDelete(quest_id);
_ = await ugqTestAssign(quest_id, quest_revision);
contain_checked_ugq_ids.Add(quest_id);
continue;
}
//기존 퀘스트 가지고 있으니까 체크된 항목에 일던 넣어놓는다.
contain_checked_ugq_ids.Add(quest_id);
continue;
}
foreach (var contain_quest_id in contain_checked_ugq_ids)
{
owned_test_ugqs.Remove(contain_quest_id, out _);
}
foreach (var delete_quest_id in owned_test_ugqs)
{
_ = await ugqTestDelete(delete_quest_id.Key);
}
return result;
}
public async Task<(Result, QuestMetaAllBaseInfo)> getUgqGameQuestTestData(UInt32 questId, UInt32 questRevision)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
(var result, var game_quest_data) = await UgqMetaHelper.loadTestGameQuestGameDataEntity(player, questId, questRevision);
if (result.isFail() || game_quest_data is null)
{
return (result, null!);
}
(result, var generated_quest_base_info) = UgqMetaHelper.generateUgqQuestBaseInfo(game_quest_data);
if (result.isFail())
{
return (result, null!);
}
NullReferenceCheckHelper.throwIfNull(generated_quest_base_info, () => $"generated_quest_base_info is null !!! - {player.toBasicString()}");
var info = new QuestMetaAllBaseInfo(UgqStateType.Test, QuestContentState.Test, generated_quest_base_info, game_quest_data);
m_ugq_test_quest_data.Value.AddOrUpdate((questId, questRevision), info, (key, oldValue) => info);
return (result, info);
}
}