123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 |
- /*
- * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
- * its licensors.
- *
- * For complete copyright and license terms please see the LICENSE at the root of this
- * distribution (the "License"). All use of this software is governed by the License,
- * or, if provided, by the license below or the license accompanying this file. Do not
- * remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *
- */
- #include <AzCore/Console/IConsole.h>
- #include <AzCore/Interface/Interface.h>
- #include <AzCore/Jobs/JobFunction.h>
- #include <AzCore/std/smart_ptr/make_shared.h>
- #include <AzFramework/Session/SessionConfig.h>
- #include <AWSCoreBus.h>
- #include <Credential/AWSCredentialBus.h>
- #include <ResourceMapping/AWSResourceMappingBus.h>
- #include <AWSGameLiftClientManager.h>
- #include <Activity/AWSGameLiftCreateSessionActivity.h>
- #include <Activity/AWSGameLiftCreateSessionOnQueueActivity.h>
- #include <Activity/AWSGameLiftJoinSessionActivity.h>
- #include <Activity/AWSGameLiftLeaveSessionActivity.h>
- #include <Activity/AWSGameLiftSearchSessionsActivity.h>
- #include <aws/core/auth/AWSCredentialsProvider.h>
- namespace AWSGameLift
- {
- #if defined(AWSGAMELIFT_DEV)
- AZ_CVAR(AZ::CVarFixedString, cl_gameliftLocalEndpoint, "", nullptr, AZ::ConsoleFunctorFlags::Null, "The local endpoint to test with GameLiftLocal SDK.");
- #endif
- AWSGameLiftClientManager::AWSGameLiftClientManager()
- {
- m_gameliftClient.reset();
- }
- void AWSGameLiftClientManager::ActivateManager()
- {
- AZ::Interface<IAWSGameLiftRequests>::Register(this);
- AWSGameLiftRequestBus::Handler::BusConnect();
- AZ::Interface<AzFramework::ISessionAsyncRequests>::Register(this);
- AWSGameLiftSessionAsyncRequestBus::Handler::BusConnect();
- AZ::Interface<AzFramework::ISessionRequests>::Register(this);
- AWSGameLiftSessionRequestBus::Handler::BusConnect();
- }
- void AWSGameLiftClientManager::DeactivateManager()
- {
- AWSGameLiftSessionRequestBus::Handler::BusDisconnect();
- AZ::Interface<AzFramework::ISessionRequests>::Unregister(this);
- AWSGameLiftSessionAsyncRequestBus::Handler::BusDisconnect();
- AZ::Interface<AzFramework::ISessionAsyncRequests>::Unregister(this);
- AWSGameLiftRequestBus::Handler::BusDisconnect();
- AZ::Interface<IAWSGameLiftRequests>::Unregister(this);
- }
- bool AWSGameLiftClientManager::ConfigureGameLiftClient(const AZStd::string& region)
- {
- m_gameliftClient.reset();
- Aws::Client::ClientConfiguration clientConfig;
- // Set up client endpoint or region
- AZStd::string localEndpoint = "";
- #if defined(AWSGAMELIFT_DEV)
- localEndpoint = static_cast<AZ::CVarFixedString>(cl_gameliftLocalEndpoint);
- #endif
- if (!localEndpoint.empty())
- {
- // The attribute needs to override to interact with GameLiftLocal
- clientConfig.endpointOverride = localEndpoint.c_str();
- }
- else if (!region.empty())
- {
- clientConfig.region = region.c_str();
- }
- else
- {
- AZStd::string clientRegion;
- AWSCore::AWSResourceMappingRequestBus::BroadcastResult(clientRegion, &AWSCore::AWSResourceMappingRequests::GetDefaultRegion);
- if (clientRegion.empty())
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientRegionMissingErrorMessage);
- return false;
- }
- clientConfig.region = clientRegion.c_str();
- }
- // Fetch AWS credential for client
- AWSCore::AWSCredentialResult credentialResult;
- AWSCore::AWSCredentialRequestBus::BroadcastResult(credentialResult, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
- if (!localEndpoint.empty())
- {
- credentialResult.result = std::make_shared<Aws::Auth::AnonymousAWSCredentialsProvider>();
- }
- else if (!credentialResult.result)
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientCredentialMissingErrorMessage);
- return false;
- }
- m_gameliftClient = AZStd::make_shared<Aws::GameLift::GameLiftClient>(credentialResult.result, clientConfig);
- return true;
- }
- AZStd::string AWSGameLiftClientManager::CreatePlayerId(bool includeBrackets, bool includeDashes)
- {
- return AZ::Uuid::CreateRandom().ToString<AZStd::string>(includeBrackets, includeDashes);
- }
- AZStd::string AWSGameLiftClientManager::CreateSession(const AzFramework::CreateSessionRequest& createSessionRequest)
- {
- AZStd::string result = "";
- if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
- {
- const AWSGameLiftCreateSessionRequest& gameliftCreateSessionRequest =
- static_cast<const AWSGameLiftCreateSessionRequest&>(createSessionRequest);
- result = CreateSessionHelper(gameliftCreateSessionRequest);
- }
- else if (CreateSessionOnQueueActivity::ValidateCreateSessionOnQueueRequest(createSessionRequest))
- {
- const AWSGameLiftCreateSessionOnQueueRequest& gameliftCreateSessionOnQueueRequest =
- static_cast<const AWSGameLiftCreateSessionOnQueueRequest&>(createSessionRequest);
- result = CreateSessionOnQueueHelper(gameliftCreateSessionOnQueueRequest);
- }
- else
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage);
- }
- return result;
- }
- void AWSGameLiftClientManager::CreateSessionAsync(const AzFramework::CreateSessionRequest& createSessionRequest)
- {
- if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
- {
- const AWSGameLiftCreateSessionRequest& gameliftCreateSessionRequest =
- static_cast<const AWSGameLiftCreateSessionRequest&>(createSessionRequest);
- AZ::JobContext* jobContext = nullptr;
- AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
- AZ::Job* createSessionJob = AZ::CreateJobFunction(
- [this, gameliftCreateSessionRequest]()
- {
- AZStd::string result = CreateSessionHelper(gameliftCreateSessionRequest);
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
- },
- true, jobContext);
- createSessionJob->Start();
- }
- else if (CreateSessionOnQueueActivity::ValidateCreateSessionOnQueueRequest(createSessionRequest))
- {
- const AWSGameLiftCreateSessionOnQueueRequest& gameliftCreateSessionOnQueueRequest =
- static_cast<const AWSGameLiftCreateSessionOnQueueRequest&>(createSessionRequest);
- AZ::JobContext* jobContext = nullptr;
- AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
- AZ::Job* createSessionOnQueueJob = AZ::CreateJobFunction(
- [this, gameliftCreateSessionOnQueueRequest]()
- {
- AZStd::string result = CreateSessionOnQueueHelper(gameliftCreateSessionOnQueueRequest);
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
- },
- true, jobContext);
- createSessionOnQueueJob->Start();
- }
- else
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage);
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, "");
- }
- }
- AZStd::string AWSGameLiftClientManager::CreateSessionHelper(
- const AWSGameLiftCreateSessionRequest& createSessionRequest)
- {
- AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameLiftClient = m_gameliftClient;
- AZStd::string result = "";
- if (!gameLiftClient)
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
- }
- else
- {
- result = CreateSessionActivity::CreateSession(*gameLiftClient, createSessionRequest);
- }
- return result;
- }
- AZStd::string AWSGameLiftClientManager::CreateSessionOnQueueHelper(
- const AWSGameLiftCreateSessionOnQueueRequest& createSessionOnQueueRequest)
- {
- AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
- AZStd::string result;
- if (!gameliftClient)
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
- }
- else
- {
- result = CreateSessionOnQueueActivity::CreateSessionOnQueue(*gameliftClient, createSessionOnQueueRequest);
- }
- return result;
- }
- bool AWSGameLiftClientManager::JoinSession(const AzFramework::JoinSessionRequest& joinSessionRequest)
- {
- bool result = false;
- if (JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
- {
- const AWSGameLiftJoinSessionRequest& gameliftJoinSessionRequest =
- static_cast<const AWSGameLiftJoinSessionRequest&>(joinSessionRequest);
- result = JoinSessionHelper(gameliftJoinSessionRequest);
- }
- return result;
- }
- void AWSGameLiftClientManager::JoinSessionAsync(const AzFramework::JoinSessionRequest& joinSessionRequest)
- {
- if (!JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
- {
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, false);
- return;
- }
- const AWSGameLiftJoinSessionRequest& gameliftJoinSessionRequest =
- static_cast<const AWSGameLiftJoinSessionRequest&>(joinSessionRequest);
- AZ::JobContext* jobContext = nullptr;
- AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
- AZ::Job* joinSessionJob = AZ::CreateJobFunction(
- [this, gameliftJoinSessionRequest]()
- {
- bool result = JoinSessionHelper(gameliftJoinSessionRequest);
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, result);
- },
- true, jobContext);
- joinSessionJob->Start();
- }
- bool AWSGameLiftClientManager::JoinSessionHelper(const AWSGameLiftJoinSessionRequest& joinSessionRequest)
- {
- AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
- bool result = false;
- if (!gameliftClient)
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
- }
- else
- {
- auto createPlayerSessionOutcome = JoinSessionActivity::CreatePlayerSession(*gameliftClient, joinSessionRequest);
- result = JoinSessionActivity::RequestPlayerJoinSession(createPlayerSessionOutcome);
- }
- return result;
- }
- void AWSGameLiftClientManager::LeaveSession()
- {
- AWSGameLift::LeaveSessionActivity::LeaveSession();
- }
- void AWSGameLiftClientManager::LeaveSessionAsync()
- {
- AZ::JobContext* jobContext = nullptr;
- AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
- AZ::Job* leaveSessionJob = AZ::CreateJobFunction(
- [this]()
- {
- LeaveSession();
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnLeaveSessionAsyncComplete);
- },
- true, jobContext);
- leaveSessionJob->Start();
- }
- AzFramework::SearchSessionsResponse AWSGameLiftClientManager::SearchSessions(
- const AzFramework::SearchSessionsRequest& searchSessionsRequest) const
- {
- AzFramework::SearchSessionsResponse response;
- if (SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
- {
- const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest =
- static_cast<const AWSGameLiftSearchSessionsRequest&>(searchSessionsRequest);
- response = SearchSessionsHelper(gameliftSearchSessionsRequest);
- }
- return response;
- }
- void AWSGameLiftClientManager::SearchSessionsAsync(const AzFramework::SearchSessionsRequest& searchSessionsRequest) const
- {
- if (!SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
- {
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, AzFramework::SearchSessionsResponse());
- return;
- }
- const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest =
- static_cast<const AWSGameLiftSearchSessionsRequest&>(searchSessionsRequest);
- AZ::JobContext* jobContext = nullptr;
- AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
- AZ::Job* searchSessionsJob = AZ::CreateJobFunction(
- [this, gameliftSearchSessionsRequest]()
- {
- AzFramework::SearchSessionsResponse response = SearchSessionsHelper(gameliftSearchSessionsRequest);
- AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
- &AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, response);
- },
- true, jobContext);
- searchSessionsJob->Start();
- }
- AzFramework::SearchSessionsResponse AWSGameLiftClientManager::SearchSessionsHelper(
- const AWSGameLiftSearchSessionsRequest& searchSessionsRequest) const
- {
- AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
- AzFramework::SearchSessionsResponse response;
- if (!gameliftClient)
- {
- AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
- }
- else
- {
- response = SearchSessionsActivity::SearchSessions(*gameliftClient, searchSessionsRequest);
- }
- return response;
- }
- void AWSGameLiftClientManager::SetGameLiftClient(AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient)
- {
- m_gameliftClient.swap(gameliftClient);
- }
- } // namespace AWSGameLift
|