using PlayFab.ServerModels; using PlayFab.Json; using PlayFab; using strange.extensions.mediation.impl; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Networking.NetworkSystem; using System.Collections; using System.Collections.Generic; public class ArenaMediator : EventMediator { // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Dependency Injections // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ [Inject] public ServerSettingsData ServerSettingsData { get; set; } [Inject] public PlayFabServerShutdownSignal ShutdownSignal { get; set; } [Inject] public LogSignal Logger { get; set; } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Variables // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ List m_PlayersBoarding = new List(); // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Mediator Overrides // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ public override void OnRegister() { NetworkServer.RegisterHandler( ServerMsgType.Connect, OnConnect ); NetworkServer.RegisterHandler( ServerMsgType.Authenticate, OnAuthenticate ); NetworkServer.RegisterHandler( ServerMsgType.Disconnect, OnDisconnect ); NetworkServer.RegisterHandler( ServerMsgType.Error, OnError ); Logger.Dispatch( LoggerTypes.Info, "Registered." ); } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Utility // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void _playerDisconnected( ArenaPlayer player ) { if( player.State != PlayerState.Disconnected ) { if( player.State != PlayerState.Connected ) PlayFabServerAPI.NotifyMatchmakerPlayerLeft( new NotifyMatchmakerPlayerLeftRequest() { PlayFabId = player.PlayFabId, LobbyId = ServerSettingsData.GameId.ToString() }, null, ProcessCloudError ); player.State = PlayerState.Disconnected; } } void _playerAuthenticated( ArenaPlayer player ) { player.State = PlayerState.Authenticated; Logger.Dispatch( LoggerTypes.Info, "Player authenticated: " + player.Connection.connectionId ); } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Cloudscript // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void ProcessCloudError( PlayFabError error ) { Logger.Dispatch( LoggerTypes.Info, "Cloud error: " + error.ErrorMessage ); ShutdownSignal.Dispatch(); } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Networking // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void OnConnect( NetworkMessage netMsg ) { ArenaPlayer player = new ArenaPlayer() { State = PlayerState.Connected, Connection = netMsg.conn }; m_PlayersBoarding.Add( player ); Logger.Dispatch( LoggerTypes.Info, "A new connection was made: " + netMsg.conn.connectionId ); StartCoroutine( CheckAuthentication( player ) ); } void OnAuthenticate( NetworkMessage netMsg ) { ArenaPlayer player = m_PlayersBoarding.Find( p => p.Connection.connectionId == netMsg.conn.connectionId ); if( player != null && player.State == PlayerState.Connected ) { AuthenticateMessage authMsg = netMsg.ReadMessage(); player.PlayFabId = authMsg.PlayFabId; Logger.Dispatch( LoggerTypes.Info, "Player authenticating: " + player.Connection.connectionId ); PlayFabServerAPI.RedeemMatchmakerTicket( new RedeemMatchmakerTicketRequest() { Ticket = authMsg.AuthTicket, LobbyId = ServerSettingsData.GameId.ToString() }, ( result ) => { if( player != null && player.State == PlayerState.Connected ) _playerAuthenticated( player ); }, ProcessCloudError ); } } void OnDisconnect( NetworkMessage netMsg ) { ArenaPlayer player = m_PlayersBoarding.Find( p => p.Connection.connectionId == netMsg.conn.connectionId ); if( player != null ) { Logger.Dispatch( LoggerTypes.Info, player.Connection.connectionId + " has disconnected." ); _playerDisconnected( player ); m_PlayersBoarding.Remove( player ); if( player != null && m_PlayersBoarding.Count <= 0 ) StartCoroutine( CheckForConnections() ); } } void OnError( NetworkMessage netMsg ) { try { ErrorMessage errorMsg = netMsg.ReadMessage(); Logger.Dispatch( LoggerTypes.Info, "Error: " + ( ( errorMsg != null ) ? errorMsg.errorCode.ToString() : "unknown" ) ); } catch { } ShutdownSignal.Dispatch(); } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Co-Routines // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ IEnumerator CheckForConnections() { yield return new WaitForSeconds( 1200f ); if( m_PlayersBoarding.Count <= 0 ) { Logger.Dispatch( LoggerTypes.Info, "Server shutting down, no more connections." ); ShutdownSignal.Dispatch(); } } IEnumerator CheckAuthentication( ArenaPlayer player ) { yield return new WaitForSeconds( 5f ); if( player.State == PlayerState.Connected ) { Logger.Dispatch( LoggerTypes.Info, "Disconnecting unauthenticated: " + player.Connection.connectionId ); player.Connection.Disconnect(); } } }