fix crash on logout, change several logger.debug to verbose, adjustments to player cache generation, fixes to file scan manager, better handling disconnects, some refactoring, adjustments to intro UI, correct display of server state
This commit is contained in:
@@ -178,12 +178,13 @@ public class CachedPlayer
|
||||
|
||||
public void DisposePlayer()
|
||||
{
|
||||
Logger.Debug("Disposing " + PlayerName + " (" + PlayerNameHash + ")");
|
||||
if (_isDisposed) return;
|
||||
if (string.IsNullOrEmpty(PlayerName)) return;
|
||||
Logger.Verbose("Disposing " + PlayerName + " (" + PlayerNameHash + ")");
|
||||
_isDisposed = true;
|
||||
try
|
||||
{
|
||||
Logger.Debug("Restoring state for " + PlayerName);
|
||||
Logger.Verbose("Restoring state for " + PlayerName);
|
||||
_dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate;
|
||||
_ipcManager.PenumbraRedrawEvent -= IpcManagerOnPenumbraRedrawEvent;
|
||||
_apiController.CharacterReceived -= ApiControllerOnCharacterReceived;
|
||||
@@ -191,7 +192,7 @@ public class CachedPlayer
|
||||
_downloadCancellationTokenSource?.Dispose();
|
||||
_downloadCancellationTokenSource = null;
|
||||
_ipcManager.PenumbraRemoveTemporaryCollection(PlayerName);
|
||||
if (PlayerCharacter != null)
|
||||
if (PlayerCharacter != null && PlayerCharacter.IsValid())
|
||||
{
|
||||
_ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter);
|
||||
_ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter);
|
||||
@@ -206,7 +207,6 @@ public class CachedPlayer
|
||||
PlayerName = string.Empty;
|
||||
PlayerCharacter = null;
|
||||
IsVisible = false;
|
||||
_isDisposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,22 +25,22 @@ namespace MareSynchronos.Managers
|
||||
private Task? _scanTask;
|
||||
public FileCacheManager(IpcManager ipcManager, Configuration pluginConfiguration)
|
||||
{
|
||||
Logger.Debug("Creating " + nameof(FileCacheManager));
|
||||
Logger.Verbose("Creating " + nameof(FileCacheManager));
|
||||
|
||||
_ipcManager = ipcManager;
|
||||
_pluginConfiguration = pluginConfiguration;
|
||||
|
||||
StartWatchersAndScan();
|
||||
|
||||
_ipcManager.PenumbraInitialized += IpcManagerOnPenumbraInitialized;
|
||||
_ipcManager.PenumbraDisposed += IpcManagerOnPenumbraDisposed;
|
||||
_ipcManager.PenumbraInitialized += StartWatchersAndScan;
|
||||
_ipcManager.PenumbraDisposed += StopWatchersAndScan;
|
||||
}
|
||||
|
||||
public long CurrentFileProgress { get; private set; }
|
||||
|
||||
public long FileCacheSize { get; set; }
|
||||
|
||||
public bool IsScanRunning => !_scanTask?.IsCompleted ?? false;
|
||||
public bool IsScanRunning => CurrentFileProgress > 0 || TotalFiles > 0;
|
||||
|
||||
public long TotalFiles { get; private set; }
|
||||
|
||||
@@ -67,10 +67,10 @@ namespace MareSynchronos.Managers
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Logger.Debug("Disposing " + nameof(FileCacheManager));
|
||||
Logger.Verbose("Disposing " + nameof(FileCacheManager));
|
||||
|
||||
_ipcManager.PenumbraInitialized -= IpcManagerOnPenumbraInitialized;
|
||||
_ipcManager.PenumbraDisposed -= IpcManagerOnPenumbraDisposed;
|
||||
_ipcManager.PenumbraInitialized -= StartWatchersAndScan;
|
||||
_ipcManager.PenumbraDisposed -= StopWatchersAndScan;
|
||||
_rescanTaskCancellationTokenSource?.Cancel();
|
||||
_rescanTaskRunCancellationTokenSource?.Cancel();
|
||||
_scanCancellationTokenSource?.Cancel();
|
||||
@@ -121,16 +121,6 @@ namespace MareSynchronos.Managers
|
||||
Task.Run(RecalculateFileCacheSize);
|
||||
}
|
||||
|
||||
private void IpcManagerOnPenumbraDisposed(object? sender, EventArgs e)
|
||||
{
|
||||
StopWatchersAndScan();
|
||||
}
|
||||
|
||||
private void IpcManagerOnPenumbraInitialized(object? sender, EventArgs e)
|
||||
{
|
||||
StartWatchersAndScan();
|
||||
}
|
||||
|
||||
private bool IsFileLocked(FileInfo file)
|
||||
{
|
||||
try
|
||||
@@ -217,6 +207,7 @@ namespace MareSynchronos.Managers
|
||||
|
||||
private async Task StartFileScan(CancellationToken ct)
|
||||
{
|
||||
TotalFiles = 1;
|
||||
_scanCancellationTokenSource = new CancellationTokenSource();
|
||||
var penumbraDir = _ipcManager.PenumbraModDirectory()!;
|
||||
Logger.Debug("Getting files from " + penumbraDir + " and " + _pluginConfiguration.CacheFolder);
|
||||
@@ -237,7 +228,7 @@ namespace MareSynchronos.Managers
|
||||
var fileCachesToDelete = new ConcurrentBag<FileCache>();
|
||||
var fileCachesToAdd = new ConcurrentBag<FileCache>();
|
||||
|
||||
Logger.Debug("Getting file list from Database");
|
||||
Logger.Verbose("Getting file list from Database");
|
||||
// scan files from database
|
||||
Parallel.ForEach(fileCaches, new ParallelOptions()
|
||||
{
|
||||
|
||||
@@ -7,6 +7,7 @@ using System.Linq;
|
||||
using Dalamud.Game.ClientState.Objects.Types;
|
||||
using Lumina.Excel.GeneratedSheets;
|
||||
using MareSynchronos.Utils;
|
||||
using MareSynchronos.WebAPI;
|
||||
|
||||
namespace MareSynchronos.Managers
|
||||
{
|
||||
@@ -33,7 +34,7 @@ namespace MareSynchronos.Managers
|
||||
_penumbraSetTemporaryMod;
|
||||
public IpcManager(DalamudPluginInterface pi)
|
||||
{
|
||||
Logger.Debug("Creating " + nameof(IpcManager));
|
||||
Logger.Verbose("Creating " + nameof(IpcManager));
|
||||
|
||||
_penumbraInit = pi.GetIpcSubscriber<object>("Penumbra.Initialized");
|
||||
_penumbraDispose = pi.GetIpcSubscriber<object>("Penumbra.Disposed");
|
||||
@@ -69,12 +70,12 @@ namespace MareSynchronos.Managers
|
||||
|
||||
if (Initialized)
|
||||
{
|
||||
PenumbraInitialized?.Invoke(null, EventArgs.Empty);
|
||||
PenumbraInitialized?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
public event EventHandler? PenumbraInitialized;
|
||||
public event EventHandler? PenumbraDisposed;
|
||||
public event VoidDelegate? PenumbraInitialized;
|
||||
public event VoidDelegate? PenumbraDisposed;
|
||||
public event EventHandler? PenumbraRedrawEvent;
|
||||
|
||||
public bool Initialized => CheckPenumbraApi();
|
||||
@@ -104,32 +105,31 @@ namespace MareSynchronos.Managers
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Logger.Debug("Disposing " + nameof(IpcManager));
|
||||
Logger.Verbose("Disposing " + nameof(IpcManager));
|
||||
|
||||
_penumbraDispose.Unsubscribe(PenumbraDispose);
|
||||
_penumbraInit.Unsubscribe(PenumbraInit);
|
||||
_penumbraObjectIsRedrawn.Unsubscribe(RedrawEvent);
|
||||
Logger.Debug("IPC Manager disposed");
|
||||
}
|
||||
|
||||
public void GlamourerApplyAll(string customization, GameObject character)
|
||||
{
|
||||
if (!CheckGlamourerApi()) return;
|
||||
Logger.Debug("Glamourer apply all to " + character);
|
||||
Logger.Verbose("Glamourer apply all to " + character);
|
||||
_glamourerApplyAll!.InvokeAction(customization, character);
|
||||
}
|
||||
|
||||
public void GlamourerApplyOnlyEquipment(string customization, GameObject character)
|
||||
{
|
||||
if (!CheckGlamourerApi() || string.IsNullOrEmpty(customization)) return;
|
||||
Logger.Debug("Glamourer apply only equipment to " + character);
|
||||
Logger.Verbose("Glamourer apply only equipment to " + character);
|
||||
_glamourerApplyOnlyEquipment!.InvokeAction(customization, character);
|
||||
}
|
||||
|
||||
public void GlamourerApplyOnlyCustomization(string customization, GameObject character)
|
||||
{
|
||||
if (!CheckGlamourerApi() || string.IsNullOrEmpty(customization)) return;
|
||||
Logger.Debug("Glamourer apply only customization to " + character);
|
||||
Logger.Verbose("Glamourer apply only customization to " + character);
|
||||
_glamourerApplyOnlyCustomization!.InvokeAction(customization, character);
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ namespace MareSynchronos.Managers
|
||||
public string PenumbraCreateTemporaryCollection(string characterName)
|
||||
{
|
||||
if (!CheckPenumbraApi()) return string.Empty;
|
||||
Logger.Debug("Creating temp collection for " + characterName);
|
||||
Logger.Verbose("Creating temp collection for " + characterName);
|
||||
var ret = _penumbraCreateTemporaryCollection.InvokeFunc("MareSynchronos", characterName, true);
|
||||
return ret.Item2;
|
||||
}
|
||||
@@ -174,7 +174,7 @@ namespace MareSynchronos.Managers
|
||||
public void PenumbraRemoveTemporaryCollection(string characterName)
|
||||
{
|
||||
if (!CheckPenumbraApi()) return;
|
||||
Logger.Debug("Removing temp collection for " + characterName);
|
||||
Logger.Verbose("Removing temp collection for " + characterName);
|
||||
_penumbraRemoveTemporaryCollection.InvokeFunc(characterName);
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ namespace MareSynchronos.Managers
|
||||
{
|
||||
if (!CheckPenumbraApi()) return null;
|
||||
var resolvedPath = _penumbraResolvePath!.InvokeFunc(path, characterName);
|
||||
PluginLog.Verbose("Resolving " + path + Environment.NewLine + "=>" + string.Join(", ", resolvedPath));
|
||||
Logger.Verbose("Resolved " + path + "=>" + string.Join(", ", resolvedPath));
|
||||
return resolvedPath;
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ namespace MareSynchronos.Managers
|
||||
{
|
||||
if (!CheckPenumbraApi()) return new[] { path };
|
||||
var resolvedPaths = _penumbraReverseResolvePath!.InvokeFunc(path, characterName);
|
||||
PluginLog.Verbose("ReverseResolving " + path + Environment.NewLine + "=>" + string.Join(", ", resolvedPaths));
|
||||
Logger.Verbose("Reverse Resolved " + path + "=>" + string.Join(", ", resolvedPaths));
|
||||
return resolvedPaths;
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ namespace MareSynchronos.Managers
|
||||
{
|
||||
if (!CheckPenumbraApi()) return;
|
||||
|
||||
Logger.Debug("Assigning temp mods for " + collectionName);
|
||||
Logger.Verbose("Assigning temp mods for " + collectionName);
|
||||
foreach (var mod in modPaths)
|
||||
{
|
||||
Logger.Verbose(mod.Key + " => " + mod.Value);
|
||||
@@ -213,13 +213,13 @@ namespace MareSynchronos.Managers
|
||||
|
||||
private void PenumbraInit()
|
||||
{
|
||||
PenumbraInitialized?.Invoke(null, EventArgs.Empty);
|
||||
PenumbraInitialized?.Invoke();
|
||||
_penumbraRedraw!.InvokeAction("self", 0);
|
||||
}
|
||||
|
||||
private void PenumbraDispose()
|
||||
{
|
||||
PenumbraDisposed?.Invoke(null, EventArgs.Empty);
|
||||
PenumbraDisposed?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class OnlinePlayerManager : IDisposable
|
||||
|
||||
public OnlinePlayerManager(Framework framework, ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager)
|
||||
{
|
||||
Logger.Debug("Creating " + nameof(OnlinePlayerManager));
|
||||
Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
|
||||
|
||||
_framework = framework;
|
||||
_apiController = apiController;
|
||||
@@ -74,7 +74,7 @@ public class OnlinePlayerManager : IDisposable
|
||||
PushCharacterData(OnlineVisiblePlayerHashes);
|
||||
}
|
||||
|
||||
private void ApiControllerOnConnected(object? sender, EventArgs e)
|
||||
private void ApiControllerOnConnected()
|
||||
{
|
||||
var apiTask = _apiController.GetOnlineCharacters();
|
||||
|
||||
@@ -95,12 +95,12 @@ public class OnlinePlayerManager : IDisposable
|
||||
_framework.Update += FrameworkOnUpdate;
|
||||
}
|
||||
|
||||
private void IpcManagerOnPenumbraDisposed(object? sender, EventArgs e)
|
||||
private void IpcManagerOnPenumbraDisposed()
|
||||
{
|
||||
_onlineCachedPlayers.ForEach(p => p.DisposePlayer());
|
||||
}
|
||||
|
||||
private void ApiControllerOnDisconnected(object? sender, EventArgs e)
|
||||
private void ApiControllerOnDisconnected()
|
||||
{
|
||||
RestoreAllCharacters();
|
||||
_playerManager.PlayerHasChanged -= PlayerManagerOnPlayerHasChanged;
|
||||
@@ -110,12 +110,12 @@ public class OnlinePlayerManager : IDisposable
|
||||
{
|
||||
_onlineCachedPlayers.Clear();
|
||||
_onlineCachedPlayers.AddRange(apiTaskResult.Select(CreateCachedPlayer));
|
||||
Logger.Debug("Online and paired users: " + string.Join(",", _onlineCachedPlayers));
|
||||
Logger.Verbose("Online and paired users: " + string.Join(Environment.NewLine, _onlineCachedPlayers));
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Logger.Debug("Disposing " + nameof(OnlinePlayerManager));
|
||||
Logger.Verbose("Disposing " + nameof(OnlinePlayerManager));
|
||||
|
||||
RestoreAllCharacters();
|
||||
|
||||
@@ -140,37 +140,28 @@ public class OnlinePlayerManager : IDisposable
|
||||
_onlineCachedPlayers.Clear();
|
||||
}
|
||||
|
||||
public async Task UpdatePlayersFromService(Dictionary<string, int> playerJobIds)
|
||||
private void ApiControllerOnPairedClientOffline(string charHash)
|
||||
{
|
||||
if (!playerJobIds.Any()) return;
|
||||
Logger.Debug("Getting data for new players: " + string.Join(Environment.NewLine, playerJobIds));
|
||||
await _apiController.GetCharacterData(playerJobIds);
|
||||
Logger.Debug("Player offline: " + charHash);
|
||||
RemovePlayer(charHash);
|
||||
}
|
||||
|
||||
private void ApiControllerOnPairedClientOffline(object? sender, EventArgs e)
|
||||
private void ApiControllerOnPairedClientOnline(string charHash)
|
||||
{
|
||||
Logger.Debug("Player offline: " + sender!);
|
||||
RemovePlayer((string)sender!);
|
||||
}
|
||||
|
||||
private void ApiControllerOnPairedClientOnline(object? sender, EventArgs e)
|
||||
{
|
||||
Logger.Debug("Player online: " + sender!);
|
||||
AddPlayer((string)sender!);
|
||||
Logger.Debug("Player online: " + charHash);
|
||||
AddPlayer(charHash);
|
||||
return;
|
||||
}
|
||||
|
||||
private void ApiControllerOnPairedWithOther(object? sender, EventArgs e)
|
||||
private void ApiControllerOnPairedWithOther(string charHash)
|
||||
{
|
||||
var characterHash = (string?)sender;
|
||||
if (string.IsNullOrEmpty(characterHash)) return;
|
||||
Logger.Debug("Pairing with " + characterHash);
|
||||
AddPlayer(characterHash);
|
||||
if (string.IsNullOrEmpty(charHash)) return;
|
||||
Logger.Debug("Pairing with " + charHash);
|
||||
AddPlayer(charHash);
|
||||
}
|
||||
|
||||
private void ApiControllerOnUnpairedFromOther(object? sender, EventArgs e)
|
||||
private void ApiControllerOnUnpairedFromOther(string? characterHash)
|
||||
{
|
||||
var characterHash = (string?)sender;
|
||||
if (string.IsNullOrEmpty(characterHash)) return;
|
||||
Logger.Debug("Unpairing from " + characterHash);
|
||||
RemovePlayer(characterHash);
|
||||
@@ -228,8 +219,8 @@ public class OnlinePlayerManager : IDisposable
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
Logger.Verbose(JsonConvert.SerializeObject(_playerManager.LastSentCharacterData!.ToCharacterCacheDto(), Formatting.Indented));
|
||||
await _apiController.PushCharacterData(_playerManager.LastSentCharacterData.ToCharacterCacheDto(),
|
||||
Logger.Verbose(JsonConvert.SerializeObject(_playerManager.LastSentCharacterData, Formatting.Indented));
|
||||
await _apiController.PushCharacterData(_playerManager.LastSentCharacterData,
|
||||
visiblePlayers);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace MareSynchronos.Managers
|
||||
private readonly IpcManager _ipcManager;
|
||||
public event PlayerHasChanged? PlayerHasChanged;
|
||||
public bool SendingData { get; private set; }
|
||||
public CharacterData? LastSentCharacterData { get; private set; }
|
||||
public CharacterCacheDto? LastSentCharacterData { get; private set; }
|
||||
|
||||
private CancellationTokenSource? _playerChangedCts;
|
||||
private DateTime _lastPlayerObjectCheck;
|
||||
@@ -31,28 +31,28 @@ namespace MareSynchronos.Managers
|
||||
public PlayerManager(ApiController apiController, IpcManager ipcManager,
|
||||
CharacterDataFactory characterDataFactory, DalamudUtil dalamudUtil)
|
||||
{
|
||||
Logger.Debug("Creating " + nameof(PlayerManager));
|
||||
Logger.Verbose("Creating " + nameof(PlayerManager));
|
||||
|
||||
_apiController = apiController;
|
||||
_ipcManager = ipcManager;
|
||||
_characterDataFactory = characterDataFactory;
|
||||
_dalamudUtil = dalamudUtil;
|
||||
|
||||
_apiController.Connected += ApiController_Connected;
|
||||
_apiController.Connected += ApiControllerOnConnected;
|
||||
_apiController.Disconnected += ApiController_Disconnected;
|
||||
|
||||
Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected);
|
||||
if (_apiController.IsConnected)
|
||||
{
|
||||
ApiController_Connected(null, EventArgs.Empty);
|
||||
ApiControllerOnConnected();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Logger.Debug("Disposing " + nameof(PlayerManager));
|
||||
Logger.Verbose("Disposing " + nameof(PlayerManager));
|
||||
|
||||
_apiController.Connected -= ApiController_Connected;
|
||||
_apiController.Connected -= ApiControllerOnConnected;
|
||||
_apiController.Disconnected -= ApiController_Disconnected;
|
||||
|
||||
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
|
||||
@@ -73,7 +73,7 @@ namespace MareSynchronos.Managers
|
||||
_lastPlayerObjectCheck = DateTime.Now;
|
||||
}
|
||||
|
||||
private void ApiController_Connected(object? sender, EventArgs args)
|
||||
private void ApiControllerOnConnected()
|
||||
{
|
||||
Logger.Debug("ApiController Connected");
|
||||
|
||||
@@ -84,17 +84,19 @@ namespace MareSynchronos.Managers
|
||||
PlayerChanged();
|
||||
}
|
||||
|
||||
private void ApiController_Disconnected(object? sender, EventArgs args)
|
||||
private void ApiController_Disconnected()
|
||||
{
|
||||
Logger.Debug(nameof(ApiController_Disconnected));
|
||||
|
||||
_ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent;
|
||||
_dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate;
|
||||
LastSentCharacterData = null;
|
||||
}
|
||||
|
||||
private async Task<CharacterData> CreateFullCharacterCache(CancellationToken token)
|
||||
private async Task<CharacterCacheDto?> CreateFullCharacterCache(CancellationToken token)
|
||||
{
|
||||
var cache = _characterDataFactory.BuildCharacterData();
|
||||
CharacterCacheDto? cacheDto = null;
|
||||
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
@@ -105,12 +107,13 @@ namespace MareSynchronos.Managers
|
||||
|
||||
if (token.IsCancellationRequested) return;
|
||||
|
||||
var json = JsonConvert.SerializeObject(cache, Formatting.Indented);
|
||||
cacheDto = cache.ToCharacterCacheDto();
|
||||
var json = JsonConvert.SerializeObject(cacheDto);
|
||||
|
||||
cache.CacheHash = Crypto.GetHash(json);
|
||||
cacheDto.Hash = Crypto.GetHash(json);
|
||||
}, token);
|
||||
|
||||
return cache;
|
||||
return cacheDto;
|
||||
}
|
||||
|
||||
private void IpcManager_PenumbraRedrawEvent(object? objectTableIndex, EventArgs e)
|
||||
@@ -160,32 +163,21 @@ namespace MareSynchronos.Managers
|
||||
|
||||
if (attempts == 10 || token.IsCancellationRequested) return;
|
||||
|
||||
Stopwatch st = Stopwatch.StartNew();
|
||||
_dalamudUtil.WaitWhileSelfIsDrawing(token);
|
||||
|
||||
var characterCache = await CreateFullCharacterCache(token);
|
||||
var characterCache = (await CreateFullCharacterCache(token))!;
|
||||
|
||||
if (token.IsCancellationRequested) return;
|
||||
|
||||
var cacheDto = characterCache.ToCharacterCacheDto();
|
||||
st.Stop();
|
||||
|
||||
if (token.IsCancellationRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.Debug("Elapsed time PlayerChangedTask: " + st.Elapsed);
|
||||
if (cacheDto.Hash == (LastSentCharacterData?.CacheHash ?? "-"))
|
||||
if (characterCache.Hash == (LastSentCharacterData?.Hash ?? "-"))
|
||||
{
|
||||
Logger.Debug("Not sending data, already sent");
|
||||
return;
|
||||
}
|
||||
|
||||
LastSentCharacterData = characterCache;
|
||||
PlayerHasChanged?.Invoke(cacheDto);
|
||||
PlayerHasChanged?.Invoke(characterCache);
|
||||
SendingData = false;
|
||||
|
||||
}, token);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user