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 Login() { return Login(new[] { TapLogin.TAP_LOGIN_SCOPE_PUBLIC_PROFILE }); } public static Task> Authorize(string[] permissions) { return InternalAuthorize(permissions, false); } public static Task 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> InternalAuthorize(string[] permissions, bool isLogin) { var tcs = new TaskCompletionSource>(); 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; var data = SafeDictionary.GetValue(dict, "data") as Dictionary; tcs.TrySetException(new TapException(SafeDictionary.GetValue(data, "code"), SafeDictionary.GetValue(data, "error_description"))); } return; } ShowLoginToast(result.Profile, isLogin); tcs.TrySetResult(new Tuple(result.Token, result.Profile)); }); return tcs.Task; } public static Task GetProfile() { var tcs = new TaskCompletionSource(); try { var profileStr = DataStorage.LoadString(_profile); if (!string.IsNullOrEmpty(profileStr)) { var profile = JsonConvert.DeserializeObject(profileStr); tcs.TrySetResult(profile); } else { tcs.TrySetResult(null); } } catch (Exception e) { tcs.TrySetException(e); } return tcs.Task; } public static Task GetAccessToken() { var tcs = new TaskCompletionSource(); try { var accessTokenStr = DataStorage.LoadString(_accessToken); if (accessTokenStr != null) { var accessToken = JsonConvert.DeserializeObject(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); } } }