Added Pursuit functionality (Untested and not fully implemented) + Global TrackedRequestSending check

This commit is contained in:
2025-07-09 03:27:23 +02:00
parent 8f884f6224
commit 03eb1132ef
22 changed files with 636 additions and 294 deletions

View File

@ -3,6 +3,7 @@
#pragma once
#include "CoreMinimal.h"
#include "Types/Enum/DTFluxCoreEnum.h"
#include "UObject/Object.h"
#include "DTFluxRequestStructs.generated.h"
@ -139,3 +140,104 @@ public:
SplitID = InSplitId;
}
};
/**
* @brief Structure représentant une requête en file d'attente avec ses métadonnées
*/
USTRUCT(BlueprintType)
struct FDTFluxQueuedRequest : public FDTFluxRequestBase
{
GENERATED_BODY()
/** L'identifiant unique de la requête */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
FGuid RequestId;
/** L'heure à laquelle la requête a été envoyée */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
FDateTime CreatedAt;
/** Le type de requête */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
EDTFluxApiDataType RequestType = EDTFluxRequestType::None;
/** Identifiant de la compétition (ContestId) */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
int32 ContestId = -1;
/** Identifiant de l'étape (StageId) */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
int32 StageId = -1;
/** Identifiant du split (SplitId) */
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
int32 SplitId = -1;
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Request")
FString RawResponse = "";
/** Délai maximum avant que la requête soit considérée comme expirée (en secondes) */
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
float TimeoutSeconds = 2.0f;
/** Determine si la requête peut être mise en cache */
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
bool bIsCacheable = false;
/** Validité du cache si bIsCacheable est mis à true après reception de la réponse (en secondes) */
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
float CachedValidity = 50.0f;
/** Indicateur si la requête a reçu une réponse */
UPROPERTY(BlueprintReadWrite, Category = "DTFlux|Request")
bool bHasReceivedResponse = false;
/** Constructeur par défaut */
FDTFluxQueuedRequest()
{
RequestId = FGuid::NewGuid();
CreatedAt = FDateTime::Now();
}
/** Constructeur avec paramètres */
FDTFluxQueuedRequest(EDTFluxRequestType InRequestType, int32 InContestId = -1, int32 InStageId = -1,
int32 InSplitId = -1)
: RequestType(InRequestType)
, ContestId(InContestId)
, StageId(InStageId)
, SplitId(InSplitId)
{
RequestId = FGuid::NewGuid();
CreatedAt = FDateTime::Now();
}
bool operator==(const FDTFluxQueuedRequest& Left) const
{
return RequestId == Left.RequestId;
}
bool operator!=(const FDTFluxQueuedRequest& Left) const
{
return RequestId != Left.RequestId;
}
const FString Serialize() const;
/** Vérifie si la requête a expiré */
bool HasTimedOut() const
{
return (FDateTime::Now() - CreatedAt).GetTotalSeconds() > TimeoutSeconds;
}
/** Vérifie si cette requête correspond aux paramètres spécifiés */
bool Matches(EDTFluxRequestType InRequestType, int32 InContestId = -1, int32 InStageId = -1,
int32 InSplitId = -1) const
{
return RequestType == InRequestType &&
(InContestId == -1 || ContestId == InContestId) &&
(InStageId == -1 || StageId == InStageId) &&
(InSplitId == -1 || SplitId == InSplitId);
}
};

View File

@ -117,4 +117,27 @@ private:
bool ParseJsonObject(TSharedPtr<FJsonObject>& OutJsonObject) const;
bool ValidateResponseType(const FString& ExpectedType) const;
EDTFluxResponseStatus InitializeFromJson(const FString& JsonMessage, bool bLogErrors);
static FString GetJsonType(const EJson Type)
{
switch (Type)
{
case EJson::None:
return TEXT("None");
case EJson::Null:
return TEXT("Null");
case EJson::String:
return TEXT("String");
case EJson::Number:
return TEXT("Number");
case EJson::Boolean:
return TEXT("Boolean");
case EJson::Array:
return TEXT("Array");
case EJson::Object:
return TEXT("Object");
default:
return TEXT("Unknown");
}
}
};