69 lines
2.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|