Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

766 строки
21 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using SUISS.Cloud.Extensions;
  6. using UnityEngine;
  7. namespace SUISS.Cloud
  8. {
  9. public class FriendsController : IFriendsController
  10. {
  11. public FriendsController(IPlayernameController playernameController, Dictionary<string, object> storage)
  12. {
  13. this._playernameController = playernameController;
  14. this._storage = storage;
  15. }
  16. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  17. public event Action<IList<IFriend>> NewFriendEvent;
  18. private void FireNewFriendEvent(IList<IFriend> newFriends)
  19. {
  20. if (this.NewFriendEvent != null)
  21. {
  22. this.NewFriendEvent(newFriends);
  23. }
  24. }
  25. //[DebuggerBrowsable(DebuggerBrowsableState.Never)]
  26. public event Action<IList<IFriend>> NewInviteEvent;
  27. private void FireNewInviteEvent(IList<IFriend> newInvites)
  28. {
  29. if (this.NewInviteEvent != null)
  30. {
  31. this.NewInviteEvent(newInvites);
  32. }
  33. }
  34. public void StartUpdateLoop(Func<IDictionary<string, object>> getInfo)
  35. {
  36. }
  37. public CloudRequest<FriendErrors?> UpdateInfo(IDictionary<string, object> info)
  38. {
  39. if (Json.Encode(info) == null)
  40. {
  41. throw new Exception("UpdateInfo(IDictionary<string, object> info): info is not valid json.");
  42. }
  43. if (!string.IsNullOrEmpty(this._playernameController.PlayerName) && !string.IsNullOrEmpty(this._playernameController.PlayerName))
  44. {
  45. return new CloudRequest<FriendErrors?>(this.CoUpdateInfo(info));
  46. }
  47. UnityEngine.Debug.LogWarning("Unable to update friend data! PlayernameController is not loged in yet.");
  48. return null;
  49. }
  50. public CloudRequest<FriendErrors?> Invite(string friendName)
  51. {
  52. return new CloudRequest<FriendErrors?>(this.CoInvite(friendName));
  53. }
  54. public CloudRequest<FriendErrors?> Unblock(string friendName)
  55. {
  56. return new CloudRequest<FriendErrors?>(this.CoUnblock(friendName));
  57. }
  58. public CloudRequest<FriendErrors?> RefreshLists()
  59. {
  60. return new CloudRequest<FriendErrors?>(this.CoRefreshLists());
  61. }
  62. public CloudRequest<FriendErrors?> Accept(IFriend friend)
  63. {
  64. return new CloudRequest<FriendErrors?>(this.CoAccept(friend));
  65. }
  66. public CloudRequest<FriendErrors?> Block(IFriend friend)
  67. {
  68. return new CloudRequest<FriendErrors?>(this.CoBlock(friend));
  69. }
  70. public CloudRequest<FriendErrors?> RemoveInvite(IFriend friend)
  71. {
  72. return new CloudRequest<FriendErrors?>(this.CoRemoveInvite(friend));
  73. }
  74. public CloudRequest<FriendErrors?> RemoveAllInvites()
  75. {
  76. return new CloudRequest<FriendErrors?>(this.CoRemoveAllInvites());
  77. }
  78. public IEnumerable<string> BlockedPlayernames
  79. {
  80. get
  81. {
  82. foreach (object obj in this.blocked)
  83. {
  84. yield return (string)obj;
  85. }
  86. yield break;
  87. }
  88. }
  89. public IEnumerable<IFriend> Invites
  90. {
  91. get
  92. {
  93. foreach (object obj in this.invites)
  94. {
  95. yield return (IFriend)obj;
  96. }
  97. yield break;
  98. }
  99. }
  100. public IEnumerable<string> KnownFriends
  101. {
  102. get
  103. {
  104. foreach (object obj in this.readInvites)
  105. {
  106. yield return (string)obj;
  107. }
  108. yield break;
  109. }
  110. }
  111. public void MarkFriendKnown(string friendName)
  112. {
  113. this.readInvites.Add(friendName);
  114. }
  115. public void UnmarkFriendKnown(string friendName)
  116. {
  117. this.readInvites.Remove(friendName);
  118. }
  119. public IEnumerable<IFriend> Friends
  120. {
  121. get
  122. {
  123. foreach (object obj in this.friends)
  124. {
  125. yield return (IFriend)obj;
  126. }
  127. yield break;
  128. }
  129. }
  130. public IEnumerable<string> Invited
  131. {
  132. get
  133. {
  134. foreach (object obj in this.invited)
  135. {
  136. yield return (string)obj;
  137. }
  138. yield break;
  139. }
  140. }
  141. private Dictionary<string, object> PlayerStorage
  142. {
  143. get
  144. {
  145. if (!this._storage.ContainsKey(this._playernameController.PlayerUuid) || !(this._storage[this._playernameController.PlayerUuid] is Dictionary<string, object>))
  146. {
  147. this._storage.Add(this._playernameController.PlayerUuid, new Dictionary<string, object>());
  148. }
  149. return (Dictionary<string, object>)this._storage[this._playernameController.PlayerUuid];
  150. }
  151. }
  152. private List<object> invites
  153. {
  154. get
  155. {
  156. if (!this.PlayerStorage.ContainsKey("invites") || !(this.PlayerStorage["invites"] is List<object>))
  157. {
  158. this.PlayerStorage["invites"] = new List<object>();
  159. }
  160. return (List<object>)this.PlayerStorage["invites"];
  161. }
  162. set
  163. {
  164. this.PlayerStorage["invites"] = value;
  165. }
  166. }
  167. private List<object> readInvites
  168. {
  169. get
  170. {
  171. if (!this.PlayerStorage.ContainsKey("readInvites") || !(this.PlayerStorage["readInvites"] is List<object>))
  172. {
  173. this.PlayerStorage["readInvites"] = new List<object>();
  174. }
  175. return (List<object>)this.PlayerStorage["readInvites"];
  176. }
  177. set
  178. {
  179. this.PlayerStorage["readInvites"] = value;
  180. }
  181. }
  182. private DateTime LastUpdated
  183. {
  184. get
  185. {
  186. if (!this.PlayerStorage.ContainsKey("lastUpdated") || !(this.PlayerStorage["lastUpdated"] is long))
  187. {
  188. this.PlayerStorage["lastUpdated"] = 0;
  189. }
  190. return new DateTime((long)this.PlayerStorage["lastUpdated"]);
  191. }
  192. }
  193. private List<object> friends
  194. {
  195. get
  196. {
  197. if (!this.PlayerStorage.ContainsKey("friends") || !(this.PlayerStorage["friends"] is List<object>))
  198. {
  199. this.PlayerStorage["friends"] = new List<object>();
  200. }
  201. return (List<object>)this.PlayerStorage["friends"];
  202. }
  203. set
  204. {
  205. this.PlayerStorage["friends"] = value;
  206. }
  207. }
  208. private List<object> blocked
  209. {
  210. get
  211. {
  212. if (!this.PlayerStorage.ContainsKey("blocked") || !(this.PlayerStorage["blocked"] is List<object>))
  213. {
  214. this.PlayerStorage.Add("blocked", new List<object>());
  215. }
  216. return (List<object>)this.PlayerStorage["blocked"];
  217. }
  218. set
  219. {
  220. this.PlayerStorage["blocked"] = value;
  221. }
  222. }
  223. private List<object> invited
  224. {
  225. get
  226. {
  227. if (!this.PlayerStorage.ContainsKey("invited") || !(this.PlayerStorage["invited"] is List<object>))
  228. {
  229. this.PlayerStorage.Add("invited", new List<object>());
  230. }
  231. return (List<object>)this.PlayerStorage["invited"];
  232. }
  233. set
  234. {
  235. this.PlayerStorage["invited"] = value;
  236. }
  237. }
  238. private CloudRequest<FriendErrors?> GetAccessToken()
  239. {
  240. return new CloudRequest<FriendErrors?>(this.CoGetAccessToken());
  241. }
  242. private IEnumerator CoGetAccessToken()
  243. {
  244. if (this._accessToken.HasExpired)
  245. {
  246. CloudRequest<IAccessToken, PlayernameErrors?> login = this._playernameController.RequestPlayerAccessToken("friends");
  247. yield return login;
  248. if (login.Result != null && !login.Result.HasExpired)
  249. {
  250. this._accessToken = login.Result;
  251. }
  252. else
  253. {
  254. PlayernameErrors value = login.Error.Value;
  255. if (value != PlayernameErrors.NoInternet)
  256. {
  257. if (value != PlayernameErrors.LostValidRefreshToken)
  258. {
  259. yield return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.GeneralError));
  260. }
  261. else
  262. {
  263. yield return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.LostRefreshToken));
  264. }
  265. }
  266. else
  267. {
  268. yield return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.NoInternet));
  269. }
  270. }
  271. }
  272. yield break;
  273. }
  274. private IEnumerator CoRemoveInvite(IFriend friend)
  275. {
  276. if (this._accessToken.HasExpired)
  277. {
  278. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  279. yield return login;
  280. if (login.Error != null)
  281. {
  282. yield return new YieldError<FriendErrors?>(login.Error);
  283. }
  284. }
  285. string url = string.Format("{0}/friends/{1}/clear?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  286. Dictionary<string, object> json = new Dictionary<string, object>
  287. {
  288. {
  289. "friendName",
  290. friend.FriendName
  291. }
  292. };
  293. ApiRequest request = ApiRequest.Post(url, json);
  294. yield return request;
  295. if (request.Error != null)
  296. {
  297. yield return this.FriendError(request.Error);
  298. }
  299. this.invited.Remove(friend.FriendName);
  300. yield break;
  301. }
  302. private IEnumerator CoRemoveAllInvites()
  303. {
  304. if (this._accessToken.HasExpired)
  305. {
  306. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  307. yield return login;
  308. if (login.Error != null)
  309. {
  310. yield return new YieldError<FriendErrors?>(login.Error);
  311. }
  312. }
  313. string url = string.Format("{0}/friends/{1}/requests/delete?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  314. ApiRequest request = ApiRequest.Get(url);
  315. yield return request;
  316. if (request.Error != null)
  317. {
  318. yield return this.FriendError(request.Error);
  319. }
  320. this.invited.Clear();
  321. yield break;
  322. }
  323. private IEnumerator CoUpdateInfo(IDictionary<string, object> json)
  324. {
  325. if (this._accessToken.HasExpired)
  326. {
  327. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  328. yield return login;
  329. if (login.Error != null)
  330. {
  331. yield return new YieldError<FriendErrors?>(login.Error);
  332. }
  333. }
  334. Dictionary<string, object> data = new Dictionary<string, object>
  335. {
  336. {
  337. "data",
  338. json
  339. },
  340. {
  341. "playername",
  342. this._playernameController.PlayerName
  343. }
  344. };
  345. string url = string.Format("{0}/friends/{1}?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  346. ApiRequest request = ApiRequest.Post(url, data);
  347. yield return request;
  348. if (request.Error != null)
  349. {
  350. yield return this.FriendError(request.Error);
  351. }
  352. yield break;
  353. }
  354. private IEnumerator CoInvite(string friendName)
  355. {
  356. if (this._accessToken.HasExpired)
  357. {
  358. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  359. yield return login;
  360. if (login.Error != null)
  361. {
  362. yield return new YieldError<FriendErrors?>(login.Error);
  363. }
  364. }
  365. string url = string.Format("{0}/friends/{1}/invite?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  366. Dictionary<string, object> json = new Dictionary<string, object>
  367. {
  368. {
  369. "friendName",
  370. friendName
  371. }
  372. };
  373. ApiRequest request = ApiRequest.Post(url, json);
  374. yield return request;
  375. if (request.Error != null)
  376. {
  377. yield return this.FriendError(request.Error);
  378. }
  379. this.invited.Add(friendName);
  380. yield break;
  381. }
  382. private IEnumerator CoUnblock(string friendName)
  383. {
  384. if (this._accessToken.HasExpired)
  385. {
  386. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  387. yield return login;
  388. if (login.Error != null)
  389. {
  390. yield return new YieldError<FriendErrors?>(login.Error);
  391. }
  392. }
  393. string url = string.Format("{0}/friends/{1}/unblock?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  394. Dictionary<string, object> json = new Dictionary<string, object>
  395. {
  396. {
  397. "friendName",
  398. friendName
  399. }
  400. };
  401. ApiRequest request = ApiRequest.Post(url, json);
  402. yield return request;
  403. if (request.Error != null)
  404. {
  405. yield return this.FriendError(request.Error);
  406. }
  407. this.blocked.Remove(friendName);
  408. yield break;
  409. }
  410. private IEnumerator CoAccept(IFriend friend)
  411. {
  412. if (this._accessToken.HasExpired)
  413. {
  414. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  415. yield return login;
  416. if (login.Error != null)
  417. {
  418. yield return new YieldError<FriendErrors?>(login.Error);
  419. }
  420. }
  421. string url = string.Format("{0}/friends/{1}/accept?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  422. Dictionary<string, object> json = new Dictionary<string, object>
  423. {
  424. {
  425. "friendName",
  426. friend.FriendName
  427. }
  428. };
  429. ApiRequest request = ApiRequest.Post(url, json);
  430. yield return request;
  431. if (request.Error != null)
  432. {
  433. yield return this.FriendError(request.Error);
  434. }
  435. this.friends.Add(friend);
  436. this.invites.Remove(this.invites.Find((object f) => ((IFriend)f).AccountUuid == friend.AccountUuid));
  437. yield break;
  438. }
  439. private IEnumerator CoBlock(IFriend friend)
  440. {
  441. if (this._accessToken.HasExpired)
  442. {
  443. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  444. yield return login;
  445. if (login.Error != null)
  446. {
  447. yield return new YieldError<FriendErrors?>(login.Error);
  448. }
  449. }
  450. string url = string.Format("{0}/friends/{1}/block?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token);
  451. Dictionary<string, object> json = new Dictionary<string, object>
  452. {
  453. {
  454. "friendName",
  455. friend.FriendName
  456. }
  457. };
  458. ApiRequest request = ApiRequest.Post(url, json);
  459. yield return request;
  460. if (request.Error != null)
  461. {
  462. yield return this.FriendError(request.Error);
  463. }
  464. this.blocked.Add(friend.FriendName);
  465. yield break;
  466. }
  467. private IEnumerator CoRefreshLists()
  468. {
  469. if (this._accessToken.HasExpired)
  470. {
  471. CloudRequest<FriendErrors?> login = this.GetAccessToken();
  472. yield return login;
  473. if (login.Error != null)
  474. {
  475. yield return new YieldError<FriendErrors?>(login.Error);
  476. }
  477. }
  478. ApiRequest friendsRequest = ApiRequest.Get(string.Format("{0}/friends/{1}?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token));
  479. yield return friendsRequest;
  480. if (friendsRequest.Result != null)
  481. {
  482. bool validJson = false;
  483. object json = Json.Decode(friendsRequest.Result.Data.ToString(), ref validJson);
  484. if (validJson)
  485. {
  486. List<Friend> list = this.FriendsFromJson(json, "friends");
  487. if (list != null)
  488. {
  489. List<IFriend> list2 = this.FindNew(this.TypedList<Friend>(this.friends), list);
  490. this.friends = this.ObjectList<Friend>(list);
  491. if (list2.Count > 0)
  492. {
  493. this.FireNewFriendEvent(list2);
  494. }
  495. }
  496. }
  497. else
  498. {
  499. UnityEngine.Debug.LogError(string.Format("Api call {0} return unexpected json!", "{0}/friends/{1}?access_token={2}"));
  500. yield return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.GeneralError));
  501. }
  502. }
  503. else
  504. {
  505. yield return this.FriendError(friendsRequest.Error);
  506. }
  507. ApiRequest invitesRequest = ApiRequest.Get(string.Format("{0}/friends/{1}/requests?access_token={2}", "https://friends.sparklingsociety.net", this._playernameController.PlayerUuid, this._accessToken.Token));
  508. yield return invitesRequest;
  509. if (invitesRequest.Result != null)
  510. {
  511. bool validJson2 = false;
  512. object json2 = Json.Decode(invitesRequest.Result.Data.ToString(), ref validJson2);
  513. if (validJson2)
  514. {
  515. List<Friend> list3 = this.FriendsFromJson(json2, "requests");
  516. if (list3 != null)
  517. {
  518. List<IFriend> list4 = this.FindNew(this.TypedList<Friend>(this.invites), list3);
  519. this.invites = this.ObjectList<Friend>(list3);
  520. if (list4.Count > 0)
  521. {
  522. this.FireNewInviteEvent(list4);
  523. }
  524. }
  525. }
  526. else
  527. {
  528. UnityEngine.Debug.LogError(string.Format("Api call {0} return unexpected json!", "{0}/friends/{1}/requests?access_token={2}"));
  529. yield return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.GeneralError));
  530. }
  531. }
  532. else
  533. {
  534. yield return this.FriendError(invitesRequest.Error);
  535. }
  536. yield break;
  537. }
  538. private YieldError<FriendErrors?> FriendError(ApiError error)
  539. {
  540. if (error.NoInternet)
  541. {
  542. return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.NoInternet));
  543. }
  544. if (error.ServerError)
  545. {
  546. UnityEngine.Debug.LogError("Server error in FriendsController: " + error.Error);
  547. }
  548. UnityEngine.Debug.LogWarning("Api call failed in FriendsController: " + error.Error);
  549. return new YieldError<FriendErrors?>(new FriendErrors?(FriendErrors.GeneralError));
  550. }
  551. private List<IFriend> FindNew(List<Friend> oldFriends, List<Friend> friends)
  552. {
  553. List<IFriend> list = new List<IFriend>();
  554. if (friends.Count > oldFriends.Count)
  555. {
  556. List<string> list2 = new List<string>();
  557. foreach (Friend friend in oldFriends)
  558. {
  559. list2.Add(friend.AccountUuid);
  560. }
  561. foreach (Friend friend2 in friends)
  562. {
  563. if (!list2.Contains(friend2.AccountUuid))
  564. {
  565. list.Add(friend2);
  566. }
  567. }
  568. }
  569. return list;
  570. }
  571. private List<object> ObjectList<T>(List<T> tl)
  572. {
  573. List<object> list = new List<object>();
  574. foreach (T t in tl)
  575. {
  576. list.Add(t);
  577. }
  578. return list;
  579. }
  580. private List<T> TypedList<T>(List<object> ol)
  581. {
  582. List<T> list = new List<T>();
  583. foreach (object obj in ol)
  584. {
  585. list.Add((T)((object)obj));
  586. }
  587. return list;
  588. }
  589. private Friend FriendFromJson(object jsonValue)
  590. {
  591. if (jsonValue is Dictionary<string, object>)
  592. {
  593. Dictionary<string, object> dictionary = (Dictionary<string, object>)jsonValue;
  594. string @string = dictionary.GetString("accountUuid", string.Empty);
  595. string string2 = dictionary.GetString("playerName", string.Empty);
  596. IDictionary<string, GameInfo> games = this.GameInfoListFromJson(dictionary.Get("data", new Dictionary<string, object>()));
  597. if (!string.IsNullOrEmpty(@string))
  598. {
  599. return new Friend(@string, string2, games);
  600. }
  601. }
  602. return null;
  603. }
  604. private IDictionary<string, GameInfo> GameInfoListFromJson(object jsonValue)
  605. {
  606. Dictionary<string, GameInfo> dictionary = new Dictionary<string, GameInfo>();
  607. if (jsonValue is Dictionary<string, object>)
  608. {
  609. Dictionary<string, object> dictionary2 = (Dictionary<string, object>)jsonValue;
  610. foreach (KeyValuePair<string, object> keyValuePair in dictionary2)
  611. {
  612. GameInfo gameInfo = this.GameInfoFromJson(keyValuePair.Value);
  613. if (gameInfo != null)
  614. {
  615. dictionary.Add(keyValuePair.Key, gameInfo);
  616. }
  617. }
  618. }
  619. return dictionary;
  620. }
  621. private GameInfo GameInfoFromJson(object jsonValue)
  622. {
  623. if (jsonValue is Dictionary<string, object>)
  624. {
  625. Dictionary<string, object> dictionary = (Dictionary<string, object>)jsonValue;
  626. string @string = dictionary.GetString("gameName", string.Empty);
  627. IDictionary<string, object> data = (IDictionary<string, object>)dictionary.Get("gameData", new Dictionary<string, object>());
  628. return new GameInfo(@string, data);
  629. }
  630. return null;
  631. }
  632. private List<Friend> FriendsFromJson(object json, string listName)
  633. {
  634. if (json is Dictionary<string, object>)
  635. {
  636. Dictionary<string, object> dictionary = (Dictionary<string, object>)json;
  637. if (dictionary.ContainsKey(listName) && dictionary[listName] is List<object>)
  638. {
  639. List<Friend> list = new List<Friend>();
  640. foreach (object jsonValue in ((List<object>)dictionary[listName]))
  641. {
  642. Friend friend = this.FriendFromJson(jsonValue);
  643. if (friend != null)
  644. {
  645. list.Add(friend);
  646. }
  647. }
  648. return list;
  649. }
  650. }
  651. return null;
  652. }
  653. private List<string> FriendNameFromJson(object json, string listName)
  654. {
  655. if (json is Dictionary<string, object>)
  656. {
  657. Dictionary<string, object> dictionary = (Dictionary<string, object>)json;
  658. if (dictionary.ContainsKey(listName) && dictionary[listName] is List<object>)
  659. {
  660. List<string> list = new List<string>();
  661. foreach (object obj in ((List<object>)dictionary[listName]))
  662. {
  663. if (obj is string)
  664. {
  665. list.Add((string)obj);
  666. }
  667. }
  668. return list;
  669. }
  670. }
  671. return null;
  672. }
  673. private const string FriendResourceName = "friends";
  674. private const string UpdateInfoCall = "{0}/friends/{1}?access_token={2}";
  675. private const string InviteCall = "{0}/friends/{1}/invite?access_token={2}";
  676. private const string AcceptCall = "{0}/friends/{1}/accept?access_token={2}";
  677. private const string BlockCall = "{0}/friends/{1}/block?access_token={2}";
  678. private const string UnblockCall = "{0}/friends/{1}/unblock?access_token={2}";
  679. private const string FriendsCall = "{0}/friends/{1}?access_token={2}";
  680. private const string InvitesCall = "{0}/friends/{1}/requests?access_token={2}";
  681. private const string BlockedCall = "{0}/friends/{1}/blocked?access_token={2}";
  682. private const string InvitedCall = "{0}/friends/{1}/invited?access_token={2}";
  683. private const string RemoveInviteCall = "{0}/friends/{1}/clear?access_token={2}";
  684. private const string RemoveAllInvitesCall = "{0}/friends/{1}/requests/delete?access_token={2}";
  685. private const string ServerUrl = "https://friends.sparklingsociety.net";
  686. private const string FriendsKey = "friends";
  687. private const string InvitesKey = "invites";
  688. private const string ReadInvitesKey = "readInvites";
  689. private const string BlockedKey = "blocked";
  690. private const string LastUpdatedKey = "lastUpdated";
  691. private const string InvitedKey = "invited";
  692. private IAccessToken _accessToken = new AccessToken();
  693. private IPlayernameController _playernameController;
  694. private Dictionary<string, object> _storage;
  695. }
  696. }