FriendPanel.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Xml;
  5. using Sfs2X.Util;
  6. using UnityEngine;
  7. using UnityEngine.UI;
  8. public class FriendPanel : Regist
  9. {
  10. #region Config
  11. public static Text NicknameTitle;
  12. public static Text ContentTitle;
  13. public static Text CloseButtonTitle;
  14. public static Text ApplicantTitle;
  15. public static Text PanelTitle;
  16. public static Text AcceptAllButtonTitle;
  17. public static Text AddFriendTitle;
  18. public static Text FriendAmountText;
  19. public static Image NewApplicantFlagImage;
  20. public static Button OpenPanelButton;
  21. public static Button AcceptAllButton;
  22. public static Button AddFriendButton;
  23. public static Button CloseButton;
  24. public static Toggle ApplicantButton;
  25. public static Transform OpenPanelButtonParent;
  26. public static Transform FriendGrid;
  27. public static Transform ApplicantGrid;
  28. public static Transform FriendPanelParentMask;
  29. public static Transform FriendPanelMask;
  30. public static CanvasGroup PanelParentCanvasGroup;
  31. public static VirtualScrollRectPlus FriendScrollRect;
  32. public static VirtualScrollRectPlus ApplicantScrollRect;
  33. private static float RefreshApplicantTime = 15f;
  34. private static float RefreshApplicantTimer = RefreshApplicantTime;
  35. private static List<ApplicantItem> ApplicantItems = new List<ApplicantItem>();
  36. public static List<AccountData> ApplicantAccountDatas = new List<AccountData>();
  37. public static int MaxFriend
  38. {
  39. get { return maxFriend; }
  40. set
  41. {
  42. maxFriend = value;
  43. UpdateFriendAmountText();
  44. }
  45. }
  46. public static int maxFriend = 25;
  47. private static float RefreshFriendTime = 15f;
  48. private static float RefreshFriendTimer;
  49. public static List<FriendItem> FriendItems = new List<FriendItem>();
  50. public static List<AccountData> FriendAccountDatas = new List<AccountData>();
  51. private static float RefreshPrivateMessageTime = 15f;
  52. private static float RefreshPrivateMessageTimer;
  53. public static bool HaveNewApplicant;
  54. public static bool HaveNewPrivateMessage
  55. {
  56. get
  57. {
  58. foreach (var friendItem in FriendItems)
  59. {
  60. if (HaveNewMessage(friendItem.AccountData.SerialNumber))
  61. {
  62. return true;
  63. }
  64. }
  65. return false;
  66. }
  67. }
  68. public static TweenOutline OpenPanelButtonOutlineTween;
  69. public static int ActivateLevel = TutorialManager.VisitTutorialLevel;
  70. public static Action<List<AccountData>> OnFriendListRefresh;
  71. #endregion
  72. public override void ThirdInit()
  73. {
  74. RefreshFriendList();
  75. }
  76. public override void RegistReference()
  77. {
  78. NicknameTitle = ResourceManager.Get<Text>(CanvasLabel.AF_NicknameTitle);
  79. ContentTitle = ResourceManager.Get<Text>(CanvasLabel.AF_ContentTitle);
  80. CloseButtonTitle = ResourceManager.Get<Text>(CanvasLabel.AF_CloseButtonTitle);
  81. ApplicantTitle = ResourceManager.Get<Text>(CanvasLabel.AF_ApplicantTitle);
  82. PanelTitle = ResourceManager.Get<Text>(CanvasLabel.AF_PanelTitle);
  83. AcceptAllButtonTitle = ResourceManager.Get<Text>(CanvasLabel.AF_AcceptAllButtonTitle);
  84. AddFriendTitle = ResourceManager.Get<Text>(CanvasLabel.AF_AddFriendTitle);
  85. FriendAmountText = ResourceManager.Get<Text>(CanvasLabel.AF_FriendAmountText);
  86. NewApplicantFlagImage = ResourceManager.Get<Image>(CanvasLabel.AF_NewApplicantFlagImage);
  87. AcceptAllButton = ResourceManager.Get<Button>(CanvasLabel.AF_AcceptAllButton);
  88. AddFriendButton = ResourceManager.Get<Button>(CanvasLabel.AF_AddFriendButton);
  89. CloseButton = ResourceManager.Get<Button>(CanvasLabel.AF_CloseButton);
  90. ApplicantButton = ResourceManager.Get<Toggle>(CanvasLabel.AF_ApplicantButton);
  91. OpenPanelButton = ResourceManager.Get<Button>(CanvasLabel.C_FriendButton);
  92. OpenPanelButtonParent = ResourceManager.Get(CanvasLabel.C_FriendButtonParent);
  93. FriendGrid = ResourceManager.Get(CanvasLabel.AF_FriendGrid);
  94. ApplicantGrid = ResourceManager.Get(CanvasLabel.AF_ApplicantGrid);
  95. FriendPanelParentMask = ResourceManager.Get(CanvasLabel.AF_FriendPanelParent);
  96. FriendPanelMask = ResourceManager.Get(CanvasLabel.AF_FriendPanelMask);
  97. PanelParentCanvasGroup = ResourceManager.Get<CanvasGroup>(CanvasLabel.AF_FriendPanelParent);
  98. FriendScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(CanvasLabel.AF_FriendScrollRect);
  99. ApplicantScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(CanvasLabel.AF_ApplicantScrollRect);
  100. LanguageManager.Add(NicknameTitle, new MulLanStr(LanguageLabel.UI__AF_NicknameTitle));
  101. LanguageManager.Add(ContentTitle, new MulLanStr(LanguageLabel.UI__AF_ContentTitle));
  102. LanguageManager.Add(CloseButtonTitle, new MulLanStr(LanguageLabel.UI__AF_CloseButtonTitle));
  103. LanguageManager.Add(ApplicantTitle, new MulLanStr(LanguageLabel.UI__AF_ApplicantTitle));
  104. LanguageManager.Add(PanelTitle, new MulLanStr(LanguageLabel.UI__AF_PanelTitle));
  105. LanguageManager.Add(AcceptAllButtonTitle, new MulLanStr(LanguageLabel.UI__AF_AcceptAllButtonTitle));
  106. LanguageManager.Add(AddFriendTitle, new MulLanStr(LanguageLabel.UI__AF_AddFriendTitle));
  107. OpenPanelButton.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  108. FriendPanelParentMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  109. FriendPanelMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  110. OpenPanelButtonOutlineTween = OpenPanelButton.CreateTweenOutline(0, 201/255f, 1f, true, true, Curve.EaseOutQuad);
  111. OpenPanelButtonOutlineTween.PingPong = true;
  112. OpenPanelButtonOutlineTween.IgnoreActiveControll = true;
  113. OpenPanelButton.onClick.AddListener(OpenRootFriendPanel);
  114. CloseButton.onClick.AddListener(CloseRootFriendPanel);
  115. ApplicantButton.onValueChanged.AddListener(OnApplicantToggleClick);
  116. AddFriendButton.onClick.AddListener(OnAddFriendButtonClick);
  117. AcceptAllButton.onClick.AddListener(OnAcceptAllButtonClick);
  118. Manager.OnLevelChange += level =>
  119. {
  120. if (level >= ActivateLevel)
  121. {
  122. OpenPanelButton.TweenForCG();
  123. OpenPanelButtonParent.SetActive(true);
  124. }
  125. };
  126. MessagePanel.OnHaveNewMessage += SortFriendItems;
  127. VisitManager.OnEnterVisteeGarden += OnEnterVisiteeGarden;
  128. VisitManager.OnExitVisteeGarden += OnExitVisiteeGarden;
  129. HttpManager.OnConnect += OnConnect;
  130. }
  131. private void Update()
  132. {
  133. RefreshApplicantTimer += Time.deltaTime;
  134. if (RefreshApplicantTimer >= RefreshApplicantTime)
  135. {
  136. RefreshApplicantTimer = 0;
  137. RefreshApplicant();
  138. }
  139. RefreshFriendTimer += Time.deltaTime;
  140. if (RefreshFriendTimer >= RefreshFriendTime)
  141. {
  142. RefreshFriendTimer = 0;
  143. RefreshFriendList();
  144. }
  145. RefreshPrivateMessageTimer += Time.deltaTime;
  146. if (RefreshPrivateMessageTimer >= RefreshPrivateMessageTime)
  147. {
  148. RefreshPrivateMessageTimer = 0;
  149. //RefreshPrivateMessage();
  150. }
  151. }
  152. public static void PlayFriendButtonOutline()
  153. {
  154. if (!OpenPanelButtonOutlineTween.IsPlaying)
  155. {
  156. OpenPanelButtonOutlineTween.PingPong = true;
  157. OpenPanelButtonOutlineTween.StartForward();
  158. }
  159. }
  160. public static void StopFriendButtonOutline()
  161. {
  162. if (OpenPanelButtonOutlineTween.IsPlaying)
  163. {
  164. OpenPanelButtonOutlineTween.PingPong = false;
  165. OpenPanelButtonOutlineTween.StartBackward();
  166. }
  167. }
  168. public static void UpdateFriendButtonOutlineStatus()
  169. {
  170. if (HaveNewApplicant || HaveNewPrivateMessage)
  171. {
  172. PlayFriendButtonOutline();
  173. }
  174. else if (!HaveNewApplicant && !HaveNewPrivateMessage)
  175. {
  176. StopFriendButtonOutline();
  177. }
  178. }
  179. public static void AddFriendItem(AccountData accountData)
  180. {
  181. FriendItem item = ResourceManager.Get(FriendItemLabel.FriendItem, Folder.UI, false, ApplicantScrollRect.content, false, ObjType.FriendItem, typeof(FriendItem)).GetComponent<FriendItem>();
  182. item.Init();
  183. item.Reset(accountData);
  184. item.SetParent(FriendScrollRect.content);
  185. FriendItems.Add(item);
  186. FriendAccountDatas.Add(accountData);
  187. UpdateFriendAmountText();
  188. }
  189. public static void SaveFriendItem(FriendItem item)
  190. {
  191. ResourceManager.Save(item);
  192. FriendItems.Remove(item);
  193. FriendAccountDatas.Remove(item.AccountData);
  194. UpdateFriendAmountText();
  195. }
  196. public static void UpdateFriendAmountText()
  197. {
  198. FriendAmountText.text = $"{FriendItems.Count}/{maxFriend}";
  199. }
  200. public static void RefreshFriendList()
  201. {
  202. HttpManager.GetBuddyList(RefreshFriendListCallback, () => {});
  203. }
  204. private static void RefreshFriendListCallback(List<AccountData> accountDatas)
  205. {
  206. for (int i = 0; i < FriendItems.Count; i++)
  207. {
  208. SaveFriendItem(FriendItems[i--]);
  209. }
  210. foreach (var accountData in accountDatas)
  211. {
  212. AddFriendItem(accountData);
  213. }
  214. FriendAccountDatas = accountDatas;
  215. if (OnFriendListRefresh != null)
  216. {
  217. OnFriendListRefresh.Invoke(accountDatas);
  218. }
  219. SortFriendItems(null);
  220. RefreshPrivateMessage();
  221. }
  222. public static void SortFriendItems(string targetSerialNumber)
  223. {
  224. FriendItem friendItem = null;
  225. List<FriendItem> haveNewPrivateMessageItems = new List<FriendItem>();
  226. List<FriendItem> dontHaveNewPrivateMessageItems = new List<FriendItem>();
  227. foreach (var item in FriendItems)
  228. {
  229. if (item.AccountData.SerialNumber == targetSerialNumber)
  230. {
  231. friendItem = item;
  232. }
  233. else if (HaveNewMessage(item.AccountData.SerialNumber))
  234. {
  235. haveNewPrivateMessageItems.Add(item);
  236. }
  237. else
  238. {
  239. dontHaveNewPrivateMessageItems.Add(item);
  240. }
  241. }
  242. haveNewPrivateMessageItems.MySort((item0, item1) => item0.AccountData.LastLoginDate.Ticks < item1.AccountData.LastLoginDate.Ticks);
  243. dontHaveNewPrivateMessageItems.MySort((item0, item1) => item0.AccountData.LastLoginDate.Ticks < item1.AccountData.LastLoginDate.Ticks);
  244. List<FriendItem> friendItems = new List<FriendItem>();
  245. friendItems.AddRange(haveNewPrivateMessageItems);
  246. friendItems.AddRange(dontHaveNewPrivateMessageItems);
  247. for (int i = 0; i < friendItems.Count; i++)
  248. {
  249. friendItems[i].transform.SetSiblingIndex(i);
  250. }
  251. if (friendItem != null)
  252. {
  253. friendItem.transform.SetAsFirstSibling();
  254. }
  255. }
  256. public static void AddApplicantItem(AccountData accountData)
  257. {
  258. ApplicantItem item = ResourceManager.Get(ApplicantItemLabel.ApplicantItem, Folder.UI, false, ApplicantScrollRect.content, false, ObjType.ApplicantItem, typeof(ApplicantItem)).GetComponent<ApplicantItem>();
  259. item.Init();
  260. item.Reset(accountData);
  261. ApplicantItems.Add(item);
  262. ApplicantAccountDatas.Add(accountData);
  263. }
  264. public static void SaveApplicantItem(ApplicantItem item)
  265. {
  266. ResourceManager.Save(item);
  267. ApplicantItems.Remove(item);
  268. ApplicantAccountDatas.Remove(item.AccountData);
  269. if (ApplicantItems.Count == 0)
  270. {
  271. OnDontHaveApplicant();
  272. }
  273. SaveLastApplicantSerialNumber();
  274. SetNewApplicantStatus();
  275. }
  276. private static void RefreshApplicant()
  277. {
  278. HttpManager.GetApplicantList(RefreshApplicantCallback, () => { });
  279. }
  280. private static void RefreshApplicantCallback(List<AccountData> accountDatas)
  281. {
  282. for (int i = 0; i < ApplicantItems.Count; i++)
  283. {
  284. SaveApplicantItem(ApplicantItems[i--]);
  285. }
  286. for (int i = 0; i < accountDatas.Count; i++)
  287. {
  288. AddApplicantItem(accountDatas[i]);
  289. }
  290. ApplicantAccountDatas = accountDatas;
  291. if (ApplicantItems.Count > 0)
  292. {
  293. OnHaveApplicant();
  294. }
  295. else
  296. {
  297. OnDontHaveApplicant();
  298. }
  299. SetNewApplicantStatus();
  300. }
  301. private static void OnHaveApplicant()
  302. {
  303. AcceptAllButton.image.material = null;
  304. AcceptAllButton.interactable = true;
  305. }
  306. private static void OnDontHaveApplicant()
  307. {
  308. AcceptAllButton.image.material = Lib.GrayMat;
  309. AcceptAllButton.interactable = false;
  310. }
  311. private static void SetNewApplicantStatus()
  312. {
  313. string lastApplicantSerialNumber = ConfigManager.GetStringFormConfig(PlayerConfigLabel.LastApplicantSerialNumber);
  314. if (ApplicantItems.Count == 0 || ApplicantItems.Back(0).AccountData.SerialNumber == lastApplicantSerialNumber)
  315. {
  316. NewApplicantFlagImage.SetActive(false);
  317. HaveNewApplicant = false;
  318. }
  319. else
  320. {
  321. NewApplicantFlagImage.SetActive(true);
  322. HaveNewApplicant = true;
  323. }
  324. UpdateFriendButtonOutlineStatus();
  325. }
  326. private static void SaveLastApplicantSerialNumber()
  327. {
  328. if (ApplicantItems.Count > 0)
  329. {
  330. ConfigManager.SaveStringToConfig(PlayerConfigLabel.LastApplicantSerialNumber, ApplicantItems.Back(0).AccountData.SerialNumber);
  331. }
  332. }
  333. private static void RefreshPrivateMessage()
  334. {
  335. foreach (var friendAccountData in FriendAccountDatas)
  336. {
  337. HttpManager.GetPrivateMessage(friendAccountData.SerialNumber, "0", MessagePanel.RefreshPrivateMessageSucceedCallback, MessagePanel.RefreshPrivateMessageFailedCallback);
  338. }
  339. }
  340. public static void OpenRootFriendPanel()
  341. {
  342. AudioManager.PlayClip(ResourceLabel.BtnClip);
  343. FriendPanelParentMask.TweenForCG();
  344. }
  345. public static void CloseRootFriendPanel()
  346. {
  347. AudioManager.PlayClip(ResourceLabel.CloseClip);
  348. FriendPanelParentMask.TweenBacCG();
  349. }
  350. public static void OpenFriendPanel()
  351. {
  352. AudioManager.PlayClip(ResourceLabel.BtnClip);
  353. FriendPanelMask.TweenForCG();
  354. }
  355. public static void CloseFriendPanel()
  356. {
  357. AudioManager.PlayClip(ResourceLabel.CloseClip);
  358. FriendPanelMask.TweenBacCG();
  359. }
  360. private static void OnApplicantToggleClick(bool value)
  361. {
  362. AudioManager.PlayClip(ResourceLabel.BtnClip);
  363. if (value)
  364. {
  365. SaveLastApplicantSerialNumber();
  366. SetNewApplicantStatus();
  367. SaveLastApplicantSerialNumber();
  368. AcceptAllButton.SetActive(true);
  369. AddFriendButton.SetActive(false);
  370. ApplicantScrollRect.SetActive(true);
  371. FriendScrollRect.SetActive(false);
  372. }
  373. else
  374. {
  375. AcceptAllButton.SetActive(false);
  376. AddFriendButton.SetActive(true);
  377. ApplicantScrollRect.SetActive(false);
  378. FriendScrollRect.SetActive(true);
  379. }
  380. }
  381. private static void OnAddFriendButtonClick()
  382. {
  383. AudioManager.PlayClip(ResourceLabel.BtnClip);
  384. AddFriendPanel.OpenPanel();
  385. }
  386. private static void OnAcceptAllButtonClick()
  387. {
  388. AudioManager.PlayClip(ResourceLabel.BtnClip);
  389. foreach (var applicantItem in ApplicantItems)
  390. {
  391. applicantItem.OnAcceptButtonClick();
  392. }
  393. }
  394. public static bool IsFriendFull(bool showBubble)
  395. {
  396. if (FriendItems.Count >= MaxFriend)
  397. {
  398. if (showBubble)
  399. {
  400. Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__FriendFullSelf));
  401. }
  402. return true;
  403. }
  404. else
  405. {
  406. return false;
  407. }
  408. }
  409. public static bool IsPrivateMessageNew(string targetSerialNumber, DateTime dateTime)
  410. {
  411. XmlNodeList nodes = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate).SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
  412. for (int i = 0; i < nodes.Count; i++)
  413. {
  414. string[] strings = nodes[i].Attributes[0].Value.Split('|');
  415. string serialNumber = strings[0];
  416. DateTime lastDateTime = DateTime.Parse(strings[1]);
  417. //Debug.Log(dateTime + " " + lastDateTime);
  418. //Debug.Log(targetSerialNumber == serialNumber && dateTime == lastDateTime);
  419. if (targetSerialNumber == serialNumber && dateTime == lastDateTime)
  420. {
  421. return false;
  422. }
  423. }
  424. return true;
  425. }
  426. public static bool HaveNewMessage(string targetSerialNumber)
  427. {
  428. if (MessagePanel.PrivateMessageDataDictionary.ContainsKey(targetSerialNumber))
  429. {
  430. PrivateMessageDataStash dataStash = MessagePanel.PrivateMessageDataDictionary[targetSerialNumber];
  431. if (dataStash.PrivateMessageDatas.Count > 0)
  432. {
  433. return IsPrivateMessageNew(targetSerialNumber, dataStash.PrivateMessageDatas[0].Date);
  434. }
  435. else
  436. {
  437. return false;
  438. }
  439. }
  440. else
  441. {
  442. return false;
  443. }
  444. }
  445. public static void SaveLastPrivateMessageDate(string targetSerialNumber, DateTime dateTime)
  446. {
  447. XmlNode parentNode = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate);
  448. XmlNodeList nodes = parentNode.SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
  449. for (int i = 0; i < nodes.Count; i++)
  450. {
  451. string[] strings = nodes[i].Attributes[0].Value.Split('|');
  452. string serialNumber = strings[0];
  453. if (targetSerialNumber == serialNumber)
  454. {
  455. nodes[i].Attributes[0].Value = $"{targetSerialNumber}|{dateTime}";
  456. //ConfigManager.SaveConfigDocument();
  457. return;
  458. }
  459. }
  460. XmlNode node = ConfigManager.ConfigDocument.CreateNode(XmlNodeType.Element, PlayerConfigLabel.LastPrivateMessageDate, null);
  461. XmlAttribute attribute = node.Attributes.Append(ConfigManager.ConfigDocument.CreateAttribute(PlayerConfigLabel.AttributeName));
  462. attribute.Value = $"{targetSerialNumber}|{dateTime}";
  463. parentNode.AppendChild(node);
  464. //ConfigManager.SaveConfigDocument();
  465. }
  466. public static void DeleteLastPrivateMessageDate(string targetSerialNumber)
  467. {
  468. XmlNode parentNode = ConfigManager.ConfigRootNode.SelectSingleNode(PlayerConfigLabel.LastPrivateMessageDate);
  469. XmlNodeList nodes = parentNode.SelectNodes(PlayerConfigLabel.LastPrivateMessageDate);
  470. for (int i = 0; i < nodes.Count; i++)
  471. {
  472. string[] strings = nodes[i].Attributes[0].Value.Split('|');
  473. string serialNumber = strings[0];
  474. if (targetSerialNumber == serialNumber)
  475. {
  476. parentNode.RemoveChild(nodes[i]);
  477. return;
  478. }
  479. }
  480. }
  481. public static void OnConnect()
  482. {
  483. MaxFriend = HttpManager.MaxFriend;
  484. }
  485. public static void OnEnterVisiteeGarden()
  486. {
  487. OpenPanelButtonParent.SetActive(false);
  488. }
  489. public static void OnExitVisiteeGarden()
  490. {
  491. OpenPanelButtonParent.SetActive(true);
  492. }
  493. }