VietnamAntiAddictionWorker.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System;
  2. using System.Threading.Tasks;
  3. using TapSDK.UI;
  4. using TapTap.AntiAddiction.Internal;
  5. using TapTap.AntiAddiction.Model;
  6. using TapTap.Common;
  7. using UnityEngine;
  8. namespace TapTap.AntiAddiction
  9. {
  10. public sealed class VietnamAntiAddictionWorker : BaseAntiAddictionWorker
  11. {
  12. /// <summary>
  13. /// 单日最长游玩时间(秒)
  14. /// </summary>
  15. private const int MAX_REMAIN_TIME_ONE_DAY = 180 * 60;
  16. /// <summary>
  17. /// 越南初始化检查可玩性时的时间
  18. /// </summary>
  19. private DateTime? _initCheckPlayableTimeVietnam;
  20. /// <summary>
  21. /// 游戏剩余时间,从服务器得到,如果不能从服务器得到,那么给予默认最长时间(180分钟)
  22. /// </summary>
  23. private int? _remainTimeCache;
  24. #region Abstract Override
  25. public override Region Region => Region.Vietnam;
  26. private readonly string rsaPublicKey =
  27. "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA708T4I+a6wkvT7kn16HY9VrpBE3ay8/nNtaLVFNj/LVBVB6LyIHdU+XIIwi9nj9+I1+a0R2lBds6yKDy6uiwctAwhEHFcKKMmjbdfL0db8bACflASNdrAodw38i7SjzdDrlFiFvJiktkUWnSswaLLPpan/1K3fKo5GgzBtQd8Fe4GQYJ5ghePjA4vVHrpI5rBa9Ca0Ji2YnSOwYv9lFljMCKDYoTzn/Ctsq5vzN+ZGomjz+cATIbA8+zSek+XoGltZvQEWyBtjHDK/pkzb58Kc0zAnEmMQPPtHa0pCU1moMXKIiPvw+YXEVxyvOCUKLAHnzhJNTPlzZzKWtz9VGktQIDAQAB";
  28. internal override string RsaPublicKey => rsaPublicKey;
  29. protected override async Task<int> CompleteVerificationWindowAsync()
  30. {
  31. var userId = TapTapAntiAddictionManager.UserId;
  32. do
  33. {
  34. try
  35. {
  36. VerificationResult result = await OpenVerificationPanelVietnam();
  37. await UIManager.Instance.OpenToastAsync(Config.Current.UIConfig.InputRealNameInfoVietnam.submitSuccessMsg);
  38. await Verification.Save(userId, Region.Vietnam, result);
  39. if (!Verification.IsVerified)
  40. {
  41. // 如果在实名认证界面得到是未认证的数据,则弹出认证中的弹框
  42. continue;
  43. }
  44. break;
  45. }
  46. catch (TaskCanceledException)
  47. {
  48. TapLogger.Debug("Close verification panel.");
  49. // 返回关闭实名制窗口
  50. return StartUpResult.REAL_NAME_STOP;
  51. }
  52. catch (Exception e)
  53. {
  54. // 其他异常
  55. TapLogger.Error(e);
  56. // 加载异常,则提示重新查询
  57. await UIManager.Instance.OpenToastAsync(TapTapAntiAddictionManager.LocalizationItems.Current.NetError);
  58. }
  59. }
  60. while (true);
  61. return 0;
  62. }
  63. protected override PlayableResult CheckOfflineMinorPlayable()
  64. {
  65. // 未成年人: 是否超过180分钟
  66. if (_remainTimeCache == null)
  67. _remainTimeCache = MAX_REMAIN_TIME_ONE_DAY;
  68. bool canPlay = true;
  69. if (_initCheckPlayableTimeVietnam != null)
  70. {
  71. DateTime now = DateTime.Now;
  72. // 是否跨天,跨天的话,重置当天可玩时间
  73. bool isCrossDay = _initCheckPlayableTimeVietnam.Value.Day != now.Day;
  74. if (isCrossDay)
  75. {
  76. _initCheckPlayableTimeVietnam = new DateTime(now.Year, now.Month, now.Day);
  77. _remainTimeCache = MAX_REMAIN_TIME_ONE_DAY;
  78. }
  79. DateTime endTime = now;
  80. DateTime beginTime = _initCheckPlayableTimeVietnam.Value;
  81. var timeSpan = endTime - beginTime;
  82. _remainTimeCache -= (int)timeSpan.TotalSeconds;
  83. canPlay = _remainTimeCache > 0;
  84. _remainTimeCache = Math.Max(0, _remainTimeCache.Value);
  85. }
  86. HealthReminderTip tip = canPlay ? null : Config.GetMinorUnplayableHealthReminderTipVietnam();
  87. return new PlayableResult
  88. {
  89. RestrictType = PlayableResult.TIME_LIMIT,
  90. CanPlay = canPlay,
  91. Title = tip?.Title,
  92. Content = tip?.Content,
  93. RemainTime = _remainTimeCache.Value
  94. };
  95. }
  96. internal override Task<bool> IsStandaloneEnabled()
  97. {
  98. var tcs = new TaskCompletionSource<bool>();
  99. tcs.SetResult(false);
  100. return tcs.Task;
  101. }
  102. #endregion
  103. #region Virtual Override
  104. /// <summary>
  105. /// 检查可玩性后,已知未成年人时的处理
  106. /// </summary>
  107. /// <param name="playable"></param>
  108. /// <returns></returns>
  109. protected override async Task<int> OnCheckedPlayableWithMinorAsync(PlayableResult playable)
  110. {
  111. var tcs = new TaskCompletionSource<int>();
  112. // 登录时,如果发现不可玩的话,那么健康弹窗面板的按钮代表切换账号
  113. Action onSwitch = null;
  114. if (playable.CanPlay)
  115. {
  116. tcs.TrySetResult(StartUpResult.LOGIN_SUCCESS);
  117. TryStartPoll();
  118. }
  119. else
  120. {
  121. onSwitch = () =>
  122. {
  123. Logout();
  124. AntiAddictionUIKit.ExternalCallback?.Invoke(StartUpResult.SWITCH_ACCOUNT, null);
  125. };
  126. tcs.TrySetResult(StartUpResult.DURATION_LIMIT);
  127. }
  128. if (onSwitch != null)
  129. {
  130. TapTapAntiAddictionUIKit.OpenHealthReminderPanel(playable, null, onSwitch);
  131. }
  132. return await tcs.Task;
  133. }
  134. /// <summary>
  135. /// 轮询时,发现不可玩处理
  136. /// </summary>
  137. /// <param name="playable"></param>
  138. protected override void OnUnplayablePostPoll(PlayableResult playable)
  139. {
  140. Action onExitGame = Application.Quit;
  141. TapTapAntiAddictionUIKit.OpenHealthReminderPanel(playable, onExitGame);
  142. AntiAddictionUIKit.ExternalCallback?.Invoke(StartUpResult.DURATION_LIMIT, null);
  143. }
  144. protected override async Task<PlayableResult> CheckPlayableAsync()
  145. {
  146. if (_initCheckPlayableTimeVietnam == null)
  147. _initCheckPlayableTimeVietnam = DateTime.Now;
  148. var result = await base.CheckPlayableAsync();
  149. if (_remainTimeCache == null)
  150. _remainTimeCache = result.RemainTime;
  151. return result;
  152. }
  153. internal override async Task<PlayableResult> CheckPlayableOnPollingAsync()
  154. {
  155. PlayableResult playable = await base.CheckPlayableOnPollingAsync();
  156. _initCheckPlayableTimeVietnam = DateTime.Now;
  157. _remainTimeCache = playable.RemainTime;
  158. return playable;
  159. }
  160. internal override void Logout()
  161. {
  162. base.Logout();
  163. _initCheckPlayableTimeVietnam = null;
  164. _remainTimeCache = null;
  165. }
  166. #endregion
  167. /// <summary>
  168. /// 打开越南实名制窗口
  169. /// </summary>
  170. /// <returns></returns>
  171. private Task<VerificationResult> OpenVerificationPanelVietnam()
  172. {
  173. var tcs = new TaskCompletionSource<VerificationResult>();
  174. var path = AntiAddictionConst.GetPrefabPath(AntiAddictionConst.TIME_SELECTOR_PANEL_NAME,
  175. TapTapAntiAddictionManager.IsUseMobileUI());
  176. var timeSelectorPanel =
  177. UIManager.Instance.OpenUI<TaptapAntiAddictionTimeSelectorController>(path);
  178. if (timeSelectorPanel == null) return tcs.Task;
  179. timeSelectorPanel.OnVerified = (verification) => tcs.TrySetResult(verification);
  180. timeSelectorPanel.OnException = () => tcs.TrySetException(new Exception("Vietnam Verification Failed"));
  181. timeSelectorPanel.OnClosed = () => tcs.TrySetCanceled();
  182. return tcs.Task;
  183. }
  184. }
  185. }