GardenSmartFox.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Sfs2X;
  5. using Sfs2X.Core;
  6. using Sfs2X.Entities;
  7. using Sfs2X.Entities.Data;
  8. using Sfs2X.Requests;
  9. using UnityEngine;
  10. public enum BatchOption
  11. {
  12. Always,
  13. TryNot,
  14. }
  15. public enum RequestType
  16. {
  17. Batch,
  18. BatchAndOverride,
  19. Immediate,
  20. }
  21. public enum RequestStatus
  22. {
  23. Failed,
  24. Succeed,
  25. Pending,
  26. }
  27. public class GardenSmartFox
  28. {
  29. #region Variable
  30. public const string CommandArrayLabel = "A";
  31. public const string CommandLabel = "C";
  32. public const string ParameterLabel = "P";
  33. public const string TargetUserLabel = "U";
  34. public User User;
  35. public SmartFox SmartFox;
  36. public BaseLoggor Loggor;
  37. public BaseConnector Connector;
  38. public DatabaseManager DatabaseManager;
  39. public SFSExtensionManager ExtensionManager;
  40. public SFSPlazaRoomManager SFSPlazaRoomManager;
  41. public float RequestTime = 3f;
  42. public float RequestTimer = 0f;
  43. public List<SFSObject> BatchRequestList = new List<SFSObject>();
  44. public List<string> StaleRequests = new List<string>();
  45. public Dictionary<string, SFSObject> BatchAndOverrideRequestDictionary = new Dictionary<string, SFSObject>();
  46. #endregion
  47. public GardenSmartFox(BaseLoggor baseLoggor, BaseConnector baseConnector)
  48. {
  49. SmartFox = new SmartFox();
  50. Loggor = baseLoggor.Init(this);
  51. Connector = baseConnector.Init(this);
  52. ExtensionManager = new SFSExtensionManager(this);
  53. DatabaseManager = new DatabaseManager(this);
  54. SFSPlazaRoomManager = new SFSPlazaRoomManager(this);
  55. }
  56. public void ExecuteAfterCheckConection(Action execute, Action<bool, BaseEvent> onConnectResult = null, Action<bool, BaseEvent> onLoginResult = null)
  57. {
  58. if (!SmartFox.IsConnected)
  59. {
  60. Reset();
  61. Connector.Connect();
  62. if (onConnectResult != null)
  63. {
  64. new CounterAction<bool, BaseEvent>
  65. (
  66. (succeed, baseEvent) =>
  67. {
  68. onConnectResult.Invoke(succeed, baseEvent);
  69. }
  70. ).Bind(ref Connector.onConnectResult);
  71. }
  72. if (onLoginResult != null)
  73. {
  74. new CounterAction<bool, BaseEvent>
  75. (
  76. (succeed, baseEvent) =>
  77. {
  78. onLoginResult.Invoke(succeed, baseEvent);
  79. }
  80. ).Bind(ref Loggor.onLoginResult);
  81. }
  82. new CounterAction<BaseEvent>
  83. (
  84. baseEven =>
  85. {
  86. execute.Invoke();
  87. }
  88. ).Bind(ref Loggor.onLogin);
  89. }
  90. else
  91. {
  92. execute.Invoke();
  93. }
  94. }
  95. public void Reset()
  96. {
  97. SmartFox.RemoveAllEventListeners();
  98. SmartFox = new SmartFox();
  99. Loggor.Init(this);
  100. Connector.Init(this);
  101. ExtensionManager.Init(this);
  102. }
  103. public void ProcessRequest()
  104. {
  105. RequestTimer += Time.deltaTime;
  106. if (RequestTimer >= RequestTime)
  107. {
  108. RequestTimer = 0;
  109. StaleRequests = new List<string>();
  110. if (BatchRequestList.Count > 0 || BatchAndOverrideRequestDictionary.Count > 0)
  111. {
  112. BatchRequestList.AddRange(BatchAndOverrideRequestDictionary.Values.ToList());
  113. SendRequest(BatchRequestList);
  114. BatchRequestList = new List<SFSObject>();
  115. BatchAndOverrideRequestDictionary = new Dictionary<string, SFSObject>();
  116. }
  117. }
  118. }
  119. public void AddRequest(SFSObject sfsObject, RequestType requestType, string requestName = null, BatchOption batchOption = BatchOption.Always)
  120. {
  121. if (requestType == RequestType.Immediate)
  122. {
  123. SendRequest(sfsObject);
  124. //Debug.Log("Send request immediately");
  125. }
  126. else if (requestType == RequestType.Batch)
  127. {
  128. if (CheckBatchOption(sfsObject, requestName, batchOption))
  129. {
  130. return;
  131. }
  132. else
  133. {
  134. BatchRequestList.Add(sfsObject);
  135. }
  136. //Debug.Log("Add batch request");
  137. }
  138. else if (requestType == RequestType.BatchAndOverride)
  139. {
  140. //Debug.Log("Override batch request");
  141. if (CheckBatchOption(sfsObject, requestName, batchOption))
  142. {
  143. return;
  144. }
  145. else
  146. {
  147. if (BatchAndOverrideRequestDictionary.ContainsKey(requestName))
  148. {
  149. BatchAndOverrideRequestDictionary[requestName] = sfsObject;
  150. }
  151. else
  152. {
  153. BatchAndOverrideRequestDictionary.Add(requestName, sfsObject);
  154. }
  155. }
  156. }
  157. else
  158. {
  159. throw new Exception();
  160. }
  161. }
  162. public bool CheckBatchOption(SFSObject sfsObject, string requestName, BatchOption batchOption)
  163. {
  164. if (batchOption == BatchOption.Always)
  165. {
  166. return false;
  167. }
  168. else if (batchOption == BatchOption.TryNot)
  169. {
  170. if (!StaleRequests.Contains(requestName))
  171. {
  172. SendRequest(sfsObject);
  173. StaleRequests.Add(requestName);
  174. return true;
  175. }
  176. else
  177. {
  178. return false;
  179. }
  180. }
  181. else
  182. {
  183. throw new Exception();
  184. }
  185. }
  186. public void SendRequest(SFSObject parameter)
  187. {
  188. parameter = ConstructRequestParameter(new List<SFSObject>() { parameter });
  189. SmartFox.Send(new ExtensionRequest(RequestID.Command.GetHashCode().ToString(), parameter));
  190. }
  191. public void SendRequest(List<SFSObject> parameters)
  192. {
  193. SFSObject parameter = ConstructRequestParameter(parameters);
  194. SmartFox.Send(new ExtensionRequest(RequestID.Command.GetHashCode().ToString(), parameter));
  195. }
  196. public static SFSObject ConstructRequestParameter(List<SFSObject> sfsObjects)
  197. {
  198. SFSObject parameter = new SFSObject();
  199. SFSArray sfsArray = new SFSArray();
  200. foreach (var sfsObject in sfsObjects)
  201. {
  202. sfsArray.AddSFSObject(sfsObject);
  203. }
  204. parameter.PutSFSArray(CommandArrayLabel, sfsArray);
  205. return parameter;
  206. }
  207. public static SFSObject ConstructCommandParameter(int commandID, SFSObject sfsObject, int targetUserID)
  208. {
  209. SFSObject parameter = new SFSObject();
  210. parameter.PutInt("C", commandID);
  211. parameter.PutSFSObject("P", sfsObject);
  212. parameter.PutInt("U", targetUserID);
  213. parameter.PutSFSObject("P", sfsObject);
  214. return parameter;
  215. }
  216. }