FriendPanel.cs 19 KB

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