Adds Custom DataAsset UI + Added Request buttons for RaceDatas/TeamList/Rankings request to ApiStatus Tab + Addes Tracked Requests For Rankings + Added Utils Module For Blueprint Utilities Functions

This commit is contained in:
2025-07-08 16:50:31 +02:00
parent 7e1ce2cdfa
commit b63f2dd7b5
40 changed files with 4027 additions and 1199 deletions

View File

@ -15,9 +15,13 @@ USTRUCT()
struct FDTFluxRequestBase
{
GENERATED_BODY()
public:
UPROPERTY()
FString Path = "";
FDateTime CreatedAt = FDateTime::Now();
FGuid RequestId = FGuid::NewGuid();
};
/**
@ -25,11 +29,13 @@ public:
* RaceData represents all data concerning the Race and its different Contests, Stages and Splits.
*/
USTRUCT()
struct FDTFluxRaceDataRequest: public FDTFluxRequestBase
struct FDTFluxRaceDataRequest : public FDTFluxRequestBase
{
GENERATED_BODY()
public:
FDTFluxRaceDataRequest(){
FDTFluxRaceDataRequest()
{
Path = "race-datas";
}
};
@ -39,11 +45,13 @@ public:
* TeamList is the list of participants of the events
*/
USTRUCT()
struct FDTFluxTeamListRequest: public FDTFluxRequestBase
struct FDTFluxTeamListRequest : public FDTFluxRequestBase
{
GENERATED_BODY()
public:
FDTFluxTeamListRequest(){
FDTFluxTeamListRequest()
{
Path = "team-list";
}
};
@ -52,16 +60,17 @@ public:
* Struct representing a Ranking json request object for a specific to the server
*/
USTRUCT()
struct FDTFluxContestRankingRequest: public FDTFluxRequestBase
struct FDTFluxContestRankingRequest : public FDTFluxRequestBase
{
GENERATED_BODY()
public:
FDTFluxContestRankingRequest()
{
Path = "contest-ranking";
ContestID = -1;
}
FDTFluxContestRankingRequest(int InContestID)
{
Path = "contest-ranking";
@ -76,10 +85,10 @@ public:
* Struct representing a Ranking json request object for a specific Stage to the server
*/
USTRUCT()
struct FDTFluxStageRankingRequest: public FDTFluxRequestBase
struct FDTFluxStageRankingRequest : public FDTFluxRequestBase
{
GENERATED_BODY()
public:
FDTFluxStageRankingRequest()
{
@ -88,6 +97,7 @@ public:
StageID = -1;
SplitID = -1;
}
FDTFluxStageRankingRequest(int InContestID, int InStageId)
{
Path = "stage-ranking";
@ -102,18 +112,16 @@ public:
int StageID;
UPROPERTY()
int SplitID;
};
/**
* Struct representing a Ranking json request object for a specific Split to the server
*/
USTRUCT()
struct FDTFluxSplitRankingRequest: public FDTFluxStageRankingRequest
struct FDTFluxSplitRankingRequest : public FDTFluxStageRankingRequest
{
GENERATED_BODY()
public:
FDTFluxSplitRankingRequest()
{
@ -122,6 +130,7 @@ public:
StageID = -1;
SplitID = -1;
}
FDTFluxSplitRankingRequest(int InContestID, int InStageId, int InSplitId)
{
Path = "stage-ranking";
@ -129,5 +138,4 @@ public:
StageID = InStageId;
SplitID = InSplitId;
}
};

View File

@ -4,13 +4,38 @@
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "DTFluxNetworkModule.h"
#include "DTFluxRaceDataServerResponse.h"
#include "DTFluxRankingServerResponse.h"
#include "DTFluxSplitSensorServerResponse.h"
#include "JsonObjectConverter.h"
#include "Types/Enum/DTFluxCoreEnum.h"
#include "Types/Objects/UDTFluxParticipantFactory.h"
#include "Types/Struct/DTFluxRaceDataStructs.h"
#include "Types/Struct/DTFluxRankingStructs.h"
#include "Types/Struct/DTFluxSplitSensor.h"
#include "DTFluxServerResponseStruct.generated.h"
/**
* Enum pour indiquer le statut du parsing
*/
UENUM(BlueprintType)
enum class EDTFluxResponseStatus : uint8
{
Unset = 0b00000000 UMETA(DisplayName="Unset"),
Success = 0b10000000 UMETA(DisplayName="Success"),
JsonParseError = 0b00000001 UMETA(DisplayName="JsonParseError"),
ServerError = 0b00000010 UMETA(DisplayName="ServerError"),
InvalidType = 0b00000100 UMETA(DisplayName="InvalidType"),
MissingData = 0b00001000 UMETA(DisplayName="MissingData"),
DataError = 0b00010000 UMETA(DisplayName="MissingData"),
UnknownError = 0b00100000 UMETA(DisplayName="UnknownError")
};
/**
* Struct representing a mixed root json server response
* Struct representing a mixed root json server response with integrated parsing capabilities
*/
USTRUCT()
struct DTFLUXNETWORK_API FDTFluxServerResponse
@ -20,35 +45,76 @@ struct DTFLUXNETWORK_API FDTFluxServerResponse
public:
UPROPERTY()
FString Type = "";
UPROPERTY()
int Code = -1;
UPROPERTY()
FString Message = "";
UPROPERTY()
FString Trigger = "";
UPROPERTY()
int ContestID = -1;
UPROPERTY()
int StageID = -1;
UPROPERTY()
int SplitID = -1;
UPROPERTY()
FDateTime ReceivedAt;
UPROPERTY()
FString RawMessage;
UPROPERTY()
FName RequestId = FName("");
UPROPERTY()
FText FailureReason;
// === CONSTRUCTEURS ===
FDTFluxServerResponse();
FDTFluxServerResponse(const FString& JsonMessage, EDTFluxResponseStatus& OutStatus, bool bLogErrors = true);
static FDTFluxServerResponse CreateFromJson(const FString& JsonMessage, bool bLogErrors = true);
// === MÉTHODES DE PARSING ===
EDTFluxResponseStatus TryParse(bool bLogErrors = true);
bool ParseTeamListResponse(FDTFluxTeamListDefinition& OutTeamList);
bool ParseTeamUpdateResponse(FDTFluxTeamListDefinition& OutTeamUpdate);
bool ParseRaceData(FDTFluxRaceData& OutRaceData);
bool ParseContestRanking(FDTFluxContestRankings& OutContestRankings);
bool ParseStageRankingResponse(FDTFluxStageRankings& OutStageRankings);
bool ParseSplitRankingResponse(FDTFluxSplitRankings& OutSplitRankings);
bool ParseStatusUpdateResponse(FDTFluxTeamStatusUpdate& OutStatusUpdate);
bool ParseSplitSensorResponse(TArray<FDTFluxSplitSensorInfo>& OutSplitSensorInfos);
// === MÉTHODES UTILITAIRES ===
bool IsValidResponse() const { return Code == -1; }
bool IsSuccessfullyParsed() const { return ParsingStatus == EDTFluxResponseStatus::Success; }
EDTFluxResponseStatus GetParsingStatus() const { return ParsingStatus; }
EDTFluxApiDataType GetResponseType() const { return ApiDataType; }
FString GetDataType() const { return Type; }
bool ContainsDataType(const FString& DataType) const { return Type.Contains(DataType); }
FString ToDebugString() const;
void ShowDebug(const bool bShouldPrintRawMessage = false) const;
FString GetErrorMessage() const;
private:
// === DONNÉES INTERNES ===
EDTFluxApiDataType ApiDataType;
// Statut du parsing initial
EDTFluxResponseStatus ParsingStatus = EDTFluxResponseStatus::Unset;
// === MÉTHODES PRIVÉES DE PARSING ===
bool ParseJsonObject(TSharedPtr<FJsonObject>& OutJsonObject) const;
bool ValidateResponseType(const FString& ExpectedType) const;
EDTFluxResponseStatus InitializeFromJson(const FString& JsonMessage, bool bLogErrors);
};