using System; using System.Collections.Generic; using System.Linq; using Sfs2X; using Sfs2X.Core; using Sfs2X.Entities; using Sfs2X.Entities.Data; using Sfs2X.Requests; using UnityEngine; public enum RequestType { Batch, BatchAndOverride, Immediate, } public enum RequestStatus { Failed, Succeed, Pending, } public class GardenSmartFox { #region Variable public const string CommandRequestLabel = "0"; public const string CommandArrayLabel = "A"; public const string CommandLabel = "C"; public const string ParameterLabel = "P"; public const string TargetUserLabel = "U"; public User User; public SmartFox SmartFox; public BaseLoggor Loggor; public BaseConnector Connector; public SFSExtensionManager ExtensionManager; public PlazaRoomManager PlazaRoomManager; public float RequestTime = 0.5f; public float RequestTimer = 0f; public List BatchRequestList = new List(); public Dictionary BatchAndOverrideRequestDictionary = new Dictionary(); #endregion public GardenSmartFox(BaseLoggor baseLoggor, BaseConnector baseConnector) { SmartFox = new SmartFox(); Loggor = baseLoggor.Init(this); Connector = baseConnector.Init(this); ExtensionManager = new SFSExtensionManager(this); PlazaRoomManager = new PlazaRoomManager(this); } public void ExecuteAfterCheckConection(Action execute, Action onConnectResult = null, Action onLoginResult = null) { if (!SmartFox.IsConnected) { Reset(); Connector.Connect(); if (onConnectResult != null) { new CounterAction ( (succeed, baseEvent) => { onConnectResult.Invoke(succeed, baseEvent); } ).Bind(ref Connector.onConnectResult); } if (onLoginResult != null) { new CounterAction ( (succeed, baseEvent) => { onLoginResult.Invoke(succeed, baseEvent); } ).Bind(ref Loggor.onLoginResult); } new CounterAction ( baseEven => { execute.Invoke(); } ).Bind(ref Loggor.onLogin); } else { execute.Invoke(); } } public void Reset() { SmartFox = new SmartFox(); Loggor.Init(this); Connector.Init(this); ExtensionManager = new SFSExtensionManager(this); PlazaRoomManager = new PlazaRoomManager(this); } public void ProcessRequest() { RequestTimer += Time.deltaTime; if (RequestTimer >= RequestTime) { RequestTimer = 0; if (BatchRequestList.Count > 0 || BatchAndOverrideRequestDictionary.Count > 0) { BatchRequestList.AddRange(BatchAndOverrideRequestDictionary.Values.ToList()); SFSObject parameter = ConstructRequestParameter(BatchRequestList); BatchRequestList = new List(); BatchAndOverrideRequestDictionary = new Dictionary(); SendRequest(parameter); } } } public void AddRequest(SFSObject sfsObject, RequestType requestType, string requestName = null) { if (requestType == RequestType.Immediate) { SFSObject parameter = ConstructRequestParameter(new List() { sfsObject }); SendRequest(parameter); Debug.Log("Send request immediately"); } else if (requestType == RequestType.Batch) { BatchRequestList.Add(sfsObject); Debug.Log("Add batch request"); } else if (requestType == RequestType.BatchAndOverride) { Debug.Log("Override batch request"); if (BatchAndOverrideRequestDictionary.ContainsKey(requestName)) { BatchAndOverrideRequestDictionary[requestName] = sfsObject; } else { BatchAndOverrideRequestDictionary.Add(requestName, sfsObject); } } else { throw new Exception(); } } public void SendRequest(SFSObject parameter) { SmartFox.Send(new ExtensionRequest(CommandRequestLabel, parameter)); } public static SFSObject ConstructRequestParameter(List sfsObjects) { SFSObject parameter = new SFSObject(); SFSArray sfsArray = new SFSArray(); foreach (var sfsObject in sfsObjects) { sfsArray.AddSFSObject(sfsObject); } parameter.PutSFSArray(CommandArrayLabel, sfsArray); return parameter; } public static SFSObject ConstructCommandParameter(int commandID, SFSObject sfsObject, int targetUserID) { SFSObject parameter = new SFSObject(); parameter.PutInt("C", commandID); parameter.PutSFSObject("P", sfsObject); parameter.PutInt("U", targetUserID); return parameter; } }