// Fill out your copyright notice in the Description page of Project Settings. #include "Game/ShooterGameMode.h" #include "GenericPlatform/GenericPlatformMisc.h" #include "Containers/UnrealString.h" #include "GameLiftClpTypes.h" #include "GameLift/GameLiftClp.h" #include "openssl/sha.h" DEFINE_LOG_CATEGORY(LogShooterGameMode); // Function implementations. AShooterGameMode::AShooterGameMode() { } void AShooterGameMode::BeginPlay() { Super::BeginPlay(); #if WITH_GAMELIFT InitGameLift(); #endif } void AShooterGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) { Super::InitGame(MapName, Options, ErrorMessage); CachedCommandLine = FCommandLine::Get(); GameLiftConfig.ServerPort = cmdlineparser::details::GetConfiguredOrDefaultPort(CachedCommandLine, "port"); if (FParse::Param(*CachedCommandLine, TEXT("-glAnywhereFleet"))) { GameLiftConfig.bIsAnywhereFleet = true; } else { GameLiftConfig.bIsAnywhereFleet = false; } if (GameLiftConfig.bIsAnywhereFleet) { GetAnywhereFleetParameters(CachedCommandLine); LogAnywhereFleetParameters(); } } FString AShooterGameMode::GetSHA256Hash(const FString& InString) { // if (InString.IsEmpty()) return TEXT("da39a3ee5e6b4b0d3255bfef95601890afd80709"); if (InString.IsEmpty()) return TEXT("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); FSHA256Signature Hash; // Use OpenSSL to compute the SHA-256 hash FTCHARToUTF8 Utf8(InString); const uint8* Bytes = reinterpret_cast(Utf8.Get()); uint32 Length = Utf8.Length() * sizeof(UTF8CHAR); SHA256_CTX Sha256Context; SHA256_Init(&Sha256Context); SHA256_Update(&Sha256Context, Bytes,Length); 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 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 } 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); } 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); } 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() { 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); UE_LOGFMT(LogShooterGameMode, Log, "Server Port: {0}", GameLiftConfig.ServerPort); }