Editor/Window/RegisterComputeInput.cs (274 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.Model;
using UnityEngine;
using UnityEngine.UIElements;
namespace AmazonGameLift.Editor
{
public class RegisterComputeInput : ProgressBarStepComponent
{
private ComputeStatus _computeState;
private readonly TextField _computeNameInput;
private readonly Button _registerButton;
private readonly Button _replaceComputeButton;
private readonly Button _cancelReplaceButton;
private readonly VisualElement _computeStatus;
private readonly StatusIndicator _statusIndicator;
private const string _primaryButtonClassName = "button--primary";
private const string _defaultComputeName = "ComputerName-ProfileName";
private const string _defaultIpAddress = "127.0.0.1";
private string _computeName;
private string _ipAddress;
private Action _onComputeChanged;
private bool _isCompleted = false;
public RegisterComputeInput(VisualElement container, StateManager stateManager) : base(container, stateManager, "EditorWindow/Components/RegisterComputeInput")
{
new DeploymentStepTemplate.Builder(Strings.AnywherePageComputeTitle, Strings.AnywherePageComputeDescription)
.WithoutBaseButtons()
.Build(container);
_computeNameInput = container.Q<TextField>("AnywherePageComputeNameInput");
_computeStatus = container.Q("AnywherePageComputeStatus");
_registerButton = container.Q<Button>("AnywherePageComputeRegisterButton");
_replaceComputeButton = container.Q<Button>("AnywherePageComputeReplaceComputeButton");
_cancelReplaceButton = container.Q<Button>("AnywherePageComputeCancelReplaceButton");
_statusIndicator = container.Q<StatusIndicator>();
LocalizeText();
_computeState = !string.IsNullOrWhiteSpace(_stateManager.ComputeName) &&
!string.IsNullOrWhiteSpace(_stateManager.IpAddress)
? ComputeStatus.Registered
: ComputeStatus.NotRegistered;
_stateManager.OnUserProfileUpdated += UpdateGUI;
SetupConfigSettings();
RegisterCallbacks();
_stateManager.OnFleetChanged += ResetAndTryStart;
_stateManager.OnFleetChanged += SetValidCompute;
_stateManager.OnFleetChanged += UpdateGUI;
UpdateGUI();
}
protected sealed override Task StartOrResumeStep()
{
UpdateGUI();
return Task.CompletedTask;
}
protected sealed override void ResetStep()
{
_isCompleted = false;
_stateManager.ComputeName = null;
_stateManager.IpAddress = null;
_stateManager.WebSocketUrl = null;
_computeState = ComputeStatus.NotRegistered;
UpdateGUI();
}
private void MarkComplete()
{
if (!_isCompleted)
{
_isCompleted = true;
CompleteStep();
}
}
private void RegisterCallbacks()
{
_registerButton.RegisterCallback<ClickEvent>(_ => OnRegisterComputeButtonClicked());
_replaceComputeButton.RegisterCallback<ClickEvent>(_ => OnReplaceComputeButtonClicked());
_cancelReplaceButton.RegisterCallback<ClickEvent>(_ => OnCancelReplaceButtonClicked());
_computeNameInput.value = _computeName;
_computeNameInput.RegisterValueChangedCallback(_ => UpdateComputeTextFields(_computeNameInput));
}
private async void OnRegisterComputeButtonClicked()
{
if (_computeState is ComputeStatus.NotRegistered or ComputeStatus.Registering)
{
var previousComputeName = _stateManager.ComputeName;
var registerResponse = await _stateManager.ComputeManager.RegisterFleetCompute(_computeName,
_stateManager.AnywhereFleetId, _stateManager.AnywhereFleetLocation, _ipAddress);
if (registerResponse.Success)
{
_computeState = ComputeStatus.Registered;
_stateManager.ComputeName = registerResponse.ComputeName;
_stateManager.IpAddress = registerResponse.IpAddress;
_stateManager.WebSocketUrl = registerResponse.WebSocketUrl;
MarkComplete();
if (!string.IsNullOrWhiteSpace(previousComputeName) && previousComputeName != _computeName)
{
var deregisterResponse =
await _stateManager.ComputeManager.DeregisterCompute(previousComputeName,
_stateManager.AnywhereFleetId);
if (!deregisterResponse)
{
Debug.LogError(new TextProvider().GetError(ErrorCode.DeregisterComputeFailed));
}
}
}
else
{
EncounteredException(StatusBox.StatusBoxType.Error,
Strings.AnywherePageStatusBoxDefaultComputeErrorText,
registerResponse.ErrorMessage);
}
}
UpdateGUI();
}
private async void SetValidCompute()
{
if (_stateManager.AnywhereFleetId == null)
{
return;
}
var computes = await _stateManager.ComputeManager.ListCompute(_stateManager.AnywhereFleetId);
if (computes.Success)
{
var matchingCompute =
computes.ComputeList.FirstOrDefault(compute =>
compute.ComputeName == _stateManager.ComputeName);
if (matchingCompute != null)
{
SetupComputeAfterSwitch(matchingCompute);
}
else if (computes.ComputeList.Count > 0)
{
var firstCompute = computes.ComputeList.First();
SetupComputeAfterSwitch(firstCompute);
}
else
{
_computeState = ComputeStatus.NotRegistered;
_stateManager.ComputeName = "";
_computeNameInput.value = _defaultComputeName;
}
}
else
{
Debug.LogError(computes.ErrorMessage);
}
UpdateGUI();
}
private void SetupComputeAfterSwitch(Compute compute)
{
_computeState = ComputeStatus.Registered;
_stateManager.ComputeName = compute.ComputeName;
_stateManager.IpAddress = compute.IpAddress;
_stateManager.WebSocketUrl = compute.GameLiftServiceSdkEndpoint;
_computeNameInput.value = compute.ComputeName;
MarkComplete();
}
private void OnReplaceComputeButtonClicked()
{
Reset();
if (_computeState is ComputeStatus.Registered)
{
_computeState = ComputeStatus.Registering;
}
UpdateGUI();
}
private void OnCancelReplaceButtonClicked()
{
if (_computeState is ComputeStatus.Registering)
{
_computeState = ComputeStatus.Registered;
}
_computeNameInput.value = _stateManager.ComputeName;
UpdateGUI();
}
private void UpdateComputeTextFields(TextField computeTextField)
{
var computeTextNameValid = computeTextField.value.Length >= 1;
_computeName = computeTextField.value;
_registerButton.SetEnabled(computeTextNameValid);
}
private void SetupConfigSettings()
{
_computeName = !string.IsNullOrWhiteSpace(_stateManager.ComputeName) ? _stateManager.ComputeName : _defaultComputeName;
_ipAddress = !string.IsNullOrWhiteSpace(_stateManager.IpAddress) ? _stateManager.IpAddress : _defaultIpAddress;
}
private List<VisualElement> GetComputeVisualElements() =>
new List<VisualElement>()
{
_registerButton,
_cancelReplaceButton,
_computeStatus,
_replaceComputeButton
};
private List<VisualElement> GetVisibleItemsByState()
{
return _computeState switch
{
ComputeStatus.Disabled => new List<VisualElement>(),
ComputeStatus.NotRegistered => new List<VisualElement>() { _registerButton, },
ComputeStatus.Registering => new List<VisualElement>() { _registerButton, _cancelReplaceButton },
ComputeStatus.Registered => new List<VisualElement>() { _computeStatus, _replaceComputeButton },
_ => throw new ArgumentOutOfRangeException()
};
}
private void CheckReadOnly()
{
if (_computeState == ComputeStatus.Registered)
{
_computeNameInput.isReadOnly = true;
_computeNameInput.SetEnabled(false);
}
else
{
_computeNameInput.isReadOnly = false;
_computeNameInput.SetEnabled(true);
}
}
protected sealed override void UpdateGUI()
{
var elements = GetVisibleItemsByState();
foreach (var element in GetComputeVisualElements())
{
if (elements.Contains(element))
{
Show(element);
}
else
{
Hide(element);
}
}
_container.SetEnabled(_stateManager.IsBootstrapped() &&
!string.IsNullOrWhiteSpace(_stateManager.AnywhereFleetId));
if (!string.IsNullOrWhiteSpace(_stateManager.ComputeName))
{
var textProvider = new TextProvider();
_statusIndicator.Set(State.Success,
textProvider.Get(Strings.AnywherePageComputeStatusRegistered));
}
if (string.IsNullOrWhiteSpace(_stateManager.AnywhereFleetId))
{
_registerButton.RemoveFromClassList(_primaryButtonClassName);
}
else
{
_registerButton.AddToClassList(_primaryButtonClassName);
}
CheckReadOnly();
}
private void LocalizeText()
{
var l = new ElementLocalizer(_container);
var strings = new[]
{
Strings.AnywherePageComputeNameLabel,
Strings.AnywherePageComputeIPLabel,
Strings.AnywherePageComputeStatusLabel,
Strings.AnywherePageComputeRegisterButton,
Strings.AnywherePageComputeReplaceComputeButton,
Strings.AnywherePageComputeCancelReplaceButton
};
foreach (var s in strings)
{
l.SetElementText(s, s);
}
l.SetElementTooltip(Strings.AnywherePageComputeIPLabel, Strings.AnywherePageComputeIPDescription);
}
public ComputeStatus getComputeStatus()
{
return _computeState;
}
}
}