Compare commits

...

37 Commits

Author SHA1 Message Date
renovate[bot]
13b1357510 chore(deps): update wiki digest to 45eef57 2026-01-13 21:15:34 +00:00
renovate[bot]
12f6cffefd chore(deps): update dependency scalar.aspnetcore to 2.12.6 2026-01-13 15:55:12 +00:00
ArchiBot
7818bf5a8e Automatic translations update 2026-01-13 02:32:21 +00:00
renovate[bot]
b86b515345 chore(deps): update dependency scalar.aspnetcore to 2.12.5 2026-01-12 17:01:08 +00:00
ArchiBot
a773b06608 Automatic translations update 2026-01-12 02:38:41 +00:00
renovate[bot]
b272cff50d chore(deps): update wiki digest to 0e8d578 2026-01-11 20:26:25 +00:00
Łukasz Domeradzki
9f10570141 Bump 2026-01-11 21:19:10 +01:00
Łukasz Domeradzki
de3a402a5b Allow to use "all" as target input for command removal options 2026-01-11 21:16:53 +01:00
ArchiBot
809b9d7427 Automatic translations update 2026-01-11 02:41:04 +00:00
ArchiBot
4c9b3c6962 Automatic translations update 2026-01-10 02:30:36 +00:00
renovate[bot]
897cccdce5 chore(deps): update wiki digest to 13f471a 2026-01-09 17:32:55 +00:00
renovate[bot]
5fde8aa20c chore(deps): update asf-ui digest to 1a2588b 2026-01-09 12:26:32 +00:00
ArchiBot
a837139b4a Automatic translations update 2026-01-09 02:33:36 +00:00
renovate[bot]
fde29cbae8 chore(deps): update dependency scalar.aspnetcore to 2.12.4 2026-01-08 19:33:59 +00:00
renovate[bot]
d6b2689a89 chore(deps): update dependency scalar.aspnetcore to 2.12.3 2026-01-08 05:56:24 +00:00
ArchiBot
06a1c036b5 Automatic translations update 2026-01-08 02:33:31 +00:00
ArchiBot
3444641a52 Automatic translations update 2026-01-07 02:33:10 +00:00
ArchiBot
b45d78ced1 Automatic translations update 2026-01-06 02:34:17 +00:00
renovate[bot]
fd1a6aca0b chore(deps): update wiki digest to 82cbaa1 2026-01-05 17:13:46 +00:00
renovate[bot]
9a3ea71f2d chore(deps): update asf-ui digest to 9f37ad5 2026-01-05 12:58:02 +00:00
Łukasz Domeradzki
7b847ea80d Do not watch over IPC.config if --no-config-watch is used 2026-01-05 10:51:58 +01:00
Łukasz Domeradzki
c619828c55 Bump 2026-01-05 10:22:38 +01:00
Łukasz Domeradzki
4e74819240 Bump 2026-01-05 09:24:28 +01:00
Łukasz Domeradzki
bec4dbad84 Do not crash on invalid IPC.config
Log error and continue without IPC instead
2026-01-05 09:23:10 +01:00
ArchiBot
7e9b5ee163 Automatic translations update 2026-01-04 02:42:07 +00:00
renovate[bot]
5c71752376 chore(deps): update wiki digest to 693a858 2026-01-03 18:06:37 +00:00
Łukasz Domeradzki
50e676a485 Misc 2026-01-01 18:43:23 +01:00
Łukasz Domeradzki
03504e959e Add additional documentation in swagger, #3533 2026-01-01 18:28:29 +01:00
Łukasz Domeradzki
6693432da5 Misc 2025-12-30 15:13:21 +01:00
ArchiBot
e263093f25 Automatic translations update 2025-12-29 02:38:30 +00:00
renovate[bot]
6a29994904 chore(deps): update dependency tmds.dbus.protocol to 0.23.0 2025-12-28 09:26:42 +00:00
ArchiBot
250074356b Automatic translations update 2025-12-28 02:39:06 +00:00
Łukasz Domeradzki
52e89112ce Misc 2025-12-28 02:26:13 +01:00
Łukasz Domeradzki
379d3f04a9 Misc 2025-12-28 02:25:27 +01:00
Łukasz Domeradzki
d75028a1e9 Do not allow plugins to modify default ASF json serializer settings upon creation
This can only accidentally break things we expect to be operative
2025-12-28 01:04:44 +01:00
Łukasz Domeradzki
10a7fe157b Misc 2025-12-27 16:49:04 +01:00
Łukasz Domeradzki
5563531170 Bump 2025-12-27 16:10:47 +01:00
24 changed files with 271 additions and 169 deletions

2
ASF-ui

Submodule ASF-ui updated: 8891c8b6d1...1a2588b77e

View File

@@ -64,4 +64,20 @@
<value>Per šį raundą iš viso suderinta {0} rinkinių.</value>
<comment>{0} will be replaced by number of sets traded</comment>
</data>
<data name="ListingAnnouncing" xml:space="preserve">
<value>Skelbiame apie {0} ({1}), kurio inventoriuje iš viso yra {2} prekių...</value>
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
</data>
<data name="MatchingFound" xml:space="preserve">
<value>Surasta iš viso {0} daiktų su robotu {1} ({2}), siunčiamas mainų pasiūlymas...</value>
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
</data>
<data name="TradeOfferFailed" xml:space="preserve">
<value>Nepavyko išsiųsti mainų pasiūlymo robotui {0} ({1}), tęsiama...</value>
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
</data>
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
<value>Kai kurie patvirtinimai nepavyko, maždaug {0} iš {1} sandorių buvo sėkmingai išsiųsti.</value>
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
</data>
</root>

View File

@@ -68,7 +68,6 @@
<value>{0} в момента е деактивирана според вашата настройка. Ако искате да помогнете на SteamDB при подаването на данни, моля разгледайте нашата уикипедия.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} не беше успешно заредена, вместо това ще бъде стартирана нова инстанция...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
@@ -104,7 +103,6 @@
<value>Приключи събирането на {0} информация за играта или приложението.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Приключи събирането на всички ключове за депа за общо {0} игри или проложения.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>

View File

@@ -68,26 +68,10 @@
<value>{0} je trenutno onemogućen po vašoj konfiguraciji. Ako želite pomoći SteamDB u dostavljanju podataka, molimo pogledajte naš wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Preuzimanje informacija o {0} aplikaciji...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nova aplikacija: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
@@ -104,10 +88,4 @@
<value>Verifikovani paketi: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -68,7 +68,6 @@
<value>A {0} jelenleg ki van kapcsolva a konfigurációid alapján. Ha szeretnéd segíteni a SteamDB-t adatok beküldésével, kérlek nézd meg a wikit.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>A(z) {0} nem tölthető be, új példány lesz inicializálva...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
@@ -92,7 +91,6 @@
<value>Összesen {0} alkalmazás-hozzáférési token lekérése befejeződött.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>{0} alkalmazás információinak lekérése...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
@@ -101,8 +99,6 @@
<value>{0} alkalmazás adatainak lekérése befejeződött.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Nincs új beküldendő adat, minden naprakész.</value>
</data>
@@ -110,12 +106,10 @@
<value>Nem sikerült elküldeni az adatokat, mert nincs olyan érvényes SteamID, amelyet közreműködőnek minősíthetnénk. Fontolja meg a(z) {0} tulajdon beállítását.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>A beküldés meghiúsult, mert túl sok kérés érkezett. Körülbelül {0} múlva újra megpróbáljuk.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Új appok: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
@@ -132,10 +126,4 @@
<value>Ellenőrzött csomagok: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -68,14 +68,6 @@
<value>설정에 따라 {0} (이)가 현재 비활성화 되어 있습니다. SteamDB에 데이터 제공을 원하신다면, wiki를 참고하세요.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>{0} 개의 앱 정보를 불러오고 있습니다...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
@@ -84,12 +76,9 @@
<value>{0} 개의 앱 정보를 불러왔습니다.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>새로 등록할 데이터가 없습니다.</value>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>서버에 새로 등록하는 앱/패키지/depot은 다음과 같습니다: {0}/{1}/{2}</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
@@ -118,12 +107,7 @@
<value>인증된 패키지: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>STD 글로벌 캐시 로드 중...</value>
</data>
</root>

View File

@@ -64,8 +64,14 @@
<value>{0} buvo išjungtas, dėl trūkstamos dalies</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>Pagal jūsų konfigūraciją {0} šiuo metu yra išjungtas. Jei norite padėti SteamDB pateikti duomenis, peržiūrėkite mūsų wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} sėkmingai inicializuotas, iš anksto dėkojame už pagalbą. Pirmasis pateikimas bus atliktas maždaug po {1}.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} nepavyko užkrauti, bus įrašyta nauja instancija...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
@@ -89,7 +95,10 @@
<value>Iš viso baigta gauti {0} programos prieigos raktų.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Gaunami visų {0} programų saugyklos raktai...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Gaunama {0} programos informacijos...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
@@ -98,18 +107,33 @@
<value>Baigta gauti {0} programos informacijos.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>Užbaigta {0} iš {1} saugyklos rakto užklausų.</value>
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Baigta gauti visų {0} programų saugyklos raktų paieška.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Nėra jokių naujų duomenų, kuriuos būtų galima pateikti, viskas jau atnaujinta.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Nepavyko pateikti duomenų, nes nėra nustatyto galiojančio SteamID, kurį galėtume klasifikuoti kaip bendraautorį. Apsvarstykite galimybę nustatyti {0} savybę.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Pateikiamas bendras užregistruotų programų / paketų / saugyklų skaičius: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Pateiktis nepavyko dėl per daug išsiustų prašymų, pradėsime iš naujo už maždaug {0} nuo dabar.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Duomenys sėkmingai pateikti. Serveris užregistravo iš viso naujų programų / paketų / saugyklų: {0} ({1} patvirtinta) / {2} ({3} patvirtinta) / {4} ({5} patvirtinta).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Naujos programos: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
@@ -126,8 +150,14 @@
<value>Patvirtinti paketai: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Naujos programos: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Patvirtintos programos: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} inicijuota, įskiepis neišspręs nė vieno iš šių dalykų: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
@@ -138,5 +168,7 @@
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Tvirtinamas STD global talpyklos vientisumas...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>Nepavyko patikrinti STD visuotinės talpyklos vientisumo. Tai rodo galimą failo / atminties sugadinimą, vietoj to bus inicijuota nauja instancija.</value>
</data>
</root>

View File

@@ -60,25 +60,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nova aplikacija: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
@@ -87,12 +68,4 @@
<value>Verifikovana aplikacija: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -60,33 +60,4 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -116,8 +116,8 @@ public static class JsonUtilities {
}
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2026:RequiresUnreferencedCode", Justification = "We don't care about trimmed assemblies, as we need it to work only with the known (used) ones")]
private static JsonSerializerOptions CreateDefaultJsonSerializerOptions(bool writeIndented = false) =>
new(JsonSerializerDefaults.Strict) {
private static JsonSerializerOptions CreateDefaultJsonSerializerOptions(bool writeIndented = false) {
JsonSerializerOptions result = new(JsonSerializerDefaults.Strict) {
AllowTrailingCommas = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
IndentCharacter = '\t',
@@ -129,6 +129,11 @@ public static class JsonUtilities {
WriteIndented = writeIndented
};
result.MakeReadOnly();
return result;
}
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2070", Justification = "We don't care about trimmed methods, it's not like we can make it work differently anyway")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2075", Justification = "We don't care about trimmed properties, it's not like we can make it work differently anyway")]
private static MethodInfo? GetShouldSerializeMethod([SuppressMessage("ReSharper", "SuggestBaseTypeForParameter")] Type parent, JsonPropertyInfo property) {

View File

@@ -280,6 +280,7 @@ internal static class ArchiKestrel {
"/swagger", static options => {
options.DefaultFonts = false;
options.OpenApiRoutePattern = $"/swagger/{SharedInfo.ASF}/swagger.json";
options.Telemetry = false;
options.Theme = ScalarTheme.Kepler;
options.Title = $"{SharedInfo.AssemblyName} API";
}
@@ -455,7 +456,7 @@ internal static class ArchiKestrel {
}
// Set up custom config to be used
builder.WebHost.UseConfiguration(new ConfigurationBuilder().SetBasePath(absoluteConfigDirectory).AddJsonFile(SharedInfo.IPCConfigFile, false, true).Build());
builder.WebHost.UseConfiguration(new ConfigurationBuilder().SetBasePath(absoluteConfigDirectory).AddJsonFile(SharedInfo.IPCConfigFile, false, Program.ConfigWatch).Build());
}
builder.WebHost.ConfigureKestrel(options => {
@@ -533,15 +534,19 @@ internal static class ArchiKestrel {
// Init history logger for /Api/Log usage
Logging.InitHistoryLogger();
WebApplication webApplication = await CreateWebApplication().ConfigureAwait(false);
WebApplication? webApplication = null;
try {
// Start the server
webApplication = await CreateWebApplication().ConfigureAwait(false);
await webApplication.StartAsync().ConfigureAwait(false);
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
await webApplication.DisposeAsync().ConfigureAwait(false);
if (webApplication != null) {
await webApplication.DisposeAsync().ConfigureAwait(false);
}
return;
}

View File

@@ -24,6 +24,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Text.Json;
@@ -48,7 +49,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/AddLicense")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, BotAddLicenseResponse>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> AddLicensePost(string botNames, [FromBody] BotAddLicenseRequest request) {
public async Task<ActionResult<GenericResponse>> AddLicensePost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotAddLicenseRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -77,7 +78,7 @@ public sealed class BotController : ArchiController {
[HttpDelete("{botNames:required}")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> BotDelete(string botNames) {
public async Task<ActionResult<GenericResponse>> BotDelete([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -95,7 +96,7 @@ public sealed class BotController : ArchiController {
[HttpGet("{botNames:required}")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, Bot>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public ActionResult<GenericResponse> BotGet(string botNames) {
public ActionResult<GenericResponse> BotGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -111,7 +112,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, bool>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> BotPost(string botNames, [FromBody] BotRequest request) {
public async Task<ActionResult<GenericResponse>> BotPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -185,7 +186,7 @@ public sealed class BotController : ArchiController {
[HttpDelete("{botNames:required}/GamesToRedeemInBackground")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundDelete(string botNames) {
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundDelete([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -203,7 +204,7 @@ public sealed class BotController : ArchiController {
[HttpGet("{botNames:required}/GamesToRedeemInBackground")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GamesToRedeemInBackgroundResponse>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundGet(string botNames) {
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -228,7 +229,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/GamesToRedeemInBackground")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, OrderedDictionary<string, string>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundPost(string botNames, [FromBody] BotGamesToRedeemInBackgroundRequest request) {
public async Task<ActionResult<GenericResponse>> GamesToRedeemInBackgroundPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotGamesToRedeemInBackgroundRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -263,7 +264,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Input")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> InputPost(string botNames, [FromBody] BotInputRequest request) {
public async Task<ActionResult<GenericResponse>> InputPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotInputRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -286,7 +287,7 @@ public sealed class BotController : ArchiController {
[HttpGet("{botNames:required}/Inventory/{appID}/{contextID}")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, BotInventoryResponse>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> InventoryGet(string botNames, uint appID, ulong contextID, [FromQuery] string? language = null) {
public async Task<ActionResult<GenericResponse>> InventoryGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames, uint appID, ulong contextID, [FromQuery] string? language = null) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
if (appID == 0) {
@@ -337,7 +338,7 @@ public sealed class BotController : ArchiController {
[HttpGet("{botNames:required}/Inventory")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, ImmutableDictionary<uint, InventoryAppData>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> InventoryInfoGet(string botNames) {
public async Task<ActionResult<GenericResponse>> InventoryInfoGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -361,7 +362,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Pause")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> PausePost(string botNames, [FromBody] BotPauseRequest request) {
public async Task<ActionResult<GenericResponse>> PausePost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotPauseRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -380,7 +381,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/RedeemPoints/{definitionID:required}")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, EResult>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> RedeemPointsPost(string botNames, uint definitionID, [FromQuery] bool forced = false) {
public async Task<ActionResult<GenericResponse>> RedeemPointsPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, uint definitionID, [FromQuery] bool forced = false) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentOutOfRangeException.ThrowIfZero(definitionID);
@@ -406,7 +407,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Redeem")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, IReadOnlyDictionary<string, CStore_RegisterCDKey_Response>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> RedeemPost(string botNames, [FromBody] BotRedeemRequest request) {
public async Task<ActionResult<GenericResponse>> RedeemPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotRedeemRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -442,7 +443,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/RemoveLicense")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, BotRemoveLicenseResponse>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> RemoveLicensePost(string botNames, [FromBody] BotRemoveLicenseRequest request) {
public async Task<ActionResult<GenericResponse>> RemoveLicensePost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] BotRemoveLicenseRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -471,7 +472,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botName:required}/Rename")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> RenamePost(string botName, [FromBody] BotRenameRequest request) {
public async Task<ActionResult<GenericResponse>> RenamePost([Description(WebUtilities.BotNamesParameterDescription)] string botName, [FromBody] BotRenameRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botName);
ArgumentNullException.ThrowIfNull(request);
@@ -496,7 +497,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Resume")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> ResumePost(string botNames) {
public async Task<ActionResult<GenericResponse>> ResumePost([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -514,7 +515,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Start")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> StartPost(string botNames) {
public async Task<ActionResult<GenericResponse>> StartPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -532,7 +533,7 @@ public sealed class BotController : ArchiController {
[HttpPost("{botNames:required}/Stop")]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> StopPost(string botNames) {
public async Task<ActionResult<GenericResponse>> StopPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);

View File

@@ -87,6 +87,8 @@ public sealed class NLogController : ArchiController {
[EndpointDescription("This API endpoint requires a websocket connection")]
[EndpointSummary("Fetches ASF log in realtime")]
[ProducesResponseType((int) HttpStatusCode.SwitchingProtocols)]
[ProducesResponseType((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult> Get() {
if (HttpContext == null) {

View File

@@ -23,6 +23,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
@@ -44,7 +45,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
[HttpGet("Confirmations")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GenericResponse<IReadOnlyCollection<Confirmation>>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> ConfirmationsGet(string botNames) {
public async Task<ActionResult<GenericResponse>> ConfirmationsGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -69,7 +70,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
[HttpPost("Confirmations")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GenericResponse<IReadOnlyCollection<Confirmation>>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> ConfirmationsPost(string botNames, [FromBody] TwoFactorAuthenticationConfirmationsRequest request) {
public async Task<ActionResult<GenericResponse>> ConfirmationsPost([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] TwoFactorAuthenticationConfirmationsRequest request) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(request);
@@ -99,7 +100,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
[HttpDelete]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GenericResponse<string>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> Delete(string botNames) {
public async Task<ActionResult<GenericResponse>> Delete([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);
@@ -124,7 +125,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
[HttpPost]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GenericResponse>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> Post(string botNames, [FromBody] MobileAuthenticator authenticator) {
public async Task<ActionResult<GenericResponse>> Post([Description(WebUtilities.BotNamesParameterDescription)] string botNames, [FromBody] MobileAuthenticator authenticator) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
ArgumentNullException.ThrowIfNull(authenticator);
@@ -150,7 +151,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
[HttpGet("Token")]
[ProducesResponseType<GenericResponse<IReadOnlyDictionary<string, GenericResponse<string>>>>((int) HttpStatusCode.OK)]
[ProducesResponseType<GenericResponse>((int) HttpStatusCode.BadRequest)]
public async Task<ActionResult<GenericResponse>> TokenGet(string botNames) {
public async Task<ActionResult<GenericResponse>> TokenGet([Description(WebUtilities.BotNamesParameterDescription)] string botNames) {
ArgumentException.ThrowIfNullOrEmpty(botNames);
HashSet<Bot>? bots = Bot.GetBots(botNames);

View File

@@ -85,6 +85,14 @@ internal sealed class DocumentTransformer : IOpenApiDocumentTransformer {
}
},
{
StatusCodes.Status200OK.ToString(CultureInfo.InvariantCulture),
new OpenApiResponse {
Description = nameof(HttpStatusCode.OK)
}
},
{
StatusCodes.Status400BadRequest.ToString(CultureInfo.InvariantCulture),

View File

@@ -28,6 +28,8 @@ using System.Linq;
namespace ArchiSteamFarm.IPC;
internal static class WebUtilities {
internal const string BotNamesParameterDescription = "Plural argument accepting one or many bots, acts the same as [Bots] parameter in the commands - https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Commands#bots-argument";
internal static string? GetUnifiedName(this Type type) {
ArgumentNullException.ThrowIfNull(type);

View File

@@ -803,7 +803,7 @@ Tiempo de actividad del proceso: {1}</value>
<value>Declaraste --system-required, aunque tu sistema operativo no tiene las dependencias para que esa característica funcione. Considera instalar dbus, aunque también puedes ignorar esta advertencia si no requieres inhibición para trabajar correctamente.</value>
</data>
<data name="WarningBotDatabaseComponentDecryptionFailed" xml:space="preserve">
<value>El descifrado del componente de base de datos {0} ha fallado. Esto puede estar bien si acabas de cambiar la {1}de tu bot, ya no deberías observar esta advertencia en la próxima ejecución entonces. De lo contrario, debería investigar y averiguar la razón exacta del fracaso.</value>
<value>El descifrado del componente de la base de datos {0} ha fallado. Esto puede ser correcto si acabas de cambiar la {1} de tu bot, ya no deberías ver esta advertencia en la próxima ejecución. De lo contrario, deberías investigar y averiguar la razón exacta de la falla.</value>
<comment>{0} will be replaced by bot database component's name (string), {1} will be replaced by bot config component's name (string).</comment>
</data>
</root>

View File

@@ -87,6 +87,10 @@ StackTrace:
{2}</value>
<comment>{0} will be replaced by function name, {1} will be replaced by exception message, {2} will be replaced by entire stack trace. Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ErrorExitingWithNonZeroErrorCode" xml:space="preserve">
<value>Išjungiama su {0} klaidos kodu!</value>
<comment>{0} will be replaced by error code (number)</comment>
</data>
<data name="ErrorFailingRequest" xml:space="preserve">
<value>Užklausa nutrūksta: {0}</value>
<comment>{0} will be replaced by URL of the request</comment>
@@ -580,6 +584,10 @@ Proceso veikimo laikas: {1}</value>
<value>Botas neturi {0} lygio.</value>
<comment>{0} will be replaced by bot's level</comment>
</data>
<data name="BotInventory" xml:space="preserve">
<value>{0}/{1} ({2}/{3}): {4} daiktai</value>
<comment>{0} will be replaced by appID (number), {1} will be replaced by contextID (number), {2} will be replaced by app's name (string), {3} will be replaced by name of the context (string), {4} will be replaced by number of assets in the specified inventory (number).</comment>
</data>
<data name="ActivelyMatchingItems" xml:space="preserve">
<value>Derinami Steam item'ai, #{0} raundas...</value>
<comment>{0} will be replaced by round number</comment>
@@ -679,6 +687,10 @@ Proceso veikimo laikas: {1}</value>
<value>Jūsų šifravimo raktas yra per trumpas. Rekomenduojame naudoti raktą, kuris yra bent {0} baitų (simbolių) ilgio.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Jūs naudojate {0} nustatymą is {1} ypatybės, tačiau nenurodėte tinkintos --cryptkey savybės. Turėtumėte pateikti tinkintą --cryptkey savybę padidintai apsaugai.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Jūs naudojate {0} nustatymą is {1} ypatybės, tačiau nenurodėte tinkintos --cryptkey savybės. Tai prieštarauja apsaugai, kadangi ASF bus priversta naudoti savo (žinomą) raktą. Reiktų nurodyti tinkintą --cryptkey savybę, kad šio gautumėte šio nustatymo naudą.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
@@ -698,6 +710,9 @@ Proceso veikimo laikas: {1}</value>
<data name="ChecksumMissing" xml:space="preserve">
<value>Nuotolinis serveris nežino apie išleidimą, į kurį bandote atsinaujinti. Ši situacija galima, jeigu išleidimas buvo neseniai paskelbtas - neleidžiama atnaujinti iš karto dėl papildomos apsaugos.</value>
</data>
<data name="ChecksumTimeout" xml:space="preserve">
<value>Nepavyko gauti atsisiųsto dvejetainio failo kontrolinės sumos dėl papildomos saugumo priemonės šiuo metu atsisakoma tęsti atnaujinimo procedūrą.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Nuotolinis serveris atsakė su nesutampančia kontroline suma. Tai gali būti dėl sugadinto atsisiuntimo arba MITM atakos. Atsisakoma tęsti atnaujinimo procesą!</value>
</data>
@@ -716,4 +731,80 @@ Proceso veikimo laikas: {1}</value>
<value>Jūs bandote naudoti mokamą funkciją {0}, tačiau jūs neturite tinkamo LicenseID nustatyto globalioje konfigūracijoje. Prašome patikrinti savo konfigūraciją, kadangi funkcija neveiks be papildomų detalių.</value>
<comment>{0} will be replaced by feature name (e.g. MatchActively)</comment>
</data>
<data name="WarningRegionRestrictedPackage" xml:space="preserve">
<value>ASF negali paleisti programėlės {0}, nes jai taikomi su regionu susiję apribojimai {1} šalyje, kurie galioja iki {2}.</value>
<comment>{0} will be replaced by app ID (number), {1} will be replaced by short country code (string, such as "PL"), {2} will be replaced by human-readable date (string).</comment>
</data>
<data name="WarningUnsupportedOfficialPlugins" xml:space="preserve">
<value>Bandote paleisti oficialų {0} įskiepį, kuris neatitinka ASF versijos: {1} (tikėtasi {2}). Tai rodo, kad darote kažką labai negerai. Jei tikrai žinote, ką darote, pataisykite nustatymus arba pateikite argumentą --ignore-unsupported-environment.</value>
<comment>{0} will be replaced by plugin name, {1} will be replaced by plugin's version number, {2} will be replaced by ASF's version number.</comment>
</data>
<data name="ErrorTooManyCrashes" xml:space="preserve">
<value>Jūsų ASF pastaruoju metu per daug kartų užstrigo, todėl proceso inicijavimas buvo išjungtas. Arba ištirkite, pataisykite nustatymus, tada pašalinkite ASF.crash failą iš konfigūracijos katalogo, arba pateikite argumentą --ignore-unsupported-environment, jei tikrai žinote, ką darote.</value>
</data>
<data name="IdlingGameNotPossiblePrivate" xml:space="preserve">
<value>Žaidimo {0} ({1}) farminimas yra išjungtas, nes šis žaidimas šiuo metu pažymėtas kaip privatus. Jei ketinate iš ASF farminti šiame žaidime, apsvarstykite galimybę pakeisti jo privatumo nustatymus.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningSkipping" xml:space="preserve">
<value>Praleidžiama: {0}...</value>
<comment>{0} will be replaced by text value (string) of entry being skipped.</comment>
</data>
<data name="PluginUpdatesChecking" xml:space="preserve">
<value>Ieškomi įskiepių atnaujinimai...</value>
</data>
<data name="PluginUpdateChecking" xml:space="preserve">
<value>Ieškomas atnaujinimas {0} įskiepiui...</value>
<comment>{0} will be replaced by plugin name (string).</comment>
</data>
<data name="PluginUpdateNotFound" xml:space="preserve">
<value>Atnaujino įskiepiui {0} nėra: {1} ≥ {2}.</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by current plugin's version, {2} will be replaced by remote plugin's version.</comment>
</data>
<data name="PluginUpdateNewVersionAvailable" xml:space="preserve">
<value>Yra nauja {0} įskiepio versija! Apsvarstykite atsinaujinti!</value>
<comment>{0} will be replaced by plugin name (string).</comment>
</data>
<data name="PluginUpdateFound" xml:space="preserve">
<value>Galimas {0} įskiepio atnaujinimas iš {1} versijos į {2}...</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by current plugin's version, {2} will be replaced by remote plugin's version.</comment>
</data>
<data name="PluginUpdateNoAssetFound" xml:space="preserve">
<value>Nėra išteklių, skirtų {0} įskiepio atnaujinimui iš {1} versijos į {2}, tai paprastai reiškia, kad atnaujinimas bus pasiekiamas vėliau.</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by current plugin's version, {2} will be replaced by remote plugin's version.</comment>
</data>
<data name="PluginUpdateConflictingAssetsFound" xml:space="preserve">
<value>Nepavyko nustatyti jokio ištekliaus {0} įskiepio atnaujinimui iš {1} versijos į {2}. Taip gali nutikti, jei leidimas dar nebaigtas jei tai kartojasi, turėtumėte apie tai pranešti įskiepio kūrėjui.</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by current plugin's version, {2} will be replaced by remote plugin's version.</comment>
</data>
<data name="PluginUpdateInProgress" xml:space="preserve">
<value>Atnaujinamas {0} įskiepis...</value>
<comment>{0} will be replaced by plugin name (string).</comment>
</data>
<data name="PluginUpdateFinished" xml:space="preserve">
<value>Įskiepio {0} atnaujinimas sėkmingas, pakeitimai bus įkelti kitą kartą paleidus ASF.</value>
<comment>{0} will be replaced by plugin name (string).</comment>
</data>
<data name="PluginUpdateEnabled" xml:space="preserve">
<value>{0}/{1} įskiepis užregistruotas ir įjungti automatiniai atnaujinimai.</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by plugin assembly name (string).</comment>
</data>
<data name="PluginUpdateDisabled" xml:space="preserve">
<value>{0} ({1}) įskiepio automatiniai atnaujinimai išjungti, nors palaiko šią funkciją.</value>
<comment>{0} will be replaced by plugin name (string), {1} will be replaced by plugin assembly name (string).</comment>
</data>
<data name="CustomPluginUpdatesEnabled" xml:space="preserve">
<value>Tinkinti įskiepiai buvo užregistruoti automatiniams atnaujinimams. ASF komanda primena, kad dėl savo pačių saugumo turėtumėte įjungti automatinius atnaujinimus tik iš patikimų šalių. Jei neketinote to daryti, galite išjungti įskiepius atnaujinimus ASF globalioje konfigūracijoje.</value>
</data>
<data name="Input" xml:space="preserve">
<value>Įvestis: {0}</value>
<comment>{0} will be replaced by text input from the user.</comment>
</data>
<data name="WarningNoSystemRequiredLinuxDependencies" xml:space="preserve">
<value>Nurodėte --system-required, nors jūsų operacinėje sistemoje trūksta būtinų dependencies, kad ši funkcija veiktų. Galite įdiegti „dbus“, nors galite drąsiai ignoruoti šį įspėjimą, jei jums nereikia slopinimo, kad jis tinkamai veiktų.</value>
</data>
<data name="WarningBotDatabaseComponentDecryptionFailed" xml:space="preserve">
<value>Duomenų bazės komponento {0} iššifravimas nepavyko. Tai gali būti gerai, jei ką tik pakeitėte savo roboto {1}, kito paleidimo metu šio įspėjimo nebeturėtumėte matyti. Priešingu atveju turėtumėte ištirti ir išsiaiškinti tikslią nesėkmės priežastį.</value>
<comment>{0} will be replaced by bot database component's name (string), {1} will be replaced by bot config component's name (string).</comment>
</data>
</root>

View File

@@ -807,4 +807,8 @@
<data name="WarningNoSystemRequiredLinuxDependencies" xml:space="preserve">
<value>Вы объявили --system-required, хотя ваша ОС не имеет необходимых зависимостей для работы этой функции. Рассмотрим установку dbus, хотя вы также можете безопасно проигнорировать это предупреждение, если вам не требуется запрещение для нормальной работы.</value>
</data>
<data name="WarningBotDatabaseComponentDecryptionFailed" xml:space="preserve">
<value>Не удалось расшифровать {0} компонент базы данных. Это может быть нормой, если вы только что изменили {1} своего бота, и при следующем запуске это предупреждение больше не должно появиться. В ином случае вы должны выяснить точную причину сбоя.</value>
<comment>{0} will be replaced by bot database component's name (string), {1} will be replaced by bot config component's name (string).</comment>
</data>
</root>

View File

@@ -800,4 +800,11 @@
<value>輸入:{0}</value>
<comment>{0} will be replaced by text input from the user.</comment>
</data>
<data name="WarningNoSystemRequiredLinuxDependencies" xml:space="preserve">
<value>您宣告了 --system-required但您的作業系統缺少該功能所需的相依套件。請考慮安裝 dbus。如果您不需要此功能則可以直接忽略這個警告。</value>
</data>
<data name="WarningBotDatabaseComponentDecryptionFailed" xml:space="preserve">
<value>無法解密資料庫 {0}。若您剛剛更改了 Bot 的 {1},可能是正常現象,在下次執行時就不會再看到這則警告。否則您應檢查並找出失敗的確切原因。</value>
<comment>{0} will be replaced by bot database component's name (string), {1} will be replaced by bot config component's name (string).</comment>
</data>
</root>

View File

@@ -1399,11 +1399,20 @@ public sealed class Commands {
HashSet<uint> appIDs = [];
foreach (string target in targets) {
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
switch (target.ToUpperInvariant()) {
case "ALL":
appIDs.UnionWith(Bot.BotDatabase.FarmingBlacklistAppIDs);
appIDs.Add(appID);
break;
default:
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
appIDs.Add(appID);
break;
}
}
if (!Bot.BotDatabase.FarmingBlacklistAppIDs.RemoveRange(appIDs)) {
@@ -1556,11 +1565,20 @@ public sealed class Commands {
HashSet<uint> appIDs = [];
foreach (string target in targets) {
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
switch (target.ToUpperInvariant()) {
case "ALL":
appIDs.UnionWith(Bot.BotDatabase.FarmingPriorityQueueAppIDs);
appIDs.Add(appID);
break;
default:
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
appIDs.Add(appID);
break;
}
}
if (!Bot.BotDatabase.FarmingPriorityQueueAppIDs.RemoveRange(appIDs)) {
@@ -1975,11 +1993,20 @@ public sealed class Commands {
HashSet<uint> appIDs = [];
foreach (string target in targets) {
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
switch (target.ToUpperInvariant()) {
case "ALL":
appIDs.UnionWith(Bot.BotDatabase.MatchActivelyBlacklistAppIDs);
appIDs.Add(appID);
break;
default:
if (!uint.TryParse(target, out uint appID) || (appID == 0)) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(appID)));
}
appIDs.Add(appID);
break;
}
}
return FormatBotResponse(Bot.BotDatabase.MatchActivelyBlacklistAppIDs.RemoveRange(appIDs) ? Strings.Done : Strings.NothingFound);
@@ -3416,11 +3443,20 @@ public sealed class Commands {
HashSet<ulong> targetIDs = [];
foreach (string target in targets) {
if (!ulong.TryParse(target, out ulong targetID) || (targetID == 0) || !new SteamID(targetID).IsIndividualAccount) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(targetID)));
}
switch (target.ToUpperInvariant()) {
case "ALL":
targetIDs.UnionWith(Bot.BotDatabase.TradingBlacklistSteamIDs);
targetIDs.Add(targetID);
break;
default:
if (!ulong.TryParse(target, out ulong targetID) || (targetID == 0) || !new SteamID(targetID).IsIndividualAccount) {
return FormatBotResponse(Strings.FormatErrorParsingObject(nameof(targetID)));
}
targetIDs.Add(targetID);
break;
}
}
return FormatBotResponse(Bot.BotDatabase.TradingBlacklistSteamIDs.RemoveRange(targetIDs) ? Strings.Done : Strings.NothingFound);

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>6.3.1.6</Version>
<Version>6.3.2.2</Version>
</PropertyGroup>
<PropertyGroup>

View File

@@ -16,11 +16,11 @@
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.11.10" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.12.6" />
<PackageVersion Include="SteamKit2" Version="3.3.1" />
<PackageVersion Include="System.Composition" Version="10.0.1" />
<PackageVersion Include="System.Composition.AttributedModel" Version="10.0.1" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="10.0.1" />
<PackageVersion Include="Tmds.DBus.Protocol" Version="0.22.0" />
<PackageVersion Include="Tmds.DBus.Protocol" Version="0.23.0" />
</ItemGroup>
</Project>

2
wiki

Submodule wiki updated: 27df146074...45eef57326