using System;
using System.Threading.Tasks;
using UnityEngine;
namespace Unity.BossRoom.ConnectionManagement
{
///
/// Connection state corresponding to when a client is attempting to connect to a server. Starts the client when
/// entering. If successful, transitions to the ClientConnected state. If not, transitions to the Offline state.
///
class ClientConnectingState : OnlineState
{
protected ConnectionMethodBase m_ConnectionMethod;
public ClientConnectingState Configure(ConnectionMethodBase baseConnectionMethod)
{
m_ConnectionMethod = baseConnectionMethod;
return this;
}
public override void Enter()
{
#pragma warning disable 4014
ConnectClientAsync();
#pragma warning restore 4014
}
public override void Exit() { }
public override void OnClientConnected(ulong _)
{
m_ConnectStatusPublisher.Publish(ConnectStatus.Success);
m_ConnectionManager.ChangeState(m_ConnectionManager.m_ClientConnected);
}
public override void OnClientDisconnect(ulong _)
{
// client ID is for sure ours here
StartingClientFailed();
}
void StartingClientFailed()
{
var disconnectReason = m_ConnectionManager.NetworkManager.DisconnectReason;
if (string.IsNullOrEmpty(disconnectReason))
{
m_ConnectStatusPublisher.Publish(ConnectStatus.StartClientFailed);
}
else
{
var connectStatus = JsonUtility.FromJson(disconnectReason);
m_ConnectStatusPublisher.Publish(connectStatus);
}
m_ConnectionManager.ChangeState(m_ConnectionManager.m_Offline);
}
internal async Task ConnectClientAsync()
{
try
{
// Setup NGO with current connection method
await m_ConnectionMethod.SetupClientConnectionAsync();
// NGO's StartClient launches everything
if (!m_ConnectionManager.NetworkManager.StartClient())
{
throw new Exception("NetworkManager StartClient failed");
}
}
catch (Exception e)
{
Debug.LogError("Error connecting client, see following exception");
Debug.LogException(e);
StartingClientFailed();
throw;
}
}
}
}