TapTapAntiAddictionManager.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using System.Reflection;
  5. using Localization.AntiAddiction;
  6. using TapSDK.UI;
  7. using TapTap.AntiAddiction.Model;
  8. using TapTap.AntiAddiction.Internal.Http;
  9. using UnityEngine;
  10. using Network = TapTap.AntiAddiction.Internal.Network;
  11. namespace TapTap.AntiAddiction
  12. {
  13. public class TapTapAntiAddictionManager
  14. {
  15. internal static string GameId => AntiAddictionConfig.gameId;
  16. internal static string UserId;
  17. private static AntiAddictionConfig config;
  18. private static bool needResumePoll;
  19. public static AntiAddictionConfig AntiAddictionConfig => config == null ? config = new AntiAddictionConfig() : config;
  20. internal static string GetRsaPublicKey() => Worker.RsaPublicKey;
  21. public static AntiAddictionLocalizationItems LocalizationItems
  22. {
  23. get
  24. {
  25. if (_antiAddictionLocalizationItems == null)
  26. {
  27. LocalizationMgr.Instance.SetLanguageType(AntiAddictionConfig.region == Region.China ? ELanguageType.cn : ELanguageType.en);
  28. var textAsset = Resources.Load<TextAsset>(AntiAddictionLocalizationItems.PATH);
  29. _antiAddictionLocalizationItems = AntiAddictionLocalizationItems.FromJson(textAsset.text);
  30. }
  31. return _antiAddictionLocalizationItems;
  32. }
  33. }
  34. private static AntiAddictionLocalizationItems _antiAddictionLocalizationItems;
  35. private static PlayableResult _currentPlayableResult;
  36. internal static PlayableResult CurrentPlayableResult
  37. {
  38. get => _currentPlayableResult;
  39. set
  40. {
  41. if (CurrentRemainSeconds == null)
  42. {
  43. AntiAddictionPoll.StartCountdownRemainTime();
  44. }
  45. if (value != null)
  46. {
  47. CurrentRemainSeconds = value.RemainTime;
  48. }
  49. _currentPlayableResult = value;
  50. }
  51. }
  52. internal static int? CurrentRemainSeconds {get; set; }
  53. /// <summary>
  54. /// 初始化, 建议使用这个接口,因为默认调用了 SetRegion,如果使用另一个 Init 接口,需要在 Init 之后,手动调用 SetRegion
  55. /// </summary>
  56. /// <param name="config"></param>
  57. public static void Init(AntiAddictionConfig config)
  58. {
  59. if (config == null)
  60. {
  61. throw new ArgumentNullException(nameof(config));
  62. }
  63. Init(config.gameId, config.showSwitchAccount);
  64. SetRegion(config.region);
  65. }
  66. /// <summary>
  67. /// 初始化
  68. /// </summary>
  69. /// <param name="gameId"></param>
  70. /// <param name="showSwitchAccount"></param>
  71. public static void Init(string gameId,
  72. bool showSwitchAccount = true)
  73. {
  74. if (string.IsNullOrEmpty(gameId))
  75. {
  76. throw new ArgumentNullException(nameof(gameId));
  77. }
  78. AntiAddictionConfig.showSwitchAccount = showSwitchAccount;
  79. Network.SetGameId(gameId);
  80. }
  81. /// <summary>
  82. /// 设置地区 (在启动之前设置)
  83. /// </summary>
  84. /// <param name="region"></param>
  85. public static void SetRegion(Region region)
  86. {
  87. Network.ChangeRegion(region);
  88. Network.ChangeHost();
  89. if (region == AntiAddictionConfig.region) return;
  90. AntiAddictionConfig.region = region;
  91. LocalizationMgr.Instance.SetLanguageType(region == Region.China ? ELanguageType.cn : ELanguageType.en);
  92. var textAsset = Resources.Load<TextAsset>(AntiAddictionLocalizationItems.PATH);
  93. _antiAddictionLocalizationItems = AntiAddictionLocalizationItems.FromJson(textAsset.text);
  94. }
  95. /// <summary>
  96. /// 启动
  97. /// </summary>
  98. /// <param name="userId">用户名</param>
  99. /// <returns></returns>
  100. public static async Task<int> StartUp( string userId)
  101. {
  102. if (string.IsNullOrEmpty(userId))
  103. {
  104. throw new ArgumentNullException(nameof(userId));
  105. }
  106. if (AntiAddictionConfig.useTapLogin)
  107. {
  108. throw new NotImplementedException();
  109. }
  110. UserId = Uri.EscapeDataString(userId);
  111. return await FetchVerification();
  112. }
  113. /// <summary>
  114. /// 获取身份验证状态
  115. /// </summary>
  116. /// <returns></returns>
  117. private static async Task<int> FetchVerification()
  118. {
  119. var worker = Worker;
  120. if (worker == null)
  121. {
  122. throw new ArgumentException($"Region {AntiAddictionConfig.region} is out of range!");
  123. }
  124. UIManager.Instance.OpenLoading();
  125. await worker.FetchConfigAsync();
  126. worker.OnConfigFetched();
  127. await worker.FetchVerificationAsync();
  128. return await worker.OnVerificationFetched();
  129. }
  130. /// <summary>
  131. /// 登出
  132. /// </summary>
  133. public static void Logout()
  134. {
  135. CurrentRemainSeconds = null;
  136. CurrentPlayableResult = null;
  137. Worker.Logout();
  138. }
  139. /// <summary>
  140. /// 检查支付
  141. /// </summary>
  142. /// <param name="amount"></param>
  143. /// <returns></returns>
  144. public static async Task<PayableResult> CheckPayLimit(long amount)
  145. {
  146. return await Worker.CheckPayableAsync(amount);
  147. }
  148. /// <summary>
  149. /// 上报支付
  150. /// </summary>
  151. /// <param name="amount"></param>
  152. /// <returns></returns>
  153. public static Task SubmitPayResult(long amount)
  154. {
  155. return Worker.SubmitPayResult(amount);
  156. }
  157. /// <summary>
  158. /// 轮询时,检查可玩性
  159. /// </summary>
  160. /// <returns></returns>
  161. internal static async Task<PlayableResult> CheckPlayableOnPolling()
  162. {
  163. CurrentPlayableResult = await Worker.CheckPlayableOnPollingAsync();
  164. return CurrentPlayableResult;
  165. }
  166. internal static async Task<bool> IsStandaloneEnabled()
  167. {
  168. return await Worker.IsStandaloneEnabled();
  169. }
  170. public static void EnterGame()
  171. {
  172. if (needResumePoll)
  173. {
  174. AntiAddictionPoll.StartUp();
  175. needResumePoll = false;
  176. }
  177. }
  178. public static void LeaveGame()
  179. {
  180. if (AntiAddictionPoll.StartPoll)
  181. {
  182. AntiAddictionPoll.Logout();
  183. needResumePoll = true;
  184. }
  185. }
  186. /// <summary>
  187. /// 是否使用移动版 UI,否则就是用 Standalone 版本 UI
  188. /// </summary>
  189. /// <returns></returns>
  190. public static bool IsUseMobileUI()
  191. {
  192. if (useMobileUI != null)
  193. return useMobileUI.Value;
  194. #if UNITY_ANDROID || UNITY_IOS
  195. return true;
  196. #else
  197. return false;
  198. #endif
  199. }
  200. public static bool? useMobileUI;
  201. #region Worker
  202. private static readonly Dictionary<Region, BaseAntiAddictionWorker>
  203. Workers = new Dictionary<Region, BaseAntiAddictionWorker>();
  204. private static BaseAntiAddictionWorker GetWorker(Region region)
  205. {
  206. if (Workers.TryGetValue(region, out BaseAntiAddictionWorker worker) && worker != null)
  207. return worker;
  208. BaseAntiAddictionWorker newWorker = null;
  209. switch (region)
  210. {
  211. case Region.China:
  212. newWorker = new ChinaAntiAddictionWorker();
  213. break;
  214. case Region.Vietnam:
  215. newWorker = new VietnamAntiAddictionWorker();
  216. break;
  217. }
  218. Workers[region] = newWorker;
  219. Debug.LogFormat($"Get New Worker! region: {region.ToString()} newWorker: {(newWorker != null ? newWorker.GetType().ToString() : "NULL")} worker In Dic: {(Workers[region] != null ? Workers[region].GetType().ToString() : "NULL")}");
  220. return newWorker;
  221. }
  222. private static BaseAntiAddictionWorker Worker => GetWorker(AntiAddictionConfig.region);
  223. #endregion
  224. }
  225. }