2025-07-16 02:41:08 +02:00
|
|
|
|
// 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;
|
2025-07-16 02:41:08 +02:00
|
|
|
|
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:
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
2025-07-16 02:41:08 +02:00
|
|
|
|
int32 ServerPort = 63350;
|
|
|
|
|
|
bool bServerRunning = false;
|
|
|
|
|
|
|
|
|
|
|
|
FHttpRouteHandle TitleRouteHandle;
|
|
|
|
|
|
FHttpRouteHandle TitleBibRouteHandle;
|
|
|
|
|
|
FHttpRouteHandle CommandsRouteHandle;
|
2025-07-18 01:10:00 +02:00
|
|
|
|
|
|
|
|
|
|
void UnloadCurrentRundown();
|
|
|
|
|
|
void LoadRundownFromSettings();
|
|
|
|
|
|
void LoadRundown();
|
|
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
|
FDelegateHandle SettingsRundownChangedHandle;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if WITH_EDITOR
|
|
|
|
|
|
// Callback pour les changements de settings
|
|
|
|
|
|
UFUNCTION()
|
|
|
|
|
|
void OnSettingsRundownChanged(const TSoftObjectPtr<UAvaRundown>& NewRundown);
|
|
|
|
|
|
#endif
|
2025-07-16 02:41:08 +02:00
|
|
|
|
};
|