UserPlayer.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using JCEngineCore;
  5. using UnityEngine.SceneManagement;
  6. using DG.Tweening;
  7. using JCUnityLib;
  8. /* Socket组件-玩家业务 */
  9. public class UserPlayer : JCEntity
  10. {
  11. public static UserPlayer ins;
  12. public UserPlayer() {
  13. ins = this;
  14. components.Add("PKComp", PKComp.Instance);
  15. components.Add("UserComp", UserComp.Instance);
  16. }
  17. public static void ConnectServer() {
  18. if (ins != null) return;
  19. if (AuthLoginMask.ins) AuthLoginMask.ins.SetVisiable(true);
  20. if (CommonConfig.businessServerWsURL != null) {
  21. JCEngine.boot(CommonConfig.businessServerWsURL, new UserPlayer());
  22. } else {
  23. LoginByToken();
  24. }
  25. }
  26. private static int _RetryLoginByTokenCount = -1;
  27. public static void LoginByToken()
  28. {
  29. if (++_RetryLoginByTokenCount > 0)
  30. AuthLoginMask.ins?.SetRetryCount(_RetryLoginByTokenCount);
  31. CoroutineStarter.Start(LoginController.Instance.LoginByToken((res) => {
  32. if (res.code == 0) {
  33. _RetryLoginByTokenCount = -1;
  34. string loginToken = (string)res.data;
  35. CommonConfig.businessServerWsURL = loginToken.Split('&')[2];
  36. PlayerPrefs.SetString(LoginMgr.LoginTokenKey, loginToken);
  37. JCEngine.boot(CommonConfig.businessServerWsURL, new UserPlayer());
  38. } else if (res.code == -9999) {
  39. if (_RetryLoginByTokenCount < 3) {
  40. LoginByToken();
  41. } else {
  42. _RetryLoginByTokenCount = -1;
  43. AuthLoginMask.ins?.SetAutoRetryFail();
  44. }
  45. } else {
  46. _RetryLoginByTokenCount = -1;
  47. handleAuthExpire();
  48. }
  49. }));
  50. }
  51. //之所以做成协程延迟触发,是因为用编辑器调试时,停止运行后会触发断线重连,就会造成游戏停止调试了,但socket还连接的现象。
  52. IEnumerator ReconnenctServer() {
  53. yield return new WaitForSecondsRealtime(0.1f);
  54. JCEngine.reboot(this);
  55. }
  56. bool canReconnnect = true;
  57. public override void onLoad() {
  58. Debug.Log("UserPlayer onLoad()");
  59. authToken();
  60. }
  61. public override void onReload() {
  62. Debug.Log("UserPlayer onReload()");
  63. authToken();
  64. }
  65. public override void onDestroy() {
  66. Debug.Log("UserPlayer onDestroy()");
  67. if (canReconnnect) {
  68. JCUnityLib.CoroutineStarter.Start(ReconnenctServer());
  69. }
  70. }
  71. public override void onMiss() {
  72. Debug.Log("UserPlayer onMiss()");
  73. if (canReconnnect) {
  74. JCUnityLib.CoroutineStarter.Start(ReconnenctServer());
  75. }
  76. }
  77. public void Close() {
  78. LoginMgr.myUserInfo.id = 0;
  79. if (ins == this) ins = null;
  80. this.canReconnnect = false;
  81. this.channel.close();
  82. Debug.Log("user player close");
  83. }
  84. //向服务端发送的请求
  85. public void authToken() {
  86. string p0 = PlayerPrefs.GetString(LoginMgr.LoginTokenKey, "");
  87. string p1 = SceneManager.GetActiveScene().name;
  88. call("authToken2", p0, p1);
  89. }
  90. //被服务端调用的函数
  91. public void onAuthRes(bool res) {
  92. Debug.Log("onAuthRes," + res);
  93. if (res) {
  94. JCUnityLib.CoroutineStarter.Start(RequestUserInfoAvoidFail());
  95. } else {
  96. handleAuthExpire();
  97. }
  98. }
  99. public void RetryRequestUserInfoAvoidFail()
  100. {
  101. _hasExecuteRequestUserInfoAvoidFail = false;
  102. _getUserInfoRetryCount = -1;
  103. _getUserInfoFailed = false;
  104. JCUnityLib.CoroutineStarter.Start(RequestUserInfoAvoidFail());
  105. }
  106. //获取用户信息,超时了就重试
  107. private bool _hasExecuteRequestUserInfoAvoidFail = false;
  108. private int _getUserInfoRetryCount = -1;
  109. private bool _getUserInfoFailed = false;
  110. IEnumerator RequestUserInfoAvoidFail()
  111. {
  112. if (_hasExecuteRequestUserInfoAvoidFail) yield break;
  113. _hasExecuteRequestUserInfoAvoidFail = true;
  114. while (!_hasGetUserInfo && ins == this) {
  115. if (++_getUserInfoRetryCount <= 3) {
  116. UserComp.Instance.getUserInfo(DoAfterGetUserInfo);
  117. if (_getUserInfoRetryCount > 0)
  118. AuthLoginMask.ins?.SetRetryCount(_getUserInfoRetryCount);
  119. yield return new WaitForSeconds(3.3f);
  120. } else {
  121. _getUserInfoFailed = true;
  122. AuthLoginMask.ins?.SetAutoRetryFail();
  123. yield break;
  124. }
  125. }
  126. }
  127. private bool _hasGetUserInfo = false;
  128. private void DoAfterGetUserInfo(UserInfo userInfo)
  129. {
  130. if (_getUserInfoFailed) return; //主要是为了避免提示了(网络异常后请稍后再试),又突然可以了
  131. if (_hasGetUserInfo) return;
  132. _hasGetUserInfo = true;
  133. LoginMgr.myUserInfo = userInfo;
  134. if (HomeView.ins) {
  135. HomeView.ins.RenderMyAvatarSprite();
  136. HomeView.ins.RenderNameOrGender();
  137. HomeView.ins.RenderDeviceNames();
  138. }
  139. if (AuthLoginMask.ins) AuthLoginMask.ins.SetVisiable(false);
  140. if (SceneManager.GetActiveScene().name.Equals("Home") && !LoginMgr.myUserInfo.IsGuideFinish(0)) {
  141. NewUserGuiderManager.ins?.ReviewNewUserGuide();
  142. }
  143. if (SceneManager.GetActiveScene().name.Equals("Home")) {
  144. if (LoginMgr.myUserInfo.nickname == "test10086") InitLogReporter();
  145. }
  146. if (SceneManager.GetActiveScene().name.Equals("Home")) {
  147. System.Action eOnAgree = () => {
  148. GPSTool.GetAddress((address) => {
  149. if (address != null) {
  150. Debug.Log("登陆时获取地理位置成功:" + string.Join(" ", address));
  151. if (LoginMgr.myUserInfo.country == address[0]
  152. && LoginMgr.myUserInfo.state == address[1]
  153. && LoginMgr.myUserInfo.city == address[2]
  154. ) return;
  155. LoginMgr.myUserInfo.country = address[0];
  156. LoginMgr.myUserInfo.state = address[1];
  157. LoginMgr.myUserInfo.city = address[2];
  158. LoginMgr.myUserInfo.Save();
  159. }
  160. });
  161. };
  162. if (!HomeView.ShowProminentBeforeConnectBLE(eOnAgree)) eOnAgree.Invoke();
  163. }
  164. }
  165. //控制台
  166. private static bool s_LogReporterInited = false;
  167. public static void InitLogReporter()
  168. {
  169. if (s_LogReporterInited) return;
  170. s_LogReporterInited = true;
  171. Object.Instantiate(Resources.Load("Prefabs/LogReporter"));
  172. Debug.LogWarning("在屏幕上画个圈即可打开控制台");
  173. }
  174. private static void handleAuthExpire()
  175. {
  176. //tip
  177. if (AuthLoginMask.ins && AuthLoginMask.ins.IsVisiable()) {
  178. AuthLoginMask.ins.SetText(TextAutoLanguage2.GetTextByCNKey("登录认证过期"));
  179. } else {
  180. PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("登录认证过期"));
  181. }
  182. //delay back login
  183. Sequence seq = DOTween.Sequence();
  184. seq.AppendInterval(1.5f);
  185. seq.AppendCallback(() => {
  186. if (SceneManager.GetActiveScene().name.Equals("Home")) {
  187. SceneManager.LoadScene("Login", LoadSceneMode.Single);
  188. } else {
  189. Application.Quit(); //不是Home场景,就关闭游戏
  190. }
  191. });
  192. //close userplayer
  193. PlayerPrefs.DeleteKey(LoginMgr.LoginTokenKey);
  194. ins?.Close();
  195. }
  196. public void onAnyMessage(string msg)
  197. {
  198. SideTipView.ShowTip(msg, msg.EndsWith("失败") ? Color.yellow : Color.white);
  199. }
  200. public void onRequestAddFriend() {
  201. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_friend-receive-request"));
  202. tempData.hasFriendRequest = true;
  203. }
  204. public void onHasFriendTip() {
  205. tempData.hasFriendRequest = true;
  206. }
  207. public TempData tempData = new TempData();
  208. public class TempData {
  209. public System.Action onUpdate;
  210. private bool _hasFriendRequest;
  211. public bool hasFriendRequest {
  212. get {
  213. return _hasFriendRequest;
  214. }
  215. set {
  216. _hasFriendRequest = value;
  217. onUpdate?.Invoke();
  218. }
  219. }
  220. }
  221. }