1
0

98 lines
2.9 KiB
C#

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<UserService>
{
private Dictionary<string, UserModel> _cachedUsers = new();
public bool IsUserCached(string username)
=> _cachedUsers.ContainsKey(username);
public UserModel? GetUserInfoAsync(string username)
=> _cachedUsers.ContainsKey(username) ? _cachedUsers[username] : null;
public async ValueTask<UserModel?> GetOrDownloadUserInfoAsync(string username)
{
if (_cachedUsers.TryGetValue(username, out var userModel)) return userModel;
return await DownloadUserInfoAsync(username);
}
public async ValueTask<UserModel?> 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<bool> 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;
}
}