using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using JCEngineCore;
using UnityEngine.SceneManagement;
using DG.Tweening;
using JCUnityLib;
using AppUI.Bluetooth;
using UHomeView = AppUI.View.Home.Main.HomeView;
/* Socket组件-玩家业务 */
public class UserPlayer : JCEntity
{
public static UserPlayer ins;
public UserPlayer() {
ins = this;
components.Add("PKComp", PKComp.Instance);
components.Add("UserComp", UserComp.Instance);
GetUserInfo();
}
public static void ConnectServer() {
if (ins != null) return;
if (AuthLoginMask.ins) AuthLoginMask.ins.SetVisiable(true);
if (CommonConfig.businessServerWsURL != null) {
JCEngine.boot(CommonConfig.businessServerWsURL, new UserPlayer());
} else {
LoginByToken();
}
}
private static int _RetryLoginByTokenCount = -1;
public static void LoginByToken()
{
if (++_RetryLoginByTokenCount > 0)
AuthLoginMask.ins?.SetRetryCount(_RetryLoginByTokenCount);
CoroutineStarter.Start(LoginController.Instance.LoginByToken((res) => {
if (res.code == 0) {
_RetryLoginByTokenCount = -1;
string loginToken = (string)res.data;
CommonConfig.businessServerWsURL = loginToken.Split('&')[2];
PlayerPrefs.SetString(LoginMgr.LoginTokenKey, loginToken);
JCEngine.boot(CommonConfig.businessServerWsURL, new UserPlayer());
} else if (res.code == -9999) {
if (_RetryLoginByTokenCount < 3) {
LoginByToken();
} else {
_RetryLoginByTokenCount = -1;
AuthLoginMask.ins?.SetAutoRetryFail();
}
} else {
_RetryLoginByTokenCount = -1;
handleAuthExpire();
}
}));
}
//之所以做成协程延迟触发,是因为用编辑器调试时,停止运行后会触发断线重连,就会造成游戏停止调试了,但socket还连接的现象。
IEnumerator ReconnenctServer() {
yield return new WaitForSecondsRealtime(0.1f);
JCEngine.reboot(this);
}
bool canReconnnect = true;
public override void onLoad() {
Debug.Log("UserPlayer onLoad()");
authToken();
}
public override void onReload() {
Debug.Log("UserPlayer onReload()");
authToken();
}
public override void onDestroy() {
loginAuthed = false;
Debug.Log("UserPlayer onDestroy()");
if (canReconnnect) {
JCUnityLib.CoroutineStarter.Start(ReconnenctServer());
}
}
public override void onMiss() {
Debug.Log("UserPlayer onMiss()");
if (canReconnnect) {
JCUnityLib.CoroutineStarter.Start(ReconnenctServer());
}
}
public void Close() {
LoginMgr.myUserInfo.id = 0;
if (ins == this) ins = null;
this.canReconnnect = false;
this.channel.close();
Debug.Log("user player close");
}
//向服务端发送的请求
public void authToken() {
string p0 = PlayerPrefs.GetString(LoginMgr.LoginTokenKey, "");
string p1 = SceneManager.GetActiveScene().name;
call("authToken2", p0, p1);
}
//被服务端调用的函数
public bool loginAuthed;
public void onAuthRes(bool res) {
Debug.Log("onAuthRes," + res);
loginAuthed = res;
if (!loginAuthed) handleAuthExpire();
else TryHomeAutoConnectBle();
}
/// Home 延迟自动连蓝牙:仅单机已拉取用户信息,或联机已 auth 且用户信息就绪且 AuthLoginMask 已关闭。
public static bool IsLoginReadyForHomeBle()
{
if (CommonConfig.bDisableBluetooth) return false;
if (CommonConfig.StandaloneMode)
return ins != null && ins.hasGetUserInfo;
if (ins == null || !ins.loginAuthed || !ins.hasGetUserInfo) return false;
if (AuthLoginMask.ins != null && AuthLoginMask.ins.IsVisiable()) return false;
return true;
}
public static void TryHomeAutoConnectBle()
{
if (!IsLoginReadyForHomeBle()) return;
if (!SceneManager.GetActiveScene().name.Equals("Home")) return;
SmartBowDeviceHub.EnsureReady();
SmartBowDeviceHub.ins?.Ble?.HomeViewConnectBLE();
}
//获取用户信息,失败了就重试
public void GetUserInfo()
{
if (CommonConfig.StandaloneMode)
{
UserInfo userInfo = UserInfo.LoadLocal(0);
if (userInfo == null) userInfo = new();
userInfo.nickname = TextAutoLanguage2.GetTextByKey("Player_Name");
TextAutoLanguage2.OnLanguageChanged += (languageEnum) =>
{
//切换单机的名字
userInfo.nickname = TextAutoLanguage2.GetTextByKey("Player_Name");
UHomeView.ins.RenderNameOrGender();
};
DoAfterGetUserInfo(userInfo);
return;
}
UserPlayer userPlayer = this;
CoroutineStarter.Start(LoginController.Instance.GetUserInfo((res) =>
{
if (ins != userPlayer) return;
if (res.code == 0)
{
UserInfo userInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(res.data as string);
DoAfterGetUserInfo(userInfo);
}
else if (res.code == -9999)
AuthLoginMask.ins?.SetAutoRetryFail();
else
handleAuthExpire();
}));
}
IEnumerator showTip()
{
yield return new WaitForSeconds(0.3f);
GameObject settingsViewObj = ViewManager2.getGameObjectAndShowView(ViewManager2.Path_HomeViewTip);
settingsViewObj.GetComponent().setHomeTip(0);
}
public bool hasGetUserInfo;
private void DoAfterGetUserInfo(UserInfo userInfo)
{
if (hasGetUserInfo) return;
hasGetUserInfo = true;
LoginMgr.myUserInfo = userInfo;
if (UHomeView.ins) {
UHomeView.ins.RenderMyAvatarSprite();
UHomeView.ins.RenderNameOrGender();
//UHomeView.ins.RenderDeviceNames();
}
if (AuthLoginMask.ins) AuthLoginMask.ins.SetVisiable(false);
TryHomeAutoConnectBle();
//if (SceneManager.GetActiveScene().name.Equals("Home") && !LoginMgr.myUserInfo.IsGuideFinish(0)) {
// //NewUserGuiderManager.ins?.ReviewNewUserGuide();
// //安装后首次进入APP和首次登录账号进入APP后
// //GameObject settingsViewObj = ViewManager2.getGameObjectAndShowView(ViewManager2.Path_HomeViewTip);
// //settingsViewObj.GetComponent().setHomeTip(0);
// CoroutineStarter.Start(showTip());
// LoginMgr.myUserInfo.SaveGuideFinish(0);
//}
if (SceneManager.GetActiveScene().name.Equals("Home")) {
if (LoginMgr.myUserInfo.nickname == "test10086") InitLogReporter();
}
if (SceneManager.GetActiveScene().name.Equals("Home") && !CommonConfig.StandaloneMode) {
System.Action eOnAgree = () => {
GPSTool.GetAddress((address) => {
if (address != null) {
if (LoginMgr.myUserInfo.country == address[0]
&& LoginMgr.myUserInfo.state == address[1]
&& LoginMgr.myUserInfo.city == address[2]
) return;
LoginMgr.myUserInfo.country = address[0];
LoginMgr.myUserInfo.state = address[1];
LoginMgr.myUserInfo.city = address[2];
LoginMgr.myUserInfo.Save();
}
});
if (!LoginMgr.myUserInfo.IsGuideFinish(0))
{
//新UI不用
//CoroutineStarter.Start(showTip());
LoginMgr.myUserInfo.SaveGuideFinish(0);
}
};
System.Action eOnReject = () => {
if (!LoginMgr.myUserInfo.IsGuideFinish(0))
{
//新UI不用
//CoroutineStarter.Start(showTip());
LoginMgr.myUserInfo.SaveGuideFinish(0);
}
};
//提示Location新UI隐藏
//if (!HomeView.ShowProminentBeforeConnectBLE_Event(eOnAgree,eOnReject)) {
// eOnAgree.Invoke();
//}
////else
////{
//// if (!LoginMgr.myUserInfo.IsGuideFinish(0))
//// {
//// CoroutineStarter.Start(showTip());
//// LoginMgr.myUserInfo.SaveGuideFinish(0);
//// }
////}
}
}
//控制台
private static bool s_LogReporterInited = false;
public static void InitLogReporter()
{
if (s_LogReporterInited) return;
s_LogReporterInited = true;
Object.Instantiate(Resources.Load("Prefabs/LogReporter"));
Debug.LogWarning("在屏幕上画个圈即可打开控制台");
Debug.Log("app-version: " + Resources.Load("app-version").text);
}
public static Object InitReturnLogReporter()
{
if (s_LogReporterInited) return null;
s_LogReporterInited = true;
Object o = Object.Instantiate(Resources.Load("Prefabs/LogReporter"));
Debug.LogWarning("在屏幕上画个圈即可打开控制台");
Debug.Log("app-version: " + Resources.Load("app-version").text);
return o;
}
private static void handleAuthExpire()
{
//tip
if (AuthLoginMask.ins && AuthLoginMask.ins.IsVisiable()) {
AuthLoginMask.ins.SetText(TextAutoLanguage2.GetTextByCNKey("登录认证过期"));
} else {
PopupMgr.ins.ShowTip(TextAutoLanguage2.GetTextByCNKey("登录认证过期"));
}
//delay back login
Sequence seq = DOTween.Sequence();
seq.AppendInterval(1.5f);
seq.AppendCallback(() => {
if (SceneManager.GetActiveScene().name.Equals("Home")) {
SceneManager.LoadScene("Login", LoadSceneMode.Single);
} else {
Application.Quit(); //不是Home场景,就关闭游戏
}
});
//close userplayer
PlayerPrefs.DeleteKey(LoginMgr.LoginTokenKey);
CommonConfig.businessServerWsURL = null;
ins?.Close();
}
public void onAnyMessage(string msg)
{
SideTipView.ShowTip(msg, msg.EndsWith("失败") ? Color.yellow : Color.white);
}
public void onRequestAddFriend() {
GameObject tipTopObject = PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_friend-receive-request"));
tipTopObject.AddComponent().onClick.AddListener(() => {
if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name != "Home") return;
//ViewMgr.Instance.ShowView("setFirstBtnTabsIndex", 1);
ViewManager2.ShowView(ViewManager2.Path_SocialView);
GameObject.Destroy(tipTopObject);
});
tempData.hasFriendRequest = true;
}
public void onHasFriendTip() {
tempData.hasFriendRequest = true;
}
public TempData tempData = new TempData();
public class TempData {
public System.Action onUpdate;
private bool _hasFriendRequest;
public bool hasFriendRequest {
get {
return _hasFriendRequest;
}
set {
_hasFriendRequest = value;
onUpdate?.Invoke();
}
}
}
/**
* 获取一个起始和结束的当月时间
*/
public string[] getDateArray() {
System.DateTime currentTime = System.DateTime.Now;
System.DateTime firstDayOfMonth = new System.DateTime(currentTime.Year, currentTime.Month, 1);
System.DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
//Debug.Log("getDateArray First day of current month: " + firstDayOfMonth.ToString("yyyy-MM-dd"));
//Debug.Log("getDateArray Last day of current month: " + lastDayOfMonth.ToString("yyyy-MM-dd"));
return new string[] { firstDayOfMonth.ToString("yyyy-MM-dd"), lastDayOfMonth.ToString("yyyy-MM-dd") };
}
}