mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-09-30 14:02:49 +02:00
86 lines
3.4 KiB
C#
86 lines
3.4 KiB
C#
using System.Collections.Immutable;
|
|
using Phantom.Agent.Services.Instances;
|
|
using Phantom.Common.Data.Replies;
|
|
using Phantom.Common.Messages.Agent.ToAgent;
|
|
using Phantom.Utils.Logging;
|
|
using Phantom.Utils.Tasks;
|
|
using Phantom.Utils.Threading;
|
|
using Serilog;
|
|
|
|
namespace Phantom.Agent.Services;
|
|
|
|
public sealed class AgentRegistrationHandler {
|
|
private readonly ILogger logger = PhantomLogger.Create<AgentRegistrationHandler>();
|
|
|
|
private readonly ManualResetEventSlim newSessionEvent = new ();
|
|
private ImmutableArray<ConfigureInstanceMessage> lastConfigureInstanceMessages;
|
|
|
|
internal void OnRegistrationComplete(ImmutableArray<ConfigureInstanceMessage> configureInstanceMessages) {
|
|
ImmutableInterlocked.InterlockedExchange(ref lastConfigureInstanceMessages, configureInstanceMessages);
|
|
}
|
|
|
|
internal void OnNewSession() {
|
|
newSessionEvent.Set();
|
|
}
|
|
|
|
public async Task<bool> Start(AgentServices agentServices, CancellationToken cancellationToken) {
|
|
var configureInstanceMessages = ImmutableInterlocked.InterlockedExchange(ref lastConfigureInstanceMessages, value: default);
|
|
if (configureInstanceMessages.IsDefault) {
|
|
logger.Fatal("Handshake failed.");
|
|
return false;
|
|
}
|
|
|
|
foreach (var configureInstanceMessage in configureInstanceMessages) {
|
|
var configureInstanceResult = await agentServices.InstanceManager.Request(GetCommand(configureInstanceMessage), cancellationToken);
|
|
if (!configureInstanceResult.Is(ConfigureInstanceResult.Success)) {
|
|
logger.Fatal("Unable to configure instance \"{Name}\" (GUID {Guid}), shutting down.", configureInstanceMessage.Configuration.InstanceName, configureInstanceMessage.InstanceGuid);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
agentServices.InstanceTicketManager.RefreshAgentStatus();
|
|
|
|
_ = HandleNewSessionRegistrations(agentServices, cancellationToken);
|
|
return true;
|
|
}
|
|
|
|
private async Task HandleNewSessionRegistrations(AgentServices agentServices, CancellationToken cancellationToken) {
|
|
while (cancellationToken.Check()) {
|
|
await newSessionEvent.WaitHandle.WaitOneAsync(cancellationToken);
|
|
newSessionEvent.Reset();
|
|
|
|
try {
|
|
await HandleNewSessionRegistration(agentServices, cancellationToken);
|
|
} catch (Exception e) {
|
|
logger.Error(e, "Could not configure instances after re-registration.");
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task HandleNewSessionRegistration(AgentServices agentServices, CancellationToken cancellationToken) {
|
|
var configureInstanceMessages = ImmutableInterlocked.InterlockedExchange(ref lastConfigureInstanceMessages, value: default);
|
|
if (configureInstanceMessages.IsDefaultOrEmpty) {
|
|
return;
|
|
}
|
|
|
|
foreach (var configureInstanceMessage in configureInstanceMessages) {
|
|
var configureInstanceResult = await agentServices.InstanceManager.Request(GetCommand(configureInstanceMessage), cancellationToken);
|
|
if (!configureInstanceResult.Is(ConfigureInstanceResult.Success)) {
|
|
logger.Error("Unable to configure instance \"{Name}\" (GUID {Guid}).", configureInstanceMessage.Configuration.InstanceName, configureInstanceMessage.InstanceGuid);
|
|
}
|
|
}
|
|
|
|
agentServices.InstanceTicketManager.RefreshAgentStatus();
|
|
}
|
|
|
|
private static InstanceManagerActor.ConfigureInstanceCommand GetCommand(ConfigureInstanceMessage configureInstanceMessage) {
|
|
return new InstanceManagerActor.ConfigureInstanceCommand(
|
|
configureInstanceMessage.InstanceGuid,
|
|
configureInstanceMessage.Configuration,
|
|
configureInstanceMessage.LaunchProperties,
|
|
configureInstanceMessage.LaunchNow,
|
|
AlwaysReportStatus: true
|
|
);
|
|
}
|
|
}
|