monopoly/Assets/Mirror/Runtime/NetworkAuthenticator.cs
2020-11-30 08:12:07 +00:00

102 lines
3.4 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Events;
namespace Mirror
{
/// <summary>
/// Unity Event for the NetworkConnection
/// </summary>
[Serializable] public class UnityEventNetworkConnection : UnityEvent<NetworkConnection> { }
/// <summary>
/// Base class for implementing component-based authentication during the Connect phase
/// </summary>
[HelpURL("https://mirror-networking.com/docs/Guides/Authentication.html")]
public abstract class NetworkAuthenticator : MonoBehaviour
{
[Header("Event Listeners (optional)")]
/// <summary>
/// Notify subscribers on the server when a client is authenticated
/// </summary>
[Tooltip("Mirror has an internal subscriber to this event. You can add your own here.")]
public UnityEventNetworkConnection OnServerAuthenticated = new UnityEventNetworkConnection();
/// <summary>
/// Notify subscribers on the client when the client is authenticated
/// </summary>
[Tooltip("Mirror has an internal subscriber to this event. You can add your own here.")]
public UnityEventNetworkConnection OnClientAuthenticated = new UnityEventNetworkConnection();
#region server
/// <summary>
/// Called on server from StartServer to initialize the Authenticator
/// <para>Server message handlers should be registered in this method.</para>
/// </summary>
public virtual void OnStartServer() { }
/// <summary>
/// Called on server from OnServerAuthenticateInternal when a client needs to authenticate
/// </summary>
/// <param name="conn">Connection to client.</param>
public abstract void OnServerAuthenticate(NetworkConnection conn);
protected void ServerAccept(NetworkConnection conn)
{
OnServerAuthenticated.Invoke(conn);
}
protected void ServerReject(NetworkConnection conn)
{
conn.Disconnect();
}
#endregion
#region client
/// <summary>
/// Called on client from StartClient to initialize the Authenticator
/// <para>Client message handlers should be registered in this method.</para>
/// </summary>
public virtual void OnStartClient() { }
/// <summary>
/// Called on client from OnClientAuthenticateInternal when a client needs to authenticate
/// </summary>
/// <param name="conn">Connection of the client.</param>
public abstract void OnClientAuthenticate(NetworkConnection conn);
protected void ClientAccept(NetworkConnection conn)
{
OnClientAuthenticated.Invoke(conn);
}
protected void ClientReject(NetworkConnection conn)
{
// Set this on the client for local reference
conn.isAuthenticated = false;
// disconnect the client
conn.Disconnect();
}
#endregion
void OnValidate()
{
#if UNITY_EDITOR
// automatically assign authenticator field if we add this to NetworkManager
NetworkManager manager = GetComponent<NetworkManager>();
if (manager != null && manager.authenticator == null)
{
manager.authenticator = this;
UnityEditor.Undo.RecordObject(gameObject, "Assigned NetworkManager authenticator");
}
#endif
}
}
}