78 lines
3.4 KiB
C#
78 lines
3.4 KiB
C#
![]() |
using MareSynchronos.API.Data;
|
|||
|
using MareSynchronos.API.Data.Comparer;
|
|||
|
using MareSynchronos.MareConfiguration;
|
|||
|
using MareSynchronos.Services.Mediator;
|
|||
|
using MareSynchronos.Services.ServerConfiguration;
|
|||
|
using MareSynchronos.WebAPI;
|
|||
|
using Microsoft.Extensions.Logging;
|
|||
|
using System.Collections.Concurrent;
|
|||
|
|
|||
|
namespace MareSynchronos.Services;
|
|||
|
|
|||
|
public class MareProfileManager : MediatorSubscriberBase
|
|||
|
{
|
|||
|
private const string _noDescription = "-- User has no description set --";
|
|||
|
private const string _nsfw = "Profile not displayed - NSFW";
|
|||
|
private readonly ApiController _apiController;
|
|||
|
private readonly MareConfigService _mareConfigService;
|
|||
|
private readonly ServerConfigurationManager _serverConfigurationManager;
|
|||
|
private readonly ConcurrentDictionary<UserData, MareProfileData> _mareProfiles = new(UserDataComparer.Instance);
|
|||
|
|
|||
|
private readonly MareProfileData _defaultProfileData = new(IsFlagged: false, IsNSFW: false, string.Empty, _noDescription);
|
|||
|
private readonly MareProfileData _loadingProfileData = new(IsFlagged: false, IsNSFW: false, string.Empty, "Loading Data from server...");
|
|||
|
private readonly MareProfileData _nsfwProfileData = new(IsFlagged: false, IsNSFW: false, string.Empty, _nsfw);
|
|||
|
|
|||
|
public MareProfileManager(ILogger<MareProfileManager> logger, MareConfigService mareConfigService,
|
|||
|
MareMediator mediator, ApiController apiController, ServerConfigurationManager serverConfigurationManager) : base(logger, mediator)
|
|||
|
{
|
|||
|
_mareConfigService = mareConfigService;
|
|||
|
_apiController = apiController;
|
|||
|
_serverConfigurationManager = serverConfigurationManager;
|
|||
|
|
|||
|
Mediator.Subscribe<ClearProfileDataMessage>(this, (msg) =>
|
|||
|
{
|
|||
|
if (msg.UserData != null)
|
|||
|
_mareProfiles.Remove(msg.UserData, out _);
|
|||
|
else
|
|||
|
_mareProfiles.Clear();
|
|||
|
});
|
|||
|
Mediator.Subscribe<DisconnectedMessage>(this, (_) => _mareProfiles.Clear());
|
|||
|
}
|
|||
|
|
|||
|
public MareProfileData GetMareProfile(UserData data)
|
|||
|
{
|
|||
|
if (!_mareProfiles.TryGetValue(data, out var profile))
|
|||
|
{
|
|||
|
_ = Task.Run(() => GetMareProfileFromService(data));
|
|||
|
return (_loadingProfileData);
|
|||
|
}
|
|||
|
|
|||
|
return (profile);
|
|||
|
}
|
|||
|
|
|||
|
private async Task GetMareProfileFromService(UserData data)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
_mareProfiles[data] = _loadingProfileData;
|
|||
|
var profile = await _apiController.UserGetProfile(new API.Dto.User.UserDto(data)).ConfigureAwait(false);
|
|||
|
MareProfileData profileData = new(profile.Disabled, profile.IsNSFW ?? false,
|
|||
|
string.IsNullOrEmpty(profile.ProfilePictureBase64) ? string.Empty : profile.ProfilePictureBase64,
|
|||
|
string.IsNullOrEmpty(profile.Description) ? _noDescription : profile.Description);
|
|||
|
if (profileData.IsNSFW && !_mareConfigService.Current.ProfilesAllowNsfw && !string.Equals(_apiController.UID, data.UID, StringComparison.Ordinal))
|
|||
|
{
|
|||
|
_mareProfiles[data] = _nsfwProfileData;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_mareProfiles[data] = profileData;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
// if fails save DefaultProfileData to dict
|
|||
|
Logger.LogWarning(ex, "Failed to get Profile from service for user {user}", data);
|
|||
|
_mareProfiles[data] = _defaultProfileData;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|