add maintenance mode & improve & bugfixing

This commit is contained in:
2024-06-20 06:55:25 +02:00
parent c31cc3aa20
commit fc27fc1c34
9 changed files with 75 additions and 44 deletions

View File

@@ -1,8 +1,15 @@
namespace ModpackUpdater.Manager; using ModpackUpdater.Model;
namespace ModpackUpdater.Manager;
public static class Extensions public static class Extensions
{ {
public static bool IsSide(this Side @this, Side side)
{
return @this.HasFlag(side) || side.HasFlag(@this);
}
public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive) public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive)
{ {

View File

@@ -37,32 +37,38 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath)
return InstallInfos.Parse(content); return InstallInfos.Parse(content);
} }
public Task<UpdateCheckResult> Check() public async Task<UpdateCheckResult> Check(UpdateCheckOptions options)
{
return Check(Side.Client, true);
}
public async Task<UpdateCheckResult> Check(Side side, bool allowUpdaterAfterInstall)
{ {
var result = new UpdateCheckResult(); var result = new UpdateCheckResult();
var hasConfig = ModpackInfo.HasModpackInfo(localPath); var hasConfig = ModpackInfo.HasModpackInfo(localPath);
InstallInfos installInfos = null; InstallInfos installInfos = null;
UpdateInfos updateInfos = null; UpdateInfos updateInfos = null;
if (updateConfig.Maintenance && !options.IgnoreMaintenance)
{
result.IsInMaintenance = true;
return result;
}
if (!hasConfig) if (!hasConfig)
{ {
installInfos = await DownloadInstallInfos(); installInfos = await DownloadInstallInfos();
if (installInfos is not null && installInfos.Actions.Count != 0) if (installInfos is not null && installInfos.Actions.Count != 0)
{ {
result.Actions.AddRange(installInfos.Actions); var actions = installInfos.Actions.Where(n => n.Side.IsSide(options.Side));
result.LatestVersion = installInfos.Version; if (actions.Any())
{
result.Actions.AddRange(installInfos.Actions);
result.LatestVersion = installInfos.Version;
}
} }
else
if (result.Actions.Count == 0)
result.HasError = true; result.HasError = true;
} }
if (allowUpdaterAfterInstall) if (options.AllowUpdaterAfterInstall)
{ {
updateInfos = await DownloadUpdateInfos(); updateInfos = await DownloadUpdateInfos();
var modpackInfo = ModpackInfo.HasModpackInfo(localPath) ? ModpackInfo.Load(localPath) : new(); var modpackInfo = ModpackInfo.HasModpackInfo(localPath) ? ModpackInfo.Load(localPath) : new();
@@ -83,7 +89,7 @@ public class ModpackInstaller(ModpackConfig updateConfig, string localPath)
foreach (var action in checkingVersion.Actions) foreach (var action in checkingVersion.Actions)
{ {
if (!result.Actions.Any(n => n.DestPath == action.DestPath)) if (action.Side.IsSide(options.Side) && !result.Actions.Any(n => n.DestPath == action.DestPath))
actionsToAdd.Add(action); actionsToAdd.Add(action);
} }

View File

@@ -0,0 +1,10 @@
using ModpackUpdater.Model;
namespace ModpackUpdater.Manager;
public class UpdateCheckOptions
{
public bool IgnoreMaintenance { get; set; }
public bool AllowUpdaterAfterInstall { get; set; } = true;
public Side Side { get; set; } = Side.Client;
}

View File

@@ -9,5 +9,6 @@ public class UpdateCheckResult
public List<InstallAction> Actions { get; private set; } = []; public List<InstallAction> Actions { get; private set; } = [];
public bool IsInstalled { get; set; } public bool IsInstalled { get; set; }
public bool HasError { get; set; } public bool HasError { get; set; }
public bool IsInMaintenance { get; set; }
public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion; public bool HasUpdates => !IsInstalled || CurrentVersion < LatestVersion;
} }

View File

@@ -4,6 +4,7 @@ namespace ModpackUpdater.Model;
public class ModpackConfig public class ModpackConfig
{ {
public bool Maintenance { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string UpdateUrl { get; set; } public string UpdateUrl { get; set; }
public string InstallUrl { get; set; } public string InstallUrl { get; set; }

View File

@@ -12,20 +12,17 @@ public partial class Form1
private ModpackConfig updateConfig = new(); private ModpackConfig updateConfig = new();
private bool currentUpdating = false; private bool currentUpdating = false;
private UpdateCheckResult lastUpdateCheckResult = null; private UpdateCheckResult lastUpdateCheckResult = null;
private readonly bool allowUpdateCheck; private readonly UpdateCheckOptionsAdv updateOptions;
private readonly bool allowUpdaterAfterInstall;
private readonly Side side;
public Form1(string modpackConfig, string profilePath, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) : this() public Form1(UpdateCheckOptionsAdv updateOptions) : this()
{ {
this.allowUpdaterAfterInstall = allowUpdaterAfterInstall; this.updateOptions = updateOptions;
this.side = side;
if (!string.IsNullOrWhiteSpace(modpackConfig)) if (!string.IsNullOrWhiteSpace(updateOptions.ModpackConfig))
LoadUpdateConfigFile(modpackConfig); LoadUpdateConfigFile(updateOptions.ModpackConfig);
if (!string.IsNullOrWhiteSpace(profilePath)) if (!string.IsNullOrWhiteSpace(updateOptions.ProfileFolder))
LoadMinecraftProfile(profilePath); LoadMinecraftProfile(updateOptions.ProfileFolder);
} }
public Form1() public Form1()
@@ -129,7 +126,7 @@ public partial class Form1
try try
{ {
lastUpdateCheckResult = await updater.Check(side, allowUpdaterAfterInstall); lastUpdateCheckResult = await updater.Check(updateOptions);
} }
catch catch
{ {
@@ -245,7 +242,7 @@ public partial class Form1
private async void Form1_Shown(object sender, EventArgs e) private async void Form1_Shown(object sender, EventArgs e)
{ {
var updater = new AppUpdater(); var updater = new AppUpdater();
if (allowUpdateCheck && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes) if (!updateOptions.NoUpdate && await updater.Check() && RadMessageBox.Show(LangRes.MsgBox_UpdateAvailable, LangRes.MsgBox_UpdateAvailable_Title, MessageBoxButtons.YesNo, RadMessageIcon.Info) == DialogResult.Yes)
{ {
SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px); SetStatus(LangRes.StatusText_InstallingAppUpdate, MySymbols.icons8_software_installer_16px);
Enabled = false; Enabled = false;

View File

@@ -10,11 +10,7 @@ internal class Options
public IReadOnlyList<string> Additionals => additionals; public IReadOnlyList<string> Additionals => additionals;
public bool Silent { get; private set; } public bool Silent { get; private set; }
public bool NoUi { get; private set; } public bool NoUi { get; private set; }
public bool NoUpdate { get; private set; }; public UpdateCheckOptionsAdv UpdateOptions { get; } = new();
public bool AllowUpdaterAfterInstall { get; private set; } = true;
public Side Side { get; private set; } = Side.Client;
public string ProfileFolder { get; private set; }
public string ModpackConfig { get; private set; }
public Options(string[] args) public Options(string[] args)
{ {
@@ -22,13 +18,14 @@ internal class Options
{ {
{ "silent", "Do not output anything.", s => Silent = s != null }, { "silent", "Do not output anything.", s => Silent = s != null },
{ "n|noui", "Install without user interface.", n => NoUi = n != null }, { "n|noui", "Install without user interface.", n => NoUi = n != null },
{ "p|profile=", "Sets the minecraft profile folder.", p => ProfileFolder = p }, { "p|profile=", "Sets the minecraft profile folder.", p => UpdateOptions.ProfileFolder = p },
{ "c|config=", "Sets the minecraft profile folder.", c => ModpackConfig = c }, { "c|config=", "Sets the minecraft profile folder.", c => UpdateOptions.ModpackConfig = c },
{ "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => Side = Enum.Parse<Side>(s)}, { "s|side=", "Sets the minecraft profile folder.\nDefault side is Client.\nAvailable: Client, Server", s => UpdateOptions.Side = Enum.Parse<Side>(s)},
{ "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => AllowUpdaterAfterInstall = uai != null}, { "uai", "Allow an update directly after install. This only has affect if there is no existing installation.", uai => UpdateOptions.AllowUpdaterAfterInstall = uai != null},
{ "noupdate", "Skip the update check wich happens when opening the user interface.", noupdate => NoUpdate = noupdate != null}, { "noupdate", "Skip the update check.", noupdate => UpdateOptions.NoUpdate = noupdate != null},
{ "m|maintenance", "Ignores the maintenance mode.", m => UpdateOptions.IgnoreMaintenance = m != null},
}; };
var additional = options.Parse(args); additionals.AddRange(options.Parse(args));
} }
} }

View File

@@ -1,6 +1,5 @@
using ModpackUpdater.Manager; using ModpackUpdater.Manager;
using ModpackUpdater.Model; using ModpackUpdater.Model;
using Mono.Options;
using Newtonsoft.Json; using Newtonsoft.Json;
using Pilz.Configuration; using Pilz.Configuration;
using Telerik.WinControls; using Telerik.WinControls;
@@ -24,12 +23,12 @@ public static class Program
{ {
var options = new Options(args); var options = new Options(args);
if (options.NoUi) if (options.NoUi)
InstallWithoutGui(options.ModpackConfig, options.ProfileFolder, options.Silent, options.Side, options.AllowUpdaterAfterInstall); InstallWithoutGui(options.UpdateOptions, options.Silent);
else else
RunApp(options.ModpackConfig, options.ProfileFolder, options.Side, options.AllowUpdaterAfterInstall, !options.NoUpdate); RunApp(options.UpdateOptions);
} }
private static void RunApp(string modpackConfig, string profileFolder, Side side, bool allowUpdaterAfterInstall, bool allowUpdateCheck) private static void RunApp(UpdateCheckOptionsAdv updateOptions)
{ {
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
@@ -38,7 +37,7 @@ public static class Program
if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp")) if (ThemeResolutionService.LoadPackageResource("ModpackUpdater.CustomThemes.Office2019DarkBluePurple.tssp"))
ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple"; ThemeResolutionService.ApplicationThemeName = "Office2019DarkBluePurple";
Application.Run(new Form1(modpackConfig, profileFolder, side, allowUpdaterAfterInstall, allowUpdateCheck)); Application.Run(new Form1(updateOptions));
} }
private static string GetSettingsPath(int? settingsVersion = 2) private static string GetSettingsPath(int? settingsVersion = 2)
@@ -72,11 +71,14 @@ public static class Program
File.Delete(settingsPath); File.Delete(settingsPath);
} }
private static void InstallWithoutGui(string modpackConfig, string profileFolder, bool silent, Side side, bool allowUpdaterAfterInstall) private static void InstallWithoutGui(UpdateCheckOptionsAdv updateOptions, bool silent)
{ {
var config = ModpackConfig.LoadFromUrl(modpackConfig); var config = ModpackConfig.LoadFromUrl(updateOptions.ModpackConfig);
var installer = new ModpackInstaller(config, profileFolder); var installer = new ModpackInstaller(config, updateOptions.ProfileFolder);
var result = installer.Check(side, allowUpdaterAfterInstall).Result; var result = installer.Check(updateOptions).Result;
if (!silent && !updateOptions.NoUpdate && new AppUpdater().Check().Result)
Console.WriteLine("A new version is available!");
if (result.HasUpdates) if (result.HasUpdates)
{ {

View File

@@ -0,0 +1,10 @@
using ModpackUpdater.Manager;
namespace ModpackUpdater;
public class UpdateCheckOptionsAdv : UpdateCheckOptions
{
public string ProfileFolder { get; set; }
public string ModpackConfig { get; set; }
public bool NoUpdate { get; set; }
}