LoginController.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using Newtonsoft.Json;
  6. using UnityEngine.SceneManagement;
  7. using Cinemachine;
  8. using UnityEngine.UI;
  9. using TMPro;
  10. /* 使用login token进行登录和数据读取保存
  11. * TestDataInjection 是测试用的假数据注入
  12. * LoginTokenCheck 验证login token是否有效,和服务器比对
  13. * 比较版本是否可以符合游戏可以允许最低版本
  14. * 弹出用户注册窗口
  15. */
  16. public class LoginController : MonoBehaviour
  17. {
  18. // Start is called once before the first execution of Update after the MonoBehaviour is created
  19. private GameObject canvasPlaceholder, regCanvas, createAdoptCanvas, loginCanvas;
  20. public static LoginController instance; // 用于在其他脚本中调用LoginController的函数
  21. private void Awake()
  22. {
  23. // 确保loginController在Awake阶段被正确赋值
  24. if (instance == null)
  25. {
  26. instance = this;
  27. }
  28. }
  29. void Start()
  30. {
  31. canvasPlaceholder = GameObject.Find("Canvas Placeholder");
  32. regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject;
  33. createAdoptCanvas = canvasPlaceholder.transform.Find("Create Or Adopt Canvas").gameObject;
  34. loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
  35. // 判断是否要切换到注册狗的子场景
  36. if (GameData.subScene == "Login_InitDog")
  37. {
  38. SwitchToInitDogScene();
  39. GameData.subScene = null;
  40. }
  41. else
  42. {
  43. //启动自动采用Login Token 登录。其他登录方式为手动登录。
  44. StartCoroutine(LoginTokenRequest());
  45. }
  46. }
  47. // Update is called once per frame
  48. //void Update()
  49. //{
  50. //}
  51. // LoginToken登录方法
  52. IEnumerator LoginTokenRequest()
  53. {
  54. Debug.Log("LoginToken Request start");
  55. string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前
  56. string LoginToken = PlayerPrefs.GetString("LoginToken", null);
  57. string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null);
  58. // 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码
  59. if (LoginToken == null) { yield break; }
  60. ;
  61. if (LoginTokenTime == null) { yield break; }
  62. ;
  63. DateTime tokenTime;
  64. DateTime now = DateTime.Now;
  65. if (DateTime.TryParse(LoginTokenTime, out tokenTime))
  66. {
  67. TimeSpan span = now - tokenTime;
  68. if (span.TotalHours > 7 * 24)
  69. {
  70. yield break;
  71. }
  72. }
  73. else { yield break; }
  74. // 提交POST
  75. string url = "/api/login/token/";
  76. WWWForm form = new();
  77. form.AddField("login_token", LoginToken);
  78. form.AddField("UUID", UUID);
  79. StartCoroutine(WebController.PostRequest(url, form, callback: LoginTokenCallback));
  80. }
  81. // Post之后callback的函数
  82. void LoginTokenCallback(string json)
  83. {
  84. LoginSucessHandler(json);
  85. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  86. {
  87. // 启动获取用户信息请求
  88. GetUserData();
  89. }
  90. else
  91. {
  92. Debug.Log("LoginTokenCallback 登陆失败");
  93. Debug.Log(json);
  94. }
  95. }
  96. void LoginSucessHandler(string json)
  97. {
  98. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  99. if (data != null && data["status"] == "success")
  100. {
  101. Debug.Log("Login Token sucess!");
  102. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  103. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  104. EnviromentSetting.accessToken = data["access_token"];
  105. EnviromentSetting.accessTokenReceivedTime = DateTime.Now;
  106. UserProperty.userId = data["user_id"];
  107. // 比较游戏版本
  108. // TODO 等后台更改后删除
  109. //string allowed_client_ver = data["allowed_client_ver"];
  110. string allowed_client_ver = "0.1";
  111. string current_ver = EnviromentSetting.version;
  112. Version curVer = new Version(current_ver);
  113. Version allowVer = new Version(allowed_client_ver);
  114. int verCompare = curVer.CompareTo(allowVer);
  115. if (verCompare < 0)
  116. {
  117. // 弹窗,然后退出
  118. string err_msg;
  119. if (EnviromentSetting.platform == "IPhonePlayer")
  120. {
  121. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_IOS", EnviromentSetting.languageCode });
  122. }
  123. else if (EnviromentSetting.platform == "Android")
  124. {
  125. if (EnviromentSetting.languageCode == "zh-cn") // 安卓中文环境
  126. {
  127. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_CN", EnviromentSetting.languageCode });
  128. }
  129. else
  130. {
  131. // 安卓其他语言
  132. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_WW", EnviromentSetting.languageCode });
  133. }
  134. }
  135. else
  136. {
  137. // 不明操作系统
  138. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Generic", EnviromentSetting.languageCode });
  139. }
  140. MessageBoxController.ShowMessage(err_msg, ShutDown);
  141. }
  142. }
  143. else
  144. {
  145. Debug.Log("Login Token fail!");
  146. Debug.Log(json);
  147. }
  148. }
  149. // 当版本检查不符合游戏时退出游戏
  150. public void ShutDown()
  151. {
  152. Application.Quit();
  153. }
  154. public void GetUserData()
  155. {
  156. Debug.Log("GetUserData request");
  157. // 提交POST
  158. string url = "/api/user/info/";
  159. WWWForm form = new();
  160. form.AddField("user_id", UserProperty.userId);
  161. StartCoroutine(WebController.PostRequest(url, form, callback: GetUserDataCallback));
  162. }
  163. void GetUserDataCallback(string json)
  164. {
  165. var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
  166. if (data != null && data["status"].ToString() == "success")
  167. {
  168. var user_info = data["user_info"].ToString();
  169. UserProperty.FreshUserInfo(user_info);
  170. // 保存狗的数据
  171. string dogsJson = data["dogs"].ToString();
  172. UserProperty.FreshDogInfo(dogsJson);
  173. // 保存道具数据
  174. UserProperty.FreshUserItems(data["props"].ToString());
  175. // 判断用户狗的数量,如果为0就跳转用户创建狗。
  176. if (UserProperty.dogs.Count < 1)
  177. {
  178. SwitchToInitDogScene();
  179. }
  180. // 如果非注册用户,提示用户注册
  181. else if (!UserProperty.isRegUser)
  182. {
  183. // 如果没有提醒过
  184. if (!GameData.hasRemindedRegister)
  185. {
  186. GameData.hasRemindedRegister = true;
  187. var canvasPlaceholder = GameObject.Find("Canvas Placeholder");
  188. var loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
  189. loginCanvas.SetActive(false);
  190. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "reg_reminder", EnviromentSetting.languageCode });
  191. //MessageBoxController.YorN_Message(msg, ()=> regCanvas.SetActive(true), ()=> SceneManager.LoadScene("Home"));
  192. MessageBoxController.YorN_Message(msg, () => regCanvas.SetActive(true), () => MaskTransitions.TransitionManager.Instance.LoadLevel("Home"));
  193. }
  194. else
  195. {
  196. MaskTransitions.TransitionManager.Instance.LoadLevel("Home");
  197. }
  198. }
  199. else
  200. {
  201. ShowStartGameUI();
  202. }
  203. }
  204. else
  205. {
  206. Debug.Log(data["message"]);
  207. }
  208. }
  209. void ShowStartGameUI()
  210. {
  211. var uiPlaceholder = GameObject.Find("Canvas Placeholder");
  212. if (uiPlaceholder != null)
  213. {
  214. var startGameUI = uiPlaceholder.transform.Find("Start Game Canvas").gameObject;
  215. startGameUI.SetActive(true);
  216. var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject;
  217. loginCanvas.SetActive(false);
  218. }
  219. }
  220. // Quick Start 登录方式,用UUID换取Login Token
  221. public void QuickStart()
  222. {
  223. Debug.Log("Quick start post request.");
  224. string url = "/api/game/quick_start/";
  225. Dictionary<string, string> formData = new();
  226. WWWForm form = new();
  227. form.AddField("UUID", EnviromentSetting.UUID);
  228. StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback));
  229. }
  230. void QuickStartCallback(string json)
  231. {
  232. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  233. if (data != null && data["status"] == "success")
  234. {
  235. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  236. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  237. UserProperty.userId = data["user_id"];
  238. StartCoroutine(LoginTokenRequest());
  239. }
  240. else
  241. {
  242. string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode });
  243. MessageBoxController.ShowMessage(errMsg);
  244. }
  245. }
  246. public void ResetPassword()
  247. {
  248. var uiPlaceholder = GameObject.Find("Canvas Placeholder");
  249. if (uiPlaceholder != null)
  250. {
  251. var resetUI = uiPlaceholder.transform.Find("Reset Pasword").gameObject;
  252. var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject;
  253. resetUI.SetActive(true);
  254. loginCanvas.SetActive(false);
  255. }
  256. }
  257. // 切换到生成狗的子场景
  258. void SwitchToInitDogScene()
  259. {
  260. createAdoptCanvas.SetActive(true);
  261. loginCanvas.SetActive(false);
  262. regCanvas.SetActive(false);
  263. var loginCam = GameObject.Find("V Cam Login").GetComponent<CinemachineVirtualCamera>();
  264. var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
  265. loginCam.Priority = 0;
  266. initDogCam.Priority = 10;
  267. }
  268. // 使用账户密码登录方法
  269. public void Login()
  270. {
  271. string account = GameObject.Find("Account input").GetComponent<TMP_InputField>().text;
  272. string password = GameObject.Find("Password input").GetComponent<TMP_InputField>().text;
  273. string url = "/api/login/";
  274. Dictionary<string, string> formData = new();
  275. WWWForm form = new();
  276. form.AddField("client_language", EnviromentSetting.languageCode);
  277. if (EnviromentSetting.languageCode == "zh-cn")
  278. {
  279. form.AddField("mobile_number", account.Trim());
  280. }
  281. else
  282. {
  283. form.AddField("email", account.Trim());
  284. }
  285. form.AddField("password", password.Trim());
  286. StartCoroutine(WebController.PostRequest(url, form, callback: LoginCallback));
  287. }
  288. void LoginCallback(string json)
  289. {
  290. var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
  291. if (data != null && data["status"].ToString() == "success")
  292. {
  293. LoginSucessHandler(json);
  294. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  295. {
  296. // 启动获取用户信息请求
  297. GetUserData();
  298. }
  299. else
  300. {
  301. Debug.Log("LoginTokenCallback 登陆失败");
  302. Debug.Log(json);
  303. }
  304. }
  305. else
  306. {
  307. string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode });
  308. MessageBoxController.ShowMessage(errMsg);
  309. }
  310. }
  311. }