您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

513 行
16 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. namespace SUISS.Cloud
  6. {
  7. public class MessageController : IMessageController
  8. {
  9. public MessageController(IPlayernameController playernames, string sparkSocGameId, int buildVersion)
  10. {
  11. this._playernames = playernames;
  12. this._sparkSocGameId = sparkSocGameId;
  13. this._buildVersion = buildVersion.ToString();
  14. }
  15. public CloudRequest<List<IReceivedMessage>, MessageErrors?> Inbox()
  16. {
  17. return new CloudRequest<List<IReceivedMessage>, MessageErrors?>(this.CoAccountInbox(string.Empty));
  18. }
  19. public CloudRequest<List<IReceivedMessage>, MessageErrors?> Inbox(string messageType)
  20. {
  21. return new CloudRequest<List<IReceivedMessage>, MessageErrors?>(this.CoAccountInbox(messageType));
  22. }
  23. public CloudRequest<MessageErrors?> MarkAsRead(IReceivedMessage message)
  24. {
  25. return new CloudRequest<MessageErrors?>(this.CoMarkAsRead(message));
  26. }
  27. public CloudRequest<MessageErrors?> SendMessage(Message message)
  28. {
  29. return new CloudRequest<MessageErrors?>(this.CoSendMessage(message));
  30. }
  31. public CloudRequest<MessageErrors?> UpdateMessage(IReceivedMessage message, IDictionary<string, object> updatedData)
  32. {
  33. return new CloudRequest<MessageErrors?>(this.CoUpdateMessage(message, updatedData));
  34. }
  35. public CloudRequest<IReceivedMessage, MessageErrors?> GetMessage(IReceivedMessage message)
  36. {
  37. return new CloudRequest<IReceivedMessage, MessageErrors?>(this.CoGetMessage(message));
  38. }
  39. public List<IReceivedMessage> AccountMessages
  40. {
  41. get
  42. {
  43. UnityEngine.Debug.LogWarning("TODO. MessageController.AccountMessages not yet done!");
  44. return new List<IReceivedMessage>();
  45. }
  46. private set
  47. {
  48. }
  49. }
  50. private IEnumerator CoUpdateMessage(IReceivedMessage message, IDictionary<string, object> updatedData)
  51. {
  52. if (this._playerAccessToken.HasExpired)
  53. {
  54. CloudRequest<IAccessToken, PlayernameErrors?> requestToken = this._playernames.RequestPlayerAccessToken("messages");
  55. yield return requestToken;
  56. if (requestToken.Result != null)
  57. {
  58. this._playerAccessToken = requestToken.Result;
  59. }
  60. else
  61. {
  62. PlayernameErrors value = requestToken.Error.Value;
  63. if (value != PlayernameErrors.NoInternet)
  64. {
  65. if (value != PlayernameErrors.LostValidRefreshToken)
  66. {
  67. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  68. }
  69. else
  70. {
  71. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.PlayernamesNotLoggedIn));
  72. }
  73. }
  74. else
  75. {
  76. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  77. }
  78. }
  79. }
  80. string url = string.Format("{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}", new object[]
  81. {
  82. "https://messages.sparklingsociety.net",
  83. this._playernames.PlayerUuid,
  84. this._playernames.InstallUuid,
  85. message.MessageUuid,
  86. this._playerAccessToken.Token
  87. });
  88. if (Json.Encode(updatedData) == null)
  89. {
  90. UnityEngine.Debug.LogError("IMessageController.UpdateMessage was called with invalid json!");
  91. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  92. }
  93. Dictionary<string, object> json = new Dictionary<string, object>
  94. {
  95. {
  96. "version",
  97. message.Version
  98. },
  99. {
  100. "data",
  101. updatedData
  102. },
  103. {
  104. "hash",
  105. MessageController.randomChars()
  106. }
  107. };
  108. ApiRequest request = ApiRequest.Post(url, json, this._buildVersion, this._sparkSocGameId);
  109. yield return request;
  110. if (request.Error != null)
  111. {
  112. if (request.Error.NoInternet)
  113. {
  114. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  115. }
  116. else if (request.Error.ServerError)
  117. {
  118. UnityEngine.Debug.LogError("Server error in MessageController: " + request.Error.Error);
  119. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  120. }
  121. else if (request.Error.ErrorCode == 807)
  122. {
  123. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.ConcurrencyError));
  124. }
  125. else
  126. {
  127. UnityEngine.Debug.LogWarning("Api call failed in FriendsController: " + request.Error.Error);
  128. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  129. }
  130. }
  131. yield break;
  132. }
  133. public IEnumerator CoGetMessage(IReceivedMessage message)
  134. {
  135. if (this._playerAccessToken.HasExpired)
  136. {
  137. CloudRequest<IAccessToken, PlayernameErrors?> requestToken = this._playernames.RequestPlayerAccessToken("messages");
  138. yield return requestToken;
  139. if (requestToken.Result != null)
  140. {
  141. this._playerAccessToken = requestToken.Result;
  142. }
  143. else
  144. {
  145. PlayernameErrors value = requestToken.Error.Value;
  146. if (value != PlayernameErrors.NoInternet)
  147. {
  148. if (value != PlayernameErrors.LostValidRefreshToken)
  149. {
  150. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  151. }
  152. else
  153. {
  154. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.PlayernamesNotLoggedIn));
  155. }
  156. }
  157. else
  158. {
  159. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  160. }
  161. }
  162. }
  163. string url = string.Format("{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}", new object[]
  164. {
  165. "https://messages.sparklingsociety.net",
  166. this._playernames.PlayerUuid,
  167. this._playernames.InstallUuid,
  168. message.MessageUuid,
  169. this._playerAccessToken.Token
  170. });
  171. ApiRequest request = ApiRequest.Get(url, this._buildVersion, this._sparkSocGameId);
  172. yield return request;
  173. if (request.Result != null)
  174. {
  175. bool validJson = false;
  176. object json = Json.Decode(request.Result.Data.ToString(), ref validJson);
  177. if (validJson)
  178. {
  179. ReceivedMessage updatedMessage = ReceivedMessage.FromJson(json);
  180. if (updatedMessage != null)
  181. {
  182. yield return new YieldResult<IReceivedMessage>(updatedMessage);
  183. }
  184. else
  185. {
  186. UnityEngine.Debug.LogError(string.Format("Api call {0} return unexpected json!", "{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}"));
  187. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  188. }
  189. }
  190. else
  191. {
  192. UnityEngine.Debug.LogError(string.Format("Api call {0} return unexpected json!", "{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}"));
  193. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  194. }
  195. }
  196. else if (request.Error.NoInternet)
  197. {
  198. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  199. }
  200. else if (request.Error.ServerError)
  201. {
  202. UnityEngine.Debug.LogError("Server error in MessageController: " + request.Error.Error);
  203. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  204. }
  205. else
  206. {
  207. UnityEngine.Debug.LogWarning("Api call failed in FriendsController: " + request.Error.Error);
  208. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  209. }
  210. yield break;
  211. }
  212. private IEnumerator CoAccountInbox(string messageType = "")
  213. {
  214. if (this._playerAccessToken.HasExpired)
  215. {
  216. CloudRequest<IAccessToken, PlayernameErrors?> requestToken = this._playernames.RequestPlayerAccessToken("messages");
  217. yield return requestToken;
  218. if (requestToken.Result != null)
  219. {
  220. this._playerAccessToken = requestToken.Result;
  221. }
  222. else
  223. {
  224. PlayernameErrors value = requestToken.Error.Value;
  225. if (value != PlayernameErrors.NoInternet)
  226. {
  227. if (value != PlayernameErrors.LostValidRefreshToken)
  228. {
  229. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  230. }
  231. else
  232. {
  233. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.PlayernamesNotLoggedIn));
  234. }
  235. }
  236. else
  237. {
  238. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  239. }
  240. }
  241. }
  242. string url = string.Format("{0}/messages/inbox/{1}/player/{2}?access_token={3}", new object[]
  243. {
  244. "https://messages.sparklingsociety.net",
  245. this._playernames.InstallUuid,
  246. this._playernames.PlayerUuid,
  247. this._playerAccessToken.Token
  248. });
  249. if (!string.IsNullOrEmpty(messageType))
  250. {
  251. url = string.Format("{0}/messages/inbox/{1}/player/{2}/tag/{3}?access_token={4}", new object[]
  252. {
  253. "https://messages.sparklingsociety.net",
  254. this._playernames.InstallUuid,
  255. this._playernames.PlayerUuid,
  256. messageType,
  257. this._playerAccessToken.Token
  258. });
  259. }
  260. ApiRequest request = ApiRequest.Get(url, this._buildVersion, this._sparkSocGameId);
  261. yield return request;
  262. if (request.Result != null)
  263. {
  264. bool validJson = false;
  265. object json = Json.Decode(request.Result.Data.ToString(), ref validJson);
  266. if (validJson && json is Dictionary<string, object>)
  267. {
  268. Dictionary<string, object> jsonDict = (Dictionary<string, object>)json;
  269. if (jsonDict.ContainsKey("playerMessages"))
  270. {
  271. List<IReceivedMessage> messages = this.MessagesFromJson(jsonDict["playerMessages"]);
  272. if (messages != null)
  273. {
  274. yield return new YieldResult<List<IReceivedMessage>>(messages);
  275. }
  276. }
  277. }
  278. UnityEngine.Debug.LogError(string.Format("Api call {0} return unexpected json!", "{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}"));
  279. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  280. }
  281. else if (request.Error.NoInternet)
  282. {
  283. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  284. }
  285. else
  286. {
  287. if (request.Error.ServerError)
  288. {
  289. UnityEngine.Debug.LogError("Server error in MessageController: " + request.Error.Error);
  290. }
  291. else
  292. {
  293. UnityEngine.Debug.LogWarning("Api call failed in FriendsController: " + request.Error.Error);
  294. }
  295. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  296. }
  297. yield break;
  298. }
  299. private IEnumerator CoMarkAsRead(IReceivedMessage message)
  300. {
  301. if (this._playerAccessToken.HasExpired)
  302. {
  303. CloudRequest<IAccessToken, PlayernameErrors?> requestToken = this._playernames.RequestPlayerAccessToken("messages");
  304. yield return requestToken;
  305. if (requestToken.Result != null)
  306. {
  307. this._playerAccessToken = requestToken.Result;
  308. }
  309. else
  310. {
  311. PlayernameErrors value = requestToken.Error.Value;
  312. if (value != PlayernameErrors.NoInternet)
  313. {
  314. if (value != PlayernameErrors.LostValidRefreshToken)
  315. {
  316. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  317. }
  318. else
  319. {
  320. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.PlayernamesNotLoggedIn));
  321. }
  322. }
  323. else
  324. {
  325. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  326. }
  327. }
  328. }
  329. string url = string.Format("{0}/messages/read/{1}/player/{2}?access_token={3}", new object[]
  330. {
  331. "https://messages.sparklingsociety.net",
  332. this._playernames.InstallUuid,
  333. this._playernames.PlayerUuid,
  334. this._playerAccessToken.Token
  335. });
  336. Dictionary<string, object> json = new Dictionary<string, object>
  337. {
  338. {
  339. "messageUuid",
  340. message.MessageUuid
  341. }
  342. };
  343. ApiRequest request = ApiRequest.Post(url, json, this._buildVersion, this._sparkSocGameId);
  344. yield return request;
  345. if (request.Error != null)
  346. {
  347. if (request.Error.NoInternet)
  348. {
  349. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  350. }
  351. else
  352. {
  353. if (request.Error.ServerError)
  354. {
  355. UnityEngine.Debug.LogError("Server error in MessageController: " + request.Error.Error);
  356. }
  357. else
  358. {
  359. UnityEngine.Debug.LogWarning("Api call failed in FriendsController: " + request.Error.Error);
  360. }
  361. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  362. }
  363. }
  364. yield break;
  365. }
  366. private IEnumerator CoSendMessage(Message message)
  367. {
  368. if (this._playerAccessToken.HasExpired)
  369. {
  370. CloudRequest<IAccessToken, PlayernameErrors?> requestToken = this._playernames.RequestPlayerAccessToken("messages");
  371. yield return requestToken;
  372. if (requestToken.Result != null)
  373. {
  374. this._playerAccessToken = requestToken.Result;
  375. }
  376. else
  377. {
  378. PlayernameErrors value = requestToken.Error.Value;
  379. if (value != PlayernameErrors.NoInternet)
  380. {
  381. if (value != PlayernameErrors.LostValidRefreshToken)
  382. {
  383. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  384. }
  385. else
  386. {
  387. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.PlayernamesNotLoggedIn));
  388. }
  389. }
  390. else
  391. {
  392. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  393. }
  394. }
  395. }
  396. string url = string.Format("{0}/messages/send?access_token={1}", "https://messages.sparklingsociety.net", this._playerAccessToken.Token);
  397. Dictionary<string, object> json = new Dictionary<string, object>
  398. {
  399. {
  400. "data",
  401. message.Data
  402. },
  403. {
  404. "fromAccountUuid",
  405. this._playernames.PlayerUuid
  406. },
  407. {
  408. "fromInstallUuid",
  409. this._playernames.InstallUuid
  410. },
  411. {
  412. "toAccountUuid",
  413. message.ToAccountUuid
  414. },
  415. {
  416. "messageType",
  417. message.MessageType
  418. }
  419. };
  420. ApiRequest request = ApiRequest.Post(url, json, this._buildVersion, this._sparkSocGameId);
  421. yield return request;
  422. if (request.Error != null)
  423. {
  424. if (request.Error.NoInternet)
  425. {
  426. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.NoInternet));
  427. }
  428. else
  429. {
  430. if (request.Error.ServerError)
  431. {
  432. UnityEngine.Debug.LogError("Server error in MessageController: " + request.Error.Error);
  433. }
  434. else
  435. {
  436. UnityEngine.Debug.LogWarning("Api call failed in MessageController: " + request.Error.Error);
  437. }
  438. yield return new YieldError<MessageErrors?>(new MessageErrors?(MessageErrors.GeneralError));
  439. }
  440. }
  441. yield break;
  442. }
  443. private static string randomChars()
  444. {
  445. string text = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  446. char[] array = new char[8];
  447. System.Random random = new System.Random();
  448. for (int i = 0; i < array.Length; i++)
  449. {
  450. array[i] = text[random.Next(text.Length)];
  451. }
  452. return new string(array);
  453. }
  454. private List<IReceivedMessage> MessagesFromJson(object json)
  455. {
  456. List<object> list = json as List<object>;
  457. if (list != null)
  458. {
  459. List<IReceivedMessage> list2 = new List<IReceivedMessage>();
  460. foreach (object json2 in list)
  461. {
  462. ReceivedMessage receivedMessage = ReceivedMessage.FromJson(json2);
  463. if (receivedMessage != null)
  464. {
  465. list2.Add(receivedMessage);
  466. }
  467. }
  468. return list2;
  469. }
  470. return null;
  471. }
  472. private const string MessageResourceName = "messages";
  473. private const string AccountInboxCall = "{0}/messages/inbox/{1}/player/{2}?access_token={3}";
  474. private const string MarkAsReadCall = "{0}/messages/read/{1}/player/{2}?access_token={3}";
  475. private const string SendMessageCall = "{0}/messages/send?access_token={1}";
  476. private const string UpdateMessageCall = "{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}";
  477. private const string GetMessageCall = "{0}/messages/player/{1}/install/{2}/message/{3}?access_token={4}";
  478. private const string AccountInboxCallWithTag = "{0}/messages/inbox/{1}/player/{2}/tag/{3}?access_token={4}";
  479. private const string ServerUrl = "https://messages.sparklingsociety.net";
  480. private IPlayernameController _playernames;
  481. private string _sparkSocGameId;
  482. private string _buildVersion;
  483. private IAccessToken _playerAccessToken = new AccessToken();
  484. }
  485. }