using System.Collections; using UnityEngine; namespace Mirror.Authenticators { /// /// An authenticator that disconnects connections if they don't /// authenticate within a specified time limit. /// [AddComponentMenu("Network/Authenticators/TimeoutAuthenticator")] public class TimeoutAuthenticator : NetworkAuthenticator { static readonly ILogger logger = LogFactory.GetLogger(typeof(TimeoutAuthenticator)); public NetworkAuthenticator authenticator; [Range(0, 600), Tooltip("Timeout to auto-disconnect in seconds. Set to 0 for no timeout.")] public float timeout = 60; public void Awake() { authenticator.OnClientAuthenticated.AddListener(connection => OnClientAuthenticated.Invoke(connection)); authenticator.OnServerAuthenticated.AddListener(connection => OnServerAuthenticated.Invoke(connection)); } public override void OnStartClient() { authenticator.OnStartClient(); } public override void OnStartServer() { authenticator.OnStartServer(); } public override void OnClientAuthenticate(NetworkConnection conn) { authenticator.OnClientAuthenticate(conn); if (timeout > 0) StartCoroutine(BeginAuthentication(conn)); } public override void OnServerAuthenticate(NetworkConnection conn) { authenticator.OnServerAuthenticate(conn); if (timeout > 0) StartCoroutine(BeginAuthentication(conn)); } IEnumerator BeginAuthentication(NetworkConnection conn) { if (logger.LogEnabled()) logger.Log($"Authentication countdown started {conn} {timeout}"); yield return new WaitForSecondsRealtime(timeout); if (!conn.isAuthenticated) { if (logger.LogEnabled()) logger.Log($"Authentication Timeout {conn}"); conn.Disconnect(); } } } }