Samples~/SampleGame/Assets/Scripts/Server/GameLiftServer.cs (243 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
#if UNITY_SERVER
using System;
using System.Collections.Generic;
using Amazon;
using Amazon.GameLift;
using Amazon.GameLift.Model;
using AmazonGameLift.Runtime;
using AmazonGameLiftPlugin.Core.CredentialManagement;
using AmazonGameLiftPlugin.Core.CredentialManagement.Models;
using AmazonGameLiftPlugin.Core.Shared.FileSystem;
using Aws.GameLift;
using Aws.GameLift.Server;
using UnityEngine;
#if UNITY_EDITOR
using AmazonGameLift.Editor;
#endif
public class GameLiftServer
{
public static readonly string ServerConfigFilePath = "GameLiftServerRuntimeSettings.yaml";
private static readonly string ProcessIDPrefix = "Amazon-GameLift-SampleGame";
private readonly GameLift _gl;
private readonly Logger _logger;
private readonly Settings<ServerSettingsKeys> _settings;
#if UNITY_EDITOR
private readonly ICredentialsStore _credentialsStore;
#endif
private int _port;
private bool _isConnected;
private string _logFilePath;
public GameLiftServer(GameLift gl, Logger logger)
{
_gl = gl ?? throw new ArgumentNullException(nameof(gl));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_settings = new Settings<ServerSettingsKeys>(ServerConfigFilePath);
#if UNITY_EDITOR
_credentialsStore = new CredentialsStore(new FileWrapper());
#endif
}
// The port must be in the range of open ports for the fleet
public void Start(int port, string authToken = null, string logFilePath = null)
{
_logFilePath = logFilePath;
_port = port;
string sdkVersion = GameLiftServerAPI.GetSdkVersion().Result;
_logger.Write(":) SDK VERSION: " + sdkVersion);
try
{
string websocketUrl;
string fleetID;
string computeName;
#if UNITY_EDITOR
var stateManager = new StateManager(new CoreApi());
websocketUrl = stateManager.WebSocketUrl;
fleetID = stateManager.AnywhereFleetId;
computeName = stateManager.ComputeName;
var profileName = stateManager.ProfileName;
var region = stateManager.Region;
var credentialsResponse =
_credentialsStore.RetriveAwsCredentials(
new RetriveAwsCredentialsRequest() { ProfileName = profileName });
var gameLiftClient = new AmazonGameLiftClient(credentialsResponse.AccessKey, credentialsResponse.SecretKey,
RegionEndpoint.GetBySystemName(region));
authToken ??= gameLiftClient
.GetComputeAuthToken(new GetComputeAuthTokenRequest { ComputeName = computeName, FleetId = fleetID })
.AuthToken;
#else
websocketUrl = _settings.GetSetting(ServerSettingsKeys.WebSocketUrl).Value;
fleetID = _settings.GetSetting(ServerSettingsKeys.FleetId).Value;
computeName = _settings.GetSetting(ServerSettingsKeys.ComputeName).Value;
#endif
var serverParams =
new ServerParameters(websocketUrl, $"{ProcessIDPrefix}-{Guid.NewGuid()}", computeName, fleetID, authToken);
GenericOutcome initOutcome = GameLiftServerAPI.InitSDK(serverParams);
if (initOutcome.Success)
{
_logger.Write(":) SERVER IS IN A GAMELIFT FLEET");
ProcessReady();
}
else
{
SetConnected(false);
_logger.Write(":( SERVER NOT IN A FLEET. GameLiftServerAPI.InitSDK() returned " + Environment.NewLine +
initOutcome.Error.ErrorMessage);
}
}
catch (Exception e)
{
_logger.Write(":( SERVER NOT IN A FLEET. GameLiftServerAPI.InitSDK() exception " + Environment.NewLine +
e.Message);
}
}
public bool AcceptPlayerSession(string playerSessionId)
{
try
{
GenericOutcome outcome = GameLiftServerAPI.AcceptPlayerSession(playerSessionId);
if (outcome.Success)
{
_logger.Write(":) Accepted Player Session: " + playerSessionId);
return true;
}
else
{
_logger.Write(":( ACCEPT PLAYER SESSION FAILED. AcceptPlayerSession() returned " +
outcome.Error.ToString());
return false;
}
}
catch (Exception e)
{
_logger.Write(":( ACCEPT PLAYER SESSION FAILED. AcceptPlayerSession() exception " + Environment.NewLine +
e.Message);
return false;
}
}
public bool RemovePlayerSession(string playerSessionId)
{
try
{
GenericOutcome outcome = GameLiftServerAPI.RemovePlayerSession(playerSessionId);
if (outcome.Success)
{
_logger.Write(":) Removed Player Session: " + playerSessionId);
return true;
}
else
{
_logger.Write(":( REMOVE PLAYER SESSION FAILED. RemovePlayerSession() returned " +
outcome.Error.ToString());
return false;
}
}
catch (Exception e)
{
_logger.Write(":( REMOVE PLAYER SESSION FAILED. RemovePlayerSession() exception " + Environment.NewLine +
e.Message);
return false;
}
}
private void ProcessReady()
{
try
{
ProcessParameters processParams = CreateProcessParameters();
GenericOutcome processReadyOutcome = GameLiftServerAPI.ProcessReady(processParams);
SetConnected(processReadyOutcome.Success);
if (processReadyOutcome.Success)
{
_logger.Write(":) PROCESSREADY SUCCESS.");
}
else
{
_logger.Write(":( PROCESSREADY FAILED. ProcessReady() returned " +
processReadyOutcome.Error.ToString());
}
}
catch (Exception e)
{
_logger.Write(":( PROCESSREADY FAILED. ProcessReady() exception " + Environment.NewLine + e.Message);
}
}
private ProcessParameters CreateProcessParameters()
{
var logParameters = new LogParameters();
if (_logFilePath != null)
{
logParameters.LogPaths = new List<string> { _logFilePath };
}
return new ProcessParameters(
onStartGameSession: gameSession =>
{
_logger.Write(":) GAMELIFT SESSION REQUESTED"); //And then do stuff with it maybe.
try
{
GenericOutcome outcome = GameLiftServerAPI.ActivateGameSession();
if (outcome.Success)
{
_logger.Write(":) GAME SESSION ACTIVATED");
}
else
{
_logger.Write(":( GAME SESSION ACTIVATION FAILED. ActivateGameSession() returned " +
outcome.Error.ToString());
}
}
catch (Exception e)
{
_logger.Write(":( GAME SESSION ACTIVATION FAILED. ActivateGameSession() exception " +
Environment.NewLine + e.Message);
}
},
onUpdateGameSession: session =>
{
_logger.Write(":) GAME SESSION UPDATED");
_logger.Write(":) UPDATE REASON - " + session.UpdateReason);
_logger.Write(":) GameSession: " + JsonUtility.ToJson(session.GameSession));
},
onProcessTerminate: () =>
{
_logger.Write(":| GAMELIFT PROCESS TERMINATION REQUESTED (OK BYE)");
_gl.TerminateServer();
},
onHealthCheck: () =>
{
_logger.Write(":) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)");
return true;
},
// tell the GameLift service which port to connect to this process on.
// unless we manage this there can only be one process per server.
_port,
logParameters);
}
public void ProcessEnding()
{
try
{
GenericOutcome outcome = GameLiftServerAPI.ProcessEnding();
if (outcome.Success)
{
_logger.Write(":) PROCESSENDING");
}
else
{
_logger.Write(":( PROCESSENDING FAILED. ProcessEnding() returned " + outcome.Error.ToString());
}
}
catch (Exception e)
{
_logger.Write(":( PROCESSENDING FAILED. ProcessEnding() exception " + Environment.NewLine + e.Message);
}
finally
{
GameLiftServerAPI.Destroy();
}
}
private void SetConnected(bool value)
{
if (_isConnected == value)
{
return;
}
_isConnected = value;
_gl.ConnectionChangedEvent?.Invoke(value);
}
}
#endif