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

88 lines
3.5 KiB
C#

using System;
using System.Threading.Tasks;
using NitroxClient.Communication.Abstract;
using NitroxModel.Helper;
using NitroxModel.MultiplayerSession;
using NitroxModel.Packets;
namespace NitroxClient.Communication.MultiplayerSession.ConnectionState
{
public class AwaitingReservationCredentials : ConnectionNegotiatingState
{
public override MultiplayerSessionConnectionStage CurrentStage => MultiplayerSessionConnectionStage.AWAITING_RESERVATION_CREDENTIALS;
public override Task NegotiateReservationAsync(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
try
{
ValidateState(sessionConnectionContext);
string reservationCorrelationId = Guid.NewGuid().ToString();
RequestSessionReservation(sessionConnectionContext, reservationCorrelationId);
AwaitSessionReservation(sessionConnectionContext, reservationCorrelationId);
}
catch (Exception)
{
Disconnect(sessionConnectionContext);
throw;
}
return Task.CompletedTask;
}
private void RequestSessionReservation(IMultiplayerSessionConnectionContext sessionConnectionContext, string reservationCorrelationId)
{
IClient client = sessionConnectionContext.Client;
PlayerSettings playerSettings = sessionConnectionContext.PlayerSettings;
AuthenticationContext authenticationContext = sessionConnectionContext.AuthenticationContext;
MultiplayerSessionReservationRequest requestPacket = new(reservationCorrelationId, playerSettings, authenticationContext);
client.Send(requestPacket);
}
private void AwaitSessionReservation(IMultiplayerSessionConnectionContext sessionConnectionContext, string reservationCorrelationId)
{
AwaitingSessionReservation nextState = new AwaitingSessionReservation(reservationCorrelationId);
sessionConnectionContext.UpdateConnectionState(nextState);
}
private static void ValidateState(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
ClientIsConnected(sessionConnectionContext);
PlayerSettingsIsNotNull(sessionConnectionContext);
AuthenticationContextIsNotNull(sessionConnectionContext);
}
private static void ClientIsConnected(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
if (!sessionConnectionContext.Client.IsConnected)
{
throw new InvalidOperationException("The client is not connected.");
}
}
private static void PlayerSettingsIsNotNull(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
try
{
Validate.NotNull(sessionConnectionContext.PlayerSettings);
}
catch (ArgumentNullException ex)
{
throw new InvalidOperationException("The context does not contain player settings.", ex);
}
}
private static void AuthenticationContextIsNotNull(IMultiplayerSessionConnectionContext sessionConnectionContext)
{
try
{
Validate.NotNull(sessionConnectionContext.AuthenticationContext);
}
catch (ArgumentNullException ex)
{
throw new InvalidOperationException("The context does not contain an authentication context.", ex);
}
}
}
}