Files
caliverse_server/GameServer/Contents/Quest/QuestMetaBase/QuestUgqLiveMeta.cs
2025-05-01 07:20:41 +09:00

159 lines
7.4 KiB
C#

using Amazon.DynamoDBv2.Model;
using ServerCommon;
using ServerCore; using ServerBase;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UGQDatabase.Models;
using Newtonsoft.Json;
using static System.Runtime.InteropServices.JavaScript.JSType;
using ServerCommon.UGQ.Models;
namespace GameServer
{
public class QuestUgqLiveMeta : QuestMetaBase
{
private Lazy<ConcurrentDictionary<(UInt32, UInt32), QuestMetaAllBaseInfo>> m_ugq_quest_data = new Lazy<ConcurrentDictionary<(UInt32, UInt32), QuestMetaAllBaseInfo>>();
private ConcurrentDictionary<(UInt32, UInt32), QuestMetaAllBaseInfo> UgqQuestData => m_ugq_quest_data.Value;
public QuestUgqLiveMeta()
: base(UgqStateType.Live, QuestContentState.Live)
{
}
public override async Task<(Result, QuestMetaAllBaseInfo)> getQuestMetaInfo(Player? player, UInt32 questId, UInt32 questRevision)
{
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var result = new Result();
if (false == UgqQuestData.TryGetValue((questId, questRevision), out var ugq_quest_meta_collected_info))
{
Log.getLogger().debug($"getQuestMetaInfo not exist memory questId : {questId}, questRevision : {questRevision}");
//서버에 캐싱이 없는 경우
ugq_quest_meta_collected_info = new(m_ugq_state, m_quest_content_state);
//api서버에서 호출
(result, var game_quest_data) = await UgqMetaHelper.loadLiveGameQuestGameDataEntity(player, questId, questRevision);
if (result.isFail() || game_quest_data is null)
{
Log.getLogger().error(result.toBasicString());
//호출 해서 데이터가 없는 경우 에러 처리(무조건 있어야 된다.)
return (result, null!);
}
result = await gameQuestDataStateCheck(player, game_quest_data); //여기 result는 그냥 shutdown으로 보내는 거라서 무시
ugq_quest_meta_collected_info.m_quest_data_entity = game_quest_data;
(result, var generated_quest_base_info) = UgqMetaHelper.generateUgqQuestBaseInfo(game_quest_data);
if (result.isFail())
{
return (result, null!);
}
ugq_quest_meta_collected_info.m_quest_base_info = generated_quest_base_info;
UgqQuestData.TryAdd((questId, questRevision), ugq_quest_meta_collected_info);
Log.getLogger().debug($"UgqQuestData.TryAdd questId : {questId}, questRevision : {questRevision}");
}
else
{
//캐싱이 오래 됐을 수도 있으니 game -quest - data - simple 로 한번더 확인 필요.
//Log.getLogger().debug($"getQuestMetaInfo exist memory questId : {questId}, questRevision : {questRevision}, player : {player.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
var lang_type = player.getLanguageType();
(result, var simple_game_quest_data) = await ugq_api_manager.getUgqQuestSimpleInfo(questId, questRevision, m_quest_content_state);
if (result.isFail())
{
Log.getLogger().error(result.toBasicString());
return (result, null!);
}
NullReferenceCheckHelper.throwIfNull(simple_game_quest_data, () => $"simple_game_quest_data is null !!!");
NullReferenceCheckHelper.throwIfNull(ugq_quest_meta_collected_info.m_quest_data_entity, () => $"ugq_quest_meta_collected_info.m_quest_data_entity is null !!!");
ugq_quest_meta_collected_info.m_quest_data_entity.Shutdown = simple_game_quest_data.Shutdown;
ugq_quest_meta_collected_info.m_quest_data_entity.State = simple_game_quest_data.State;
result = await gameQuestDataStateCheck(player, ugq_quest_meta_collected_info.m_quest_data_entity);
if (result.isFail())
{
Log.getLogger().error(result.toBasicString());
return (result, null!);
}
}
UgqQuestData.TryGetValue((questId, questRevision), out ugq_quest_meta_collected_info);
return (result, ugq_quest_meta_collected_info!);
}
private async Task<Result> gameQuestDataStateCheck(Player player, GameQuestDataEntity gameQuestData)
{
//api에서 로드해서 상태 값 확인 했는데 shutdown 인 경우
var result = new Result();
if (gameQuestData.Shutdown == true)
{
var server_logic = GameServerApp.getServerLogic();
var ugq_api_manager = server_logic.GetUqgApiManager();
var lang_type = player.getLanguageType();
//해당 퀘스트가 Shutdown 인경우 갱신 해줘야 된다.
(result, var latest_queat_game_data) = await ugq_api_manager.getUgqLatestQuestData((UInt32)gameQuestData.QuestId, lang_type);
if (result.isFail())
{
var err_msg = $"Failed to getUgqLatestQuestData()!!! questId : {gameQuestData.QuestId} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(latest_queat_game_data, () => $"latest_queat_game_data is null !!! - {player.toBasicString()}");
//기존 로드된 데이터의 리비전과, 최신 리비전이 다르면 리비전이 변경이 발생한것
if (gameQuestData.Revision != latest_queat_game_data.Revision)
{
Log.getLogger().info($"Revision diff gameQuestData.Revision : {gameQuestData.Revision} <-> latest_queat_game_data.Revision : {latest_queat_game_data.Revision}");
gameQuestData.UgqGameQuestDataForClient.UgqStateType = UgqStateType.RevisionChanged;
gameQuestData.UgqGameQuestDataForClient.UgqGradeType = gameQuestData.GradeType;
//최신 버전이 아닌경우
result = updateUgqState(gameQuestData.UgqGameQuestDataForClient, UgqStateType.RevisionChanged);
if (result.isFail())
{
return result;
}
}
}
return result;
}
private Result updateUgqState(UgqGameQuestDataForClient ugqGameQuestDataForClient, UgqStateType state)
{
var result = new Result();
if (ugqGameQuestDataForClient is null)
{
var err_msg = $"GameQuestDataEntity NotExist ugqGameQuestDataForClientString";
result.setFail(ServerErrorCode.UgqQuestMetaNotExist, err_msg);
Log.getLogger().error(err_msg);
return result;
}
ugqGameQuestDataForClient.UgqStateType = state;
Log.getLogger().info($"ugq_game_quest_data_for_client ugqState: {state}");
return result;
}
}
}