123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- using System;
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using Newtonsoft.Json;
- using UnityEngine.SceneManagement;
- using Cinemachine;
- using UnityEngine.UI;
- using TMPro;
- /* 使用login token进行登录和数据读取保存
- * TestDataInjection 是测试用的假数据注入
- * LoginTokenCheck 验证login token是否有效,和服务器比对
- * 比较版本是否可以符合游戏可以允许最低版本
- * 弹出用户注册窗口
- */
- public class LoginController : MonoBehaviour
- {
- // Start is called once before the first execution of Update after the MonoBehaviour is created
- private GameObject canvasPlaceholder, regCanvas, createAdoptCanvas, loginCanvas;
- void Start()
- {
- canvasPlaceholder = GameObject.Find("Canvas Placeholder");
- regCanvas = canvasPlaceholder.transform.Find("Register Canvas").gameObject;
- createAdoptCanvas = canvasPlaceholder.transform.Find("Create Or Adopt Canvas").gameObject;
- loginCanvas = canvasPlaceholder.transform.Find("Login Canvas").gameObject;
- // 判断是否要切换到注册狗的子场景
- if (GameData.subScene == "Login_InitDog")
- {
- SwitchToInitDogScene();
- GameData.subScene = null;
- }
- else
- {
- //启动自动采用Login Token 登录。其他登录方式为手动登录。
- StartCoroutine(LoginTokenRequest());
- }
- }
- // Update is called once per frame
- //void Update()
- //{
- //}
- // LoginToken登录方法
- IEnumerator LoginTokenRequest()
- {
- Debug.Log("LoginToken Request start");
- string UUID = SystemInfo.deviceUniqueIdentifier; // 这里需要考虑这段代码执行在Enviroment Controller之前
- string LoginToken = PlayerPrefs.GetString("LoginToken", null);
- string LoginTokenTime = PlayerPrefs.GetString("LoginTokenTime", null);
- // 比较LoginTokenTime 如果超时直接放弃后面代码。比较UUID是否是null如果是直接放弃后面代码
- if (LoginToken == null) { yield break; }
- ;
- if (LoginTokenTime == null) { yield break; }
- ;
- DateTime tokenTime;
- DateTime now = DateTime.Now;
- if (DateTime.TryParse(LoginTokenTime, out tokenTime))
- {
- TimeSpan span = now - tokenTime;
- if (span.TotalHours > 7 * 24)
- {
- yield break;
- }
- }
- else { yield break; }
- // 提交POST
- string url = "/api/login/token/";
- WWWForm form = new();
- form.AddField("login_token", LoginToken);
- form.AddField("UUID", UUID);
- StartCoroutine(WebController.PostRequest(url, form, callback: LoginTokenCallback));
- }
- // Post之后callback的函数
- void LoginTokenCallback(string json)
- {
- LoginSucessHandler(json);
- if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
- {
- // 启动获取用户信息请求
- StartCoroutine(GetUserData());
- }
- else
- {
- Debug.Log("LoginTokenCallback 登陆失败");
- Debug.Log(json);
- }
- }
- void LoginSucessHandler(string json)
- {
- var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
- if (data != null && data["status"] == "success")
- {
- Debug.Log("Login Token sucess!");
- PlayerPrefs.SetString("LoginToken", data["login_token"]);
- PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
- EnviromentSetting.accessToken = data["access_token"];
- EnviromentSetting.accessTokenReceivedTime = DateTime.Now;
- UserProperty.userId = data["user_id"];
- // 比较游戏版本
- // TODO 等后台更改后删除
- //string allowed_client_ver = data["allowed_client_ver"];
- string allowed_client_ver = "0.1";
- string current_ver = EnviromentSetting.version;
- Version curVer = new Version(current_ver);
- Version allowVer = new Version(allowed_client_ver);
- int verCompare = curVer.CompareTo(allowVer);
- if (verCompare < 0)
- {
- // 弹窗,然后退出
- string err_msg;
- if (EnviromentSetting.platform == "IPhonePlayer")
- {
- err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_IOS", EnviromentSetting.languageCode });
- }
- else if (EnviromentSetting.platform == "Android")
- {
- if (EnviromentSetting.languageCode == "zh-cn") // 安卓中文环境
- {
- err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_CN", EnviromentSetting.languageCode });
- }
- else
- {
- // 安卓其他语言
- err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Andriod_WW", EnviromentSetting.languageCode });
- }
- }
- else
- {
- // 不明操作系统
- err_msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "not_allow_version_Generic", EnviromentSetting.languageCode });
- }
- MessageBoxController.ShowMessage(err_msg, ShutDown);
- }
- }
- else
- {
- Debug.Log("Login Token fail!");
- Debug.Log(json);
- }
- }
- // 当版本检查不符合游戏时退出游戏
- public void ShutDown()
- {
- Application.Quit();
- }
- IEnumerator GetUserData()
- {
- Debug.Log("GetUserData request");
- yield return null; // 跳过第一帧
- // 提交POST
- string url = "/api/user/info/";
- WWWForm form = new();
- form.AddField("user_id", UserProperty.userId);
- StartCoroutine(WebController.PostRequest(url, form, callback: GetUserDataCallback));
- }
- void GetUserDataCallback(string json)
- {
- var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
- if (data != null && data["status"].ToString() == "success")
- {
- var user_info = data["user_info"].ToString();
- UserProperty.FreshUserInfo(user_info);
- // 保存狗的数据
- string dogsJson = data["dogs"].ToString();
- UserProperty.FreshDogInfo(dogsJson);
- // 保存道具数据
- UserProperty.FreshUserItems(data["props"].ToString());
- // 判断用户狗的数量,如果为0就跳转用户创建狗。
- if (UserProperty.dogs.Count < 1)
- {
- SwitchToInitDogScene();
- }
- else if (!UserProperty.isRegUser)
- {
- // 如果非注册用户,提示用户注册
- var loginCanvas = GameObject.Find("Login Canvas");
- loginCanvas.SetActive(false);
- string msg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "reg_reminder", EnviromentSetting.languageCode });
- //MessageBoxController.YorN_Message(msg, ()=> regCanvas.SetActive(true), ()=> SceneManager.LoadScene("Home"));
- MessageBoxController.YorN_Message(msg, () => regCanvas.SetActive(true), () => MaskTransitions.TransitionManager.Instance.LoadLevel("Home"));
- }
- else
- {
- ShowStartGameUI();
- }
- }
- else
- {
- Debug.Log(data["message"]);
- }
- }
- void ShowStartGameUI()
- {
- var uiPlaceholder = GameObject.Find("Canvas Placeholder");
- if (uiPlaceholder != null)
- {
- var startGameUI = uiPlaceholder.transform.Find("Start Game Canvas").gameObject;
- startGameUI.SetActive(true);
- var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject;
- loginCanvas.SetActive(false);
- }
- }
- // Quick Start 登录方式,用UUID换取Login Token
- public void QuickStart()
- {
- Debug.Log("Quick start post request.");
- string url = "/api/game/quick_start/";
- Dictionary<string, string> formData = new();
- WWWForm form = new();
- form.AddField("UUID", EnviromentSetting.UUID);
- StartCoroutine(WebController.PostRequest(url, form, callback: QuickStartCallback));
- }
- void QuickStartCallback(string json)
- {
- var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
- if (data != null && data["status"] == "success")
- {
- PlayerPrefs.SetString("LoginToken", data["login_token"]);
- PlayerPrefs.SetString("LoginTokenTime", DateTime.Now.ToString());
- UserProperty.userId = data["user_id"];
- StartCoroutine(LoginTokenRequest());
- }
- else
- {
- string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode });
- MessageBoxController.ShowMessage(errMsg);
- }
- }
- public void ResetPassword()
- {
- var uiPlaceholder = GameObject.Find("Canvas Placeholder");
- if (uiPlaceholder != null)
- {
- var resetUI = uiPlaceholder.transform.Find("Reset Pasword").gameObject;
- var loginCanvas = uiPlaceholder.transform.Find("Login Canvas").gameObject;
- resetUI.SetActive(true);
- loginCanvas.SetActive(false);
- }
- }
- // 切换到生成狗的子场景
- void SwitchToInitDogScene()
- {
-
- createAdoptCanvas.SetActive(true);
- loginCanvas.SetActive(false);
- regCanvas.SetActive(false);
- var loginCam = GameObject.Find("V Cam Login").GetComponent<CinemachineVirtualCamera>();
- var initDogCam = GameObject.Find("V Cam Init Dog").GetComponent<CinemachineVirtualCamera>();
- loginCam.Priority = 0;
- initDogCam.Priority = 10;
- }
- // 使用账户密码登录方法
- public void Login()
- {
- string account = GameObject.Find("Account input").GetComponent<TMP_InputField>().text;
- string password = GameObject.Find("Password input").GetComponent<TMP_InputField>().text;
- string url = "/api/login/";
- Dictionary<string, string> formData = new();
- WWWForm form = new();
- form.AddField("client_language", EnviromentSetting.languageCode);
- if (EnviromentSetting.languageCode == "zh-cn")
- {
- form.AddField("mobile_number", account.Trim());
- }
- else
- {
- form.AddField("email", account.Trim());
- }
- form.AddField("password", password.Trim());
- StartCoroutine(WebController.PostRequest(url, form, callback: LoginCallback));
- }
- void LoginCallback(string json)
- {
- var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
- if (data != null && data["status"].ToString() == "success")
- {
- LoginSucessHandler(json);
- if (UserProperty.userId != null && EnviromentSetting.accessToken != null)
- {
- // 启动获取用户信息请求
- StartCoroutine(GetUserData());
- }
- else
- {
- Debug.Log("LoginTokenCallback 登陆失败");
- Debug.Log(json);
- }
- }
- else
- {
- string errMsg = GameTool.GetValueAtPath(EnviromentSetting.languageData, new string[] { "game_message", "login_fail", EnviromentSetting.languageCode });
- MessageBoxController.ShowMessage(errMsg);
- }
- }
- }
|