# Updater ![Workflow](https://git.frigat.duckdns.org/FrigaT/ReleaseUpdater/actions/workflows/release-package.yaml/badge.svg?branch=master&style=flat) ## 📖 Описание `Updater` — это инструмент для безопасного обновления приложений. Он состоит из двух частей: - **ReleaseUpdater.dll** — библиотека для работы с API Gitea/GitHub: - Получение списка доступных версий. - Выбор нужной версии. - Скачивание архива релиза. - События жизненного цикла (`BeforeInstall`, `AfterInstall`, `UpdateFailed`). - Запуск обновления либо напрямую (`UpdateInlineAsync`), либо через внешний процесс (`UpdateWithExternalAsync`). - **Updater.exe** — консольное приложение: - Принимает параметры (`--zip`, `--installPath`, `--appExe`). - Распаковывает архив в папку установки. - Перезапускает приложение. - Работает как «чистый установщик», чтобы избежать проблем с блокировкой файлов. --- ## 🏗 Архитектура ``` Solution/ ├─ ReleaseUpdater/ # Class Library (.dll) │ ├─ ReleaseUpdaterFacade.cs │ ├─ GiteaReleaseProvider.cs │ ├─ HttpAssetDownloader.cs │ ├─ SemVerService.cs │ └─ Models.cs │ ├─ Updater/ # Console App (.exe) │ ├─ Program.cs │ ├─ Core/ │ │ ├─ IExtractor.cs / ZipExtractor.cs │ │ ├─ IInstaller.cs / SafeFileInstaller.cs │ │ ├─ IProcessManager.cs / ProcessManager.cs │ │ ├─ UpdaterApp.cs │ │ └─ Options.cs │ └─ UpdaterSolution.sln ``` --- ## ⚡ Возможности - Получение списка версий из Gitea API. - Обновление до последней или конкретной версии. - Два режима обновления: - **Inline** — всё внутри DLL. - **External** — через Updater.exe. - События: - `BeforeInstall` — перед установкой. - `AfterInstall` — после успешной установки. - `UpdateFailed` — при ошибке (автоматический запуск текущей версии). - Безопасная установка: бэкап и откат при ошибке. --- ## 🚀 Использование ### В Telegram‑боте ```csharp // Получение списка версий var versions = await ReleaseUpdaterFacade.GetVersionsAsync(apiUrl, token); // Обновление до последней версии await ReleaseUpdaterFacade.UpdateInlineAsync(apiUrl, token, installPath, "MyBot.exe", "latest"); // Обновление через внешний Updater.exe await ReleaseUpdaterFacade.UpdateWithExternalAsync(apiUrl, token, installPath, "MyBot.exe", "3.5.2"); ``` ### Запуск Updater.exe напрямую ```bash Updater.exe --zip "C:\Temp\update.zip" --installPath "C:\Apps\MyBot" --appExe "MyBot.exe" ``` --- ## 🔧 Параметры Updater.exe - `--zip ` — путь к архиву .zip. - `--installPath ` — папка установки. - `--appExe ` — исполняемый файл приложения. - `--restartDelayMs ` — задержка перед перезапуском (по умолчанию 500 мс). --- ## 📦 Коды возврата - `0` — успешное обновление. - `2` — ошибка аргументов. - `3` — ошибка распаковки. - `4` — ошибка установки. - `5` — ошибка перезапуска. --- ## 🛠 Пример сценария 1. Бот получает команду `/update latest`. 2. ReleaseUpdater.dll: - Запрашивает список релизов через Gitea API. - Скачивает архив последней версии. - Вызывает событие `BeforeInstall`. - Запускает Updater.exe с параметрами. 3. Updater.exe: - Распаковывает архив. - Перезапускает приложение. - Возвращает код `0`. 4. ReleaseUpdater.dll вызывает событие `AfterInstall`.