#if !BESTHTTP_DISABLE_SIGNALR
using System;
using UnityEngine;
using BestHTTP.SignalR;
using BestHTTP.SignalR.Hubs;
using BestHTTP.Examples;
sealed class ConnectionStatusSample : MonoBehaviour
{
readonly Uri URI = new Uri("https://besthttpsignalr.azurewebsites.net/signalr");
///
/// Reference to the SignalR Connection
///
Connection signalRConnection;
GUIMessageList messages = new GUIMessageList();
#region Unity Events
void Start()
{
// Connect to the StatusHub hub
signalRConnection = new Connection(URI, "StatusHub");
// General events
signalRConnection.OnNonHubMessage += signalRConnection_OnNonHubMessage;
signalRConnection.OnError += signalRConnection_OnError;
signalRConnection.OnStateChanged += signalRConnection_OnStateChanged;
// SaveLocal up a Callback for Hub events
signalRConnection["StatusHub"].OnMethodCall += statusHub_OnMethodCall;
// Connect to the server
signalRConnection.Open();
}
void OnDestroy()
{
// Close the connection when we are closing the sample
signalRConnection.Close();
}
void OnGUI()
{
GUIHelper.DrawArea(GUIHelper.ClientArea, true, () =>
{
GUILayout.BeginHorizontal();
if (GUILayout.Button("START") && signalRConnection.State != ConnectionStates.Connected)
signalRConnection.Open();
if (GUILayout.Button("STOP") && signalRConnection.State == ConnectionStates.Connected)
{
signalRConnection.Close();
messages.Clear();
}
if (GUILayout.Button("PING") && signalRConnection.State == ConnectionStates.Connected)
{
// Call a Hub-method on the server.
signalRConnection["StatusHub"].Call("Ping");
}
GUILayout.EndHorizontal();
GUILayout.Space(20);
GUILayout.Label("Connection Status Messages");
GUILayout.BeginHorizontal();
GUILayout.Space(20);
messages.Draw(Screen.width - 20, 0);
GUILayout.EndHorizontal();
});
}
#endregion
#region SignalR Events
///
/// Called on server-sent non-hub messages.
///
void signalRConnection_OnNonHubMessage(Connection manager, object data)
{
messages.Add("[Server Message] " + data.ToString());
}
///
/// Called when the SignalR Connection's state changes.
///
void signalRConnection_OnStateChanged(Connection manager, ConnectionStates oldState, ConnectionStates newState)
{
messages.Add(string.Format("[State Change] {0} => {1}", oldState, newState));
}
///
/// Called when an error occures. The plugin may close the connection after this event.
///
void signalRConnection_OnError(Connection manager, string error)
{
messages.Add("[Error] " + error);
}
///
/// Called when the "StatusHub" hub wants to call a method on this client.
///
void statusHub_OnMethodCall(Hub hub, string method, params object[] args)
{
string id = args.Length > 0 ? args[0] as string : string.Empty;
string when = args.Length > 1 ? args[1].ToString() : string.Empty;
switch (method)
{
case "joined":
messages.Add(string.Format("[{0}] {1} joined at {2}", hub.Name, id, when));
break;
case "rejoined":
messages.Add(string.Format("[{0}] {1} reconnected at {2}", hub.Name, id, when));
break;
case "leave":
messages.Add(string.Format("[{0}] {1} leaved at {2}", hub.Name, id, when));
break;
default: // pong
messages.Add(string.Format("[{0}] {1}", hub.Name, method));
break;
}
}
#endregion
}
#endif