Editor/CoreAPI/GameLiftFleetManager.cs (153 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.GameLift;
using Amazon.GameLift.Model;
using Amazon.Runtime.Internal;
using AmazonGameLiftPlugin.Core;
using AmazonGameLiftPlugin.Core.Shared;
using UnityEngine;
using UnityEngine.UIElements;
namespace AmazonGameLift.Editor
{
public class GameLiftFleetManager
{
private const string FleetLocation = "custom-location-1";
private const string FleetDescription = "Deployed by the Amazon GameLift Plug-in for Unity.";
private readonly IAmazonGameLiftWrapper _amazonGameLiftWrapper;
private string _fleetName;
private string _fleetId;
private VisualElement _container;
private ErrorResponse _logger;
public GameLiftFleetManager(IAmazonGameLiftWrapper amazonGameLiftWrapper)
{
_amazonGameLiftWrapper = amazonGameLiftWrapper;
}
public async Task<CreateFleetResponse> CreateFleet(string fleetName, string fleetLocation)
{
if (_amazonGameLiftWrapper == null)
{
return Response.Fail(new CreateFleetResponse { ErrorCode = ErrorCode.AccountProfileMissing });
}
if (string.IsNullOrWhiteSpace(fleetName))
{
return Response.Fail(new CreateFleetResponse { ErrorCode = ErrorCode.InvalidFleetName });
}
try
{
var createFleetRequest = new CreateFleetRequest
{
Name = fleetName,
ComputeType = ComputeType.ANYWHERE,
Description = $"{FleetDescription} Using Unity Engine Version {UnityEngineVersionUtil.CurrentVersion}",
Locations = new List<LocationConfiguration>
{
new()
{
Location = fleetLocation,
}
},
Tags = new List<Tag>
{
{ new() { Key = "CreatedBy", Value = "AmazonGameLiftUnityPlugin" } }
}
};
var createFleetResponse = await _amazonGameLiftWrapper.CreateFleet(createFleetRequest);
return Response.Ok(new CreateFleetResponse()
{
FleetId = createFleetResponse.FleetAttributes.FleetId,
FleetName = fleetName
});
}
catch (Exception ex)
{
return Response.Fail(new CreateFleetResponse()
{
ErrorCode = ErrorCode.CreateFleetFailed,
ErrorMessage = ex.Message
});
}
}
public async Task<CreateCustomLocationResponse> CreateCustomLocationIfNotExists()
{
if (_amazonGameLiftWrapper == null)
{
return Response.Fail(new CreateCustomLocationResponse { ErrorCode = ErrorCode.AccountProfileMissing });
}
try
{
var listLocationsResponse = await _amazonGameLiftWrapper.ListLocations(new ListLocationsRequest
{
Filters = new List<string> { "CUSTOM" },
});
var foundLocation = listLocationsResponse.Locations
.FirstOrDefault(l => l.LocationName.ToString() == FleetLocation);
if (foundLocation == null)
{
await _amazonGameLiftWrapper.CreateLocation(new CreateLocationRequest()
{
LocationName = FleetLocation
});
}
return Response.Ok(new CreateCustomLocationResponse
{
Location = FleetLocation
});
}
catch (Exception ex)
{
return Response.Fail(new CreateCustomLocationResponse()
{
ErrorCode = ErrorCode.CustomLocationCreationFailed,
ErrorMessage = ex.Message
});
}
}
public async Task<List<FleetAttributes>> DescribeFleetAttributes(ComputeType computeType)
{
try
{
var listFleetRequest = new ListFleetsRequest();
var listFleetResponse = await _amazonGameLiftWrapper.ListFleets(listFleetRequest);
var describeFleetRequest = new DescribeFleetAttributesRequest()
{
FleetIds = listFleetResponse.FleetIds
};
var describeFleetResponse = await _amazonGameLiftWrapper.DescribeFleetAttributes(describeFleetRequest);
return describeFleetResponse.FleetAttributes.Where(fleet => fleet.ComputeType == computeType)
.ToList();
}
catch (Exception ex)
{
Debug.LogError(ex.Message);
return null;
}
}
public async Task<FindFleetLocationResponse> FindFirstFleetLocation(string fleetId)
{
try
{
var describeFleetLocationAttributesRequest = new DescribeFleetLocationAttributesRequest()
{
FleetId = fleetId
};
var describeFleetUtilizationResponse =
await _amazonGameLiftWrapper.DescribeFleetLocationAttributes(describeFleetLocationAttributesRequest);
return Response.Ok(new FindFleetLocationResponse
{
Location = describeFleetUtilizationResponse.LocationAttributes[0].LocationState.Location
});
}
catch (Exception ex)
{
return Response.Fail(new FindFleetLocationResponse()
{
ErrorCode = ErrorCode.CustomLocationCreationFailed,
ErrorMessage = ex.Message
});
}
}
}
}