diff --git a/Config/AccessTransformers.ini b/Config/AccessTransformers.ini index 166f5e03..655747bb 100644 --- a/Config/AccessTransformers.ini +++ b/Config/AccessTransformers.ini @@ -22,8 +22,8 @@ Friend=(Class="AFGBuildableFactory", FriendClass="UFRM_Factory") Friend=(Class="AFGSchematicManager", FriendClass="UFRM_Factory") Accessor=(Class="AFGCharacterPlayer", Property="mCachedPlayerName") -#Friend=(Class="/Script/FactoryDedicatedServer.FGServerSubsystem", FriendClass="AFicsitRemoteMonitoring") -#Friend=(Class="/Script/FactoryDedicatedServer.FGServerAPIManager", FriendClass="AFicsitRemoteMonitoring") +Friend=(Class="UFGServerSubsystem", FriendClass="AFicsitRemoteMonitoring") +Friend=(Class="UFGServerAPIManager", FriendClass="AFicsitRemoteMonitoring") BlueprintReadWrite=(Class="/Script/FactoryGame.FGItemDescriptor", Property="mPersistentBigIcon") diff --git a/Source/FicsitRemoteMonitoring/FicsitRemoteMonitoring.build.cs b/Source/FicsitRemoteMonitoring/FicsitRemoteMonitoring.build.cs index 00331512..98e5d2f9 100644 --- a/Source/FicsitRemoteMonitoring/FicsitRemoteMonitoring.build.cs +++ b/Source/FicsitRemoteMonitoring/FicsitRemoteMonitoring.build.cs @@ -63,9 +63,17 @@ public FicsitRemoteMonitoring(ReadOnlyTargetRules Target) : base(Target) // Add uWebSockets LoaduWebSockets(Target); + PublicDependencyModuleNames.Add("FactoryDedicatedServer"); + if (Target.Type == TargetType.Server) { - PublicDependencyModuleNames.Add("FactoryDedicatedServer"); + // Define WITH_DEDICATED_SERVER=1 only for server targets + + PublicDefinitions.Add("WITH_DEDICATED_SERVER=1"); + } else + { + // Explicitly set WITH_DEDICATED_SERVER=0 for non-server builds to avoid warnings + PublicDefinitions.Add("WITH_DEDICATED_SERVER=0"); } PublicDefinitions.Add("UWS_STATICLIB"); // If you're using the static version of uWS diff --git a/Source/FicsitRemoteMonitoring/Private/FicsitRemoteMonitoring.cpp b/Source/FicsitRemoteMonitoring/Private/FicsitRemoteMonitoring.cpp index 3dfcec56..7ec9147e 100644 --- a/Source/FicsitRemoteMonitoring/Private/FicsitRemoteMonitoring.cpp +++ b/Source/FicsitRemoteMonitoring/Private/FicsitRemoteMonitoring.cpp @@ -1,6 +1,8 @@ #include "FicsitRemoteMonitoring.h" #include "Async/Async.h" #include "FRM_Request.h" +#include "HttpServerRequest.h" +#include "IHttpRouter.h" us_listen_socket_t* SocketListener; bool SocketRunning = false; @@ -737,36 +739,36 @@ void AFicsitRemoteMonitoring::RegisterEndpoint(const FString& Method, const FStr UE_LOGFMT(LogHttpServer, Log, "Registered API Endpoint: {APIName} - Current number of endpoints registered: {1}", APIName, APIEndpoints.Num()); -/* - // Store the APIName in a member variable for use in HandleCSSEndpoint - StoredAPIName = APIName; +#if WITH_DEDICATED_SERVER + const UFGServerSubsystem* ServerSubsystem = UFGServerSubsystem::Get(GetWorld()); + const UFGServerAPIManager* APIManager = ServerSubsystem->GetServerAPIManager(); + const TSharedPtr Router = APIManager->mHTTPRouter; + const FString DataPath = "/api/" + APIName; - UFGServerSubsystem* ServerSubsystem = UFGServerSubsystem::Get(GetWorld()); - if (IsValid(ServerSubsystem)) { return; } + EHttpServerRequestVerbs RequestVerb = EHttpServerRequestVerbs::VERB_GET; - UFGServerAPIManager* APIManager = ServerSubsystem->GetServerAPIManager(); - if (IsValid(APIManager)) { return; } - - if (!IsRunningDedicatedServer()) { - - // Store the APIName in a member variable for use in HandleCSSEndpoint - StoredAPIName = APIName; - - UFGServerSubsystem* ServerSubsystem = UFGServerSubsystem::Get(GetWorld()); - if (IsValid(ServerSubsystem)) { return; } - - UFGServerAPIManager* APIManager = ServerSubsystem->GetServerAPIManager(); - if (IsValid(APIManager)) { return; } - - FFGRequestHandlerRegistration HandleRegistration = FFGRequestHandlerRegistration(); - HandleRegistration.HandlerObject = this; - HandleRegistration.HandlerFunction = this->FindFunction(FName("HandleCSSEndpoint")); - HandleRegistration.FunctionName = FName(*APIName); - HandleRegistration.PrivilegeLevel = EPrivilegeLevel::None; - APIManager->mRegisteredHandlers.Add(FString(APIName), HandleRegistration); - - }; -*/ + if (Method == "POST") + { + RequestVerb = EHttpServerRequestVerbs::VERB_POST; + } + + Router->BindRoute(DataPath, RequestVerb, + [this, APIName](const FHttpServerRequest& Request, const FHttpResultCallback& OnComplete) + { + bool bSuccess = false; + FRequestData RequestData; + RequestData.QueryParams = Request.QueryParams; + TUniquePtr Response = FHttpServerResponse::Create( + AFicsitRemoteMonitoring::HandleEndpoint(this->GetWorld(), APIName, RequestData, bSuccess), + "application/json"); + OnComplete(MoveTemp(Response)); + if (!bSuccess) + { + UE_LOGFMT(LogHttpServer, Log, "Game Port - API Endpoint Not Found: {APIName}", APIName); + }; + return true; + }); +#endif } FCallEndpointResponse AFicsitRemoteMonitoring::CallEndpoint(UObject* WorldContext, FString InEndpoint, FRequestData RequestData, bool& bSuccess) diff --git a/Source/FicsitRemoteMonitoring/Public/FicsitRemoteMonitoring.h b/Source/FicsitRemoteMonitoring/Public/FicsitRemoteMonitoring.h index b080c99c..a474d10a 100644 --- a/Source/FicsitRemoteMonitoring/Public/FicsitRemoteMonitoring.h +++ b/Source/FicsitRemoteMonitoring/Public/FicsitRemoteMonitoring.h @@ -12,8 +12,6 @@ #include "UObject/NoExportTypes.h" #include "Async/Async.h" #include "Templates/Function.h" // Required for function pointers -//#include "FactoryDedicatedServer/Public/FGServerSubsystem.h" -//#include "FactoryDedicatedServer/Public/Networking/FGServerAPIManager.h" #include "FRM_Drones.h" #include "FRM_Factory.h" #include "FRM_Player.h" @@ -56,6 +54,14 @@ THIRD_PARTY_INCLUDES_START #include "ThirdParty/uWebSockets/App.h" THIRD_PARTY_INCLUDES_END +#if WITH_DEDICATED_SERVER + #include "FactoryDedicatedServer/Public/FGServerSubsystem.h" + #include "FactoryDedicatedServer/Public/Networking/FGServerAPIManager.h" + #include "JsonUtilities.h" + #include "HttpServerRequest.h" + #include "IHttpRouter.h" +#endif + #include "FicsitRemoteMonitoring.generated.h" struct FWebSocketUserData { @@ -119,11 +125,13 @@ class FICSITREMOTEMONITORING_API AFicsitRemoteMonitoring : public AModSubsystem public: - AFicsitRemoteMonitoring(); - virtual ~AFicsitRemoteMonitoring(); - +#if WITH_DEDICATED_SERVER friend class UFGServerSubsystem; friend class UFGServerAPIManager; +#endif + + AFicsitRemoteMonitoring(); + virtual ~AFicsitRemoteMonitoring(); /** Get the subsystem in the current world, can be nullptr, e.g. on game ending (destroy) or game startup. */ static AFicsitRemoteMonitoring* Get(UWorld* world);