using MareSynchronos.API.Data; using MareSynchronos.API.Dto.User; using Microsoft.AspNetCore.SignalR.Client; using Microsoft.Extensions.Logging; using System.Text; namespace MareSynchronos.WebAPI; public partial class ApiController { public async Task PushCharacterData(CharacterData data, List visibleCharacters) { if (!IsConnected) return; try { Logger.LogDebug("Pushing Character data {hash} to {visible}", data.DataHash, string.Join(", ", visibleCharacters.Select(v => v.AliasOrUID))); await PushCharacterDataInternal(data, [.. visibleCharacters]).ConfigureAwait(false); } catch (OperationCanceledException) { Logger.LogDebug("Upload operation was cancelled"); } catch (Exception ex) { Logger.LogWarning(ex, "Error during upload of files"); } } public async Task UserAddPair(UserDto user) { if (!IsConnected) return; await _mareHub!.SendAsync(nameof(UserAddPair), user).ConfigureAwait(false); } public async Task UserChatSendMsg(UserDto user, ChatMessage message) { CheckConnection(); await _mareHub!.SendAsync(nameof(UserChatSendMsg), user, message).ConfigureAwait(false); } public async Task UserDelete() { CheckConnection(); await _mareHub!.SendAsync(nameof(UserDelete)).ConfigureAwait(false); await CreateConnections().ConfigureAwait(false); } public async Task> UserGetOnlinePairs() { return await _mareHub!.InvokeAsync>(nameof(UserGetOnlinePairs)).ConfigureAwait(false); } public async Task> UserGetPairedClients() { return await _mareHub!.InvokeAsync>(nameof(UserGetPairedClients)).ConfigureAwait(false); } public async Task UserGetProfile(UserDto dto) { if (!IsConnected) return new UserProfileDto(dto.User, false, null, null, null); return await _mareHub!.InvokeAsync(nameof(UserGetProfile), dto).ConfigureAwait(false); } public async Task UserPushData(UserCharaDataMessageDto dto) { try { await _mareHub!.InvokeAsync(nameof(UserPushData), dto).ConfigureAwait(false); } catch (Exception ex) { Logger.LogWarning(ex, "Failed to Push character data"); } } public async Task UserRemovePair(UserDto userDto) { if (!IsConnected) return; await _mareHub!.SendAsync(nameof(UserRemovePair), userDto).ConfigureAwait(false); } public async Task UserReportProfile(UserProfileReportDto userDto) { if (!IsConnected) return; await _mareHub!.SendAsync(nameof(UserReportProfile), userDto).ConfigureAwait(false); } public async Task UserSetPairPermissions(UserPermissionsDto userPermissions) { await _mareHub!.SendAsync(nameof(UserSetPairPermissions), userPermissions).ConfigureAwait(false); } public async Task UserSetProfile(UserProfileDto userDescription) { if (!IsConnected) return; await _mareHub!.InvokeAsync(nameof(UserSetProfile), userDescription).ConfigureAwait(false); } private async Task PushCharacterDataInternal(CharacterData character, List visibleCharacters) { Logger.LogInformation("Pushing character data for {hash} to {charas}", character.DataHash.Value, string.Join(", ", visibleCharacters.Select(c => c.AliasOrUID))); StringBuilder sb = new(); foreach (var kvp in character.FileReplacements.ToList()) { sb.AppendLine($"FileReplacements for {kvp.Key}: {kvp.Value.Count}"); } foreach (var item in character.GlamourerData) { sb.AppendLine($"GlamourerData for {item.Key}: {!string.IsNullOrEmpty(item.Value)}"); } Logger.LogDebug("Chara data contained: {nl} {data}", Environment.NewLine, sb.ToString()); await UserPushData(new(visibleCharacters, character)).ConfigureAwait(false); } }