using System; using System.Collections.Generic; using System.Threading.Tasks; using Flawless.Client.Models; using ReactiveUI.SourceGenerators; namespace Flawless.Client.Service; public partial class UserService : BaseService { private Dictionary _cachedUsers = new(); public bool IsUserCached(string username) => _cachedUsers.ContainsKey(username); public UserModel? GetUserInfoAsync(string username) => _cachedUsers.ContainsKey(username) ? _cachedUsers[username] : null; public async ValueTask GetOrDownloadUserInfoAsync(string username) { if (_cachedUsers.TryGetValue(username, out var userModel)) return userModel; return await DownloadUserInfoAsync(username); } public async ValueTask DownloadUserInfoAsync(string username) { var api = Api.C; UserModel user; try { if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync())) { api.ClearGateway(); return null; } var info = await api.Gateway.GetInfo(username); user = new UserModel(); user.Username = info.Username; user.Nickname = info.NickName; user.Bio = info.Bio; user.Sex = (UserModel.SexType) info.Gender; user.EmailIsVisible = info.PublicEmail ?? false; user.CanEdit = info.Authorized; user.PhoneNumber = info.Phone; user.Email = info.Email; user.IsAdmin = info.IsAdmin; user.IsActive = info.IsActive; user.JoinDate = info.CreatedAt!.Value.LocalDateTime; _cachedUsers.Add(username, user); } catch (Exception e) { UIHelper.NotifyError(e); Console.WriteLine(e); return null; } return user; } public async ValueTask RefreshUserInfoAsync(UserModel user) { var api = Api.C; try { if (api.RequireRefreshToken() && !(await api.TryRefreshTokenAsync())) { api.ClearGateway(); return false; } var info = await api.Gateway.GetInfo(user.Username); user.Nickname = info.NickName; user.Bio = info.Bio; user.Sex = (UserModel.SexType) info.Gender; user.EmailIsVisible = info.PublicEmail ?? false; user.CanEdit = info.Authorized; user.PhoneNumber = info.Phone; user.Email = info.Email; user.IsAdmin = info.IsAdmin; user.IsActive = info.IsActive; user.JoinDate = info.CreatedAt!.Value.LocalDateTime; } catch (Exception e) { UIHelper.NotifyError(e); Console.WriteLine(e); return false; } return true; } }