LoginController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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, initDogCanvas, loginCanvas;
  20. void Start()
  21. {
  22. canvasPlaceholder = GameObject.Find("Canvas Placeholder");
  23. regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject;
  24. initDogCanvas = canvasPlaceholder.transform.Find("Init Dog Canvas").gameObject;
  25. loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
  26. // 判断是否要切换到注册狗的子场景
  27. if ( GameData.subScene == "Login_InitDog")
  28. {
  29. SwitchToInitDogScene();
  30. GameData.subScene = null;
  31. }
  32. else
  33. {
  34. //启动自动采用Login Token 登录。其他登录方式为手动登录。
  35. StartCoroutine(LoginTokenRequest());
  36. }
  37. }
  38. // Update is called once per frame
  39. //void Update()
  40. //{
  41. //}
  42. // LoginToken登录方法
  43. IEnumerator LoginTokenRequest()
  44. {
  45. Debug.Log("LoginToken Request start");
  46. string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前
  47. string LoginToken = PlayerPrefs.GetString("LoginToken", null);
  48. string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null);
  49. // 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码
  50. if (LoginToken == null) { yield break; };
  51. if (LoginTokenTime == null) { yield break; };
  52. DateTime tokenTime;
  53. DateTime now = DateTime.Now;
  54. if (DateTime.TryParse(LoginTokenTime, out tokenTime))
  55. {
  56. TimeSpan span = now - tokenTime;
  57. if (span.TotalHours > 7 * 24)
  58. {
  59. yield break;
  60. }
  61. }
  62. else { yield break; }
  63. // 提交POST
  64. string url = "/api/login/token/";
  65. WWWForm form = new();
  66. form.AddField("login_token", LoginToken);
  67. form.AddField("UUID", UUID);
  68. StartCoroutine(WebController.PostRequest(url, form, callback:LoginTokenCallback));
  69. }
  70. // Post之后callback的函数
  71. void LoginTokenCallback(string json)
  72. {
  73. LoginSucessHandler(json);
  74. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  75. {
  76. // 启动获取用户信息请求
  77. StartCoroutine(GetUserData());
  78. }
  79. else
  80. {
  81. Debug.Log("LoginTokenCallback 登陆失败");
  82. Debug.Log(json);
  83. }
  84. }
  85. void LoginSucessHandler(string json)
  86. {
  87. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  88. if (data != null && data["status"] == "success")
  89. {
  90. Debug.Log("Login Token sucess!");
  91. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  92. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  93. EnviromentSetting.accessToken = data["access_token"];
  94. EnviromentSetting.accessTokenReceivedTime = DateTime.Now;
  95. UserProperty.userId = data["user_id"];
  96. // todo 用user id 获取用户数据并保存
  97. // 比较游戏版本
  98. // TODO 等后台更改后删除
  99. //string allowed_client_ver = data["allowed_client_ver"];
  100. string allowed_client_ver = "0.1";
  101. string current_ver = EnviromentSetting.version;
  102. Version curVer = new Version(current_ver);
  103. Version allowVer = new Version(allowed_client_ver);
  104. int verCompare = curVer.CompareTo(allowVer);
  105. if (verCompare < 0) {
  106. // 弹窗,然后退出
  107. string err_msg;
  108. if (EnviromentSetting.platform == "IPhonePlayer")
  109. {
  110. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_IOS", EnviromentSetting.languageCode });
  111. }
  112. else if (EnviromentSetting.platform == "Android")
  113. {
  114. if (EnviromentSetting.languageCode == "zh-cn") // 安卓中文环境
  115. {
  116. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_CN", EnviromentSetting.languageCode });
  117. }
  118. else
  119. {
  120. // 安卓其他语言
  121. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_WW", EnviromentSetting.languageCode });
  122. }
  123. }
  124. else
  125. {
  126. // 不明操作系统
  127. err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Generic", EnviromentSetting.languageCode });
  128. }
  129. MessageBoxController.ShowMessage(err_msg, ShutDown);
  130. }
  131. }
  132. // 当版本检查不符合游戏时退出游戏
  133. void ShutDown()
  134. {
  135. Application.Quit();
  136. }
  137. }
  138. IEnumerator GetUserData()
  139. {
  140. Debug.Log("GetUserData request");
  141. yield return null; // 跳过第一帧
  142. // 提交POST
  143. string url = "/api/user/info/";
  144. WWWForm form = new();
  145. form.AddField("user_id", UserProperty.userId);
  146. StartCoroutine(WebController.PostRequest(url, form, callback: GetUserDataCallback));
  147. }
  148. void GetUserDataCallback(string json)
  149. {
  150. var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
  151. if (data != null && data["status"].ToString() == "success")
  152. {
  153. var user_info = JsonConvert.DeserializeObject<Dictionary<string, string>>(data["user_info"].ToString());
  154. UserProperty.name = user_info["user_name"];
  155. UserProperty.coin = int.Parse(user_info["coin"]);
  156. UserProperty.mobile = user_info["mobile"];
  157. UserProperty.email = user_info["email"];
  158. UserProperty.level = user_info["level"];
  159. if (UserProperty.level == "pro"){ EnviromentSetting.maxDogQty = 3; }
  160. UserProperty.isRegUser = bool.Parse(user_info["isRegUser"]);
  161. Debug.Log("login in user id: " + UserProperty.userId);
  162. // 保存狗的数据
  163. DogProperty[] dogProperties = JsonConvert.DeserializeObject<DogProperty[]>(data["dogs"].ToString());
  164. foreach (var dog in dogProperties)
  165. {
  166. UserProperty.dogs.Add(dog);
  167. }
  168. // 判断用户狗的数量,如果为0就跳转用户创建狗。
  169. if (UserProperty.dogs.Count < 1)
  170. {
  171. SwitchToInitDogScene();
  172. }
  173. else if (!UserProperty.isRegUser)
  174. {
  175. // 如果非注册用户,提示用户注册
  176. string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "reg_reminder", EnviromentSetting.languageCode });
  177. MessageBoxController.YorN_Message(msg, ()=> regCanvas.SetActive(true), ()=> SceneManager.LoadScene("Home"));
  178. }
  179. else
  180. {
  181. SceneManager.LoadScene("Home");
  182. }
  183. }else{
  184. Debug.Log(data["message"]);
  185. }
  186. }
  187. // Quick Start 登录方式,用UUID换取Login Token
  188. public void QuickStart()
  189. {
  190. Debug.Log("Quick start post request.");
  191. string url = "/api/game/quick_start/";
  192. Dictionary<string, string> formData = new();
  193. WWWForm form = new();
  194. form.AddField("UUID", EnviromentSetting.UUID);
  195. StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback));
  196. }
  197. void QuickStartCallback(string json)
  198. {
  199. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  200. if (data != null && data["status"] == "success")
  201. {
  202. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  203. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  204. UserProperty.userId = data["user_id"];
  205. StartCoroutine(LoginTokenRequest());
  206. }
  207. else
  208. {
  209. string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode });
  210. MessageBoxController.ShowMessage(errMsg);
  211. }
  212. }
  213. // 切换到生成狗的子场景
  214. void SwitchToInitDogScene()
  215. {
  216. initDogCanvas.SetActive(true);
  217. loginCanvas.SetActive(false);
  218. regCanvas.SetActive(false);
  219. var loginCam = GameObject.Find("V Cam Login").GetComponent<CinemachineVirtualCamera>();
  220. var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
  221. loginCam.Priority = 0;
  222. initDogCam.Priority = 10;
  223. }
  224. // 使用账户密码登录方法
  225. public void Login()
  226. {
  227. string account = GameObject.Find("Account input").GetComponent<TMP_InputField>().text;
  228. string password = GameObject.Find("Password input").GetComponent<TMP_InputField>().text;
  229. string url = "/api/login/";
  230. Dictionary<string, string> formData = new();
  231. WWWForm form = new();
  232. form.AddField("client_language", EnviromentSetting.languageCode);
  233. if (EnviromentSetting.languageCode == "zh-cn")
  234. {
  235. form.AddField("mobile_number", account);
  236. }
  237. else
  238. {
  239. form.AddField("email", account);
  240. }
  241. form.AddField("password", password);
  242. StartCoroutine(WebController.PostRequest(url, form, callback: LoginCallback));
  243. }
  244. void LoginCallback(string json)
  245. {
  246. LoginSucessHandler(json);
  247. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  248. {
  249. // 启动获取用户信息请求
  250. StartCoroutine(GetUserData());
  251. }
  252. else
  253. {
  254. // 处理登录失败
  255. }
  256. }
  257. }