98 lines
2.9 KiB
C#
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;
|
|
}
|
|
|
|
} |