Samples~/SampleGame/Assets/Scripts/GameLift.cs (162 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
using System;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using AmazonGameLift.Runtime;
#if !UNITY_SERVER
using System.Threading;
using System.Threading.Tasks;
using AmazonGameLiftPlugin.Core.UserIdentityManagement.Models;
#endif
using UnityEngine;
using UnityEngine.Events;
#if UNITY_EDITOR
using AmazonGameLift.Editor;
#endif
public class GameLift : MonoBehaviour
{
[Serializable]
public sealed class GameLiftConnectionChangedEvent : UnityEvent<bool> { }
public GameLiftConnectionChangedEvent ConnectionChangedEvent;
public static readonly string ClientConfigFilePath = "GameLiftAnywhereClientSettings.yaml";
[SerializeField]
private GameLiftClientSettings _gameLiftSettings;
private readonly Logger _logger = Logger.SharedInstance;
#if UNITY_SERVER
private GameLiftServer _server;
#else
private GameLiftClient _client;
#endif
public int ServerPort { get; private set; }
public bool IsConnected { get; set;}
private bool MyRemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
bool isOk = true;
// If there are errors in the certificate chain, look at each error to determine the cause.
if (sslPolicyErrors != SslPolicyErrors.None)
{
for (int i = 0; i < chain.ChainStatus.Length; i++)
{
if (chain.ChainStatus[i].Status != X509ChainStatusFlags.RevocationStatusUnknown)
{
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
bool chainIsValid = chain.Build((X509Certificate2)certificate);
if (!chainIsValid)
{
isOk = false;
}
}
}
}
return isOk;
}
private void Awake()
{
_logger.Write(":) GAMELIFT AWAKE");
// Allow Unity to validate HTTPS SSL certificates; http://stackoverflow.com/questions/4926676
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
ConnectionChangedEvent.AddListener(value => IsConnected = value);
#if UNITY_SERVER
_logger.Write(":) I AM SERVER");
_server = new GameLiftServer(this, _logger);
#else
_logger.Write(":) I AM CLIENT");
var config = _gameLiftSettings.GetConfiguration();
if (config.IsGameLiftAnywhere)
{
#if UNITY_EDITOR
var stateManager = new StateManager(new CoreApi());
config.FleetId = stateManager.AnywhereFleetId;
config.FleetLocation = stateManager.AnywhereFleetLocation;
config.AwsRegion = stateManager.Region;
config.ProfileName = stateManager.ProfileName;
#else
var settings = new Settings<ClientSettingsKeys>(ClientConfigFilePath);
config.FleetId = settings.GetSetting(ClientSettingsKeys.FleetId).Value;
config.FleetLocation = settings.GetSetting(ClientSettingsKeys.FleetLocation).Value;
config.AwsRegion = settings.GetSetting(ClientSettingsKeys.CurrentRegion).Value;
config.ProfileName = settings.GetSetting(ClientSettingsKeys.CurrentProfileName).Value;
#endif
}
var coreApi = new LoggingGameLiftCoreApi(config);
_client = new GameLiftClient(coreApi, new Delay(), _logger);
#endif
}
private void OnDestroy()
{
#if !UNITY_SERVER
_client.Dispose();
#endif
}
#if UNITY_SERVER
public void StartServer(int port, string authToken = null, string logFilePath = null)
{
_logger.Write($":) GAMELIFT StartServer at port {port}.");
ServerPort = port;
_server.Start(port, authToken, logFilePath);
}
public void TerminateGameSession()
{
_server.ProcessEnding();
}
// we received a force terminate request. Notify clients and gracefully exit.
public void TerminateServer()
{
Application.Quit();
}
public bool AcceptPlayerSession(string playerSessionId)
{
return _server.AcceptPlayerSession(playerSessionId);
}
public bool RemovePlayerSession(string playerSessionId)
{
return _server.RemovePlayerSession(playerSessionId);
}
#else
#if UNITY_EDITOR
public void OverrideClient(GameLiftClient value)
{
_client = value ?? throw new ArgumentNullException(nameof(value));
}
#endif
public SignUpResponse SignUp(string email, string password)
{
return _client.Core.SignUp(email, password);
}
public ConfirmSignUpResponse ConfirmSignUp(string email, string confirmationCode)
{
return _client.Core.ConfirmSignUp(email, confirmationCode);
}
public SignInResponse SignIn(string email, string password)
{
SignInResponse response = _client.Core.SignIn(email, password);
if (!response.Success)
{
return response;
}
_client.ClientCredentials = new ClientCredentials
{
AccessToken = response.AccessToken,
IdToken = response.IdToken,
RefreshToken = response.RefreshToken
};
return response;
}
public SignOutResponse SignOut()
{
return _client.SignOut();
}
public void SetCredentials(ClientCredentials credentials)
{
_client.ClientCredentials = credentials;
}
public async Task<(bool success, ConnectionInfo connection)> GetConnectionInfo(CancellationToken cancellationToken = default)
{
_logger.Write("CLIENT GetConnectionInfo()");
(bool success, ConnectionInfo connectionInfo) response = await _client.GetConnectionInfo(cancellationToken);
_logger.Write($"CLIENT CONNECT INFO: {response.connectionInfo}");
ConnectionChangedEvent?.Invoke(response.success);
return response;
}
#endif
}