diff --git a/Dalamud/Dalamud.cs b/Dalamud/Dalamud.cs index 6a9332b9d..f54a24ff6 100644 --- a/Dalamud/Dalamud.cs +++ b/Dalamud/Dalamud.cs @@ -51,8 +51,8 @@ namespace Dalamud { public DiscordBotManager BotManager { get; private set; } - public PluginManager PluginManager { get; private set; } - public PluginRepository PluginRepository { get; private set; } + internal PluginManager PluginManager { get; private set; } + internal PluginRepository PluginRepository { get; private set; } public readonly ClientState ClientState; diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs index 18a6a6016..6583ec6c4 100644 --- a/Dalamud/Game/ChatHandlers.cs +++ b/Dalamud/Game/ChatHandlers.cs @@ -227,7 +227,7 @@ namespace Dalamud.Game { try { - var hasNeedsUpdate = this.dalamud.PluginRepository.UpdatePlugins(true).UpdatedCount != 0; + var hasNeedsUpdate = this.dalamud.PluginRepository.UpdatePlugins(true).UpdatedPlugins.Length != 0; if (hasNeedsUpdate) { diff --git a/Dalamud/Plugin/PluginInstallerWindow.cs b/Dalamud/Plugin/PluginInstallerWindow.cs index 750913ac4..e57aadb57 100644 --- a/Dalamud/Plugin/PluginInstallerWindow.cs +++ b/Dalamud/Plugin/PluginInstallerWindow.cs @@ -18,7 +18,7 @@ using Serilog; namespace Dalamud.Plugin { - class PluginInstallerWindow { + internal class PluginInstallerWindow { private const string PluginRepoBaseUrl = "https://goaaats.github.io/DalamudPlugins/"; private PluginManager manager; @@ -30,6 +30,7 @@ namespace Dalamud.Plugin private bool updateComplete = false; private int updatePluginCount = 0; + private PluginRepository.PluginUpdateStatus[] updatedInternalName; private enum PluginInstallStatus { None, @@ -81,7 +82,18 @@ namespace Dalamud.Plugin var isInstalled = this.manager.Plugins.Where(x => x.Definition != null).Any( x => x.Definition.InternalName == pluginDefinition.InternalName); - if (ImGui.CollapsingHeader(pluginDefinition.Name + (isInstalled ? Loc.Localize("InstallerInstalled", " (installed)") : string.Empty) + "###Header" + pluginDefinition.InternalName)) { + var label = isInstalled ? Loc.Localize("InstallerInstalled", " (installed)") : string.Empty; + label = this.updatedInternalName != null && + this.updatedInternalName.Any(x => x.InternalName == pluginDefinition.InternalName && x.WasUpdated) + ? Loc.Localize("InstallerUpdated", " (updated)") + : label; + + label = this.updatedInternalName != null && + this.updatedInternalName.Any(x => x.InternalName == pluginDefinition.InternalName && x.WasUpdated == false) + ? Loc.Localize("InstallerUpdateFailed", " (update failed)") + : label; + + if (ImGui.CollapsingHeader(pluginDefinition.Name + label + "###Header" + pluginDefinition.InternalName)) { ImGui.Indent(); ImGui.Text(pluginDefinition.Name); @@ -176,7 +188,8 @@ namespace Dalamud.Plugin if (this.installStatus == PluginInstallStatus.Success) { this.updateComplete = true; - this.updatePluginCount = t.Result.UpdatedCount; + this.updatePluginCount = t.Result.UpdatedPlugins.Length; + this.updatedInternalName = t.Result.UpdatedPlugins; } this.errorModalDrawing = this.installStatus == PluginInstallStatus.Fail; diff --git a/Dalamud/Plugin/PluginManager.cs b/Dalamud/Plugin/PluginManager.cs index 2b5de87b2..d2a05f7db 100644 --- a/Dalamud/Plugin/PluginManager.cs +++ b/Dalamud/Plugin/PluginManager.cs @@ -36,15 +36,21 @@ namespace Dalamud.Plugin // This handler should only be invoked on things that fail regular lookups, but it *is* global to this appdomain AppDomain.CurrentDomain.AssemblyResolve += (object source, ResolveEventArgs e) => { - Log.Debug($"Resolving missing assembly {e.Name}"); - // This looks weird but I'm pretty sure it's actually correct. Pretty sure. Probably. - var assemblyPath = Path.Combine(Path.GetDirectoryName(e.RequestingAssembly.Location), new AssemblyName(e.Name).Name + ".dll"); - if (!File.Exists(assemblyPath)) - { - Log.Error($"Assembly not found at {assemblyPath}"); + try { + Log.Debug($"Resolving missing assembly {e.Name}"); + // This looks weird but I'm pretty sure it's actually correct. Pretty sure. Probably. + var assemblyPath = Path.Combine(Path.GetDirectoryName(e.RequestingAssembly.Location), + new AssemblyName(e.Name).Name + ".dll"); + if (!File.Exists(assemblyPath)) { + Log.Error($"Assembly not found at {assemblyPath}"); + return null; + } + + return Assembly.LoadFrom(assemblyPath); + } catch(Exception ex) { + Log.Error(ex, "Could not load assembly " + e.Name); return null; } - return Assembly.LoadFrom(assemblyPath); }; } diff --git a/Dalamud/Plugin/PluginRepository.cs b/Dalamud/Plugin/PluginRepository.cs index 4e68d64cc..8d3646976 100644 --- a/Dalamud/Plugin/PluginRepository.cs +++ b/Dalamud/Plugin/PluginRepository.cs @@ -12,7 +12,7 @@ using Serilog; namespace Dalamud.Plugin { - public class PluginRepository + internal class PluginRepository { private const string PluginRepoBaseUrl = "https://goatcorp.github.io/DalamudPlugins/"; @@ -109,11 +109,16 @@ namespace Dalamud.Plugin } } - public (bool Success, int UpdatedCount) UpdatePlugins(bool dryRun = false) + internal class PluginUpdateStatus { + public string InternalName { get; set; } + public bool WasUpdated { get; set; } + } + + public (bool Success, PluginUpdateStatus[] UpdatedPlugins) UpdatePlugins(bool dryRun = false) { Log.Information("Starting plugin update... dry:{0}", dryRun); - var updatedCount = 0; + var updatedList = new List(); var hasError = false; try @@ -190,18 +195,23 @@ namespace Dalamud.Plugin var installSuccess = InstallPlugin(remoteInfo, wasEnabled); - if (installSuccess) - { - updatedCount++; - } - else + if (!installSuccess) { Log.Error("InstallPlugin failed."); hasError = true; } + + updatedList.Add(new PluginUpdateStatus { + InternalName = remoteInfo.InternalName, + WasUpdated = installSuccess + }); } else { - updatedCount++; + updatedList.Add(new PluginUpdateStatus + { + InternalName = remoteInfo.InternalName, + WasUpdated = true + }); } } else @@ -218,7 +228,7 @@ namespace Dalamud.Plugin Log.Information("Plugin update OK."); - return (!hasError, updatedCount); + return (!hasError, updatedList.ToArray()); } } }