TapLogin-Unity/Standalone/Runtime/Internal/LoginHelper.cs

153 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LC.Newtonsoft.Json;
using TapTap.Common;
using TapTap.Common.Runtime.Internal.Utils;
using TapTap.Login.Standalone;
using UnityEngine;
namespace TapTap.Login.Internal
{
internal class LoginHelper
{
private static readonly string _accessToken = "taptapsdk_accesstoken";
private static readonly string _profile = "taptapsdk_profile";
public static Task<AccessToken> Login()
{
return Login(new[] { TapLogin.TAP_LOGIN_SCOPE_PUBLIC_PROFILE });
}
public static Task<Tuple<AccessToken, Profile>> Authorize(string[] permissions) {
return InternalAuthorize(permissions, false);
}
public static Task<AccessToken> Login(string[] permissions) {
var pl = permissions.ToList();
// // 如果是海外版,移除合规权限
// bool isCn = !TapLoginStandalone.IsOverseas;
// if (!isCn) {
// pl.Remove(TapLogin.TAP_LOGIN_SCOPE_COMPLIANCE);
// }
permissions = pl.ToArray();
var task = InternalAuthorize(permissions, true);
return task.ContinueWith(t => {
if (t.IsFaulted) {
throw t.Exception;
}
var result = t.Result;
return result.Item1;
});
}
private static void ShowLoginToast(Profile profile, bool isLogin) {
if (!isLogin) return;
var content = LoginLanguage.GetCurrentLang().LoginNotice();
var str = string.Format(content, profile.name);
Texture avatar = UI.UIManager.TapTapToastIcon;
TdsImage.Instance.Load(profile.avatar, 500, (image) => {
if (image != null) {
avatar = image;
}
UI.UIManager.Instance.OpenToast(false, str, 3, icon: avatar);
});
}
private static Task<Tuple<AccessToken, Profile>> InternalAuthorize(string[] permissions, bool isLogin) {
var tcs = new TaskCompletionSource<Tuple<AccessToken, Profile>>();
LoginManager.AuthorizeWithReadPermissions(permissions, isLogin,result =>
{
if (result == null)
{
tcs.TrySetException(new TapException((int) TapErrorCode.ERROR_CODE_UNDEFINED, "UnKnow Error"));
return;
}
if (result.IsCanceled)
{
tcs.TrySetException(
new TapException((int) TapErrorCode.ERROR_CODE_LOGIN_CANCEL, "Login Cancel"));
return;
}
if (result.IsFaulted)
{
var str = result.Exception.Message;
if (str == "unknown")
{
tcs.TrySetException(new TapException((int) TapErrorCode.ERROR_CODE_UNDEFINED,
"UnKnow Error"));
}
else
{
var dict = Json.Deserialize(str) as Dictionary<string, object>;
var data = SafeDictionary.GetValue<object>(dict, "data") as Dictionary<string, object>;
tcs.TrySetException(new TapException(SafeDictionary.GetValue<int>(data, "code"),
SafeDictionary.GetValue<string>(data, "error_description")));
}
return;
}
ShowLoginToast(result.Profile, isLogin);
tcs.TrySetResult(new Tuple<AccessToken, Profile>(result.Token, result.Profile));
});
return tcs.Task;
}
public static Task<Profile> GetProfile()
{
var tcs = new TaskCompletionSource<Profile>();
try
{
var profileStr = DataStorage.LoadString(_profile);
if (!string.IsNullOrEmpty(profileStr))
{
var profile = JsonConvert.DeserializeObject<Profile>(profileStr);
tcs.TrySetResult(profile);
}
else {
tcs.TrySetResult(null);
}
}
catch (Exception e)
{
tcs.TrySetException(e);
}
return tcs.Task;
}
public static Task<AccessToken> GetAccessToken()
{
var tcs = new TaskCompletionSource<AccessToken>();
try
{
var accessTokenStr = DataStorage.LoadString(_accessToken);
if (accessTokenStr != null)
{
var accessToken = JsonConvert.DeserializeObject<AccessToken>(accessTokenStr);
tcs.TrySetResult(accessToken);
}
}
catch (Exception e)
{
tcs.TrySetException(e);
}
return tcs.Task;
}
public static void Logout()
{
DataStorage.SaveString(_profile, null);
DataStorage.SaveString(_accessToken, null);
}
}
}