FriendPanel.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. public class FriendPanel : Regist
  7. {
  8. #region Config
  9. public static Text NicknameTitle;
  10. public static Text ContentTitle;
  11. public static Text CloseButtonTitle;
  12. public static Text ApplicantTitle;
  13. public static Text PanelTitle;
  14. public static Text AcceptAllButtonTitle;
  15. public static Text AddFriendTitle;
  16. public static Text FriendAmountText;
  17. public static Image NewApplicantFlagImage;
  18. public static Button OpenPanelButton;
  19. public static Button AcceptAllButton;
  20. public static Button AddFriendButton;
  21. public static Button CloseButton;
  22. public static Toggle ApplicantButton;
  23. public static Transform FriendGrid;
  24. public static Transform ApplicantGrid;
  25. public static Transform FriendPanelParentMask;
  26. public static Transform FriendPanelMask;
  27. public static CanvasGroup PanelParentCanvasGroup;
  28. public static VirtualScrollRectPlus FriendScrollRect;
  29. public static VirtualScrollRectPlus ApplicantScrollRect;
  30. private static float RefreshApplicantTime = 15f;
  31. private static float RefreshApplicantTimer = RefreshApplicantTime;
  32. private static List<ApplicantItem> ApplicantItems = new List<ApplicantItem>();
  33. public static List<AccountData> ApplicantAccountDatas = new List<AccountData>();
  34. public static int MaxFriend
  35. {
  36. get { return maxFriend; }
  37. set
  38. {
  39. maxFriend = value;
  40. UpdateFriendAmountText();
  41. }
  42. }
  43. public static int maxFriend = 25;
  44. private static float RefreshFriendTime = 15f;
  45. private static float RefreshFriendTimer = RefreshFriendTime;
  46. public static List<FriendItem> FriendItems = new List<FriendItem>();
  47. public static List<AccountData> FriendAccountDatas = new List<AccountData>();
  48. public static bool HaveNewApplicant;
  49. public static bool HaveNewPrivateMessage
  50. {
  51. get { return haveNewPrivateMessage; }
  52. set
  53. {
  54. haveNewPrivateMessage = value;
  55. UpdateFriendButtonOutlineStatus();
  56. }
  57. }
  58. public static bool haveNewPrivateMessage;
  59. public static TweenOutline OpenPanelButtonOutlineTween;
  60. public static int ActivateLevel = TutorialManager.VisitTutorialLevel;
  61. public static Action<List<AccountData>> OnFriendListRefresh;
  62. #endregion
  63. public override void ThirdInit()
  64. {
  65. RefreshFriendList();
  66. }
  67. public override void RegistReference()
  68. {
  69. NicknameTitle = ResourceManager.Get<Text>(ObjectLabel.AF_NicknameTitle);
  70. ContentTitle = ResourceManager.Get<Text>(ObjectLabel.AF_ContentTitle);
  71. CloseButtonTitle = ResourceManager.Get<Text>(ObjectLabel.AF_CloseButtonTitle);
  72. ApplicantTitle = ResourceManager.Get<Text>(ObjectLabel.AF_ApplicantTitle);
  73. PanelTitle = ResourceManager.Get<Text>(ObjectLabel.AF_PanelTitle);
  74. AcceptAllButtonTitle = ResourceManager.Get<Text>(ObjectLabel.AF_AcceptAllButtonTitle);
  75. AddFriendTitle = ResourceManager.Get<Text>(ObjectLabel.AF_AddFriendTitle);
  76. FriendAmountText = ResourceManager.Get<Text>(ObjectLabel.AF_FriendAmountText);
  77. NewApplicantFlagImage = ResourceManager.Get<Image>(ObjectLabel.AF_NewApplicantFlagImage);
  78. AcceptAllButton = ResourceManager.Get<Button>(ObjectLabel.AF_AcceptAllButton);
  79. AddFriendButton = ResourceManager.Get<Button>(ObjectLabel.AF_AddFriendButton);
  80. CloseButton = ResourceManager.Get<Button>(ObjectLabel.AF_CloseButton);
  81. ApplicantButton = ResourceManager.Get<Toggle>(ObjectLabel.AF_ApplicantButton);
  82. OpenPanelButton = ResourceManager.Get<Button>(ObjectLabel.C_FriendButton);
  83. FriendGrid = ResourceManager.Get(ObjectLabel.AF_FriendGrid);
  84. ApplicantGrid = ResourceManager.Get(ObjectLabel.AF_ApplicantGrid);
  85. FriendPanelParentMask = ResourceManager.Get(ObjectLabel.AF_FriendPanelParent);
  86. FriendPanelMask = ResourceManager.Get(ObjectLabel.AF_FriendPanelMask);
  87. PanelParentCanvasGroup = ResourceManager.Get<CanvasGroup>(ObjectLabel.AF_FriendPanelParent);
  88. FriendScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(ObjectLabel.AF_FriendScrollRect);
  89. ApplicantScrollRect = ResourceManager.Get<VirtualScrollRectPlus>(ObjectLabel.AF_ApplicantScrollRect);
  90. LanguageManager.Add(NicknameTitle, Language.GetStr(LanguageLabel.UI__AF_NicknameTitle));
  91. LanguageManager.Add(ContentTitle, Language.GetStr(LanguageLabel.UI__AF_ContentTitle));
  92. LanguageManager.Add(CloseButtonTitle, Language.GetStr(LanguageLabel.UI__AF_CloseButtonTitle));
  93. LanguageManager.Add(ApplicantTitle, Language.GetStr(LanguageLabel.UI__AF_ApplicantTitle));
  94. LanguageManager.Add(PanelTitle, Language.GetStr(LanguageLabel.UI__AF_PanelTitle));
  95. LanguageManager.Add(AcceptAllButtonTitle, Language.GetStr(LanguageLabel.UI__AF_AcceptAllButtonTitle));
  96. LanguageManager.Add(AddFriendTitle, Language.GetStr(LanguageLabel.UI__AF_AddFriendTitle));
  97. OpenPanelButton.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  98. FriendPanelParentMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  99. FriendPanelMask.CreateTweenCG(0, 1, 0.25f, false, true, Curve.EaseOutQuad);
  100. OpenPanelButtonOutlineTween = OpenPanelButton.CreateTweenOutline(0, 201/255f, 1f, true, true, Curve.EaseOutQuad);
  101. OpenPanelButtonOutlineTween.PingPong = true;
  102. OpenPanelButtonOutlineTween.IgnoreActiveControll = true;
  103. OpenPanelButton.onClick.AddListener(OpenRootFriendPanel);
  104. CloseButton.onClick.AddListener(CloseRootFriendPanel);
  105. ApplicantButton.onValueChanged.AddListener(OnApplicantToggleClick);
  106. AddFriendButton.onClick.AddListener(OnAddFriendButtonClick);
  107. AcceptAllButton.onClick.AddListener(OnAcceptAllButtonClick);
  108. Manager.OnLevelChange += level =>
  109. {
  110. if (level >= ActivateLevel) OpenPanelButton.TweenForCG();
  111. };
  112. }
  113. private void Update()
  114. {
  115. RefreshApplicantTimer += Time.deltaTime;
  116. if (RefreshApplicantTimer >= RefreshApplicantTime)
  117. {
  118. RefreshApplicantTimer = 0;
  119. RefreshApplicant();
  120. }
  121. RefreshFriendTimer += Time.deltaTime;
  122. if (RefreshFriendTimer >= RefreshFriendTime)
  123. {
  124. RefreshFriendTimer = 0;
  125. RefreshFriendList();
  126. }
  127. }
  128. public static void PlayFriendButtonOutline()
  129. {
  130. if (!OpenPanelButtonOutlineTween.IsPlaying)
  131. {
  132. OpenPanelButtonOutlineTween.PingPong = true;
  133. OpenPanelButtonOutlineTween.StartForward();
  134. }
  135. }
  136. public static void StopFriendButtonOutline()
  137. {
  138. if (OpenPanelButtonOutlineTween.IsPlaying)
  139. {
  140. OpenPanelButtonOutlineTween.PingPong = false;
  141. OpenPanelButtonOutlineTween.StartBackward();
  142. }
  143. }
  144. public static void UpdateFriendButtonOutlineStatus()
  145. {
  146. if (HaveNewApplicant || HaveNewPrivateMessage)
  147. {
  148. PlayFriendButtonOutline();
  149. }
  150. else if (!HaveNewApplicant && !HaveNewPrivateMessage)
  151. {
  152. StopFriendButtonOutline();
  153. }
  154. }
  155. public static void AddFriendItem(AccountData accountData)
  156. {
  157. FriendItem item = ResourceManager.Get(FriendItemLabel.FriendItem, Folder.UI, false, ApplicantScrollRect.content, false, ObjType.FriendItem, typeof(FriendItem)).GetComponent<FriendItem>();
  158. item.Init();
  159. item.Reset(accountData);
  160. item.SetParent(FriendScrollRect.content);
  161. FriendItems.Add(item);
  162. FriendAccountDatas.Add(accountData);
  163. UpdateFriendAmountText();
  164. }
  165. public static void SaveFriendItem(FriendItem item)
  166. {
  167. ResourceManager.Save(item);
  168. FriendItems.Remove(item);
  169. FriendAccountDatas.Remove(item.AccountData);
  170. UpdateFriendAmountText();
  171. }
  172. public static void UpdateFriendAmountText()
  173. {
  174. FriendAmountText.text = $"{FriendItems.Count}/{maxFriend}";
  175. }
  176. public static void RefreshFriendList()
  177. {
  178. HttpManager.GetBuddyList(RefreshFriendListCallback, () => {});
  179. }
  180. private static void RefreshFriendListCallback(List<AccountData> accountDatas)
  181. {
  182. for (int i = 0; i < FriendItems.Count; i++)
  183. {
  184. SaveFriendItem(FriendItems[i--]);
  185. }
  186. foreach (var accountData in accountDatas)
  187. {
  188. AddFriendItem(accountData);
  189. }
  190. FriendAccountDatas = accountDatas;
  191. if (OnFriendListRefresh != null)
  192. {
  193. OnFriendListRefresh.Invoke(accountDatas);
  194. }
  195. }
  196. public static void AddApplicantItem(AccountData accountData)
  197. {
  198. ApplicantItem item = ResourceManager.Get(ApplicantItemLabel.ApplicantItem, Folder.UI, false, ApplicantScrollRect.content, false, ObjType.ApplicantItem, typeof(ApplicantItem)).GetComponent<ApplicantItem>();
  199. item.Init();
  200. item.Reset(accountData);
  201. ApplicantItems.Add(item);
  202. ApplicantAccountDatas.Add(accountData);
  203. }
  204. public static void SaveApplicantItem(ApplicantItem item)
  205. {
  206. ResourceManager.Save(item);
  207. ApplicantItems.Remove(item);
  208. ApplicantAccountDatas.Remove(item.AccountData);
  209. if (ApplicantItems.Count == 0)
  210. {
  211. OnDontHaveApplicant();
  212. }
  213. SaveLastApplicantSerialNumber();
  214. SetNewApplicantStatus();
  215. }
  216. private static void RefreshApplicant()
  217. {
  218. HttpManager.GetApplicantList(RefreshApplicantCallback, () => { });
  219. }
  220. private static void RefreshApplicantCallback(List<AccountData> accountDatas)
  221. {
  222. foreach (var applicantItem in ApplicantItems)
  223. {
  224. SaveApplicantItem(applicantItem);
  225. }
  226. for (int i = 0; i < accountDatas.Count; i++)
  227. {
  228. AddApplicantItem(accountDatas[i]);
  229. }
  230. ApplicantAccountDatas = accountDatas;
  231. if (ApplicantItems.Count > 0)
  232. {
  233. OnHaveApplicant();
  234. }
  235. else
  236. {
  237. OnDontHaveApplicant();
  238. }
  239. SetNewApplicantStatus();
  240. }
  241. private static void OnHaveApplicant()
  242. {
  243. AcceptAllButton.image.material = null;
  244. AcceptAllButton.interactable = true;
  245. }
  246. private static void OnDontHaveApplicant()
  247. {
  248. AcceptAllButton.image.material = Lib.GrayMat;
  249. AcceptAllButton.interactable = false;
  250. }
  251. private static void SetNewApplicantStatus()
  252. {
  253. string lastApplicantSerialNumber = ConfigManager.GetStringFormConfig(PlayerConfigLabel.LastApplicantSerialNumber);
  254. if (ApplicantItems.Count == 0 || ApplicantItems.Back(0).AccountData.SerialNumber == lastApplicantSerialNumber)
  255. {
  256. NewApplicantFlagImage.SetActive(false);
  257. HaveNewApplicant = false;
  258. }
  259. else
  260. {
  261. NewApplicantFlagImage.SetActive(true);
  262. HaveNewApplicant = true;
  263. }
  264. UpdateFriendButtonOutlineStatus();
  265. }
  266. private static void SaveLastApplicantSerialNumber()
  267. {
  268. if (ApplicantItems.Count > 0)
  269. {
  270. ConfigManager.SaveStringToConfig(PlayerConfigLabel.LastApplicantSerialNumber, ApplicantItems.Back(0).AccountData.SerialNumber);
  271. }
  272. }
  273. public static void OpenRootFriendPanel()
  274. {
  275. AudioManager.PlayClip(ResourceLabel.BtnClip);
  276. FriendPanelParentMask.TweenForCG();
  277. }
  278. public static void CloseRootFriendPanel()
  279. {
  280. AudioManager.PlayClip(ResourceLabel.CloseClip);
  281. FriendPanelParentMask.TweenBacCG();
  282. }
  283. public static void OpenFriendPanel()
  284. {
  285. AudioManager.PlayClip(ResourceLabel.BtnClip);
  286. FriendPanelMask.TweenForCG();
  287. }
  288. public static void CloseFriendPanel()
  289. {
  290. AudioManager.PlayClip(ResourceLabel.CloseClip);
  291. FriendPanelMask.TweenBacCG();
  292. }
  293. private static void OnApplicantToggleClick(bool value)
  294. {
  295. AudioManager.PlayClip(ResourceLabel.BtnClip);
  296. if (value)
  297. {
  298. SaveLastApplicantSerialNumber();
  299. SetNewApplicantStatus();
  300. SaveLastApplicantSerialNumber();
  301. AcceptAllButton.SetActive(true);
  302. AddFriendButton.SetActive(false);
  303. ApplicantScrollRect.SetActive(true);
  304. FriendScrollRect.SetActive(false);
  305. }
  306. else
  307. {
  308. AcceptAllButton.SetActive(false);
  309. AddFriendButton.SetActive(true);
  310. ApplicantScrollRect.SetActive(false);
  311. FriendScrollRect.SetActive(true);
  312. }
  313. }
  314. private static void OnAddFriendButtonClick()
  315. {
  316. AudioManager.PlayClip(ResourceLabel.BtnClip);
  317. AddFriendPanel.OpenPanel();
  318. }
  319. private static void OnAcceptAllButtonClick()
  320. {
  321. AudioManager.PlayClip(ResourceLabel.BtnClip);
  322. foreach (var applicantItem in ApplicantItems)
  323. {
  324. applicantItem.OnAcceptButtonClick();
  325. }
  326. }
  327. public static bool IsFriendFull(bool showBubble)
  328. {
  329. if (FriendItems.Count >= MaxFriend)
  330. {
  331. if (showBubble)
  332. {
  333. Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__FriendFullSelf));
  334. }
  335. return true;
  336. }
  337. else
  338. {
  339. return false;
  340. }
  341. }
  342. }