diff --git a/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp b/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp index 24aa9544..e69ce4ec 100644 --- a/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp +++ b/Source/FPSTemplate/Private/Game/ShooterGameMode.cpp @@ -29,28 +29,23 @@ void AShooterGameMode::InitGame(const FString& MapName, const FString& Options, { Super::InitGame(MapName, Options, ErrorMessage); CachedCommandLine = FCommandLine::Get(); - GameLiftConfig.ServerPort = cmdlineparser::details::GetConfiguredOrDefaultPort(CachedCommandLine, "port"); - if (FParse::Param(*CachedCommandLine, TEXT("-glAnywhereFleet"))) + GameLiftConfig.ServerPort = cmdlineparser::details::GetConfiguredOrDefaultPort(CachedCommandLine, TEXT("port")); + if (FParse::Param(*CachedCommandLine, TEXT("glAnywhereFleet"))) { - GameLiftConfig.bIsAnywhereFleet = true; + UE_LOGFMT(LogShooterGameMode, Log, "Fleet type: Anywhere"); + GameLiftConfig.bAllOptionsFound = GetAnywhereFleetParameters(CachedCommandLine); + LogAnywhereFleetParameters(); } else { - GameLiftConfig.bIsAnywhereFleet = false; - } - - if (GameLiftConfig.bIsAnywhereFleet) - { - GetAnywhereFleetParameters(CachedCommandLine); - LogAnywhereFleetParameters(); + UE_LOGFMT(LogShooterGameMode, Log, "Fleet type: EC2"); + // TODO: EC2 configuration } } FString AShooterGameMode::GetSHA256Hash(const FString& InString) { -// if (InString.IsEmpty()) return TEXT("da39a3ee5e6b4b0d3255bfef95601890afd80709"); - if (InString.IsEmpty()) return TEXT("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); @@ -69,99 +64,133 @@ FString AShooterGameMode::GetSHA256Hash(const FString& InString) SHA256_Final(Hash.Signature, &Sha256Context); return Hash.ToString(); - - - - - - -/* - FSHA1 Sha; - FTCHARToUTF8 Utf8(InString); - Sha.Update((uint8*)Utf8.Get(), Utf8.Length() * sizeof(UTF8CHAR)); - Sha.Final(); - uint8 Hash[FSHA1::DigestSize]; - Sha.GetHash(Hash); - - // 40-char hex (SHA1 = 160 bits) - return FString::Printf(TEXT("%08X%08X%08X%08X%08X"), - Hash[0], Hash[1], Hash[2], Hash[3], Hash[4]); -*/ } void AShooterGameMode::InitGameLift() { - GetAnywhereFleetParameters(CachedCommandLine); } -bool AShooterGameMode::GetAnywhereFleetParameters(FString CommandLineString) +bool AShooterGameMode::GetAnywhereFleetParameters(const FString& CommandLineString) { bool bAllAnywhereFleetParametersValid = true; - cmdlineparser::details::FParseResult AuthResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::AuthToken); - if (AuthResult.bIsValid) - { - GameLiftConfig.AuthToken = AuthResult.Value; -#if UE_BUILD_DEBUG - UE_LOGFMT(LogShooterGameMode, Log, "AuthToken loaded: {0}", GameLiftConfig.AuthToken); -#else - UE_LOGFMT(LogShooterGameMode, Log, "AuthToken loaded: HASH - {0}", GetSHA256Hash(GameLiftConfig.AuthToken)); -#endif - - } - else - { - bAllAnywhereFleetParametersValid = false; -#if UE_BUILD_DEBUG - UE_LOGFMT(LogShooterGameMode, Error, "AuthToken Invalid: {0}", GameLiftConfig.AuthToken); -#else - UE_LOGFMT(LogShooterGameMode, Error, "AuthToken Invalid: HASH - {0}", GetSHA256Hash(GameLiftConfig.AuthToken)); -#endif - } + GameLiftConfig.AuthTokenResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::AuthToken); + if (!GameLiftConfig.AuthTokenResult.bIsValid) bAllAnywhereFleetParametersValid = false; - cmdlineparser::details::FParseResult HostIdResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::HostId); - if (HostIdResult.bIsValid) - { - GameLiftConfig.HostId = HostIdResult.Value; - UE_LOGFMT(LogShooterGameMode, Log, "HostId loaded: {0}", GameLiftConfig.HostId); - } - else - { - bAllAnywhereFleetParametersValid = false; - UE_LOGFMT(LogShooterGameMode, Error, "HostId Invalid: {0}", HostIdResult.Value); - } + GameLiftConfig.FleetIdResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::FleetId); + if (!GameLiftConfig.FleetIdResult.bIsValid) bAllAnywhereFleetParametersValid = false; - cmdlineparser::details::FParseResult FleetIdResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::FleetId); - if (FleetIdResult.bIsValid) - { - GameLiftConfig.FleetId = FleetIdResult.Value; - UE_LOGFMT(LogShooterGameMode, Log, "FleetId loaded: {0}", FleetIdResult.Value); - } - else - { - bAllAnywhereFleetParametersValid = false; - UE_LOGFMT(LogShooterGameMode, Error, "FleetId Invalid: {0}", GameLiftConfig.HostId); - } + GameLiftConfig.HostIdResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::HostId); + if (!GameLiftConfig.HostIdResult.bIsValid) bAllAnywhereFleetParametersValid = false; + + GameLiftConfig.WebSocketUrlResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::WebsocketUrl); + if (!GameLiftConfig.WebSocketUrlResult.bIsValid) bAllAnywhereFleetParametersValid = false; - cmdlineparser::details::FParseResult WebSocketUrlResult = cmdlineparser::GetValueOfToken(CommandLineString, cmdlineparser::details::EAvailableTokens::WebsocketUrl); - if (WebSocketUrlResult.bIsValid) - { - GameLiftConfig.WebSocketUrl = WebSocketUrlResult.Value; - UE_LOGFMT(LogShooterGameMode, Log, "WebSocketUrl loaded: {0}", WebSocketUrlResult.Value); - } - else - { - bAllAnywhereFleetParametersValid = false; - UE_LOGFMT(LogShooterGameMode, Error, "WebSocketUrl Invalid: {0}", WebSocketUrlResult.Value); - } return bAllAnywhereFleetParametersValid; } void AShooterGameMode::LogAnywhereFleetParameters() { + // Lambda for getting the token name from token + auto GetTokenName = [](const cmdlineparser::details::FParseResult& Result) -> FString + { + return cmdlineparser::details::CLI_TOKENS[static_cast(Result.Token)]; + }; + +#if UE_BUILD_DEBUG + const FString AuthDisplay = GameLiftConfig.AuthTokenResult.Value; +#else + const FString AuthDisplay = TEXT("HASH:") + GetSHA256Hash(GameLiftConfig.AuthTokenResult.Value); +#endif + UE_LOGFMT(LogShooterGameMode, Log, "Anywhere Fleet Parameters:"); - UE_LOGFMT(LogShooterGameMode, Log, "AuthToken: {0}", GameLiftConfig.AuthToken); - UE_LOGFMT(LogShooterGameMode, Log, "FleetId: {0}", GameLiftConfig.FleetId); - UE_LOGFMT(LogShooterGameMode, Log, "HostId: {0}", GameLiftConfig.HostId); - UE_LOGFMT(LogShooterGameMode, Log, "WebsocketUrl: {0}", GameLiftConfig.WebSocketUrl); + if (GameLiftConfig.AuthTokenResult.bIsValid) + { + UE_LOGFMT(LogShooterGameMode, Log, "AuthToken: {0}", AuthDisplay); + } + else + { + UE_LOGFMT( + LogShooterGameMode, + Error, + "AuthToken: {0}", + FString::Format( + *GameLiftConfig.AuthTokenResult.ErrorMessage, + { + FStringFormatArg(GetTokenName(GameLiftConfig.AuthTokenResult)), + FStringFormatArg(AuthDisplay) + } + ) + ); + } + + if (GameLiftConfig.FleetIdResult.bIsValid) + { + UE_LOGFMT(LogShooterGameMode, Log, "FleetId: {0}", GameLiftConfig.FleetIdResult.Value); + } + else + { + UE_LOGFMT( + LogShooterGameMode, + Error, + "FleetId: {0}", + FString::Format( + *GameLiftConfig.FleetIdResult.ErrorMessage, + { + FStringFormatArg(GetTokenName(GameLiftConfig.FleetIdResult)), + FStringFormatArg(GameLiftConfig.FleetIdResult.Value) + } + ) + ); + } + + if (GameLiftConfig.HostIdResult.bIsValid) + { + UE_LOGFMT(LogShooterGameMode, Log, "HostId: {0}", GameLiftConfig.HostIdResult.Value); + } + else + { + UE_LOGFMT( + LogShooterGameMode, + Error, + "HostId: {0}", + FString::Format( + *GameLiftConfig.HostIdResult.ErrorMessage, + { + FStringFormatArg(GetTokenName(GameLiftConfig.HostIdResult)), + FStringFormatArg(GameLiftConfig.HostIdResult.Value) + } + ) + ); + } + + if (GameLiftConfig.WebSocketUrlResult.bIsValid) + { + UE_LOGFMT(LogShooterGameMode, Log, "WebSocketUrl: {0}", GameLiftConfig.WebSocketUrlResult.Value); + } + else + { + UE_LOGFMT( + LogShooterGameMode, + Error, + "WebSocketUrl: {0}", + FString::Format( + *GameLiftConfig.WebSocketUrlResult.ErrorMessage, + { + FStringFormatArg(GetTokenName(GameLiftConfig.WebSocketUrlResult)), + FStringFormatArg(GameLiftConfig.WebSocketUrlResult.Value) + } + ) + ); + } + UE_LOGFMT(LogShooterGameMode, Log, "Server Port: {0}", GameLiftConfig.ServerPort); -} + + if (GameLiftConfig.bAllOptionsFound) + { + UE_LOGFMT(LogShooterGameMode, Log, "Anywhere Fleet Parameters Loaded Successfully...."); + } + else + { + UE_LOGFMT(LogShooterGameMode, Error, "Anywhere Fleet Parameters Load FAILED...."); + } +} \ No newline at end of file diff --git a/Source/FPSTemplate/Private/GameLift/GameLiftClp.cpp b/Source/FPSTemplate/Private/GameLift/GameLiftClp.cpp index 2ecf044a..3f431846 100644 --- a/Source/FPSTemplate/Private/GameLift/GameLiftClp.cpp +++ b/Source/FPSTemplate/Private/GameLift/GameLiftClp.cpp @@ -40,10 +40,17 @@ cmdlineparser::details::FParseResult cmdlineparser::GetValueOfToken(const FStrin } else { - // TODO: Validation of inputs + if (details::DoesRegExMatch(ValueOfToken, details::REGEX_PATTERNS[static_cast(Token)])) + { + Result.ErrorCode = details::EErrorCodes::NoError; + Result.bIsValid = true; + } + else + { + Result.ErrorCode = details::EErrorCodes::FailedValidation; + Result.bIsValid = false; + } Result.Value = ValueOfToken; - Result.ErrorCode = details::EErrorCodes::NoError; - Result.bIsValid = true; } } @@ -51,7 +58,9 @@ cmdlineparser::details::FParseResult cmdlineparser::GetValueOfToken(const FStrin FString ErrorMessage = details::ERROR_MESSAGES[static_cast(Result.ErrorCode)]; FString TokenName = details::CLI_TOKENS[static_cast(Result.Token)]; FString Value = Result.Value; - Result.ErrorMessage = FString::Format(*ErrorMessage, {FStringFormatArg(TokenName), FStringFormatArg(Value)}); +// Result.ErrorMessage = FString::Format(*ErrorMessage, {FStringFormatArg(TokenName), FStringFormatArg(Value)}); + Result.ErrorMessage = ErrorMessage; + return Result; } @@ -75,4 +84,11 @@ int32 cmdlineparser::details::GetConfiguredOrDefaultPort(const FString& CommandL } } return Port; -} \ No newline at end of file +} + +bool cmdlineparser::details::DoesRegExMatch(const FString& Text, const FString& Pattern) +{ + const FRegexPattern RegexPattern(Pattern); + FRegexMatcher Matcher(RegexPattern, Text); + return Matcher.FindNext(); +} diff --git a/Source/FPSTemplate/Private/GameLiftClpTypes.cpp b/Source/FPSTemplate/Private/GameLiftClpTypes.cpp index 9b1affb1..fcbdfd08 100644 --- a/Source/FPSTemplate/Private/GameLiftClpTypes.cpp +++ b/Source/FPSTemplate/Private/GameLiftClpTypes.cpp @@ -6,7 +6,7 @@ const TArray& cmdlineparser::details::ERROR_MESSAGES = []() -> const TA Error_Messages.Add(TEXT("VALID: {0}: {1}")); Error_Messages.Add(TEXT("INVALID TOKEN: [-{0}=] not found in command line arguments")); Error_Messages.Add(TEXT("EMPTY VALUE: [-{0}=] found. No value assigned")); - Error_Messages.Add(TEXT("VALIDATION FAILED: [-{0}=] found.... Value: [-{1}=]")); + Error_Messages.Add(TEXT("VALIDATION FAILED: [-{0}=] found.... Value: [{1}]")); return Error_Messages; }(); @@ -19,4 +19,14 @@ const TArray& cmdlineparser::details::CLI_TOKENS = []() -> const TArray Cli_Tokens.Add(TEXT("fleetid")); Cli_Tokens.Add(TEXT("websocketurl")); return Cli_Tokens; +}(); + +const TArray& cmdlineparser::details::REGEX_PATTERNS = []() -> const TArray& +{ + static TArray Cli_Tokens; + Cli_Tokens.Add(TEXT("^[a-zA-Z0-9\\-]+$")); + Cli_Tokens.Add(TEXT("^[a-zA-Z0-9][a-zA-Z0-9\\-]{0,62}[a-zA-Z0-9]?$")); + Cli_Tokens.Add(TEXT("^[a-z]*fleet-[a-zA-Z0-9\\-]+$|^arn:.*:[a-z]*fleet\\/[a-z]*fleet-[a-zA-Z0-9\\-]+$")); + Cli_Tokens.Add(TEXT("^wss://[a-z0-9-]+(\\.[a-z0-9-]+)*\\.api\\.amazongamelift\\.com(:[0-9]+)?/?$")); + return Cli_Tokens; }(); \ No newline at end of file diff --git a/Source/FPSTemplate/Public/Game/ShooterGameMode.h b/Source/FPSTemplate/Public/Game/ShooterGameMode.h index bfa1c84f..f50e2426 100644 --- a/Source/FPSTemplate/Public/Game/ShooterGameMode.h +++ b/Source/FPSTemplate/Public/Game/ShooterGameMode.h @@ -3,6 +3,7 @@ #pragma once #include "CoreMinimal.h" +#include "GameLiftClpTypes.h" #include "ShooterGameModeBase.h" #include "ShooterGameMode.generated.h" @@ -13,24 +14,14 @@ struct FServerParameters; struct FGameLiftConfig { - bool bDebugMode = false; - bool bIsAnywhereFleet = false; - bool bIsCriticalError = false; + bool bAllOptionsFound = false; - int32 ServerPort; + int32 ServerPort = 7777; - FString AuthToken; - FString FleetId; - FString HostId; - FString WebSocketUrl; - FString ServerRegion; -}; - -enum ETokenStatus : uint8 -{ - Found, - NotFoundRequired, - NotFoundNotRequired + cmdlineparser::details::FParseResult AuthTokenResult; + cmdlineparser::details::FParseResult FleetIdResult; + cmdlineparser::details::FParseResult HostIdResult; + cmdlineparser::details::FParseResult WebSocketUrlResult; }; /** @@ -55,6 +46,6 @@ private: static FString GetSHA256Hash(const FString& CommandLineString); void InitGameLift(); - bool GetAnywhereFleetParameters(FString CommandLineString); + bool GetAnywhereFleetParameters(const FString& CommandLineString); void LogAnywhereFleetParameters(); }; diff --git a/Source/FPSTemplate/Public/GameLift/GameLiftClp.h b/Source/FPSTemplate/Public/GameLift/GameLiftClp.h index 863cf0c6..bb6313ca 100644 --- a/Source/FPSTemplate/Public/GameLift/GameLiftClp.h +++ b/Source/FPSTemplate/Public/GameLift/GameLiftClp.h @@ -19,5 +19,6 @@ namespace cmdlineparser::details FString EnsureEndsWith(const FString& Token, const TCHAR* Suffix); int32 GetConfiguredOrDefaultPort(const FString& CommandLine, const FString& Token); + bool DoesRegExMatch(const FString& Text, const FString& Pattern); } diff --git a/Source/FPSTemplate/Public/GameLiftClpTypes.h b/Source/FPSTemplate/Public/GameLiftClpTypes.h index 986e583a..f599c4cd 100644 --- a/Source/FPSTemplate/Public/GameLiftClpTypes.h +++ b/Source/FPSTemplate/Public/GameLiftClpTypes.h @@ -22,6 +22,7 @@ namespace cmdlineparser::details extern const TArray& ERROR_MESSAGES; extern const TArray& CLI_TOKENS; + extern const TArray& REGEX_PATTERNS; struct FParseResult {