using IchniOnline.Online.Models; using IchniOnline.Online.Network.Models; using TapSDK.Login; using UnityEngine; namespace IchniOnline.Online.Logic { /// /// 登录缓存的读写管理器。所有方法均为静态,可在任意位置调用。 /// 使用 ES3 进行本地持久化。 /// public static class LoginCacheManager { private const string ES3_KEY = "Ichni_LoginCache"; /// /// 本地是否存在有效的登录缓存 /// public static bool HasCachedLogin => HasValidSession; /// /// 获取缓存的登录数据,无缓存返回 null /// public static LoginCacheData CachedData { get { if (!ES3.KeyExists(ES3_KEY)) return null; return ES3.Load(ES3_KEY); } } /// /// 缓存的 JWT 令牌,无缓存或无会话返回 null /// public static string CachedJwtToken => CachedData?.jwtToken; /// /// 是否存在有效的服务端会话(JWT 令牌存在且 hasServerSession 为 true) /// public static bool HasValidSession => CachedData?.IsValid ?? false; /// /// 将 TapTap 登录结果写入本地缓存,保留已有的服务端会话数据 /// public static void SaveFromTapTapAccount(TapTapAccount account) { if (account == null) { Debug.LogWarning("[LoginCacheManager] account 为 null,跳过缓存"); return; } LoginCacheData data; if (ES3.KeyExists(ES3_KEY)) { data = ES3.Load(ES3_KEY) ?? new LoginCacheData(); } else { data = new LoginCacheData(); } data.openId = account.openId; data.unionId = account.unionId; data.name = account.name; data.avatar = account.avatar; data.email = account.email; ES3.Save(ES3_KEY, data); Debug.Log($"[LoginCacheManager] 已缓存登录数据,openId={data.openId}"); } /// /// 保存服务端认证会话(JWT + 用户信息),保留已有的 TapTap 数据 /// public static void SaveAuthSession(string jwtToken, LoginResponseDto response) { if (string.IsNullOrEmpty(jwtToken) || response == null) { Debug.LogWarning("[LoginCacheManager] jwtToken 或 response 为 null,跳过缓存"); return; } LoginCacheData data; if (ES3.KeyExists(ES3_KEY)) { data = ES3.Load(ES3_KEY) ?? new LoginCacheData(); } else { data = new LoginCacheData(); } data.UpdateFromServerResponse(response); ES3.Save(ES3_KEY, data); Debug.Log($"[LoginCacheManager] 已缓存服务端会话,userId={data.userId}"); } /// /// 清除服务端会话数据,保留 TapTap 原始数据 /// public static void ClearSession() { if (!ES3.KeyExists(ES3_KEY)) return; var data = ES3.Load(ES3_KEY); if (data == null) return; data.ClearServerSession(); ES3.Save(ES3_KEY, data); Debug.Log("[LoginCacheManager] 已清除服务端会话,保留 TapTap 数据"); } /// /// 写入模拟数据(供编辑器工具使用) /// public static void SaveMockData() { var data = new LoginCacheData( "mock_openid_001", "mock_unionid_001", "MockUser", "", "mock@test.com" ); ES3.Save(ES3_KEY, data); Debug.Log($"[LoginCacheManager] 已写入模拟缓存数据"); } /// /// 清除本地登录缓存 /// public static void Clear() { if (ES3.KeyExists(ES3_KEY)) { ES3.DeleteKey(ES3_KEY); Debug.Log("[LoginCacheManager] 已清除登录缓存"); } } } }