Added Module Remote To add HTTP basic RemoteControl

This commit is contained in:
2025-07-16 02:41:08 +02:00
parent d6b8874827
commit da89e35eb2
13 changed files with 769 additions and 25 deletions

View File

@ -0,0 +1,75 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "DTFluxRemoteMessage.generated.h"
USTRUCT(BlueprintType)
struct FDTFluxRemoteBasicData
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FDateTime UpdateAt = FDateTime::Now();
FDTFluxRemoteBasicData() = default;
FDTFluxRemoteBasicData(const FDateTime& InUpdateAt): UpdateAt(InUpdateAt){};
};
USTRUCT(BlueprintType)
struct FDTFluxRemoteTitleData : public FDTFluxRemoteBasicData
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FString FirstName = "";
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FString LastName = "";
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FString Function1 = "";
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FString Function2 = "";
FDTFluxRemoteTitleData() = default;
FDTFluxRemoteTitleData(const FString InFirstName, const FString InLastName, const FString InFunction1, const FString InFunction2):
FirstName(InFirstName), LastName(InLastName), Function1(InFunction1), Function2(InFunction2){};
};
USTRUCT(BlueprintType)
struct FDTFluxRemoteBibData : public FDTFluxRemoteBasicData
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
int Bib = -1;
FDTFluxRemoteBibData() = default;
FDTFluxRemoteBibData(int InBib): Bib(InBib){};
};
USTRUCT(BlueprintType)
struct FDTFluxRemoteCommandData : public FDTFluxRemoteBasicData
{
GENERATED_BODY()
public:
FDTFluxRemoteCommandData() = default;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
int Type = -1;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="DTFlux|Remote")
FString Data = "";
FDTFluxRemoteCommandData(int InType, FString InData):
Type(InType), Data(InData){};
};

View File

@ -0,0 +1,13 @@
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"
DTFLUXREMOTE_API DECLARE_LOG_CATEGORY_EXTERN(logDTFluxRemote, Log, All);
class DTFLUXREMOTE_API FDTFluxRemoteModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};

View File

@ -0,0 +1,82 @@
// 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"
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;
int32 ServerPort = 63350;
bool bServerRunning = false;
FHttpRouteHandle TitleRouteHandle;
FHttpRouteHandle TitleBibRouteHandle;
FHttpRouteHandle CommandsRouteHandle;
};