Files
DTFluxAPI/Source/DTFluxRemote/Public/DTFluxRemoteSubsystem.h

118 lines
4.2 KiB
C
Raw Permalink Normal View History

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/EngineSubsystem.h"
#include "DTFluxRemoteMessage.h"
#include "HttpRouteHandle.h"
#include "IHttpRouter.h"
#include "DTFluxRemoteSubsystem.generated.h"
2025-07-18 01:10:00 +02:00
class UAvaRundown;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnTitleReceived, const FDTFluxRemoteTitleData&, TitleData);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnTitleBibReceived, const FDTFluxRemoteBibData&, TitleBibData);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCommandReceived, const FDTFluxRemoteCommandData&, CommandData);
/**
*
*/
UCLASS(BlueprintType, Category="DTFlux|Remote")
class DTFLUXREMOTE_API UDTFluxRemoteSubsystem : public UEngineSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
UPROPERTY(BlueprintAssignable, Category = "DTFlux API")
FOnTitleReceived OnTitleReceived;
UPROPERTY(BlueprintAssignable, Category = "DTFlux API")
FOnTitleBibReceived OnTitleBibReceived;
UPROPERTY(BlueprintAssignable, Category = "DTFlux API")
FOnCommandReceived OnCommandReceived;
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
bool StartHTTPServer(int32 Port = 63350);
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
void StopHTTPServer();
UFUNCTION(BlueprintCallable, Category = "DTFlux API", BlueprintPure)
bool IsHTTPServerRunning() const;
UFUNCTION(BlueprintCallable, Category = "DTFlux API", BlueprintPure)
int32 GetServerPort() const { return ServerPort; }
// Manual data processing (for testing)
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
bool ProcessTitleData(const FString& JsonString);
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
bool ProcessTitleBibData(const FString& JsonString);
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
bool ProcessCommandData(const FString& JsonString);
2025-07-18 17:36:17 +02:00
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DTFlux API")
bool bHasPendingTitleRequest = false;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DTFlux API")
bool bHasPendingTitleBibRequest = false;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DTFlux API")
FDTFluxRemoteTitleData PendingTitleData;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "DTFlux API")
FDTFluxRemoteBibData PendingTitleBibData;
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
void ResetPendingTitleData();
UFUNCTION(BlueprintCallable, Category = "DTFlux API")
void ResetPendingBibData();
private:
void SetupRoutes();
bool HandleTitleRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete);
bool HandleTitleBibRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete);
bool HandleCommandsRequest(const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete);
TSharedPtr<FJsonObject> ParseJsonFromRequest(const FHttpServerRequest& Request);
FString CreateSuccessResponse(const FString& Message = TEXT("Success"));
FString CreateErrorResponse(const FString& Error, int32 Code = 400);
bool ParseTitleData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteTitleData& OutData);
bool ParseTitleBibData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteBibData& OutData);
bool ParseCommandData(const TSharedPtr<FJsonObject>& JsonObject, FDTFluxRemoteCommandData& OutData);
private:
TSharedPtr<IHttpRouter> HttpRouter;
2025-07-18 01:10:00 +02:00
TSoftObjectPtr<UAvaRundown> RemotedRundown;
int32 ServerPort = 63350;
bool bServerRunning = false;
FHttpRouteHandle TitleRouteHandle;
FHttpRouteHandle TitleBibRouteHandle;
FHttpRouteHandle CommandsRouteHandle;
2025-07-18 01:10:00 +02:00
void UnloadCurrentRundown();
void LoadRundownFromSettings();
2025-07-18 17:36:17 +02:00
bool LoadRundown(const TSoftObjectPtr<UAvaRundown>& RundownAsset);
2025-07-18 01:10:00 +02:00
#if WITH_EDITOR
FDelegateHandle SettingsRundownChangedHandle;
#endif
#if WITH_EDITOR
// Callback pour les changements de settings
UFUNCTION()
void OnSettingsRundownChanged(const TSoftObjectPtr<UAvaRundown>& NewRundown);
#endif
};