add warnings for missing optional plugins when respective data is received

This commit is contained in:
rootdarkarchon
2023-01-08 00:19:11 +01:00
parent 90a25c23dc
commit e1f6d6df24
7 changed files with 56 additions and 8 deletions

View File

@@ -80,6 +80,7 @@ public class Configuration : IPluginConfiguration
public bool FullPause { get; set; } = false; public bool FullPause { get; set; } = false;
public bool HideInfoMessages { get; set; } = false; public bool HideInfoMessages { get; set; } = false;
public bool DisableOptionalPluginWarnings { get; set; } = false;
public Dictionary<string, Dictionary<string, string>> UidServerComments { get; set; } = new(StringComparer.Ordinal); public Dictionary<string, Dictionary<string, string>> UidServerComments { get; set; } = new(StringComparer.Ordinal);
public Dictionary<string, Dictionary<string, string>> GidServerComments { get; set; } = new(StringComparer.Ordinal); public Dictionary<string, Dictionary<string, string>> GidServerComments { get; set; } = new(StringComparer.Ordinal);

View File

@@ -61,7 +61,7 @@ public class CachedPlayer
private PlayerRelatedObject? _currentCharacterEquipment; private PlayerRelatedObject? _currentCharacterEquipment;
public void ApplyCharacterData(CharacterCacheDto characterData) public void ApplyCharacterData(CharacterCacheDto characterData, OptionalPluginWarning warning)
{ {
Logger.Debug("Received data for " + this); Logger.Debug("Received data for " + this);
@@ -122,6 +122,7 @@ public class CachedPlayer
bool heelsOffsetDifferent = _cachedData.HeelsOffset != characterData.HeelsOffset; bool heelsOffsetDifferent = _cachedData.HeelsOffset != characterData.HeelsOffset;
if (heelsOffsetDifferent) if (heelsOffsetDifferent)
{ {
Logger.Debug("Updating " + objectKind); Logger.Debug("Updating " + objectKind);
charaDataToUpdate.Add(objectKind); charaDataToUpdate.Add(objectKind);
continue; continue;
@@ -137,6 +138,23 @@ public class CachedPlayer
} }
} }
if (characterData.HeelsOffset != default)
{
if (!warning.ShownHeelsWarning && !_ipcManager.CheckHeelsApi())
{
_dalamudUtil.PrintWarnChat("Received Heels data for player " + PlayerName + ", but Heels is not installed. Install Heels to experience their character fully.");
warning.ShownHeelsWarning = true;
}
}
if (!string.IsNullOrEmpty(characterData.CustomizePlusData))
{
if (!warning.ShownCustomizePlusWarning && !_ipcManager.CheckCustomizePlusApi())
{
_dalamudUtil.PrintWarnChat("Received Customize+ data for player " + PlayerName + ", but Customize+ is not installed. Install Customize+ to experience their character fully.");
warning.ShownCustomizePlusWarning = true;
}
}
_cachedData = characterData; _cachedData = characterData;
DownloadAndApplyCharacter(charaDataToUpdate, updateModdedPaths); DownloadAndApplyCharacter(charaDataToUpdate, updateModdedPaths);
@@ -418,7 +436,7 @@ public class CachedPlayer
} }
} }
public void InitializePlayer(IntPtr character, string name, CharacterCacheDto? cache) public void InitializePlayer(IntPtr character, string name, CharacterCacheDto? cache, OptionalPluginWarning displayedChatWarning)
{ {
if (!_isDisposed) return; if (!_isDisposed) return;
IsVisible = true; IsVisible = true;
@@ -434,7 +452,7 @@ public class CachedPlayer
_isDisposed = false; _isDisposed = false;
if (cache != null) if (cache != null)
{ {
ApplyCharacterData(cache); ApplyCharacterData(cache, displayedChatWarning);
} }
} }

View File

@@ -6,6 +6,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MareSynchronos.API; using MareSynchronos.API;
using MareSynchronos.FileCache; using MareSynchronos.FileCache;
using MareSynchronos.Models;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI; using MareSynchronos.WebAPI;
using MareSynchronos.WebAPI.Utils; using MareSynchronos.WebAPI.Utils;
@@ -19,14 +20,16 @@ public class OnlinePlayerManager : IDisposable
private readonly IpcManager _ipcManager; private readonly IpcManager _ipcManager;
private readonly PlayerManager _playerManager; private readonly PlayerManager _playerManager;
private readonly FileCacheManager _fileDbManager; private readonly FileCacheManager _fileDbManager;
private readonly Configuration _configuration;
private readonly ConcurrentDictionary<string, CachedPlayer> _onlineCachedPlayers = new(StringComparer.Ordinal); private readonly ConcurrentDictionary<string, CachedPlayer> _onlineCachedPlayers = new(StringComparer.Ordinal);
private readonly ConcurrentDictionary<string, CharacterCacheDto> _temporaryStoredCharacterCache = new(StringComparer.Ordinal); private readonly ConcurrentDictionary<string, CharacterCacheDto> _temporaryStoredCharacterCache = new(StringComparer.Ordinal);
private readonly ConcurrentDictionary<CachedPlayer, CancellationTokenSource> _playerTokenDisposal = new(); private readonly ConcurrentDictionary<CachedPlayer, CancellationTokenSource> _playerTokenDisposal = new();
private readonly ConcurrentDictionary<string, OptionalPluginWarning> _shownWarnings = new(StringComparer.Ordinal);
private List<string> OnlineVisiblePlayerHashes => _onlineCachedPlayers.Select(p => p.Value).Where(p => p.PlayerCharacter != IntPtr.Zero) private List<string> OnlineVisiblePlayerHashes => _onlineCachedPlayers.Select(p => p.Value).Where(p => p.PlayerCharacter != IntPtr.Zero)
.Select(p => p.PlayerNameHash).ToList(); .Select(p => p.PlayerNameHash).ToList();
public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager, FileCacheManager fileDbManager) public OnlinePlayerManager(ApiController apiController, DalamudUtil dalamudUtil, IpcManager ipcManager, PlayerManager playerManager, FileCacheManager fileDbManager, Configuration configuration)
{ {
Logger.Verbose("Creating " + nameof(OnlinePlayerManager)); Logger.Verbose("Creating " + nameof(OnlinePlayerManager));
@@ -35,6 +38,7 @@ public class OnlinePlayerManager : IDisposable
_ipcManager = ipcManager; _ipcManager = ipcManager;
_playerManager = playerManager; _playerManager = playerManager;
_fileDbManager = fileDbManager; _fileDbManager = fileDbManager;
_configuration = configuration;
_apiController.PairedClientOnline += ApiControllerOnPairedClientOnline; _apiController.PairedClientOnline += ApiControllerOnPairedClientOnline;
_apiController.PairedClientOffline += ApiControllerOnPairedClientOffline; _apiController.PairedClientOffline += ApiControllerOnPairedClientOffline;
_apiController.Connected += ApiControllerOnConnected; _apiController.Connected += ApiControllerOnConnected;
@@ -60,10 +64,15 @@ public class OnlinePlayerManager : IDisposable
private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e) private void ApiControllerOnCharacterReceived(object? sender, CharacterReceivedEventArgs e)
{ {
if (!_shownWarnings.ContainsKey(e.CharacterNameHash)) _shownWarnings[e.CharacterNameHash] = new()
{
ShownCustomizePlusWarning = _configuration.DisableOptionalPluginWarnings,
ShownHeelsWarning = _configuration.DisableOptionalPluginWarnings,
};
if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible) if (_onlineCachedPlayers.TryGetValue(e.CharacterNameHash, out var visiblePlayer) && visiblePlayer.IsVisible)
{ {
Logger.Debug("Received data and applying to " + e.CharacterNameHash); Logger.Debug("Received data and applying to " + e.CharacterNameHash);
visiblePlayer.ApplyCharacterData(e.CharacterData); visiblePlayer.ApplyCharacterData(e.CharacterData, _shownWarnings[e.CharacterNameHash]);
} }
else else
{ {
@@ -205,7 +214,12 @@ public class OnlinePlayerManager : IDisposable
if (existingPlayer != null) if (existingPlayer != null)
{ {
_temporaryStoredCharacterCache.TryRemove(hashedName, out var cache); _temporaryStoredCharacterCache.TryRemove(hashedName, out var cache);
existingPlayer.InitializePlayer(pChar.Address, pChar.Name.ToString(), cache); if (!_shownWarnings.ContainsKey(hashedName)) _shownWarnings[hashedName] = new()
{
ShownCustomizePlusWarning = _configuration.DisableOptionalPluginWarnings,
ShownHeelsWarning = _configuration.DisableOptionalPluginWarnings,
};
existingPlayer.InitializePlayer(pChar.Address, pChar.Name.ToString(), cache, _shownWarnings[hashedName]);
} }
} }

View File

@@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<Authors></Authors> <Authors></Authors>
<Company></Company> <Company></Company>
<Version>0.5.24</Version> <Version>0.5.25</Version>
<Description></Description> <Description></Description>
<Copyright></Copyright> <Copyright></Copyright>
<PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl> <PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl>

View File

@@ -0,0 +1,7 @@
namespace MareSynchronos.Models;
public record OptionalPluginWarning
{
public bool ShownHeelsWarning { get; set; } = false;
public bool ShownCustomizePlusWarning { get; set; } = false;
}

View File

@@ -190,7 +190,7 @@ public sealed class Plugin : IDalamudPlugin
_playerManager = new PlayerManager(_apiController, _ipcManager, _playerManager = new PlayerManager(_apiController, _ipcManager,
characterCacheFactory, _dalamudUtil, _transientResourceManager, _periodicFileScanner); characterCacheFactory, _dalamudUtil, _transientResourceManager, _periodicFileScanner);
_characterCacheManager = new OnlinePlayerManager(_apiController, _characterCacheManager = new OnlinePlayerManager(_apiController,
_dalamudUtil, _ipcManager, _playerManager, _fileCacheManager); _dalamudUtil, _ipcManager, _playerManager, _fileCacheManager, _configuration);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -28,6 +28,7 @@ public class SettingsUi : Window, IDisposable
private string _lastTab = string.Empty; private string _lastTab = string.Empty;
private bool _openPopupOnAddition; private bool _openPopupOnAddition;
private bool _hideInfoMessages; private bool _hideInfoMessages;
private bool _disableOptionalPluginsWarnings;
public SettingsUi(WindowSystem windowSystem, public SettingsUi(WindowSystem windowSystem,
UiShared uiShared, Configuration configuration, ApiController apiController) : base("Mare Synchronos Settings") UiShared uiShared, Configuration configuration, ApiController apiController) : base("Mare Synchronos Settings")
@@ -46,6 +47,7 @@ public class SettingsUi : Window, IDisposable
_uiShared = uiShared; _uiShared = uiShared;
_openPopupOnAddition = _configuration.OpenPopupOnAdd; _openPopupOnAddition = _configuration.OpenPopupOnAdd;
_hideInfoMessages = _configuration.HideInfoMessages; _hideInfoMessages = _configuration.HideInfoMessages;
_disableOptionalPluginsWarnings = _configuration.DisableOptionalPluginWarnings;
windowSystem.AddWindow(this); windowSystem.AddWindow(this);
} }
@@ -171,6 +173,12 @@ public class SettingsUi : Window, IDisposable
_configuration.Save(); _configuration.Save();
} }
UiShared.DrawHelpText("Enabling this will not print any \"Info\" labeled messages into the game chat."); UiShared.DrawHelpText("Enabling this will not print any \"Info\" labeled messages into the game chat.");
if (ImGui.Checkbox("Disable optional plugin warnings", ref _disableOptionalPluginsWarnings))
{
_configuration.DisableOptionalPluginWarnings = _disableOptionalPluginsWarnings;
_configuration.Save();
}
UiShared.DrawHelpText("Enabling this will not print any \"Warning\" labeled messages for missing optional plugins Heels or Customize+ in the game chat.");
} }
private void DrawAdministration() private void DrawAdministration()