67 lines
2.8 KiB
C#
67 lines
2.8 KiB
C#
namespace Updater.Core;
|
|
|
|
/// <summary>Параметры CLI для Updater.exe.</summary>
|
|
public sealed class Options
|
|
{
|
|
/// <summary>Путь к скачанному архиву (.zip).</summary>
|
|
public required string ZipPath { get; init; }
|
|
|
|
/// <summary>Целевой каталог установки.</summary>
|
|
public required string InstallPath { get; init; }
|
|
|
|
/// <summary>Имя исполняемого файла приложения для перезапуска (e.g., MyBot.exe).</summary>
|
|
public required string AppExe { get; init; }
|
|
|
|
/// <summary>Необязательно: подождите миллисекунды перед перезапуском (льготный период).</summary>
|
|
public int RestartDelayMs { get; init; } = 500;
|
|
|
|
public static string Usage =>
|
|
"Usage: Updater.exe --zip <path.zip> --installPath <dir> --appExe <file.exe> [--restartDelayMs <int>]";
|
|
|
|
/// <summary>Папрсинг CLI аргументов в Options.</summary>
|
|
public static Options Parse(string[] args)
|
|
{
|
|
var dict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
for (int i = 0; i < args.Length; i++)
|
|
{
|
|
if (!args[i].StartsWith("--")) continue;
|
|
var key = args[i][2..];
|
|
var val = (i + 1 < args.Length && !args[i + 1].StartsWith("--")) ? args[i + 1] : "true";
|
|
dict[key] = val;
|
|
}
|
|
|
|
var zip = Require(dict, "zip");
|
|
var install = Require(dict, "installPath");
|
|
var exe = Require(dict, "appExe");
|
|
|
|
if (!File.Exists(zip)) throw new FileNotFoundException("Zip not found", zip);
|
|
Directory.CreateDirectory(install);
|
|
|
|
return new Options
|
|
{
|
|
ZipPath = Path.GetFullPath(zip),
|
|
InstallPath = Path.GetFullPath(install),
|
|
AppExe = exe,
|
|
RestartDelayMs = dict.TryGetValue("restartDelayMs", out var d) && int.TryParse(d, out var n) ? n : 500
|
|
};
|
|
}
|
|
|
|
private static string Require(IDictionary<string, string> dict, string key)
|
|
=> dict.TryGetValue(key, out var v) && !string.IsNullOrWhiteSpace(v)
|
|
? v : throw new ArgumentException($"Missing --{key}");
|
|
}
|
|
|
|
public static class ExitCodes
|
|
{
|
|
/// <summary>Успешное обновление.</summary>
|
|
public const int Ok = 0;
|
|
/// <summary>Неверные аргументы командной строки.</summary>
|
|
public const int InvalidArgs = 2;
|
|
/// <summary>Ошибка извлечения.</summary>
|
|
public const int ExtractFailed = 3;
|
|
/// <summary>Ошибка установки (копировать/заменить).</summary>
|
|
public const int InstallFailed = 4;
|
|
/// <summary>Ошибка перезапуска.</summary>
|
|
public const int RestartFailed = 5;
|
|
}
|