diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 5dfe48f..58547ed 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -46,6 +46,9 @@ public class CharacterDataFactory return previousData; } + var previousFileReplacements = previousData.FileReplacements.ToDictionary(d => d.Key, d => d.Value); + var previousGlamourerData = previousData.GlamourerString.ToDictionary(d => d.Key, d => d.Value); + try { return CreateCharacterData(previousData, objectKind, playerPointer, token); @@ -53,15 +56,17 @@ public class CharacterDataFactory catch (OperationCanceledException) { Logger.Debug("Cancelled creating Character data"); - return previousData; } catch (Exception e) { Logger.Warn("Failed to create " + objectKind + " data"); Logger.Warn(e.Message); Logger.Warn(e.StackTrace ?? string.Empty); - return previousData; } + + previousData.FileReplacements = previousFileReplacements; + previousData.GlamourerString = previousGlamourerData; + return previousData; } private (string, string) GetIndentationForInheritanceLevel(int inheritanceLevel) diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index 06ca1f0..b925018 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -109,8 +109,11 @@ namespace MareSynchronos.Managers { Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind); PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address, token); - unprocessedObject.IsProcessing = false; - unprocessedObject.HasUnprocessedUpdate = false; + if (!token.IsCancellationRequested) + { + unprocessedObject.HasUnprocessedUpdate = false; + unprocessedObject.IsProcessing = false; + } token.ThrowIfCancellationRequested(); } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 61027d3..dfc5171 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.2.10.0 + 0.2.11.0 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs index 01283f5..2ea7e7e 100644 --- a/MareSynchronos/WebAPI/ApIController.Functions.Files.cs +++ b/MareSynchronos/WebAPI/ApIController.Functions.Files.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Net; using System.Runtime.CompilerServices; +using System.Text; using System.Threading; using System.Threading.Tasks; using LZ4; @@ -203,7 +204,17 @@ namespace MareSynchronos.WebAPI if (!uploadToken.IsCancellationRequested) { - Logger.Info("Pushing character data for " + character.GetHashCode()); + Logger.Info("Pushing character data for " + character.GetHashCode() + " to " + string.Join(", ", visibleCharacterIds)); + StringBuilder sb = new StringBuilder(); + foreach (var item in character.FileReplacements) + { + sb.AppendLine($"FileReplacements for {item.Key}: {item.Value.Count}"); + } + foreach (var item in character.GlamourerData) + { + sb.AppendLine($"GlamourerData for {item.Key}: {!string.IsNullOrEmpty(item.Value)}"); + } + Logger.Debug("Chara data contained: " + Environment.NewLine + sb.ToString()); await _mareHub!.InvokeAsync(Api.InvokeUserPushCharacterDataToVisibleClients, character, visibleCharacterIds, uploadToken); } else diff --git a/MareSynchronos/WebAPI/ApiController.Connectivity.cs b/MareSynchronos/WebAPI/ApiController.Connectivity.cs index 85cc294..d6c3c7c 100644 --- a/MareSynchronos/WebAPI/ApiController.Connectivity.cs +++ b/MareSynchronos/WebAPI/ApiController.Connectivity.cs @@ -184,42 +184,11 @@ namespace MareSynchronos.WebAPI await _mareHub.InvokeAsync(Api.InvokeHeartbeat, _dalamudUtil.PlayerNameHashed, token); if (ServerState is ServerState.Connected) // user is authorized && server is legit { - Logger.Debug("Initializing data"); - _mareHub.On(Api.OnUserUpdateClientPairs, - UpdateLocalClientPairsCallback); - _mareHub.On(Api.OnUserReceiveCharacterData, - ReceiveCharacterDataCallback); - _mareHub.On(Api.OnUserRemoveOnlinePairedPlayer, - (s) => PairedClientOffline?.Invoke(s)); - _mareHub.On(Api.OnUserAddOnlinePairedPlayer, - (s) => PairedClientOnline?.Invoke(s)); - _mareHub.On(Api.OnAdminForcedReconnect, UserForcedReconnectCallback); - - PairedClients = - await _mareHub!.InvokeAsync>(Api.InvokeUserGetPairedClients, token); + await InitializeData(token); _mareHub.Closed += MareHubOnClosed; _mareHub.Reconnected += MareHubOnReconnected; _mareHub.Reconnecting += MareHubOnReconnecting; - - if (IsModerator) - { - AdminForbiddenFiles = - await _mareHub.InvokeAsync>(Api.InvokeAdminGetForbiddenFiles, - token); - AdminBannedUsers = - await _mareHub.InvokeAsync>(Api.InvokeAdminGetBannedUsers, - token); - _mareHub.On(Api.OnAdminUpdateOrAddBannedUser, - UpdateOrAddBannedUserCallback); - _mareHub.On(Api.OnAdminDeleteBannedUser, DeleteBannedUserCallback); - _mareHub.On(Api.OnAdminUpdateOrAddForbiddenFile, - UpdateOrAddForbiddenFileCallback); - _mareHub.On(Api.OnAdminDeleteForbiddenFile, - DeleteForbiddenFileCallback); - } - - Connected?.Invoke(); } else if (ServerState is ServerState.VersionMisMatch or ServerState.NoAccount or ServerState.Unauthorized) { @@ -237,6 +206,43 @@ namespace MareSynchronos.WebAPI } } + private async Task InitializeData(CancellationToken? token) + { + if (_mareHub == null) return; + Logger.Debug("Initializing data"); + _mareHub.On(Api.OnUserUpdateClientPairs, + UpdateLocalClientPairsCallback); + _mareHub.On(Api.OnUserReceiveCharacterData, + ReceiveCharacterDataCallback); + _mareHub.On(Api.OnUserRemoveOnlinePairedPlayer, + (s) => PairedClientOffline?.Invoke(s)); + _mareHub.On(Api.OnUserAddOnlinePairedPlayer, + (s) => PairedClientOnline?.Invoke(s)); + _mareHub.On(Api.OnAdminForcedReconnect, UserForcedReconnectCallback); + + PairedClients = + await _mareHub!.InvokeAsync>(Api.InvokeUserGetPairedClients, token); + + if (IsModerator) + { + AdminForbiddenFiles = + await _mareHub.InvokeAsync>(Api.InvokeAdminGetForbiddenFiles, + token); + AdminBannedUsers = + await _mareHub.InvokeAsync>(Api.InvokeAdminGetBannedUsers, + token); + _mareHub.On(Api.OnAdminUpdateOrAddBannedUser, + UpdateOrAddBannedUserCallback); + _mareHub.On(Api.OnAdminDeleteBannedUser, DeleteBannedUserCallback); + _mareHub.On(Api.OnAdminUpdateOrAddForbiddenFile, + UpdateOrAddForbiddenFileCallback); + _mareHub.On(Api.OnAdminDeleteForbiddenFile, + DeleteForbiddenFileCallback); + } + + Connected?.Invoke(); + } + public void Dispose() { Logger.Verbose("Disposing " + nameof(ApiController)); @@ -278,8 +284,7 @@ namespace MareSynchronos.WebAPI { Logger.Info("Connection restored"); await Task.Delay(TimeSpan.FromSeconds(new Random().Next(5, 10))); - _connectionDto = await _mareHub!.InvokeAsync(Api.InvokeHeartbeat, _dalamudUtil.PlayerNameHashed); - Connected?.Invoke(); + await InitializeData(null); } private Task MareHubOnReconnecting(Exception? arg) @@ -288,6 +293,8 @@ namespace MareSynchronos.WebAPI CurrentDownloads.Clear(); _uploadCancellationTokenSource?.Cancel(); Logger.Warn("Connection closed... Reconnecting"); + Logger.Warn(arg?.Message ?? string.Empty); + Logger.Warn(arg?.StackTrace ?? string.Empty); Disconnected?.Invoke(); return Task.CompletedTask; }