Add TrackedRequest implementation in DTFluxCoreSubsystem and various Modifications and bugfixes.

This commit is contained in:
2025-07-11 23:45:23 +02:00
parent f1f300a351
commit d92ca63ea4
8 changed files with 199 additions and 142 deletions

View File

@ -10,6 +10,7 @@
#include "FileHelpers.h"
#include "Assets/DTFluxModelAsset.h"
#include "Subsystems/DTFluxNetworkSubsystem.h"
#include "Struct/DTFluxServerResponseStruct.h"
#include "UObject/SavePackage.h"
void UDTFluxCoreSubsystem::Initialize(FSubsystemCollectionBase& Collection)
@ -52,6 +53,84 @@ void UDTFluxCoreSubsystem::SaveDataStorage()
}
}
void UDTFluxCoreSubsystem::ProcessTrackedResponse(FDTFluxServerResponse& InResponse)
{
switch (InResponse.GetResponseType())
{
case EDTFluxApiDataType::ContestRanking:
{
FDTFluxContestRankings Rankings;
if (InResponse.ParseContestRanking(Rankings))
{
ProcessContestRanking(Rankings);
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRanking added for Contest %s"),
*Rankings.ContestName);
}
else
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to parse ContestRanking"));
}
break;
}
case EDTFluxApiDataType::StageRanking:
{
FDTFluxStageRankings Rankings;
if (InResponse.ParseStageRanking(Rankings))
{
ProcessStageRanking(Rankings);
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRanking added for Stage %i of Contest %i"),
Rankings.StageId, Rankings.ContestId);
}
else
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to parse StageRanking"));
}
break;
}
case EDTFluxApiDataType::SplitRanking:
{
FDTFluxSplitRankings Rankings;
if (InResponse.ParseSplitRanking(Rankings))
{
ProcessSplitRanking(Rankings);
UE_LOG(logDTFluxCoreSubsystem, Warning,
TEXT("ContestRanking added for Split %i of Stage %i of Contest %i"),
Rankings.SplitId, Rankings.StageId, Rankings.ContestId);
}
else
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to parse SplitRanking"));
}
break;
}
case EDTFluxApiDataType::RaceData:
{
FDTFluxRaceData RaceData;
if (InResponse.ParseRaceData(RaceData))
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("RaceDataDefinition added for Contest %s"),
*RaceData.Datas[0].Name);
ProcessRaceData(RaceData);
}
break;
}
case EDTFluxApiDataType::TeamList:
{
FDTFluxTeamListDefinition TeamList;
if (InResponse.ParseTeamList(TeamList))
{
ProcessTeamList(TeamList);
UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("Process TeamList"))
}
break;
}
default:
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Unknown DataType %s"),
*UEnum::GetValueAsString(InResponse.GetResponseType()));
break;
}
}
void UDTFluxCoreSubsystem::RegisterDelegates()
{
if (NetworkSubsystem)
@ -148,21 +227,24 @@ void UDTFluxCoreSubsystem::ProcessContestRanking(const FDTFluxContestRankings& C
DataStorage->AddContestRanking(NewContestRankings);
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRankings added for Contest %s"),
*NewContestRankings.ContestName);
SaveDataStorage();
if (bShouldKeepRankings)
{
SaveDataStorage();
}
}
void UDTFluxCoreSubsystem::ProcessStageRanking(const FDTFluxStageRankings& StageRankings)
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received StageRankings with %i Items"), StageRankings.Rankings.Num());
DataStorage->UpdateOrCreateStageRanking(StageRankings);
SaveDataStorage();
if (bShouldKeepRankings) { SaveDataStorage(); }
}
void UDTFluxCoreSubsystem::ProcessSplitRanking(const FDTFluxSplitRankings& SplitRankings)
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Received SplitRanking with %i Items"), SplitRankings.Rankings.Num());
DataStorage->UpdateOrCreateSplitRanking(SplitRankings);
SaveDataStorage();
if (bShouldKeepRankings) { SaveDataStorage(); }
}
void UDTFluxCoreSubsystem::ProcessTeamStatusUpdate(const FDTFluxTeamStatusUpdate& NewParticipantStatus)
@ -286,14 +368,18 @@ TArray<FGuid> UDTFluxCoreSubsystem::TrackedRequestContestRankings(const TArray<i
FOnDTFluxRequestSuccess OnSuccess = FOnDTFluxRequestSuccess::CreateLambda(
[this](const FDTFluxTrackedRequest& Request)
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("ContestRanking Request %s %s Success"),
UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("ContestRanking Request %s %s Success"),
*Request.RequestId.ToString(), *UEnum::GetValueAsString(Request.RequestType));
if (Request.ParsedResponse.IsSet())
{
ProcessTrackedResponse(*Request.ParsedResponse.GetValue());
}
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
[this](const FDTFluxTrackedRequest& InReq, const FString& InError)
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("ContestRanking Request [%s] Error %s"),
UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("ContestRanking Request [%s] Error %s"),
*InReq.RequestId.ToString(), *InError);
});
// if Contest is not ended
@ -318,6 +404,10 @@ TArray<FGuid> UDTFluxCoreSubsystem::TrackedRequestStageRankings(const TArray<FDT
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Stage Request %s %s Success"),
*Request.RequestId.ToString(), *UEnum::GetValueAsString(Request.RequestType));
if (Request.ParsedResponse.IsSet())
{
ProcessTrackedResponse(*Request.ParsedResponse.GetValue());
}
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
@ -348,6 +438,10 @@ TArray<FGuid> UDTFluxCoreSubsystem::TrackedRequestSplitRankings(const TArray<FDT
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Stage Request %s %s Success"),
*Request.RequestId.ToString(), *UEnum::GetValueAsString(Request.RequestType));
if (Request.ParsedResponse.IsSet())
{
ProcessTrackedResponse(*Request.ParsedResponse.GetValue());
}
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
@ -368,68 +462,6 @@ TArray<FGuid> UDTFluxCoreSubsystem::TrackedRequestSplitRankings(const TArray<FDT
return TArray<FGuid>();
}
void UDTFluxCoreSubsystem::SendTeamListRequest()
{
if (NetworkSubsystem)
{
NetworkSubsystem->SendRequest(EDTFluxRequestType::TeamList);
}
}
void UDTFluxCoreSubsystem::SendRaceDataRequest()
{
if (NetworkSubsystem)
{
NetworkSubsystem->SendRequest(EDTFluxRequestType::RaceData);
}
}
void UDTFluxCoreSubsystem::SendContestRankingRequest(int InContestId)
{
if (NetworkSubsystem)
{
NetworkSubsystem->SendRequest(EDTFluxRequestType::ContestRanking, InContestId);
}
}
void UDTFluxCoreSubsystem::SendStageRankingRequest(int InContestId, int InStageId, bool bShouldIncludeSplitRanking)
{
// TODO Implement this
}
void UDTFluxCoreSubsystem::RequestAllStageRankingOfContest(int InContestId, int InStageId,
bool bShouldIncludeSplitRanking)
{
// TODO Implement this
}
void UDTFluxCoreSubsystem::SendSplitRankingRequest(int InContestId, int InStageId, int InSplitId)
{
// TODO Implement this
}
void UDTFluxCoreSubsystem::RequestAllSplitRankingOfContest(int InContestId, int InStageId)
{
// TODO Implement this
}
//
// FDTFluxStageRankings UDTFluxCoreSubsystem::GetStageRankings(FDTFluxStageKey StageKey)
// {
// if (DataStorage->StageRankings.Contains(StageKey))
// {
// return DataStorage->StageRankings[StageKey];
// }
// UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Cannot find StageRankings for key [%s]"), *StageKey.GetDisplayName());
// return FDTFluxStageRankings();
// }
void UDTFluxCoreSubsystem::RequestAllSplitRankingOfStage(int InContestId, int InStageId, int InSplitId)
{
// TODO Implement this
}
const FDTFluxParticipant UDTFluxCoreSubsystem::GetParticipant(int InBib)
{
if (DataStorage->Participants.Contains(InBib))
@ -439,11 +471,6 @@ const FDTFluxParticipant UDTFluxCoreSubsystem::GetParticipant(int InBib)
return FDTFluxParticipant();
}
void UDTFluxCoreSubsystem::RefreshStorage()
{
// TODO Implement this
}
TArray<int> UDTFluxCoreSubsystem::GetCurrentContestsId()
{
return GetContestsIdForTime(FDateTime::Now());
@ -454,7 +481,7 @@ TArray<FDTFluxContest> UDTFluxCoreSubsystem::GetCurrentContests()
return GetContestsForTime(FDateTime::Now());
}
TArray<int> UDTFluxCoreSubsystem::GetContestsIdForTime(const FDateTime Time)
TArray<int> UDTFluxCoreSubsystem::GetContestsIdForTime(const FDateTime Time) const
{
TArray<int> Contests;
for (const auto& Pair : DataStorage->Contests)