refactor + add resiliency against penumbra/api shutdowns

This commit is contained in:
Stanley Dimant
2022-06-25 21:39:20 +02:00
parent 8c9f816e6d
commit 3bba240cd5
9 changed files with 169 additions and 150 deletions

View File

@@ -37,6 +37,46 @@ public class CharacterCacheManager : IDisposable
_apiController = apiController;
_dalamudUtil = dalamudUtil;
_ipcManager = ipcManager;
_clientState.Login += ClientStateOnLogin;
_clientState.Logout += ClientStateOnLogout;
_apiController.CharacterReceived += ApiControllerOnCharacterReceived;
_apiController.PairedClientOnline += ApiControllerOnPairedClientOnline;
_apiController.PairedClientOffline += ApiControllerOnPairedClientOffline;
_apiController.PairedWithOther += ApiControllerOnPairedWithOther;
_apiController.UnpairedFromOther += ApiControllerOnUnpairedFromOther;
_apiController.Disconnected += ApiControllerOnDisconnected;
_ipcManager.PenumbraDisposed += IpcManagerOnPenumbraDisposed;
if (clientState.IsLoggedIn)
{
ClientStateOnLogin(null, EventArgs.Empty);
}
}
private void IpcManagerOnPenumbraDisposed(object? sender, EventArgs e)
{
foreach (var character in _onlineCachedPlayers.ToList())
{
RestoreCharacter(character);
character.IsVisible = false;
}
}
private void ApiControllerOnDisconnected(object? sender, EventArgs e)
{
RestoreAllCharacters();
}
private void ClientStateOnLogin(object? sender, EventArgs e)
{
_framework.Update += FrameworkOnUpdate;
}
private void ClientStateOnLogout(object? sender, EventArgs e)
{
_framework.Update -= FrameworkOnUpdate;
}
public void AddInitialPairs(List<string> apiTaskResult)
@@ -55,8 +95,15 @@ public class CharacterCacheManager : IDisposable
_apiController.PairedClientOffline -= ApiControllerOnPairedClientOffline;
_apiController.PairedWithOther -= ApiControllerOnPairedWithOther;
_apiController.UnpairedFromOther -= ApiControllerOnUnpairedFromOther;
_ipcManager.PenumbraDisposed -= ApiControllerOnDisconnected;
_framework.Update -= FrameworkOnUpdate;
_clientState.Login -= ClientStateOnLogin;
_clientState.Logout -= ClientStateOnLogout;
RestoreAllCharacters();
}
private void RestoreAllCharacters()
{
foreach (var character in _onlineCachedPlayers.ToList())
{
RestoreCharacter(character);
@@ -65,18 +112,6 @@ public class CharacterCacheManager : IDisposable
_onlineCachedPlayers.Clear();
}
public void Initialize()
{
_onlineCachedPlayers.Clear();
_apiController.CharacterReceived += ApiControllerOnCharacterReceived;
_apiController.PairedClientOnline += ApiControllerOnPairedClientOnline;
_apiController.PairedClientOffline += ApiControllerOnPairedClientOffline;
_apiController.PairedWithOther += ApiControllerOnPairedWithOther;
_apiController.UnpairedFromOther += ApiControllerOnUnpairedFromOther;
_framework.Update += FrameworkOnUpdate;
}
public async Task UpdatePlayersFromService(Dictionary<string, int> playerJobIds)
{
await _apiController.GetCharacterData(playerJobIds);
@@ -190,6 +225,7 @@ public class CharacterCacheManager : IDisposable
if (DateTime.Now < _lastPlayerObjectCheck.AddSeconds(2)) return;
_localVisiblePlayers.Clear();
if (!_ipcManager.Initialized) return;
foreach (var obj in _objectTable)
{
if (obj.ObjectKind != Dalamud.Game.ClientState.Objects.Enums.ObjectKind.Player) continue;