Added Events OnDisplayRankings to launch Display of rankings in BluePrints.

This commit is contained in:
2025-07-14 15:40:03 +02:00
parent 4bbdf43ffa
commit 0a175f7813
8 changed files with 275 additions and 7 deletions

View File

@ -185,6 +185,46 @@ void UDTFluxCoreSubsystem::RegisterDelegates()
}
}
bool UDTFluxCoreSubsystem::IsStageRankingSealed(FDTFluxStageKey StageKey)
{
FDTFluxStageRankings StageRankings;
if (GetStageRankingsWithKey(StageKey, StageRankings))
{
FDTFluxStage Stage;
if (GetStageDefinition(StageKey, Stage))
{
return StageRankings.IsSealed(Stage.EndTime);
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to find Stage %i"), StageKey.StageId);
return false;
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to find StageRankings for StageKey %i"), StageKey.StageId);
return false;
}
bool UDTFluxCoreSubsystem::IsContestRankingSealed(int ContestId)
{
if (DataStorage)
{
FDTFluxContestRankings ContestRankings;
if (GetContestRankings(ContestId, ContestRankings))
{
FDTFluxContest Contest;
if (GetContestForId(ContestId, Contest))
{
return ContestRankings.IsSealed(Contest.EndTime);
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to find Contest %i"), ContestId);
return false;
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Unable to find ContestRankings for ContestId %i"), ContestId);
return false;
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DataStorage not available"));
return false;
}
void UDTFluxCoreSubsystem::ProcessRaceData(const FDTFluxRaceData& RaceDataDefinition)
{
if (RaceDataDefinition.Datas.Num() > 0)
@ -288,6 +328,138 @@ void UDTFluxCoreSubsystem::SendRequest(const FString& Message)
}
}
FGuid UDTFluxCoreSubsystem::InitContestRankingsDisplay(const int ContestId)
{
if (NetworkSubsystem)
{
if (DataStorage)
{
// no need to request StageRankings;
if (IsContestRankingSealed(ContestId))
{
const FGuid DisplayRequestId = FGuid::NewGuid();
OnContestRankingDisplayReady.Broadcast(DisplayRequestId, true);
return DisplayRequestId;
}
else
{
FOnDTFluxRequestSuccess OnSuccess = FOnDTFluxRequestSuccess::CreateLambda(
[this](const FDTFluxTrackedRequest& Request)
{
FDTFluxContestRankings Rankings = FDTFluxContestRankings();
if (Request.ParsedResponse.IsSet())
{
TSharedPtr<FDTFluxServerResponse> ResponsePtr = Request.ParsedResponse.GetValue();
ResponsePtr->ParseContestRanking(Rankings);
this->DataStorage->AddContestRanking(Rankings);
this->OnContestRankingDisplayReady.Broadcast(Request.RequestId, true);
return;
}
this->OnStageRankingDisplayReady.Broadcast(Request.RequestId, false);
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
[this](const FDTFluxTrackedRequest& InReq, const FString& InError)
{
this->OnStageRankingDisplayReady.Broadcast(InReq.RequestId, false);
});
FGuid DisplayRequestId = NetworkSubsystem->SendTrackedRequestWithCallbacks(
EDTFluxApiDataType::ContestRanking, ContestId, -1, -1, OnSuccess, OnError, true);
return DisplayRequestId;
}
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DTFluxDatastorage unavailable ..."));
OnContestRankingDisplayReady.Broadcast(FGuid(), false);
return FGuid();
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DTFluxNetworkSubsystem unavailable ..."));
OnContestRankingDisplayReady.Broadcast(FGuid(), false);
return FGuid();
}
FGuid UDTFluxCoreSubsystem::InitStageRankingsDisplay(const int ContestId, const int StageId)
{
if (NetworkSubsystem)
{
if (DataStorage)
{
// no need to request StageRankings;
if (IsStageRankingSealed(FDTFluxStageKey(ContestId, StageId)))
{
const FGuid DisplayRequestId = FGuid::NewGuid();
OnStageRankingDisplayReady.Broadcast(DisplayRequestId, true);
return DisplayRequestId;
}
else
{
FOnDTFluxRequestSuccess OnSuccess = FOnDTFluxRequestSuccess::CreateLambda(
[this](const FDTFluxTrackedRequest& Request)
{
FDTFluxStageRankings Rankings = FDTFluxStageRankings();
if (Request.ParsedResponse.IsSet())
{
TSharedPtr<FDTFluxServerResponse> ResponsePtr = Request.ParsedResponse.GetValue();
ResponsePtr->ParseStageRanking(Rankings);
this->DataStorage->AddStageRanking(Rankings);
this->OnStageRankingDisplayReady.Broadcast(Request.RequestId, true);
return;
}
this->OnStageRankingDisplayReady.Broadcast(Request.RequestId, false);
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
[this](const FDTFluxTrackedRequest& InReq, const FString& InError)
{
this->OnStageRankingDisplayReady.Broadcast(InReq.RequestId, false);
});
FGuid DisplayRequestId = NetworkSubsystem->SendTrackedRequestWithCallbacks(
EDTFluxApiDataType::StageRanking, ContestId, StageId, -1, OnSuccess, OnError, true);
return DisplayRequestId;
}
}
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DTFluxNetworkSubsystem unavailable ..."));
const FGuid RequestId = FGuid::NewGuid();
OnStageRankingDisplayReady.Broadcast(RequestId, false);
return RequestId;
}
FGuid UDTFluxCoreSubsystem::InitSplitRankingsDisplay(const int ContestId, const int StageId, const int SplitId)
{
if (NetworkSubsystem)
{
if (DataStorage)
{
FOnDTFluxRequestSuccess OnSuccess = FOnDTFluxRequestSuccess::CreateLambda(
[this](const FDTFluxTrackedRequest& Request)
{
FDTFluxSplitRankings Rankings = FDTFluxSplitRankings();
if (Request.ParsedResponse.IsSet())
{
TSharedPtr<FDTFluxServerResponse> ResponsePtr = Request.ParsedResponse.GetValue();
ResponsePtr->ParseSplitRanking(Rankings);
this->DataStorage->AddSplitRanking(Rankings);
this->OnSplitRankingDisplayReady.Broadcast(Request.RequestId, true);
return;
}
this->OnSplitRankingDisplayReady.Broadcast(Request.RequestId, false);
});
FOnDTFluxRequestError OnError = FOnDTFluxRequestError::CreateLambda(
[this](const FDTFluxTrackedRequest& InReq, const FString& InError)
{
this->OnSplitRankingDisplayReady.Broadcast(InReq.RequestId, false);
});
FGuid DisplayRequestId = NetworkSubsystem->SendTrackedRequestWithCallbacks(
EDTFluxApiDataType::ContestRanking, ContestId, StageId, SplitId, OnSuccess, OnError, true);
return DisplayRequestId;
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DTFluxDatastorage unavailable ..."));
OnSplitRankingDisplayReady.Broadcast(FGuid(), false);
return FGuid();
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("DTFluxNetworkSubsystem unavailable ..."));
OnSplitRankingDisplayReady.Broadcast(FGuid(), false);
return FGuid();
}
bool UDTFluxCoreSubsystem::GetStageRankingForBib(const int ContestId, const int StageId, const int Bib,
FDTFluxStageRanking& OutStageRanking)
{
@ -491,7 +663,6 @@ TArray<FGuid> UDTFluxCoreSubsystem::TrackedRequestStageRankings(const TArray<FDT
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("StageRanking Request [%s] Error %s"),
*InReq.RequestId.ToString(), *InError);
});
// if Contest is not ended
for (auto StageKey : ForStages)
{
FGuid ContestRequest = NetworkSubsystem->SendTrackedRequestWithCallbacks(EDTFluxApiDataType::StageRanking,