using System; using System.Threading.Tasks; using TapSDK.UI; using TapTap.AntiAddiction.Internal; using TapTap.AntiAddiction.Model; using TapTap.Common; using UnityEngine; namespace TapTap.AntiAddiction { public sealed class VietnamAntiAddictionWorker : BaseAntiAddictionWorker { /// /// 单日最长游玩时间(秒) /// private const int MAX_REMAIN_TIME_ONE_DAY = 180 * 60; /// /// 越南初始化检查可玩性时的时间 /// private DateTime? _initCheckPlayableTimeVietnam; /// /// 游戏剩余时间,从服务器得到,如果不能从服务器得到,那么给予默认最长时间(180分钟) /// private int? _remainTimeCache; #region Abstract Override public override Region Region => Region.Vietnam; private readonly string rsaPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA708T4I+a6wkvT7kn16HY9VrpBE3ay8/nNtaLVFNj/LVBVB6LyIHdU+XIIwi9nj9+I1+a0R2lBds6yKDy6uiwctAwhEHFcKKMmjbdfL0db8bACflASNdrAodw38i7SjzdDrlFiFvJiktkUWnSswaLLPpan/1K3fKo5GgzBtQd8Fe4GQYJ5ghePjA4vVHrpI5rBa9Ca0Ji2YnSOwYv9lFljMCKDYoTzn/Ctsq5vzN+ZGomjz+cATIbA8+zSek+XoGltZvQEWyBtjHDK/pkzb58Kc0zAnEmMQPPtHa0pCU1moMXKIiPvw+YXEVxyvOCUKLAHnzhJNTPlzZzKWtz9VGktQIDAQAB"; internal override string RsaPublicKey => rsaPublicKey; protected override async Task CompleteVerificationWindowAsync() { var userId = TapTapAntiAddictionManager.UserId; do { try { VerificationResult result = await OpenVerificationPanelVietnam(); await UIManager.Instance.OpenToastAsync(Config.Current.UIConfig.InputRealNameInfoVietnam.submitSuccessMsg); await Verification.Save(userId, Region.Vietnam, result); if (!Verification.IsVerified) { // 如果在实名认证界面得到是未认证的数据,则弹出认证中的弹框 continue; } break; } catch (TaskCanceledException) { TapLogger.Debug("Close verification panel."); // 返回关闭实名制窗口 return StartUpResult.REAL_NAME_STOP; } catch (Exception e) { // 其他异常 TapLogger.Error(e); // 加载异常,则提示重新查询 await UIManager.Instance.OpenToastAsync(TapTapAntiAddictionManager.LocalizationItems.Current.NetError); } } while (true); return 0; } protected override PlayableResult CheckOfflineMinorPlayable() { // 未成年人: 是否超过180分钟 if (_remainTimeCache == null) _remainTimeCache = MAX_REMAIN_TIME_ONE_DAY; bool canPlay = true; if (_initCheckPlayableTimeVietnam != null) { DateTime now = DateTime.Now; // 是否跨天,跨天的话,重置当天可玩时间 bool isCrossDay = _initCheckPlayableTimeVietnam.Value.Day != now.Day; if (isCrossDay) { _initCheckPlayableTimeVietnam = new DateTime(now.Year, now.Month, now.Day); _remainTimeCache = MAX_REMAIN_TIME_ONE_DAY; } DateTime endTime = now; DateTime beginTime = _initCheckPlayableTimeVietnam.Value; var timeSpan = endTime - beginTime; _remainTimeCache -= (int)timeSpan.TotalSeconds; canPlay = _remainTimeCache > 0; _remainTimeCache = Math.Max(0, _remainTimeCache.Value); } HealthReminderTip tip = canPlay ? null : Config.GetMinorUnplayableHealthReminderTipVietnam(); return new PlayableResult { RestrictType = PlayableResult.TIME_LIMIT, CanPlay = canPlay, Title = tip?.Title, Content = tip?.Content, RemainTime = _remainTimeCache.Value }; } internal override Task IsStandaloneEnabled() { var tcs = new TaskCompletionSource(); tcs.SetResult(false); return tcs.Task; } #endregion #region Virtual Override /// /// 检查可玩性后,已知未成年人时的处理 /// /// /// protected override async Task OnCheckedPlayableWithMinorAsync(PlayableResult playable) { var tcs = new TaskCompletionSource(); // 登录时,如果发现不可玩的话,那么健康弹窗面板的按钮代表切换账号 Action onSwitch = null; if (playable.CanPlay) { tcs.TrySetResult(StartUpResult.LOGIN_SUCCESS); TryStartPoll(); } else { onSwitch = () => { Logout(); AntiAddictionUIKit.ExternalCallback?.Invoke(StartUpResult.SWITCH_ACCOUNT, null); }; tcs.TrySetResult(StartUpResult.DURATION_LIMIT); } if (onSwitch != null) { TapTapAntiAddictionUIKit.OpenHealthReminderPanel(playable, null, onSwitch); } return await tcs.Task; } /// /// 轮询时,发现不可玩处理 /// /// protected override void OnUnplayablePostPoll(PlayableResult playable) { Action onExitGame = Application.Quit; TapTapAntiAddictionUIKit.OpenHealthReminderPanel(playable, onExitGame); AntiAddictionUIKit.ExternalCallback?.Invoke(StartUpResult.DURATION_LIMIT, null); } protected override async Task CheckPlayableAsync() { if (_initCheckPlayableTimeVietnam == null) _initCheckPlayableTimeVietnam = DateTime.Now; var result = await base.CheckPlayableAsync(); if (_remainTimeCache == null) _remainTimeCache = result.RemainTime; return result; } internal override async Task CheckPlayableOnPollingAsync() { PlayableResult playable = await base.CheckPlayableOnPollingAsync(); _initCheckPlayableTimeVietnam = DateTime.Now; _remainTimeCache = playable.RemainTime; return playable; } internal override void Logout() { base.Logout(); _initCheckPlayableTimeVietnam = null; _remainTimeCache = null; } #endregion /// /// 打开越南实名制窗口 /// /// private Task OpenVerificationPanelVietnam() { var tcs = new TaskCompletionSource(); var path = AntiAddictionConst.GetPrefabPath(AntiAddictionConst.TIME_SELECTOR_PANEL_NAME, TapTapAntiAddictionManager.IsUseMobileUI()); var timeSelectorPanel = UIManager.Instance.OpenUI(path); if (timeSelectorPanel == null) return tcs.Task; timeSelectorPanel.OnVerified = (verification) => tcs.TrySetResult(verification); timeSelectorPanel.OnException = () => tcs.TrySetException(new Exception("Vietnam Verification Failed")); timeSelectorPanel.OnClosed = () => tcs.TrySetCanceled(); return tcs.Task; } } }