Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Content/FRM_Icon.uasset
Binary file not shown.
Binary file modified Content/GameInstance.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified Content/SessionSettings/FicsitRemoteMonitoring_Base.uasset
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified Content/Subsystems/FicsitRemoteMonitoring_BP.uasset
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,15 @@ public FicsitRemoteMonitoring(ReadOnlyTargetRules Target) : base(Target)
"InputCore",
"Json",
"JsonUtilities",
"Sockets",
"Networking",
"FactoryGame",
"SML",
"Chaos",
"ChaosVehiclesCore", "ChaosVehicles", "ChaosSolverEngine",
"HTTP",
"FicsitRemoteMonitoring"
"FicsitRemoteMonitoring",
"FactoryDedicatedServer"
}
);

Expand Down
26 changes: 18 additions & 8 deletions Source/FicsitRemoteMonitoring/Private/Commands/multi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "FRM_Request.h"
#include "NotificationLoader.h"
#include "StructuredLog.h"
#include "Libraries/Validation.h"
#include "Kismet/KismetSystemLibrary.h"

FChatReturn AFRMCommand::RemoteMonitoringCommand(UObject* WorldContext, UCommandSender* Sender, TArray<FString> Arguments) {
Expand Down Expand Up @@ -76,7 +77,7 @@ FChatReturn AFRMCommand::RemoteMonitoringCommand(UObject* WorldContext, UCommand
return ChatReturn;
}

if (command == "http") {
if (command == "http" || command == "uws") {
ChatReturn.Chat = TEXT("Usage: /frm http <start/stop>");

if (argumentsNum < 2) {
Expand All @@ -85,9 +86,19 @@ FChatReturn AFRMCommand::RemoteMonitoringCommand(UObject* WorldContext, UCommand

FString arg1 = Arguments[1].ToLower();

const int32 Port = UFRMConfigManager::FRM_GetConfigOrDefault<int32>(TEXT("uWS.Port"), 8080);

FString Reason;
if (!UFRMValidation::IsTcpPortAvailable(Port, Reason))
{
UE_LOG(LogHttpServer, Error, TEXT("Port %d unavailable: %s"), Port, *Reason);

ChatReturn.Chat = FString(TEXT("Port " + FString::FromInt(Port) + "Unavailable. Reason: " + *Reason));
ChatReturn.Color = FLinearColor::Red;
ChatReturn.Status = EExecutionStatus::COMPLETED;
}

if (arg1 == "start") {
auto config = FConfig_HTTPStruct::GetActiveConfig(WorldContext);
int32 Port = config.HTTP_Port;

UE_LOG(LogHttpServer, Log, TEXT("Chat Command: Starting HTTP Service. Port: %d"), Port);
ModSubsystem->StartWebSocketServer(true);
Expand Down Expand Up @@ -118,19 +129,18 @@ FChatReturn AFRMCommand::RemoteMonitoringCommand(UObject* WorldContext, UCommand
FString arg1 = Arguments[1].ToLower();

if (arg1 == "start") {
auto config = FConfig_SerialStruct::GetActiveConfig(WorldContext);
FString Port = config.COM_Port;

ModSubsystem->StartWebSocketServer();
ModSubsystem->InitSerialDevice();

const FString Port = UFRMConfigManager::FRM_GetConfigOrDefault<FString>(TEXT("Serial.Port"), "COM3").TrimStartAndEnd();

ChatReturn.Chat = FString(TEXT("Serial/RS232 Service Initiated on Port: " + Port));
ChatReturn.Color = FLinearColor::Green;
ChatReturn.Status = EExecutionStatus::COMPLETED;

UE_LOGFMT(LogHttpServer, Log, "Serial/RS232 Service started. Port: {Port}");
}
else if (arg1 == "stop") {
ModSubsystem->StopWebSocketServer();
ModSubsystem->StopSerialDevice();
UE_LOG(LogHttpServer, Log, TEXT("Stopping Serial/RS232 Service."));

ChatReturn.Chat = TEXT("Stopping Serial/RS232 Service.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ class UFGFactoryConnectionComponent;

TArray<TSharedPtr<FJsonValue>> ULogistics::getBelts_Helper(UObject* WorldContext, bool IsBelt) {
AFGBuildableSubsystem* BuildableSubsystem = AFGBuildableSubsystem::Get(WorldContext->GetWorld());
USessionSettingsManager* SessionSettings = WorldContext->GetWorld()->GetSubsystem<USessionSettingsManager>();
float SampleDistance = SessionSettings->GetFloatOptionValue("FicsitRemoteMonitoring.General.SplineSampleDistance");

const float SampleDistance = UFRMConfigManager::FRM_GetConfigOrDefault<float>(TEXT("General.SplineSampleDistance"), 75.0f);

TArray<AFGBuildableConveyorBase*> Conveyors;
BuildableSubsystem->GetTypedBuildable<AFGBuildableConveyorBase>(Conveyors);
Expand Down Expand Up @@ -179,8 +179,7 @@ void ULogistics::getSplitterMerger(UObject* WorldContext, FRequestData RequestDa

void ULogistics::getPipes(UObject* WorldContext, FRequestData RequestData, TArray<TSharedPtr<FJsonValue>>& OutJsonArray) {
AFGBuildableSubsystem* BuildableSubsystem = AFGBuildableSubsystem::Get(WorldContext->GetWorld());
USessionSettingsManager* SessionSettings = WorldContext->GetWorld()->GetSubsystem<USessionSettingsManager>();
float SampleDistance = SessionSettings->GetFloatOptionValue("FicsitRemoteMonitoring.General.SplineSampleDistance");
const float SampleDistance = UFRMConfigManager::FRM_GetConfigOrDefault<float>(TEXT("General.SplineSampleDistance"), 75.0f);

TArray<AFGBuildablePipeline*> Pipes;
BuildableSubsystem->GetTypedBuildable<AFGBuildablePipeline>(Pipes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ void UHypertubes::getHyperEntrance(UObject* WorldContext, FRequestData RequestDa
void UHypertubes::getHypertube(UObject* WorldContext, FRequestData RequestData, TArray<TSharedPtr<FJsonValue>>& OutJsonArray) {

AFGBuildableSubsystem* BuildableSubsystem = AFGBuildableSubsystem::Get(WorldContext->GetWorld());
USessionSettingsManager* SessionSettings = WorldContext->GetWorld()->GetSubsystem<USessionSettingsManager>();
float SampleDistance = SessionSettings->GetFloatOptionValue("FicsitRemoteMonitoring.General.SplineSampleDistance");
const float SampleDistance = UFRMConfigManager::FRM_GetConfigOrDefault<float>(TEXT("General.SplineSampleDistance"), 75.0f);

TArray<AFGBuildablePipeHyper*> Hypertubes;
BuildableSubsystem->GetTypedBuildable<AFGBuildablePipeHyper>(Hypertubes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,8 +287,8 @@ void UTrains::getTrainStation(UObject* WorldContext, FRequestData RequestData, T

void UTrains::getTrainRails(UObject* WorldContext, FRequestData RequestData, TArray<TSharedPtr<FJsonValue>>& OutJsonArray) {
AFGBuildableSubsystem* BuildableSubsystem = AFGBuildableSubsystem::Get(WorldContext->GetWorld());
USessionSettingsManager* SessionSettings = WorldContext->GetWorld()->GetSubsystem<USessionSettingsManager>();
float SampleDistance = SessionSettings->GetFloatOptionValue("FicsitRemoteMonitoring.General.SplineSampleDistance");

const float SampleDistance = UFRMConfigManager::FRM_GetConfigOrDefault<float>(TEXT("General.SplineSampleDistance"), 75.0f);

TArray<AFGBuildableRailroadTrack*> RailroadTracks;
BuildableSubsystem->GetTypedBuildable<AFGBuildableRailroadTrack>(RailroadTracks);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,12 +270,9 @@ void UCommunication::setModSetting(UObject* WorldContext, FRequestData RequestDa
continue;
}

UE_LOG(LogTemp, Warning, TEXT("SplineSampleDistance: %f"), SplineSampleDistance);
UE_LOG(LogFRMAPI, Warning, TEXT("SplineSampleDistance: %f"), SplineSampleDistance);

const FString& cvar = "FicsitRemoteMonitoring.General.SplineSampleDistance";

USessionSettingsManager* SessionSettings = WorldContext->GetWorld()->GetSubsystem<USessionSettingsManager>();
SessionSettings->SetFloatOptionValue(cvar, SplineSampleDistance);
UFRMConfigManager::FRM_SetConfigFromInput(TEXT("General.SplineSampleDistance"), FString::SanitizeFloat(SplineSampleDistance), false);

TSharedPtr<FJsonObject> JChatMessage = MakeShared<FJsonObject>();
JChatMessage->Values.Add("IsSent", MakeShared<FJsonValueBoolean>(true));
Expand Down
50 changes: 17 additions & 33 deletions Source/FicsitRemoteMonitoring/Private/FRMConfigInitSubsystem.cpp
Original file line number Diff line number Diff line change
@@ -1,60 +1,44 @@
#include "FRMConfigInitSubsystem.h"
#include "Configuration/ConfigManager.h"
#include "ConfigPropertyString.h"
#include "FGGameUserSettings.h"
#include "SessionSettingsManager.h"
#include "SMLOptionsLibrary.h"
#include "Engine/Engine.h"
#include "Libraries/FRMConfigManager.h"

DEFINE_LOG_CATEGORY_STATIC(LogFRMConfigInitSubsystem, Log, All);

void UFRMConfigInitSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);

UConfigManager* ConfigManager = GetGameInstance()->GetSubsystem<UConfigManager>();
if (!ConfigManager)
USessionSettingsManager* SessionSettings = GetWorld()->GetSubsystem<USessionSettingsManager>();
if (!SessionSettings)
{
UE_LOG(LogFRMConfigInitSubsystem, Error, TEXT("ConfigManager missing."));
UE_LOG(LogFRMConfigInitSubsystem, Error, TEXT("SessionSettingsManager missing."));
return;
}

ConfigManager->ReloadModConfigurations();
const FString AuthToken = UFRMConfigManager::FRM_GetConfigOrDefault<FString>(TEXT("uWS.Root"), "");

// Now config is loaded and safe to read/write
HttpConfig = FConfig_HTTPStruct::GetActiveConfig(this);
SerialConfig = FConfig_SerialStruct::GetActiveConfig(this);
FactoryConfig = FConfig_FactoryStruct::GetActiveConfig(this);

if (HttpConfig.Authentication_Token.IsEmpty())
if (AuthToken.IsEmpty())
{
HttpConfig.Authentication_Token = GenerateAuthToken(32);
SaveHttpAuthToken(ConfigManager);
if (!UFRMConfigManager::FRM_SetConfigFromInput(TEXT("uWS.AuthenticationToken"), GenerateAuthToken(32), false))
{
UE_LOG(LogFRMConfigInitSubsystem, Warning, TEXT("Failed to apply setting"));
return;
}

UE_LOG(LogFRMConfigInitSubsystem, Log, TEXT("Generated and saved new token: %s"), *HttpConfig.Authentication_Token);
UE_LOG(LogFRMConfigInitSubsystem, Log, TEXT("Generated and saved new token: %s"), *AuthToken);
}
else
{
UE_LOG(LogFRMConfigInitSubsystem, Log, TEXT("Token already exists."));
}

AuthenticationToken = HttpConfig.Authentication_Token;
}

void UFRMConfigInitSubsystem::SaveHttpAuthToken(UConfigManager* ConfigManager)
{
FConfigId ConfigId{ "FicsitRemoteMonitoring", "WebServer" };

UConfigPropertySection* ConfigurationRootSection = ConfigManager->GetConfigurationRootSection(ConfigId);
if (!ConfigurationRootSection)
{
UE_LOG(LogFRMConfigInitSubsystem, Warning, TEXT("ConfigurationRootSection is null."));
return;
}

if (UConfigPropertyString* AuthTokenProperty = Cast<UConfigPropertyString>(ConfigurationRootSection->SectionProperties.FindRef("Authentication_Token")))
{
AuthTokenProperty->Value = HttpConfig.Authentication_Token;
}

ConfigManager->MarkConfigurationDirty(ConfigId);
AuthenticationToken = AuthToken;

}

FString UFRMConfigInitSubsystem::GenerateAuthToken(const int32 Length)
Expand Down
Loading
Loading