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 BatchOption { Always, TryNot, } public enum RequestType { Batch, BatchAndOverride, Immediate, } public class GardenSmartFox { #region Config public User User; public SmartFox SmartFox; public BaseLoggor Loggor; public BaseConnector Connector; public SFSEventManager EventManager; public PlazaRoomController PlazaRoomController; public float BatchTime = 3f; public float BatchTimer = 0f; public List StaleRequests = new List(); public List BatchRequestList = new List(); public Dictionary BatchOverrideRequests = new Dictionary(); #endregion public GardenSmartFox() { SmartFox = new SmartFox(); Loggor = new Loggor().Init(this); Connector = new Connector().Init(this); EventManager = new SFSEventManager(this); PlazaRoomController = new PlazaRoomController(this); } public void ExecuteAfterCheckConection(Action execute = null, 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.onLoginReturn); } new CounterAction ( baseEven => { execute.SafeInvoke(); } ).Bind(ref Loggor.onLogin); } else { execute.SafeInvoke(); } } public void Reset() { SmartFox = new SmartFox(); Loggor.Init(this); Connector.Init(this); EventManager = new SFSEventManager(this); } public void ProcessRequest() { BatchTimer += Time.deltaTime; if (BatchTimer >= BatchTime) { BatchTimer = 0; StaleRequests = new List(); if (BatchRequestList.Count > 0 || BatchOverrideRequests.Count > 0) { BatchRequestList.AddRange(BatchOverrideRequests.Values.ToList()); SendRequest(BatchRequestList); BatchRequestList = new List(); BatchOverrideRequests = new Dictionary(); } } } public void AddRequest(SFSObject sfsObject, RequestType requestType, string requestName = null, BatchOption batchOption = BatchOption.Always) { if (requestType == RequestType.Immediate) { SendRequest(sfsObject); } else if (requestType == RequestType.Batch) { if (CheckBatchOption(sfsObject, requestName, batchOption)) { return; } else { BatchRequestList.Add(sfsObject); } } else if (requestType == RequestType.BatchAndOverride) { if (CheckBatchOption(sfsObject, requestName, batchOption)) { return; } else { if (BatchOverrideRequests.ContainsKey(requestName)) { BatchOverrideRequests[requestName] = sfsObject; } else { BatchOverrideRequests.Add(requestName, sfsObject); } } } else { throw new Exception(); } } private bool CheckBatchOption(SFSObject sfsObject, string requestName, BatchOption batchOption) { if (batchOption == BatchOption.Always) { return false; } else if (batchOption == BatchOption.TryNot) { if (!StaleRequests.Contains(requestName)) { SendRequest(sfsObject); StaleRequests.Add(requestName); return true; } else { return false; } } else { throw new Exception(); } } private void SendRequest(SFSObject parameter) { parameter = WrapIntoArray(new List() { parameter }); SmartFox.Send(new ExtensionRequest(HandlerID.PlazaRoom.GetHashString(), parameter)); } private void SendRequest(List parameters) { SFSObject parameter = WrapIntoArray(parameters); SmartFox.Send(new ExtensionRequest(HandlerID.PlazaRoom.GetHashString(), parameter)); } public static SFSObject WrapIntoArray(List sfsObjects) { SFSObject obj = new SFSObject(); SFSArray sfsArray = new SFSArray(); foreach (var sfsObject in sfsObjects) { sfsArray.AddSFSObject(sfsObject); } obj.PutSFSArray(SFSLabel.DataArray, sfsArray); return obj; } }