diff --git a/ArchiSteamFarm/IPC/Controllers/Api/PluginsController.cs b/ArchiSteamFarm/IPC/Controllers/Api/PluginsController.cs index 9eecce268..4d2494fa7 100644 --- a/ArchiSteamFarm/IPC/Controllers/Api/PluginsController.cs +++ b/ArchiSteamFarm/IPC/Controllers/Api/PluginsController.cs @@ -21,11 +21,17 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System; using System.Collections.Generic; +using System.Globalization; using System.Net; +using System.Threading.Tasks; +using ArchiSteamFarm.IPC.Requests; using ArchiSteamFarm.IPC.Responses; +using ArchiSteamFarm.Localization; using ArchiSteamFarm.Plugins; using ArchiSteamFarm.Plugins.Interfaces; +using ArchiSteamFarm.Steam.Interaction; using Microsoft.AspNetCore.Mvc; namespace ArchiSteamFarm.IPC.Controllers.Api; @@ -35,4 +41,25 @@ public sealed class PluginsController : ArchiController { [HttpGet] [ProducesResponseType>>((int) HttpStatusCode.OK)] public ActionResult>> PluginsGet() => Ok(new GenericResponse>(PluginsCore.ActivePlugins)); + + /// + /// Makes ASF update loaded plugins. + /// + [HttpPost("Update")] + [ProducesResponseType>((int) HttpStatusCode.OK)] + public async Task>> UpdatePost([FromBody] PluginUpdateRequest request) { + ArgumentNullException.ThrowIfNull(request); + + if (request.Channel.HasValue && !Enum.IsDefined(request.Channel.Value)) { + return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsInvalid, nameof(request.Channel)))); + } + + (bool success, string? message) = await Actions.UpdatePlugins(request.Channel, request.Plugins, request.Forced).ConfigureAwait(false); + + if (string.IsNullOrEmpty(message)) { + message = success ? Strings.Success : Strings.WarningFailed; + } + + return Ok(new GenericResponse(success, message)); + } } diff --git a/ArchiSteamFarm/IPC/Requests/PluginUpdateRequest.cs b/ArchiSteamFarm/IPC/Requests/PluginUpdateRequest.cs new file mode 100644 index 000000000..c22a3875b --- /dev/null +++ b/ArchiSteamFarm/IPC/Requests/PluginUpdateRequest.cs @@ -0,0 +1,53 @@ +// ---------------------------------------------------------------------------------------------- +// _ _ _ ____ _ _____ +// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ +// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ +// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | +// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_| +// ---------------------------------------------------------------------------------------------- +// | +// Copyright 2015-2024 Ɓukasz "JustArchi" Domeradzki +// Contact: JustArchi@JustArchi.net +// | +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// | +// http://www.apache.org/licenses/LICENSE-2.0 +// | +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; +using System.Text.Json.Serialization; +using ArchiSteamFarm.Storage; + +namespace ArchiSteamFarm.IPC.Requests; + +[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")] +public sealed class PluginUpdateRequest { + /// + /// Target update channel. Not required, will default to UpdateChannel in if not provided. + /// + [JsonInclude] + public GlobalConfig.EUpdateChannel? Channel { get; private init; } + + /// + /// Forced update. This allows ASF to potentially downgrade to previous version available on selected , which isn't permitted normally. + /// + [JsonInclude] + public bool Forced { get; private init; } + + /// + /// Target plugins. Not required, will default to plugin update configuration in if not provided + /// + [JsonInclude] + public ImmutableHashSet? Plugins { get; private init; } + + [JsonConstructor] + private PluginUpdateRequest() { } +}