AWSGameLiftClientManager.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. /*
  2. * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
  3. * its licensors.
  4. *
  5. * For complete copyright and license terms please see the LICENSE at the root of this
  6. * distribution (the "License"). All use of this software is governed by the License,
  7. * or, if provided, by the license below or the license accompanying this file. Do not
  8. * remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
  9. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. *
  11. */
  12. #include <AzCore/Console/IConsole.h>
  13. #include <AzCore/Interface/Interface.h>
  14. #include <AzCore/Jobs/JobFunction.h>
  15. #include <AzCore/std/smart_ptr/make_shared.h>
  16. #include <AzFramework/Session/SessionConfig.h>
  17. #include <AWSCoreBus.h>
  18. #include <Credential/AWSCredentialBus.h>
  19. #include <ResourceMapping/AWSResourceMappingBus.h>
  20. #include <AWSGameLiftClientManager.h>
  21. #include <Activity/AWSGameLiftCreateSessionActivity.h>
  22. #include <Activity/AWSGameLiftCreateSessionOnQueueActivity.h>
  23. #include <Activity/AWSGameLiftJoinSessionActivity.h>
  24. #include <Activity/AWSGameLiftLeaveSessionActivity.h>
  25. #include <Activity/AWSGameLiftSearchSessionsActivity.h>
  26. #include <aws/core/auth/AWSCredentialsProvider.h>
  27. namespace AWSGameLift
  28. {
  29. #if defined(AWSGAMELIFT_DEV)
  30. AZ_CVAR(AZ::CVarFixedString, cl_gameliftLocalEndpoint, "", nullptr, AZ::ConsoleFunctorFlags::Null, "The local endpoint to test with GameLiftLocal SDK.");
  31. #endif
  32. AWSGameLiftClientManager::AWSGameLiftClientManager()
  33. {
  34. m_gameliftClient.reset();
  35. }
  36. void AWSGameLiftClientManager::ActivateManager()
  37. {
  38. AZ::Interface<IAWSGameLiftRequests>::Register(this);
  39. AWSGameLiftRequestBus::Handler::BusConnect();
  40. AZ::Interface<AzFramework::ISessionAsyncRequests>::Register(this);
  41. AWSGameLiftSessionAsyncRequestBus::Handler::BusConnect();
  42. AZ::Interface<AzFramework::ISessionRequests>::Register(this);
  43. AWSGameLiftSessionRequestBus::Handler::BusConnect();
  44. }
  45. void AWSGameLiftClientManager::DeactivateManager()
  46. {
  47. AWSGameLiftSessionRequestBus::Handler::BusDisconnect();
  48. AZ::Interface<AzFramework::ISessionRequests>::Unregister(this);
  49. AWSGameLiftSessionAsyncRequestBus::Handler::BusDisconnect();
  50. AZ::Interface<AzFramework::ISessionAsyncRequests>::Unregister(this);
  51. AWSGameLiftRequestBus::Handler::BusDisconnect();
  52. AZ::Interface<IAWSGameLiftRequests>::Unregister(this);
  53. }
  54. bool AWSGameLiftClientManager::ConfigureGameLiftClient(const AZStd::string& region)
  55. {
  56. m_gameliftClient.reset();
  57. Aws::Client::ClientConfiguration clientConfig;
  58. // Set up client endpoint or region
  59. AZStd::string localEndpoint = "";
  60. #if defined(AWSGAMELIFT_DEV)
  61. localEndpoint = static_cast<AZ::CVarFixedString>(cl_gameliftLocalEndpoint);
  62. #endif
  63. if (!localEndpoint.empty())
  64. {
  65. // The attribute needs to override to interact with GameLiftLocal
  66. clientConfig.endpointOverride = localEndpoint.c_str();
  67. }
  68. else if (!region.empty())
  69. {
  70. clientConfig.region = region.c_str();
  71. }
  72. else
  73. {
  74. AZStd::string clientRegion;
  75. AWSCore::AWSResourceMappingRequestBus::BroadcastResult(clientRegion, &AWSCore::AWSResourceMappingRequests::GetDefaultRegion);
  76. if (clientRegion.empty())
  77. {
  78. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientRegionMissingErrorMessage);
  79. return false;
  80. }
  81. clientConfig.region = clientRegion.c_str();
  82. }
  83. // Fetch AWS credential for client
  84. AWSCore::AWSCredentialResult credentialResult;
  85. AWSCore::AWSCredentialRequestBus::BroadcastResult(credentialResult, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
  86. if (!localEndpoint.empty())
  87. {
  88. credentialResult.result = std::make_shared<Aws::Auth::AnonymousAWSCredentialsProvider>();
  89. }
  90. else if (!credentialResult.result)
  91. {
  92. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientCredentialMissingErrorMessage);
  93. return false;
  94. }
  95. m_gameliftClient = AZStd::make_shared<Aws::GameLift::GameLiftClient>(credentialResult.result, clientConfig);
  96. return true;
  97. }
  98. AZStd::string AWSGameLiftClientManager::CreatePlayerId(bool includeBrackets, bool includeDashes)
  99. {
  100. return AZ::Uuid::CreateRandom().ToString<AZStd::string>(includeBrackets, includeDashes);
  101. }
  102. AZStd::string AWSGameLiftClientManager::CreateSession(const AzFramework::CreateSessionRequest& createSessionRequest)
  103. {
  104. AZStd::string result = "";
  105. if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
  106. {
  107. const AWSGameLiftCreateSessionRequest& gameliftCreateSessionRequest =
  108. static_cast<const AWSGameLiftCreateSessionRequest&>(createSessionRequest);
  109. result = CreateSessionHelper(gameliftCreateSessionRequest);
  110. }
  111. else if (CreateSessionOnQueueActivity::ValidateCreateSessionOnQueueRequest(createSessionRequest))
  112. {
  113. const AWSGameLiftCreateSessionOnQueueRequest& gameliftCreateSessionOnQueueRequest =
  114. static_cast<const AWSGameLiftCreateSessionOnQueueRequest&>(createSessionRequest);
  115. result = CreateSessionOnQueueHelper(gameliftCreateSessionOnQueueRequest);
  116. }
  117. else
  118. {
  119. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage);
  120. }
  121. return result;
  122. }
  123. void AWSGameLiftClientManager::CreateSessionAsync(const AzFramework::CreateSessionRequest& createSessionRequest)
  124. {
  125. if (CreateSessionActivity::ValidateCreateSessionRequest(createSessionRequest))
  126. {
  127. const AWSGameLiftCreateSessionRequest& gameliftCreateSessionRequest =
  128. static_cast<const AWSGameLiftCreateSessionRequest&>(createSessionRequest);
  129. AZ::JobContext* jobContext = nullptr;
  130. AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
  131. AZ::Job* createSessionJob = AZ::CreateJobFunction(
  132. [this, gameliftCreateSessionRequest]()
  133. {
  134. AZStd::string result = CreateSessionHelper(gameliftCreateSessionRequest);
  135. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  136. &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
  137. },
  138. true, jobContext);
  139. createSessionJob->Start();
  140. }
  141. else if (CreateSessionOnQueueActivity::ValidateCreateSessionOnQueueRequest(createSessionRequest))
  142. {
  143. const AWSGameLiftCreateSessionOnQueueRequest& gameliftCreateSessionOnQueueRequest =
  144. static_cast<const AWSGameLiftCreateSessionOnQueueRequest&>(createSessionRequest);
  145. AZ::JobContext* jobContext = nullptr;
  146. AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
  147. AZ::Job* createSessionOnQueueJob = AZ::CreateJobFunction(
  148. [this, gameliftCreateSessionOnQueueRequest]()
  149. {
  150. AZStd::string result = CreateSessionOnQueueHelper(gameliftCreateSessionOnQueueRequest);
  151. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  152. &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, result);
  153. },
  154. true, jobContext);
  155. createSessionOnQueueJob->Start();
  156. }
  157. else
  158. {
  159. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftCreateSessionRequestInvalidErrorMessage);
  160. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  161. &AzFramework::SessionAsyncRequestNotifications::OnCreateSessionAsyncComplete, "");
  162. }
  163. }
  164. AZStd::string AWSGameLiftClientManager::CreateSessionHelper(
  165. const AWSGameLiftCreateSessionRequest& createSessionRequest)
  166. {
  167. AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameLiftClient = m_gameliftClient;
  168. AZStd::string result = "";
  169. if (!gameLiftClient)
  170. {
  171. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
  172. }
  173. else
  174. {
  175. result = CreateSessionActivity::CreateSession(*gameLiftClient, createSessionRequest);
  176. }
  177. return result;
  178. }
  179. AZStd::string AWSGameLiftClientManager::CreateSessionOnQueueHelper(
  180. const AWSGameLiftCreateSessionOnQueueRequest& createSessionOnQueueRequest)
  181. {
  182. AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
  183. AZStd::string result;
  184. if (!gameliftClient)
  185. {
  186. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
  187. }
  188. else
  189. {
  190. result = CreateSessionOnQueueActivity::CreateSessionOnQueue(*gameliftClient, createSessionOnQueueRequest);
  191. }
  192. return result;
  193. }
  194. bool AWSGameLiftClientManager::JoinSession(const AzFramework::JoinSessionRequest& joinSessionRequest)
  195. {
  196. bool result = false;
  197. if (JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
  198. {
  199. const AWSGameLiftJoinSessionRequest& gameliftJoinSessionRequest =
  200. static_cast<const AWSGameLiftJoinSessionRequest&>(joinSessionRequest);
  201. result = JoinSessionHelper(gameliftJoinSessionRequest);
  202. }
  203. return result;
  204. }
  205. void AWSGameLiftClientManager::JoinSessionAsync(const AzFramework::JoinSessionRequest& joinSessionRequest)
  206. {
  207. if (!JoinSessionActivity::ValidateJoinSessionRequest(joinSessionRequest))
  208. {
  209. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  210. &AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, false);
  211. return;
  212. }
  213. const AWSGameLiftJoinSessionRequest& gameliftJoinSessionRequest =
  214. static_cast<const AWSGameLiftJoinSessionRequest&>(joinSessionRequest);
  215. AZ::JobContext* jobContext = nullptr;
  216. AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
  217. AZ::Job* joinSessionJob = AZ::CreateJobFunction(
  218. [this, gameliftJoinSessionRequest]()
  219. {
  220. bool result = JoinSessionHelper(gameliftJoinSessionRequest);
  221. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  222. &AzFramework::SessionAsyncRequestNotifications::OnJoinSessionAsyncComplete, result);
  223. },
  224. true, jobContext);
  225. joinSessionJob->Start();
  226. }
  227. bool AWSGameLiftClientManager::JoinSessionHelper(const AWSGameLiftJoinSessionRequest& joinSessionRequest)
  228. {
  229. AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
  230. bool result = false;
  231. if (!gameliftClient)
  232. {
  233. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
  234. }
  235. else
  236. {
  237. auto createPlayerSessionOutcome = JoinSessionActivity::CreatePlayerSession(*gameliftClient, joinSessionRequest);
  238. result = JoinSessionActivity::RequestPlayerJoinSession(createPlayerSessionOutcome);
  239. }
  240. return result;
  241. }
  242. void AWSGameLiftClientManager::LeaveSession()
  243. {
  244. AWSGameLift::LeaveSessionActivity::LeaveSession();
  245. }
  246. void AWSGameLiftClientManager::LeaveSessionAsync()
  247. {
  248. AZ::JobContext* jobContext = nullptr;
  249. AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
  250. AZ::Job* leaveSessionJob = AZ::CreateJobFunction(
  251. [this]()
  252. {
  253. LeaveSession();
  254. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  255. &AzFramework::SessionAsyncRequestNotifications::OnLeaveSessionAsyncComplete);
  256. },
  257. true, jobContext);
  258. leaveSessionJob->Start();
  259. }
  260. AzFramework::SearchSessionsResponse AWSGameLiftClientManager::SearchSessions(
  261. const AzFramework::SearchSessionsRequest& searchSessionsRequest) const
  262. {
  263. AzFramework::SearchSessionsResponse response;
  264. if (SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
  265. {
  266. const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest =
  267. static_cast<const AWSGameLiftSearchSessionsRequest&>(searchSessionsRequest);
  268. response = SearchSessionsHelper(gameliftSearchSessionsRequest);
  269. }
  270. return response;
  271. }
  272. void AWSGameLiftClientManager::SearchSessionsAsync(const AzFramework::SearchSessionsRequest& searchSessionsRequest) const
  273. {
  274. if (!SearchSessionsActivity::ValidateSearchSessionsRequest(searchSessionsRequest))
  275. {
  276. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  277. &AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, AzFramework::SearchSessionsResponse());
  278. return;
  279. }
  280. const AWSGameLiftSearchSessionsRequest& gameliftSearchSessionsRequest =
  281. static_cast<const AWSGameLiftSearchSessionsRequest&>(searchSessionsRequest);
  282. AZ::JobContext* jobContext = nullptr;
  283. AWSCore::AWSCoreRequestBus::BroadcastResult(jobContext, &AWSCore::AWSCoreRequests::GetDefaultJobContext);
  284. AZ::Job* searchSessionsJob = AZ::CreateJobFunction(
  285. [this, gameliftSearchSessionsRequest]()
  286. {
  287. AzFramework::SearchSessionsResponse response = SearchSessionsHelper(gameliftSearchSessionsRequest);
  288. AzFramework::SessionAsyncRequestNotificationBus::Broadcast(
  289. &AzFramework::SessionAsyncRequestNotifications::OnSearchSessionsAsyncComplete, response);
  290. },
  291. true, jobContext);
  292. searchSessionsJob->Start();
  293. }
  294. AzFramework::SearchSessionsResponse AWSGameLiftClientManager::SearchSessionsHelper(
  295. const AWSGameLiftSearchSessionsRequest& searchSessionsRequest) const
  296. {
  297. AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient = m_gameliftClient;
  298. AzFramework::SearchSessionsResponse response;
  299. if (!gameliftClient)
  300. {
  301. AZ_Error(AWSGameLiftClientManagerName, false, AWSGameLiftClientMissingErrorMessage);
  302. }
  303. else
  304. {
  305. response = SearchSessionsActivity::SearchSessions(*gameliftClient, searchSessionsRequest);
  306. }
  307. return response;
  308. }
  309. void AWSGameLiftClientManager::SetGameLiftClient(AZStd::shared_ptr<Aws::GameLift::GameLiftClient> gameliftClient)
  310. {
  311. m_gameliftClient.swap(gameliftClient);
  312. }
  313. } // namespace AWSGameLift