Files
Nitrox/NitroxClient/Communication/MultiplayerSession/ConnectionState/EstablishingSessionPolicy.cs
2025-07-06 00:23:46 +02:00

69 lines
2.5 KiB
C#

using System;
using System.Threading.Tasks;
using NitroxClient.Communication.Abstract;
using NitroxModel.Helper;
using NitroxModel.Packets.Exceptions;
namespace NitroxClient.Communication.MultiplayerSession.ConnectionState
{
public class EstablishingSessionPolicy : ConnectionNegotiatingState
{
private readonly string policyRequestCorrelationId;
public EstablishingSessionPolicy(string policyRequestCorrelationId)
{
Validate.NotNull(policyRequestCorrelationId);
this.policyRequestCorrelationId = policyRequestCorrelationId;
}
public override MultiplayerSessionConnectionStage CurrentStage => MultiplayerSessionConnectionStage.ESTABLISHING_SERVER_POLICY;
public override Task NegotiateReservationAsync(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
try
{
ValidateState(sessionConnectionContext);
AwaitReservationCredentials(sessionConnectionContext);
}
catch (Exception)
{
Disconnect(sessionConnectionContext);
throw;
}
return Task.CompletedTask;
}
private void ValidateState(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
SessionPolicyIsNotNull(sessionConnectionContext);
SessionPolicyPacketCorrelation(sessionConnectionContext);
}
private static void SessionPolicyIsNotNull(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
try
{
Validate.NotNull(sessionConnectionContext.SessionPolicy);
}
catch (ArgumentNullException ex)
{
throw new InvalidOperationException("The context is missing a session policy.", ex);
}
}
private void SessionPolicyPacketCorrelation(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
if (!policyRequestCorrelationId.Equals(sessionConnectionContext.SessionPolicy.CorrelationId))
{
throw new UncorrelatedPacketException(sessionConnectionContext.SessionPolicy, policyRequestCorrelationId);
}
}
private void AwaitReservationCredentials(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
AwaitingReservationCredentials nextState = new AwaitingReservationCredentials();
sessionConnectionContext.UpdateConnectionState(nextState);
}
}
}