Added Tracking Mechanism for Participant

This commit is contained in:
2025-07-15 07:59:45 +02:00
parent c02993057f
commit 880ca9a3b1
8 changed files with 240 additions and 91 deletions

View File

@ -554,9 +554,6 @@ void UDTFluxNetworkSubsystem::ReconnectWs(const FName WsClientId)
}
}
// ================================================================================================
// MÉTHODES DE PARSING LEGACY (COMPATIBILITÉ TOTALE)
// ================================================================================================
void UDTFluxNetworkSubsystem::ParseTeamListResponse(FDTFluxServerResponse& Response)
{

View File

@ -17,20 +17,12 @@ class FDTFluxQueuedRequestManager;
typedef TSharedPtr<FDTFluxWebSocketClient> FDTFluxWebSocketClientSP;
// ================================================================================================
// DELEGATES BLUEPRINT POUR LES REQUÊTES TRACKÉES
// ================================================================================================
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnDTFluxTrackedRequestCompleted, const FGuid&, RequestId,
EDTFluxApiDataType, RequestType, const FString&, ResponseData);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnDTFluxTrackedRequestFailed, const FGuid&, RequestId,
EDTFluxApiDataType, RequestType, const FString&, ErrorMessage);
// ================================================================================================
// DELEGATES LEGACY POUR LA COMPATIBILITÉ
// ================================================================================================
DECLARE_DELEGATE_OneParam(FOnRaceDataReceived, const FDTFluxRaceData& /*RaceDataDefinition*/);
DECLARE_DELEGATE_OneParam(FOnTeamListReceived, const FDTFluxTeamListDefinition& /*TeamListDefinition*/);
DECLARE_DELEGATE_OneParam(FOnStageRankingReceived, const FDTFluxStageRankings& /*StageRankings*/);
@ -42,25 +34,16 @@ DECLARE_DELEGATE_OneParam(FOnTeamStatusUpdateReceived, const FDTFluxTeamStatusUp
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnWebSocketConnected);
// ================================================================================================
// NETWORK SUBSYSTEM - Interface UObject avec compatibilité Blueprint
// ================================================================================================
/**
* Subsystem réseau DTFlux avec support complet des requêtes trackées et compatibilité legacy
* Combine l'efficacité du RequestManager C++ avec l'interface Blueprint UObject
*/
UCLASS(Blueprintable)
class DTFLUXNETWORK_API UDTFluxNetworkSubsystem : public UEngineSubsystem
{
GENERATED_BODY()
public:
// === ÉTAT DE CONNEXION ===
UPROPERTY(BlueprintReadOnly, Category = "DTFlux|Network")
EDTFluxConnectionStatus WsStatus = EDTFluxConnectionStatus::Unset;
// === CONNEXION WEBSOCKET (Legacy) ===
/**
* Se connecter au serveur WebSocket
@ -80,8 +63,6 @@ public:
UFUNCTION(BlueprintCallable, Category = "DTFlux|Network")
void Reconnect();
// === REQUÊTES TRACKÉES (Nouveau système optimisé) ===
/**
* Envoyer une requête trackée avec cache, timeout et retry
* @param RequestType Type de requête (ContestRanking, StageRanking, etc.)
@ -127,83 +108,50 @@ public:
float TimeoutSeconds = 5.0f,
int32 MaxRetries = 3
);
// === ACCESSEURS BLUEPRINT POUR LES REQUÊTES TRACKÉES ===
/**
* Récupérer une requête trackée par son ID
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
bool GetTrackedRequest(const FGuid& RequestId, FDTFluxTrackedRequest& OutRequest) const;
/**
* Vérifier si une requête a reçu une réponse
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
bool HasRequestReceivedResponse(const FGuid& RequestId) const;
/**
* Récupérer les données de réponse d'une requête
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
FString GetRequestResponseData(const FGuid& RequestId) const;
/**
* Vérifier si une requête similaire est en attente
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
bool IsRequestPending(EDTFluxApiDataType RequestType, int32 ContestId = -1, int32 StageId = -1,
int32 SplitId = -1) const;
/**
* Compter le nombre de requêtes en attente
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
int32 GetPendingRequestCount() const;
/**
* Récupérer les statistiques du gestionnaire de requêtes
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Tracked Requests")
void GetRequestStatistics(int32& OutPending, int32& OutCompleted, int32& OutFailed) const;
// === REQUÊTES LEGACY (Compatibilité totale) ===
/**
* Envoyer une requête en mode legacy (pour compatibilité)
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Legacy")
void SendRequest(const EDTFluxApiDataType RequestType, int InContestId = -1, int InStageId = -1,
int InSplitId = -1);
/**
* Envoyer un message brut via WebSocket
*/
UFUNCTION(BlueprintCallable, Category = "DTFlux|Network")
void SendMessage(const FString& Message);
// === EVENTS BLUEPRINT ===
/**
* Event déclenché lors de la connexion WebSocket
*/
UPROPERTY(BlueprintAssignable, Category = "DTFlux|Network")
FOnWebSocketConnected OnWebSocketConnected;
/**
* Event déclenché quand une requête trackée se termine avec succès
*/
UPROPERTY(BlueprintAssignable, Category = "DTFlux|Tracked Requests")
FOnDTFluxTrackedRequestCompleted OnTrackedRequestCompleted;
/**
* Event déclenché quand une requête trackée échoue
*/
UPROPERTY(BlueprintAssignable, Category = "DTFlux|Tracked Requests")
FOnDTFluxTrackedRequestFailed OnTrackedRequestFailed;
// === DELEGATES LEGACY (Compatibilité totale) ===
FOnRaceDataReceived OnRaceDataReceived;
FOnTeamListReceived OnTeamListReceived;
FOnStageRankingReceived OnStageRankingReceived;
@ -213,7 +161,6 @@ public:
FOnTeamUpdateReceived OnTeamUpdateReceived;
FOnTeamStatusUpdateReceived OnTeamStatusUpdateReceived;
// Accesseurs pour la compatibilité legacy
FOnRaceDataReceived& OnReceivedRaceData() { return OnRaceDataReceived; }
FOnTeamListReceived& OnReceivedTeamList() { return OnTeamListReceived; }
FOnStageRankingReceived& OnReceivedStageRanking() { return OnStageRankingReceived; }
@ -223,29 +170,21 @@ public:
FOnTeamUpdateReceived& OnReceivedTeamUpdate() { return OnTeamUpdateReceived; }
FOnTeamStatusUpdateReceived& OnReceivedTeamStatusUpdate() { return OnTeamStatusUpdateReceived; }
// === ACCESSEUR PUBLIC POUR LE REQUEST MANAGER ===
/**
* Accéder au gestionnaire de requêtes (pour usage avancé)
*/
TSharedPtr<FDTFluxQueuedRequestManager> GetRequestManager() const { return RequestManager; }
protected:
// === LIFECYCLE DU SUBSYSTEM ===
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
private:
// === CONFIGURATION ===
FDTFluxWsSettings WsSettings;
// === CLIENTS RÉSEAU ===
FDTFluxWebSocketClientSP WsClient = nullptr;
// === REQUEST MANAGER C++ ===
TSharedPtr<FDTFluxQueuedRequestManager> RequestManager;
// === GESTION DES ÉVÉNEMENTS WEBSOCKET ===
void RegisterWebSocketEvents();
void UnregisterWebSocketEvents() const;
void OnWebSocketConnected_Subsystem();
@ -254,14 +193,12 @@ private:
void OnWebSocketMessageEvent_Subsystem(const FString& MessageString);
void OnWebSocketMessageSentEvent_Subsystem(const FString& MessageSent);
// Handles pour les événements WebSocket
FDelegateHandle OnWsConnectedEventDelegateHandle;
FDelegateHandle OnWsConnectionErrorEventDelegateHandle;
FDelegateHandle OnWsClosedEventDelegateHandle;
FDelegateHandle OnWsMessageEventDelegateHandle;
FDelegateHandle OnWsMessageSentEventDelegateHandle;
// === PARSING ET TRAITEMENT DES RÉPONSES ===
/**
* Essayer de matcher une réponse à une requête trackée
@ -292,7 +229,6 @@ private:
void ParseSplitSensorResponse(FDTFluxServerResponse& Response);
EDTFluxResponseStatus ProcessPushMessage(FDTFluxServerResponse& Response);
// === CALLBACKS POUR LE REQUEST MANAGER ===
/**
* Callback appelé quand une requête trackée se termine
@ -304,7 +240,6 @@ private:
*/
void OnRequestFailed_Internal(const FDTFluxTrackedRequest& FailedRequest);
// === CONFIGURATION DYNAMIQUE ===
/**
* Callback appelé quand les paramètres WebSocket changent
@ -317,7 +252,6 @@ private:
*/
void ReconnectWs(const FName WsClientId);
// === UTILITAIRES ===
/**
* Construire une adresse WebSocket complète