diff --git a/Dalamud/Dalamud.cs b/Dalamud/Dalamud.cs index 667df8076..04f1e8e95 100644 --- a/Dalamud/Dalamud.cs +++ b/Dalamud/Dalamud.cs @@ -111,11 +111,7 @@ namespace Dalamud { else this.LocalizationManager.SetupWithUiCulture(); - var pluginDir = this.StartInfo.PluginDirectory; - if (this.Configuration.DoPluginTest) - pluginDir = Path.Combine(pluginDir, "..", "testPlugins"); - - PluginRepository = new PluginRepository(this, pluginDir, this.StartInfo.GameVersion); + PluginRepository = new PluginRepository(this, this.StartInfo.PluginDirectory, this.StartInfo.GameVersion); var isInterfaceLoaded = false; if (!bool.Parse(Environment.GetEnvironmentVariable("DALAMUD_NOT_HAVE_INTERFACE") ?? "false")) { @@ -160,7 +156,7 @@ namespace Dalamud { { PluginRepository.CleanupPlugins(); - PluginManager = new PluginManager(this, pluginDir, this.StartInfo.DefaultPluginDirectory); + PluginManager = new PluginManager(this, this.StartInfo.PluginDirectory, this.StartInfo.DefaultPluginDirectory); PluginManager.LoadPlugins(); } catch (Exception ex) diff --git a/Dalamud/Plugin/PluginDefinition.cs b/Dalamud/Plugin/PluginDefinition.cs index 60dae3864..8d876ab06 100644 --- a/Dalamud/Plugin/PluginDefinition.cs +++ b/Dalamud/Plugin/PluginDefinition.cs @@ -28,6 +28,16 @@ namespace Dalamud.Plugin /// public string AssemblyVersion { get; set; } + /// + /// The current testing assembly version of the plugin. + /// + public string TestingAssemblyVersion { get; set; } + + /// + /// Defines if the plugin is only available for testing. + /// + public bool IsTestingExclusive { get; set; } + /// /// A description of the plugins functions. /// diff --git a/Dalamud/Plugin/PluginInstallerWindow.cs b/Dalamud/Plugin/PluginInstallerWindow.cs index 30068b3fc..9fb81cc3c 100644 --- a/Dalamud/Plugin/PluginInstallerWindow.cs +++ b/Dalamud/Plugin/PluginInstallerWindow.cs @@ -100,8 +100,6 @@ namespace Dalamud.Plugin didAnyWithSearch = true; - ImGui.PushID(pluginDefinition.InternalName + pluginDefinition.AssemblyVersion); - var isInstalled = this.dalamud.PluginManager.Plugins.Where(x => x.Definition != null).Any( x => x.Definition.InternalName == pluginDefinition.InternalName); @@ -116,6 +114,20 @@ namespace Dalamud.Plugin ? Loc.Localize("InstallerUpdateFailed", " (update failed)") : label; + var isTestingAvailable = false; + if (Version.TryParse(pluginDefinition.AssemblyVersion, out var assemblyVersion) && Version.TryParse(pluginDefinition.TestingAssemblyVersion, out var testingAssemblyVersion)) + isTestingAvailable = this.dalamud.Configuration.DoPluginTest && testingAssemblyVersion > assemblyVersion; + + if (this.dalamud.Configuration.DoPluginTest && pluginDefinition.IsTestingExclusive) { + isTestingAvailable = true; + } else if (!this.dalamud.Configuration.DoPluginTest && pluginDefinition.IsTestingExclusive) { + continue; + } + + label += isTestingAvailable ? " (Testing version)" : string.Empty; + + ImGui.PushID(pluginDefinition.InternalName + pluginDefinition.AssemblyVersion); + if (ImGui.CollapsingHeader(pluginDefinition.Name + label + "###Header" + pluginDefinition.InternalName)) { ImGui.Indent(); @@ -129,10 +141,12 @@ namespace Dalamud.Plugin if (this.installStatus == PluginInstallStatus.InProgress) { ImGui.Button(Loc.Localize("InstallerInProgress", "Install in progress...")); } else { - if (ImGui.Button($"Install v{pluginDefinition.AssemblyVersion}")) { + var versionString = isTestingAvailable ? (pluginDefinition.TestingAssemblyVersion + " (Testing version)") : pluginDefinition.AssemblyVersion; + + if (ImGui.Button($"Install v{versionString}")) { this.installStatus = PluginInstallStatus.InProgress; - Task.Run(() => this.dalamud.PluginRepository.InstallPlugin(pluginDefinition)).ContinueWith(t => { + Task.Run(() => this.dalamud.PluginRepository.InstallPlugin(pluginDefinition, true, false, isTestingAvailable)).ContinueWith(t => { this.installStatus = t.Result ? PluginInstallStatus.Success : PluginInstallStatus.Fail; this.installStatus = diff --git a/Dalamud/Plugin/PluginRepository.cs b/Dalamud/Plugin/PluginRepository.cs index 0d98ee229..d82917bd1 100644 --- a/Dalamud/Plugin/PluginRepository.cs +++ b/Dalamud/Plugin/PluginRepository.cs @@ -14,9 +14,8 @@ namespace Dalamud.Plugin { internal class PluginRepository { - private string PluginRepoBaseUrl => "https://raw.githubusercontent.com/goatcorp/DalamudPlugins/testing/plugins/{0}/latest.zip"; - private string PluginFunctionBaseUrl => "https://us-central1-xl-functions.cloudfunctions.net/download-plugin/?plugin={0}&isUpdate={1}"; - private string PluginMasterUrl => "https://raw.githubusercontent.com/goatcorp/DalamudPlugins/" + (this.dalamud.Configuration.DoPluginTest ? "testing/" : "master/") + "pluginmaster.json"; + private string PluginFunctionBaseUrl => "https://us-central1-xl-functions.cloudfunctions.net/download-plugin/?plugin={0}&isUpdate={1}&isTesting={2}"; + private string PluginMasterUrl => "https://raw.githubusercontent.com/goatcorp/DalamudPlugins/master/pluginmaster.json"; private readonly Dalamud dalamud; @@ -66,7 +65,7 @@ namespace Dalamud.Plugin }); } - public bool InstallPlugin(PluginDefinition definition, bool enableAfterInstall = true, bool isUpdate = false) { + public bool InstallPlugin(PluginDefinition definition, bool enableAfterInstall = true, bool isUpdate = false, bool fromTesting = false) { try { var outputDir = new DirectoryInfo(Path.Combine(this.pluginDirectory, definition.InternalName, definition.AssemblyVersion)); @@ -98,9 +97,15 @@ namespace Dalamud.Plugin using var client = new WebClient(); - var url = this.dalamud.Configuration.DoPluginTest ? PluginRepoBaseUrl : PluginFunctionBaseUrl; - url = string.Format(url, definition.InternalName, isUpdate); - Log.Information("Downloading plugin to {0} from {1}", path, url); + var doTestingDownload = false; + if ((Version.TryParse(definition.TestingAssemblyVersion, out var testingAssemblyVer) || definition.IsTestingExclusive) + && fromTesting) { + doTestingDownload = testingAssemblyVer > Version.Parse(definition.AssemblyVersion) || definition.IsTestingExclusive; + } + + var url = string.Format(PluginFunctionBaseUrl, definition.InternalName, isUpdate, doTestingDownload); + + Log.Information("Downloading plugin to {0} from {1} doTestingDownload:{2} isTestingExclusive:{3}", path, url, doTestingDownload, definition.IsTestingExclusive); client.DownloadFile(url, path); @@ -177,7 +182,16 @@ namespace Dalamud.Plugin continue; } - if (remoteInfo.AssemblyVersion != info.AssemblyVersion) { + Version.TryParse(remoteInfo.AssemblyVersion, out Version remoteAssemblyVer); + Version.TryParse(info.AssemblyVersion, out Version localAssemblyVer); + + var testingAvailable = false; + if (!string.IsNullOrEmpty(remoteInfo.TestingAssemblyVersion)) { + Version.TryParse(remoteInfo.TestingAssemblyVersion, out var testingAssemblyVer); + testingAvailable = testingAssemblyVer > localAssemblyVer && this.dalamud.Configuration.DoPluginTest; + } + + if (remoteAssemblyVer > localAssemblyVer || testingAvailable) { Log.Information("Eligible for update: {0}", remoteInfo.InternalName); // DisablePlugin() below immediately creates a .disabled file anyway, but will fail @@ -211,7 +225,7 @@ namespace Dalamud.Plugin Log.Error(ex, "Plugin disable old versions failed"); } - var installSuccess = InstallPlugin(remoteInfo, wasEnabled, true); + var installSuccess = InstallPlugin(remoteInfo, wasEnabled, true, testingAvailable); if (!installSuccess) { Log.Error("InstallPlugin failed.");