LoginController.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Networking;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using Unity.VisualScripting;
  7. using Newtonsoft.Json;
  8. using UnityEngine.SceneManagement;
  9. using UnityEditor;
  10. /* 使用login token进行登录和数据读取保存
  11. * TestDataInjection 是测试用的假数据注入
  12. * LoginTokenCheck 验证login token是否有效,和服务器比对
  13. */
  14. public class LoginController : MonoBehaviour
  15. {
  16. // Start is called once before the first execution of Update after the MonoBehaviour is created
  17. void Start()
  18. {
  19. //启动自动采用Login Token 登录。其他登录方式为手动登录。
  20. //StartCoroutine(LoginTokenRequest());
  21. }
  22. // Update is called once per frame
  23. //void Update()
  24. //{
  25. //}
  26. // LoginToken登录方法
  27. IEnumerator LoginTokenEvent()
  28. {
  29. //yield return null; // 跳过第一帧(可以考虑去掉,数据加载已经移到awake()了。
  30. string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前
  31. string LoginToken = PlayerPrefs.GetString("LoginToken", null);
  32. string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null);
  33. // todo 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码
  34. if (LoginToken == null) { yield break; };
  35. if (LoginTokenTime == null) { yield break; };
  36. DateTime tokenTime;
  37. DateTime now = DateTime.Now;
  38. if (DateTime.TryParse(LoginTokenTime, out tokenTime))
  39. {
  40. TimeSpan span = now - tokenTime;
  41. if (span.TotalHours > 7 * 24)
  42. {
  43. yield break;
  44. }
  45. }
  46. else { yield break; }
  47. // 提交POST
  48. string url = "/api/login/token/";
  49. Dictionary<string, string> formData = new();
  50. formData.Add("login_token", LoginToken);
  51. formData.Add("UUID", UUID);
  52. StartCoroutine(WebController.PostRequest(url, formData, callback:LoginTokenCallback));
  53. }
  54. // Post之后callback的函数
  55. void LoginTokenCallback(string json)
  56. {
  57. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  58. if (data != null && data["status"] == "success") {
  59. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  60. PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
  61. EnviromentSetting.accessToken = data["access_token"];
  62. EnviromentSetting.accessTokenReceivedTime = DateTime.Now;
  63. UserProperty.userId = data["user_id"];
  64. }
  65. if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
  66. {
  67. SceneManager.LoadScene("Home");
  68. }
  69. }
  70. // Quick Start 登录方式,用UUID换取Login Token
  71. public void QuickStart()
  72. {
  73. string url = "/api/game/quick_start/";
  74. Dictionary<string, string> formData = new();
  75. formData.Add("UUID", EnviromentSetting.UUID);
  76. StartCoroutine(WebController.PostRequest(url, formData, callback: QuickStartCallback));
  77. }
  78. void QuickStartCallback(string json)
  79. {
  80. var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
  81. if (data != null && data["status"] == "success")
  82. {
  83. PlayerPrefs.SetString("LoginToken", data["login_token"]);
  84. UserProperty.userId = data["user_id"];
  85. StartCoroutine(LoginTokenEvent());
  86. }
  87. }
  88. }