chicken_dy/Assets/HCMiniSdk/Scripts/Account/HCAccountManager.cs

565 lines
23 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace HC
{
public class HCAccountManager : HCSingleton<HCAccountManager>
{
private string staticOnlineKey_loginChannels = "loginChannels";
public string staticSaveKey_DeviceID = "DeviceID";
private string staticSaveKey_LastLoginType = "LastLoginType";
public const string staticSaveKey_UserID = "UserID";
public const string staticSaveKey_UserType = "UserType";
private string staticSaveKey_Token = "Token";
// 当前登录信息
private UserInfo CurrUserInfo;
private Action<LoginInfo> mLoginResultCallback = null;
// Start is called before the first frame update
void Start()
{
}
/// <summary>
/// Login
/// </summary>
/// <param name="_loginType"> loginType </param>
/// <param name="_loginResultCallback"> loginCallback </param>
public void Login(HCLoginType _loginType, Action<LoginInfo> _loginResultCallback = null)
{
mLoginResultCallback = _loginResultCallback;
HCTools.SavePlayerPrefsInt(staticSaveKey_LastLoginType, (int)_loginType);
if (_loginType == HCLoginType.LOGIN_BY_GUESTER)
{
// 取deviceID给服务器发登录请求
string deviceID = HCTools.GetPlayerPrefsString(staticSaveKey_DeviceID);
if (string.IsNullOrEmpty(deviceID))
{
deviceID = HCNativeInterface.Instance.GetDeviceID();
if (string.IsNullOrEmpty(deviceID))
{
deviceID = System.Guid.NewGuid().ToString();
}
HCTools.SavePlayerPrefsString(staticSaveKey_DeviceID, deviceID);
GuestLogin(deviceID);
}
else
{
GuestLogin(deviceID);
}
}
else
{
// 调用三方登录
HCNativeInterface.Instance.Login(_loginType, ThirdLoginCallback);
}
// 事件埋点
if (HCTools.IfFirstCheckPlayerPrefs(string.Format("{0}_IfFirst", HCInnerStaticSting.HC_Login_CreateTKUserid)))
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginType));
}
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginType));
}
/// <summary>
/// 游客登录方法
/// </summary>
/// <param name="_deviceID"></param>
private void GuestLogin(string _deviceID)
{
_deviceID = _deviceID.Replace("-", "");
UserInfo userInfo = new UserInfo();
userInfo.userID = _deviceID;
userInfo.loginType = HCLoginType.LOGIN_BY_GUESTER;
LoginByServer(userInfo, ServerLoginCallback);
}
/// <summary>
/// 三方登录回调,请求服务器登录
/// </summary>
/// <param name="_loginInfo"></param>
private void ThirdLoginCallback(LoginInfo _loginInfo)
{
// 事件埋点
if (_loginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginInfo.userInfo.loginType));
}
else
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_loginInfo.userInfo.loginType));
}
if (_loginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
LoginByServer(_loginInfo.userInfo, ServerLoginCallback);
}
else
{
mLoginResultCallback?.Invoke(_loginInfo);
}
}
/// <summary>
/// 服务器登录返回callback回游戏
/// </summary>
/// <param name="status"></param>
/// <param name="msg"></param>
/// <param name="callbackInfo"></param>
private void ServerLoginCallback(int status, string msg, ServerBackLoginInfo callbackInfo)
{
var loginStatus = status == 0 ? HCLoginStatus.LOGIN_STATUS_SUCC : HCLoginStatus.LOGIN_STATUS_FAILED;
var loginTypeEnum = (HCLoginType)Enum.ToObject(typeof(HCLoginType), callbackInfo.user_type);
HCTools.SavePlayerPrefsString(staticSaveKey_UserID, callbackInfo.user_id);
HCTools.SavePlayerPrefsString(staticSaveKey_Token, callbackInfo.token);
HCTools.SavePlayerPrefsInt(staticSaveKey_UserType, callbackInfo.user_type);
LoginInfo loginInfo = new LoginInfo();
loginInfo.loginStatus = loginStatus;
loginInfo.userInfo = new UserInfo();
loginInfo.userInfo.loginType = loginTypeEnum;
loginInfo.loginMsg = msg;
loginInfo.userInfo.userID = callbackInfo.user_id;
loginInfo.userInfo.token = callbackInfo.token;
loginInfo.userInfo.email = "";
loginInfo.userInfo.nickName = "";
loginInfo.userInfo.photoUrl = "";
if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
CurrUserInfo = loginInfo.userInfo;
HCAnalyticsManager.Instance.SetUserId(loginInfo.userInfo.userID);
}
mLoginResultCallback?.Invoke(loginInfo);
// 事件埋点
if (HCTools.IfFirstCheckPlayerPrefs(string.Format("{0}_IfFirst_Result", HCInnerStaticSting.HC_Login_CreateTKUserid)))
{
if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType));
}
else
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_CreateTKUserid_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType), "fail_reason", msg);
}
}
// 事件埋点
if (loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType));
}
else
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Login_Enter_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(loginInfo.userInfo.loginType), "fail_reason", msg);
}
}
/// <summary>
/// 自动登录
/// </summary>
/// <param name="_loginResultCallback"></param>
public void AutoLogin(Action<LoginInfo> _loginResultCallback = null)
{
if (!IsCanAutoLogin())
{
Login(HCLoginType.LOGIN_BY_GUESTER, _loginResultCallback);
}
else
{
var lastLoginType = HCTools.GetPlayerPrefsInt(staticSaveKey_LastLoginType);
Login((HCLoginType)Enum.ToObject(typeof(HCLoginType), lastLoginType), _loginResultCallback);
}
}
/// <summary>
/// 获取当前用户类型
/// </summary>
/// <returns></returns>
public HCLoginType GetAccountType()
{
int userType = HCTools.GetPlayerPrefsInt(staticSaveKey_UserType);
return (HCLoginType)Enum.ToObject(typeof(HCLoginType), userType);
}
/// <summary>
/// 是否可自动登录
/// </summary>
/// <returns></returns>
public bool IsCanAutoLogin()
{
return HCTools.HasKey(staticSaveKey_LastLoginType);
}
/// <summary>
/// 登出
/// </summary>
/// <param name="_logoutCallback"></param>
public void Logout(Action _logoutCallback = null)
{
HCTools.DeleteKey(staticSaveKey_LastLoginType);
HCTools.DeleteKey(staticSaveKey_UserID);
HCTools.DeleteKey(staticSaveKey_UserType);
HCTools.DeleteKey(staticSaveKey_Token);
if(null != CurrUserInfo)
{
CurrUserInfo.ClearData();
}
_logoutCallback?.Invoke();
HCNativeInterface.Instance.Logout();
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Logout_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(CurrUserInfo.loginType));
}
/// <summary>
/// 获取支持登录类型列表
/// 在线参数配置0,1,2
/// </summary>
/// <returns></returns>
public List<HCLoginType> AvailableLoginChannelList()
{
string loginChannels = HCSDKManager.Instance.GetRemoteConfigStr(staticOnlineKey_loginChannels, "0,2");
if (string.IsNullOrEmpty(loginChannels))
{
loginChannels = "0,2";
}
return loginChannels.Split(',')
.Select(channel => (HCLoginType)Enum.ToObject(typeof(HCLoginType), int.Parse(channel))).ToList();
}
/// <summary>
/// 删除账号
/// </summary>
/// <param name="deleteAccountCallback"></param>
public void DeleteAccount(Action<HCDeleteStatus, string> deleteAccountCallback = null)
{
DeleteAccountByServer(HCTools.GetPlayerPrefsString(staticSaveKey_UserID), (code, msg) =>
{
// 退出账号
if(code == 0)
{
Logout();
}
deleteAccountCallback?.Invoke(
code == 0 ? HCDeleteStatus.DELETE_ACCOUNT_SUCC : HCDeleteStatus.DELETE_ACCOUNT_FAILED, msg);
// 事件埋点
if (code == 0)
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Delete_Account_Success, HCInnerStaticSting.HC_Account, HCInnerStaticSting.HC_Delete_Account_Success);
}
else
{
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Delete_Account_Success, HCInnerStaticSting.HC_Account, HCInnerStaticSting.HC_Delete_Account_Fail);
}
});
}
// 保存当前绑定类型
private HCBindType currBindType = HCBindType.NO_FORCE;
// 保存当前要绑定的userID
private string currUserID = "";
// 保存绑定回调
private Action<BindInfo> currBindAccountCallback = null;
/// <summary>
/// 绑定账号
/// </summary>
/// <param name="type"></param>
/// <param name="isForce"></param>
/// <param name="userId"></param>
/// <param name="bindAccountCallback"></param>
public void BindAccount(HCLoginType type, HCBindType isForce, string userId, Action<BindInfo> bindAccountCallback)
{
currBindType = isForce;
currUserID = userId;
currBindAccountCallback = bindAccountCallback;
// 调用三方登录
HCNativeInterface.Instance.Login(type, ThirdLoginCallbackForBind);
// 事件埋点
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind, HCInnerStaticSting.HC_Account, GetLoginTypeString(type));
}
/// <summary>
/// 绑定时三方登录回调,请求服务器绑定
/// </summary>
/// <param name="_thirdloginInfo"></param>
private void ThirdLoginCallbackForBind(LoginInfo _thirdLoginInfo)
{
if (_thirdLoginInfo.loginStatus != HCLoginStatus.LOGIN_STATUS_SUCC)
{
var bindInfo = new BindInfo
{
userInfo = _thirdLoginInfo.userInfo,
bindStatus = HCBindAccountStatus.BIND_CODE_FAILED,
bindMsg = _thirdLoginInfo.loginMsg
};
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_thirdLoginInfo.userInfo.loginType), "fail_reason", $"bind error from login :{_thirdLoginInfo.loginMsg}");
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(_thirdLoginInfo.userInfo.loginType), "fail_reason", $"bind error from login :{_thirdLoginInfo.loginMsg}");
currBindAccountCallback?.Invoke(bindInfo);
return;
}
if (currBindType == HCBindType.NO_FORCE)
{
currUserID = HCTools.GetPlayerPrefsString(staticSaveKey_UserID);
}
if (_thirdLoginInfo.loginStatus == HCLoginStatus.LOGIN_STATUS_SUCC)
{
CallBind2Server(_thirdLoginInfo.userInfo, currBindType, _thirdLoginInfo.userInfo.userID, currUserID, currBindAccountCallback);
}
}
/// <summary>
/// 调用服务器方法操作绑定
/// </summary>
/// <param name="type"></param>
/// <param name="isForce"></param>
/// <param name="userId"></param>
/// <param name="thirdUserId"></param>
/// <param name="bindAccountCallback"></param>
private void CallBind2Server(UserInfo userInfo, HCBindType isForce, string thirdUserId, string userId, Action<BindInfo> bindAccountCallback)
{
BindByServer(userInfo, isForce, thirdUserId, userId, (status, msg, data) =>
{
if (status != 0)
{
BindInfo bindInfo = new BindInfo();
bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_FAILED;
bindInfo.userInfo = new UserInfo();
bindInfo.userInfo.loginType = userInfo.loginType;
bindInfo.bindMsg = msg;
bindInfo.userInfo.userID = data.user_id;
bindInfo.userInfo.token = data.token;
bindInfo.userInfo.email = userInfo.email;
bindInfo.userInfo.nickName = userInfo.nickName;
bindInfo.userInfo.photoUrl = userInfo.photoUrl;
bindInfo.userIDs = data.user_ids;
bindAccountCallback.Invoke(bindInfo);
// 事件埋点
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType), "fail_reason", msg);
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Fail, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType), "fail_reason", $"bind error from login :{msg}");
return;
}
if (data.user_ids != null && data.user_ids.Length == 2)
{
// (status, loginTYpe, msg, userId, token, email, displayName, photoUrl, userIdList)
BindInfo bindInfo = new BindInfo();
bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_SELECT;
bindInfo.userInfo = new UserInfo();
bindInfo.userInfo.loginType = userInfo.loginType;
bindInfo.bindMsg = msg;
bindInfo.userInfo.userID = data.user_id;
bindInfo.userInfo.token = data.token;
bindInfo.userInfo.email = userInfo.email;
bindInfo.userInfo.nickName = userInfo.nickName;
bindInfo.userInfo.photoUrl = userInfo.photoUrl;
bindInfo.userIDs = data.user_ids;
bindAccountCallback.Invoke(bindInfo);
// 事件埋点
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Conflict, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType));
}
else // 绑定成功
{
HCTools.SavePlayerPrefsString(staticSaveKey_UserID, data.user_id);
HCTools.SavePlayerPrefsString(staticSaveKey_Token, data.token);
HCTools.SavePlayerPrefsInt(staticSaveKey_UserType, (int)userInfo.loginType);
BindInfo bindInfo = new BindInfo();
bindInfo.bindStatus = HCBindAccountStatus.BIND_CODE_SUCC;
bindInfo.userInfo = new UserInfo();
bindInfo.userInfo.loginType = userInfo.loginType;
bindInfo.bindMsg = msg;
bindInfo.userInfo.userID = data.user_id;
bindInfo.userInfo.token = data.token;
bindInfo.userInfo.email = userInfo.email;
bindInfo.userInfo.nickName = userInfo.nickName;
bindInfo.userInfo.photoUrl = userInfo.photoUrl;
bindInfo.userIDs = data.user_ids;
CurrUserInfo = bindInfo.userInfo; // 保存当前登录信息
bindAccountCallback.Invoke(bindInfo);
// 事件埋点
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType));
HCAnalyticsManager.Instance.TrackEvent(HCInnerStaticSting.HC_Click_Bind_Login_Success, HCInnerStaticSting.HC_Account, GetLoginTypeString(userInfo.loginType));
}
});
}
#region server
private void LoginByServer(UserInfo userInfo, Action<int, string, ServerBackLoginInfo> callback)
{
Debug.Log("userInfo : " + userInfo);
// userInfo.ext?.TryGetValue("anonymousCode", out var anonymousCode);
var body = new Dictionary<string, object>()
{
["user_type"] = (int)userInfo.loginType,
["third_uid"] = userInfo.userID,
["user_id"] = HCTools.GetPlayerPrefsString(staticSaveKey_UserID),
["third_token"] = userInfo.token,
["email"] = userInfo.email,
["photoUrl"] = userInfo.photoUrl,
["displayName"] = userInfo.nickName,
};
HCDebugger.LogDebug("zj third_token : " + userInfo.token + " , userID : " + userInfo.userID + ", third_id : " + HCTools.GetPlayerPrefsString(staticSaveKey_UserID));
HCServer.Instance.Post(HCServer.URL_LOGIN, body, callback);
}
public void BindByServer(UserInfo userInfo, HCBindType bindType, string thirdUid, string userId,
Action<int, string, ServerBackBindInfo> callback)
{
var args = new Dictionary<string, object>
{
{ "user_type", (int)userInfo.loginType },
{ "third_uid", thirdUid },
{ "user_id", userId },
{ "is_force", (int)bindType },
{ "third_token", userInfo.token },
{ "email", userInfo.email },
{ "photoUrl", userInfo.photoUrl },
{ "displayName", userInfo.nickName },
};
HCServer.Instance.Post(HCServer.URL_BIND, args, callback);
}
public void DeleteAccountByServer(string userId, Action<int, string> callback)
{
if (string.IsNullOrEmpty(userId))
{
callback?.Invoke((int)HCDeleteStatus.DELETE_ACCOUNT_FAILED, "empty userID by client.");
return;
}
var args = new Dictionary<string, object> { { "user_id", userId } };
HCServer.Instance.Post<object>(HCServer.URL_DELETE, args,
(code, msg, obj) => { callback.Invoke(code, code == 0 ? userId : msg); });
}
/// <summary>
/// 根据登录类别,获取对应登录事件名称
/// </summary>
/// <param name="_loginType"></param>
/// <returns></returns>
public string GetLoginTypeString(HCLoginType _loginType)
{
switch (_loginType)
{
case HCLoginType.LOGIN_BY_GUESTER:
return "Guest"; //Google/Facebook/Geust
case HCLoginType.LOGIN_BY_GOOGLE:
return "Google";
case HCLoginType.LOGIN_BY_FACEBOOK:
return "Facebook";
case HCLoginType.LOGIN_BY_Apple:
return "Apple";
case HCLoginType.LOGIN_BY_EMAIL:
return "Email";
case HCLoginType.LOGIN_BY_WECHAT_MINI_GAME:
return "wechat_mini_game";
default:
return "Unknow";
}
}
/// <summary>
/// 获取当前UserInfo
/// </summary>
/// <returns></returns>
public UserInfo GetCurrUserInfo()
{
return CurrUserInfo;
}
#endregion
}
// 登录状态码登录类型登录状态信息useridtoken邮箱 , 显示名称 , 头像url
[System.Serializable]
public struct LoginInfo
{
public HCLoginStatus loginStatus;
public string loginMsg;
public UserInfo userInfo;
}
// HCBindAccountStatus, HCLoginType, string, string, string, string, string, string, string[]
[System.Serializable]
public struct BindInfo
{
public HCBindAccountStatus bindStatus;
public string bindMsg;
public UserInfo userInfo;
public string[] userIDs;
}
[System.Serializable]
public class UserInfo
{
public HCLoginType loginType;
public string userID = "";
public string token = "";
public string email = "";
public string nickName = "";
public string photoUrl = "";
public void ClearData()
{
userID = "";
token = "";
email = "";
nickName = "";
photoUrl = "";
}
}
[System.Serializable]
public struct ServerBackLoginInfo
{
public string user_id;
public string token;
public int user_type;
public int first_login;
}
[System.Serializable]
public struct ServerBackBindInfo
{
public string user_id;
public string token;
public string[] user_ids;
}
}