Compare commits

..

39 Commits

Author SHA1 Message Date
ArchiBot
aea7c7640c Automatic translations update 2022-03-24 02:22:40 +00:00
Łukasz Domeradzki
7118185ac5 Remove support for IPC localization (#2545) 2022-03-24 01:47:12 +01:00
Renovate Bot
b681b74ee6 Update ASF-ui digest to 871721c 2022-03-22 20:45:48 +00:00
Archi
cc83222c3e Use shorter syntax for json properties 2022-03-22 16:33:47 +01:00
Archi
6c570738ee Fix handling inventory loading errors
"success" doesn't have to exist as a property in error json
2022-03-22 14:57:48 +01:00
Archi
393ddf6f10 Misc optimization 2022-03-22 12:27:07 +01:00
renovate[bot]
75a7df2751 Update peter-evans/dockerhub-description action to v3 (#2542)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-22 11:37:59 +01:00
Archi
0c3dfaa4ae Use generic delay for all unhandled disconnects
There are only handful of cases where we want to reconnect immediately, and login limiter delay usually kills those anyway
2022-03-21 14:50:36 +01:00
Renovate Bot
94e70e5ac2 Update ASF-ui digest to 97dcaf2 2022-03-19 01:15:00 +00:00
Archi
9ce527c938 Bump 2022-03-18 19:51:04 +01:00
Renovate Bot
660b05e4c4 Update ASF-ui digest to 0f8dfef 2022-03-18 11:13:17 +00:00
Archi
b39efb2b03 Re-enable ASF-ui updates 2022-03-18 12:12:38 +01:00
ArchiBot
53e0b62ced Automatic translations update 2022-03-18 02:21:32 +00:00
ArchiBot
d3980962fe Automatic translations update 2022-03-17 02:20:45 +00:00
Renovate Bot
517787efb8 Update wiki digest to 6505a66 2022-03-16 17:55:41 +00:00
lrcf
d06afa26d4 LICENSE-2.0.txt > LICENSE.txt (#2539) 2022-03-16 16:41:08 +01:00
Archi
4562e71e47 Misc 2022-03-16 15:34:37 +01:00
Renovate Bot
894471fa82 Update crazy-max/ghaction-import-gpg action to v4.3.0 2022-03-16 03:40:33 +00:00
ArchiBot
e9f6c15ba1 Automatic translations update 2022-03-16 02:21:54 +00:00
ArchiBot
814b93d1cf Automatic translations update 2022-03-15 02:19:58 +00:00
Renovate Bot
beafbd8f43 Update docker/build-push-action action to v2.10.0 2022-03-14 20:06:32 +00:00
ArchiBot
dbd0e006ed Automatic translations update 2022-03-14 02:18:10 +00:00
ArchiBot
4661803836 Automatic translations update 2022-03-13 02:13:18 +00:00
Renovate Bot
99ecd72660 Update wiki digest to 791cfff 2022-03-12 23:59:22 +00:00
Archi
799ec2965f Bump 2022-03-12 22:34:55 +01:00
Archi
c7e9c0c3b0 Bump 2022-03-12 22:34:35 +01:00
Sebastian Göls
1f3e861612 Correctly detect steam deck keyboard skins (#2535) 2022-03-12 22:16:45 +01:00
Renovate Bot
159b0620a7 Update dependency Markdig.Signed to v0.28.0 2022-03-11 14:37:14 +00:00
ArchiBot
e508602be7 Automatic translations update 2022-03-11 02:20:00 +00:00
Archi
6edf62d849 Set initial state of ShouldResumeFarming to false
ShouldResumeFarming indicates whether call to Resume() should start farming, which is used for example when account is marked as free to farm due to event. That event by default is triggered on ASF startup as well.

At the same time, the prerequisite to start farming is having our cache ready at least for the bot that is about to start farming. This happens in OnBotLicenseList() which notified CardsFarmer about new games added once it finishes, which also triggers the farming.

Previous behaviour resulted in a bit unwanted situation where CardsFarmer didn't bother waiting for cache to be ready, as the event about occupation triggered resume process, and that process due to true value started immediately. Changing default state of that value to false should suffice, as initial resume event won't cause the cards farming process to be started, and event about new games added already sets that flag back to true, so if cache being rebuilt happens before playing lock being released, Resume() should still trigger farming as wanted.

Give yourself a pat on the back if you understood something from that.
2022-03-10 12:36:31 +01:00
ArchiBot
021d414143 Automatic translations update 2022-03-09 02:19:23 +00:00
Renovate Bot
813587508e Update dotnet monorepo to v3.1.23 2022-03-08 16:53:12 +00:00
Renovate Bot
0e3d124663 Update swashbuckle-aspnetcore monorepo to v6.3.0 2022-03-08 02:27:31 +00:00
ArchiBot
91115b7cb7 Automatic translations update 2022-03-08 02:16:20 +00:00
Archi
0f12174564 Bump 2022-03-07 18:43:29 +01:00
Łukasz Domeradzki
d087aacbfb Closes #2532 2022-03-07 18:35:41 +01:00
Archi
1c0d2d88ed Address crowdin-cli 3.7.8 breaking change
And ensure it doesn't fail silently again the next time something like that happens

https://github.com/crowdin/crowdin-cli/issues/439
2022-03-07 13:28:32 +01:00
renovate[bot]
6b170c345d Update actions/upload-artifact action to v3 (#2530)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-03 20:39:53 +01:00
Archi
bc8a4a50d2 Bump 2022-03-03 14:51:41 +01:00
66 changed files with 645 additions and 478 deletions

View File

@@ -67,7 +67,7 @@ ASF is open-source project, developed mainly by **[JustArchi](https://github.com
### License
ASF is using **[Apache License 2.0](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE-2.0.txt)**.
ASF is using **[Apache License 2.0](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE.txt)**.
> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.

1
.github/crowdin.yml vendored
View File

@@ -1,3 +1,4 @@
"base_path": ".."
"preserve_hierarchy": true
"files": [
{

View File

@@ -19,14 +19,6 @@
"allowedVersions": "<= 3.1",
"matchManagers": [ "nuget" ],
"matchPackageNames": [ "Microsoft.Extensions.Configuration.Json", "Microsoft.Extensions.Logging.Configuration" ]
},
{
// TODO: ASF-ui bug, https://github.com/JustArchiNET/ASF-ui/issues/1556
"matchManagers": ["git-submodules"],
"matchPackageNames": [
"ASF-ui"
],
"enabled": false
}
]
}

View File

@@ -38,7 +38,6 @@ jobs:
run: dotnet test ArchiSteamFarm.Tests -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
- name: Upload latest strings for translation on Crowdin
continue-on-error: true
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.configuration == 'Release' && startsWith(matrix.os, 'ubuntu-') }}
uses: crowdin/github-action@1.4.7
with:

View File

@@ -25,7 +25,7 @@ jobs:
uses: docker/setup-buildx-action@v1.6.0
- name: Build ${{ matrix.configuration }} Docker image from ${{ matrix.file }}
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
file: ${{ matrix.file }}

View File

@@ -55,7 +55,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile.Service
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
file: Dockerfile.Service

View File

@@ -55,7 +55,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
platforms: ${{ env.PLATFORMS }}
@@ -71,7 +71,7 @@ jobs:
- name: Update DockerHub repository description
continue-on-error: true
uses: peter-evans/dockerhub-description@v2.4.3
uses: peter-evans/dockerhub-description@v3.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

View File

@@ -56,7 +56,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile
uses: docker/build-push-action@v2.9.0
uses: docker/build-push-action@v2.10.0
with:
context: .
platforms: ${{ env.PLATFORMS }}

View File

@@ -19,7 +19,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
os: [macos-latest, ubuntu-latest, windows-2019]
runs-on: ${{ matrix.os }}
@@ -340,7 +340,7 @@ jobs:
- name: Upload ASF-generic
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-generic
path: out/ASF-generic.zip
@@ -348,49 +348,49 @@ jobs:
- name: Upload ASF-generic-netf
continue-on-error: true
if: startsWith(matrix.os, 'windows-')
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-generic-netf
path: out/ASF-generic-netf.zip
- name: Upload ASF-linux-arm
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-linux-arm
path: out/ASF-linux-arm.zip
- name: Upload ASF-linux-arm64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-linux-arm64
path: out/ASF-linux-arm64.zip
- name: Upload ASF-linux-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-linux-x64
path: out/ASF-linux-x64.zip
- name: Upload ASF-osx-arm64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-osx-arm64
path: out/ASF-osx-arm64.zip
- name: Upload ASF-osx-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-osx-x64
path: out/ASF-osx-x64.zip
- name: Upload ASF-win-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}_ASF-win-x64
path: out/ASF-win-x64.zip
@@ -407,56 +407,56 @@ jobs:
# TODO: It'd be perfect if we could match final artifacts to the platform they target, so e.g. linux build comes from the linux machine
# However, that is currently impossible due to https://github.com/dotnet/msbuild/issues/3897
# Therefore, we'll (sadly) pull artifacts from Windows machine only for now
- name: Download ASF-generic artifact from windows-latest
- name: Download ASF-generic artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-generic
name: windows-2019_ASF-generic
path: out
- name: Download ASF-generic-netf artifact from windows-latest
- name: Download ASF-generic-netf artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-generic-netf
name: windows-2019_ASF-generic-netf
path: out
- name: Download ASF-linux-arm artifact from windows-latest
- name: Download ASF-linux-arm artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-arm
name: windows-2019_ASF-linux-arm
path: out
- name: Download ASF-linux-arm64 artifact from windows-latest
- name: Download ASF-linux-arm64 artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-arm64
name: windows-2019_ASF-linux-arm64
path: out
- name: Download ASF-linux-x64 artifact from windows-latest
- name: Download ASF-linux-x64 artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-x64
name: windows-2019_ASF-linux-x64
path: out
- name: Download ASF-osx-arm64 artifact from windows-latest
- name: Download ASF-osx-arm64 artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-osx-arm64
name: windows-2019_ASF-osx-arm64
path: out
- name: Download ASF-osx-x64 artifact from windows-latest
- name: Download ASF-osx-x64 artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-osx-x64
name: windows-2019_ASF-osx-x64
path: out
- name: Download ASF-win-x64 artifact from windows-latest
- name: Download ASF-win-x64 artifact from windows-2019
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-win-x64
name: windows-2019_ASF-win-x64
path: out
- name: Import GPG key for signing
uses: crazy-max/ghaction-import-gpg@v4.2.0
uses: crazy-max/ghaction-import-gpg@v4.3.0
with:
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
@@ -474,14 +474,14 @@ jobs:
- name: Upload SHA512SUMS
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: SHA512SUMS
path: out/SHA512SUMS
- name: Upload SHA512SUMS.sign
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.0.0
with:
name: SHA512SUMS.sign
path: out/SHA512SUMS.sign

View File

@@ -38,7 +38,7 @@ jobs:
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
- name: Import GPG key for signing
uses: crazy-max/ghaction-import-gpg@v4.2.0
uses: crazy-max/ghaction-import-gpg@v4.3.0
with:
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
git_config_global: true

2
ASF-ui

Submodule ASF-ui updated: 156992e88d...871721c699

View File

@@ -55,7 +55,7 @@ internal static class CatAPI {
#pragma warning disable CA1812 // False positive, the class is used during json deserialization
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
private sealed class MeowResponse {
[JsonProperty(PropertyName = "file", Required = Required.Always)]
[JsonProperty("file", Required = Required.Always)]
internal readonly string Link = "";
[JsonConstructor]

View File

@@ -71,7 +71,7 @@
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>已成功初始化 {0}先感謝您的幫助。第一次提交將大約在 {1} 後進行。</value>
<value>已成功初始化 {0},先感謝您的幫助。第一次提交將大約在 {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">
@@ -79,7 +79,7 @@
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>此 Bot 實例中沒有需要再新的應用程式。</value>
<value>此 Bot 中沒有需要再新的應用程式。</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>正在檢索共 {0} 個應用程式存取權杖…</value>
@@ -114,15 +114,15 @@
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>已完成檢索 {0} 個應用程式的 Depot。</value>
<value>已完成檢索 {0} 個應用程式的 Depot 金鑰。</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>已完成檢索共 {0} 個應用程式的 Depot。</value>
<value>已完成檢索共 {0} 個應用程式的 Depot 金鑰。</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>沒有要提交的新資料,一切都是最新。</value>
<value>沒有要提交的新資料,一切都是最新狀態。</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>無法提交資料,因為沒有可以讓我們歸類為貢獻者的有效 SteamID 集。 考慮設定 {0} 屬性。</value>

View File

@@ -30,27 +30,27 @@ using SteamKit2;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
internal sealed class RequestData {
[JsonProperty(PropertyName = "guid", Required = Required.Always)]
[JsonProperty("guid", Required = Required.Always)]
private static string Guid => ASF.GlobalDatabase?.Identifier.ToString("N") ?? throw new InvalidOperationException(nameof(ASF.GlobalDatabase.Identifier));
[JsonProperty(PropertyName = "token", Required = Required.Always)]
[JsonProperty("token", Required = Required.Always)]
private static string Token => SharedInfo.Token;
[JsonProperty(PropertyName = "v", Required = Required.Always)]
[JsonProperty("v", Required = Required.Always)]
private static byte Version => SharedInfo.ApiVersion;
[JsonProperty(PropertyName = "apps", Required = Required.Always)]
[JsonProperty("apps", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Apps;
[JsonProperty(PropertyName = "depots", Required = Required.Always)]
[JsonProperty("depots", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Depots;
private readonly ulong SteamID;
[JsonProperty(PropertyName = "subs", Required = Required.Always)]
[JsonProperty("subs", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Subs;
[JsonProperty(PropertyName = "steamid", Required = Required.Always)]
[JsonProperty("steamid", Required = Required.Always)]
private string SteamIDText => new SteamID(SteamID).Render();
internal RequestData(ulong steamID, IReadOnlyCollection<KeyValuePair<uint, ulong>> apps, IReadOnlyCollection<KeyValuePair<uint, ulong>> accessTokens, IReadOnlyCollection<KeyValuePair<uint, string>> depots) {

View File

@@ -29,12 +29,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ResponseData {
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "data", Required = Required.DisallowNull)]
[JsonProperty("data", Required = Required.DisallowNull)]
internal readonly InternalData? Data;
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "success", Required = Required.Always)]
[JsonProperty("success", Required = Required.Always)]
internal readonly bool Success;
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
@@ -42,22 +42,22 @@ internal sealed class ResponseData {
private ResponseData() { }
internal sealed class InternalData {
[JsonProperty(PropertyName = "new_apps", Required = Required.Always)]
[JsonProperty("new_apps", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewApps = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "new_depots", Required = Required.Always)]
[JsonProperty("new_depots", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewDepots = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "new_subs", Required = Required.Always)]
[JsonProperty("new_subs", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewPackages = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_apps", Required = Required.Always)]
[JsonProperty("verified_apps", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedApps = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_depots", Required = Required.Always)]
[JsonProperty("verified_depots", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedDepots = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_subs", Required = Required.Always)]
[JsonProperty("verified_subs", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedPackages = ImmutableHashSet<uint>.Empty;
[JsonConstructor]

View File

@@ -33,7 +33,6 @@
<PackageReference Include="Microsoft.AspNetCore.Cors" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" />
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" />
<PackageReference Include="Microsoft.AspNetCore.Localization" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCaching" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" />
@@ -64,7 +63,7 @@
</ItemGroup>
<ItemGroup>
<Content Include="..\LICENSE-2.0.txt">
<Content Include="..\LICENSE.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>

View File

@@ -130,30 +130,30 @@ internal static class ArchiNet {
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ListedUser {
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "items_count", Required = Required.Always)]
[JsonProperty("items_count", Required = Required.Always)]
internal readonly ushort ItemsCount;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
internal readonly HashSet<Asset.EType> MatchableTypes = new();
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "steam_id", Required = Required.Always)]
[JsonProperty("steam_id", Required = Required.Always)]
internal readonly ulong SteamID;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "trade_token", Required = Required.Always)]
[JsonProperty("trade_token", Required = Required.Always)]
internal readonly string TradeToken = "";
internal float Score => GamesCount / (float) ItemsCount;
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "games_count", Required = Required.Always)]
[JsonProperty("games_count", Required = Required.Always)]
private readonly ushort GamesCount;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
internal bool MatchEverything { get; private set; }
[JsonProperty(PropertyName = "matchable_backgrounds", Required = Required.Always)]
[JsonProperty("matchable_backgrounds", Required = Required.Always)]
private byte MatchableBackgroundsNumber {
set {
switch (value) {
@@ -173,7 +173,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_cards", Required = Required.Always)]
[JsonProperty("matchable_cards", Required = Required.Always)]
private byte MatchableCardsNumber {
set {
switch (value) {
@@ -193,7 +193,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_emoticons", Required = Required.Always)]
[JsonProperty("matchable_emoticons", Required = Required.Always)]
private byte MatchableEmoticonsNumber {
set {
switch (value) {
@@ -213,7 +213,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_foil_cards", Required = Required.Always)]
[JsonProperty("matchable_foil_cards", Required = Required.Always)]
private byte MatchableFoilCardsNumber {
set {
switch (value) {
@@ -233,7 +233,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "match_everything", Required = Required.Always)]
[JsonProperty("match_everything", Required = Required.Always)]
private byte MatchEverythingNumber {
set {
switch (value) {

View File

@@ -1,84 +0,0 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2022 Ł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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Headers;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
namespace ArchiSteamFarm.IPC.Integration;
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
internal sealed class LocalizationMiddleware {
private static readonly ImmutableDictionary<string, string> CultureConversions = new Dictionary<string, string>(2, StringComparer.OrdinalIgnoreCase) {
{ "lol-US", SharedInfo.LolcatCultureName },
{ "sr-CS", "sr-Latn" }
}.ToImmutableDictionary(StringComparer.OrdinalIgnoreCase);
private readonly RequestDelegate Next;
public LocalizationMiddleware(RequestDelegate next) => Next = next ?? throw new ArgumentNullException(nameof(next));
[UsedImplicitly]
public async Task InvokeAsync(HttpContext context) {
ArgumentNullException.ThrowIfNull(context);
RequestHeaders headers = context.Request.GetTypedHeaders();
IList<StringWithQualityHeaderValue> acceptLanguageHeader = headers.AcceptLanguage;
if (acceptLanguageHeader.Count == 0) {
await Next(context).ConfigureAwait(false);
return;
}
bool valuesChanged = false;
for (int i = 0; i < acceptLanguageHeader.Count; i++) {
StringSegment language = acceptLanguageHeader[i].Value;
if (!language.HasValue || string.IsNullOrEmpty(language.Value)) {
continue;
}
if (!CultureConversions.TryGetValue(language.Value, out string? replacement) || string.IsNullOrEmpty(replacement)) {
continue;
}
acceptLanguageHeader[i] = StringWithQualityHeaderValue.Parse(replacement);
valuesChanged = true;
}
if (valuesChanged) {
// The getter returns a temporary collection; To make sure our changes are persisted, we need to assign it back
headers.AcceptLanguage = acceptLanguageHeader;
}
await Next(context).ConfigureAwait(false);
}
}

View File

@@ -55,7 +55,7 @@ public sealed class TwoFactorAuthenticationConfirmationsRequest {
/// <summary>
/// A helper property which works the same as <see cref="AcceptedCreatorIDs" /> but with values written as strings - for javascript compatibility purposes. Use either this one, or <see cref="AcceptedCreatorIDs" />, not both.
/// </summary>
[JsonProperty(PropertyName = $"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(AcceptedCreatorIDs)}", Required = Required.DisallowNull)]
[JsonProperty($"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(AcceptedCreatorIDs)}", Required = Required.DisallowNull)]
public ImmutableHashSet<string> SAcceptedCreatorIDs {
get => AcceptedCreatorIDs.Select(static creatorID => creatorID.ToString(CultureInfo.InvariantCulture)).ToImmutableHashSet();
set {

View File

@@ -30,7 +30,6 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using ArchiSteamFarm.Core;
@@ -44,7 +43,6 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Headers;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
@@ -136,12 +134,6 @@ internal sealed class Startup {
}
);
// Add support for additional localization mappings
app.UseMiddleware<LocalizationMiddleware>();
// Add support for localization
app.UseRequestLocalization();
// Use routing for our API controllers, this should be called once we're done with all the static files mess
#if !NETFRAMEWORK
app.UseRouting();
@@ -233,29 +225,6 @@ internal sealed class Startup {
// Add support for response compression
services.AddResponseCompression();
// Add support for localization
services.AddLocalization();
services.AddRequestLocalization(
static options => {
// We do not set the DefaultRequestCulture here, because it will default to Thread.CurrentThread.CurrentCulture in this case, which is set when loading GlobalConfig
try {
CultureInfo lolcatCulture = CultureInfo.CreateSpecificCulture(SharedInfo.LolcatCultureName);
options.SupportedCultures = options.SupportedUICultures = CultureInfo.GetCultures(CultureTypes.AllCultures).Append(lolcatCulture).ToList();
} catch (Exception e) {
// Fallback for platforms that do not support qps-Ploc culture
ASF.ArchiLogger.LogGenericDebuggingException(e);
options.SupportedCultures = options.SupportedUICultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
}
// The default checks the URI and cookies and only then for headers; ASFs IPC does not use either of the higher priority mechanisms anywhere else and we don't want to start here.
options.RequestCultureProviders = new List<IRequestCultureProvider>(1) { new AcceptLanguageHeaderRequestCultureProvider() };
}
);
string? ipcPassword = ASF.GlobalConfig != null ? ASF.GlobalConfig.IPCPassword : GlobalConfig.DefaultIPCPassword;
if (!string.IsNullOrEmpty(ipcPassword)) {

View File

@@ -20,7 +20,6 @@
// limitations under the License.
#if NETFRAMEWORK
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
#endif
@@ -61,18 +60,6 @@ internal static class WebUtilities {
return mvc;
}
internal static IServiceCollection AddRequestLocalization(this IServiceCollection services, Action<RequestLocalizationOptions> action) {
if (services == null) {
throw new ArgumentNullException(nameof(services));
}
if (action == null) {
throw new ArgumentNullException(nameof(action));
}
return services.Configure(action);
}
#endif
internal static string? GetUnifiedName(this Type type) {

View File

@@ -697,7 +697,7 @@ StackTrace:
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Vaše Steam heslo pro '{0}' se zdá být slabé. Pro větší zabezpečení zvažte změnu hesla na silnější variantu. Detaily: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Váš šifrovací klíč se zdá být slabý. Zvažte výběr silnější varianty pro zvýšení bezpečnosti. Detaily: {0}</value>

View File

@@ -482,7 +482,7 @@ StackTrace:
<value>Verbinde...</value>
</data>
<data name="BotHeartBeatFailed" xml:space="preserve">
<value>Die Verbindung zum Client konnte nicht getrennt werden. Verzichte auf diese Bot-Instanz!</value>
<value>Die Verbindung zum Client konnte nicht getrennt werden. Verzicht auf diese Bot-Instanz!</value>
</data>
<data name="BotSteamDirectoryInitializationFailed" xml:space="preserve">
<value>SteamDirectory konnte nicht initialisiert werden: Die Verbindung mit dem Steam-Netzwerk könnte viel länger dauern als sonst!</value>
@@ -697,7 +697,7 @@ Prozesslaufzeit: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Dein Steam-Passwort für '{0}' scheint schwach zu sein. Für erhöhte Sicherheit solltest du überlegen, ein Stärkeres auszusuchen. Details: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Dein kryptografischer Schlüssel scheint schwach zu sein. Für erhöhte Sicherheit solltest du überlegen, einen Stärkeren auszusuchen. Details: {0}</value>

View File

@@ -194,7 +194,10 @@ StackTrace:
<value>Εισάγετε τον κωδικό από την εφαρμογή επαληθευτή Steam σας: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Παρακαλώ εισάγετε τον κωδικό SteamGuard που στάλθηκε στο e-mail σας: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Εισάγετε το όνομα χρήστη Steam σας: </value>
<comment>Please note that this translation should end with space</comment>
@@ -694,7 +697,7 @@ StackTrace:
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Ο κωδικός πρόσβασης Steam για το '{0}' φαίνεται να είναι αδύναμος. Εξετάστε το ενδεχόμενο να επιλέξετε έναν ισχυρότερο για αυξημένη ασφάλεια. Λεπτομέρειες: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Το κλειδί κρυπτογράφησής σας φαίνεται να είναι αδύναμο. Εξετάστε το ενδεχόμενο να επιλέξετε ένα ισχυρότερο για αυξημένη ασφάλεια. Λεπτομέρειες: {0}</value>

View File

@@ -696,7 +696,7 @@ Tiempo de actividad del proceso: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Parece que tu contraseña de Steam para '{0}' es débil. Considera elegir una más fuerte para mayor seguridad. Detalles: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Parece que tu clave de cifrado es débil. Considera elegir una más fuerte para mayor seguridad. Detalles: {0}</value>

View File

@@ -694,7 +694,7 @@ Durée de fonctionnement : {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Votre mot de passe Steam pour '{0}' semble faible. Pensez à choisir un mot de passe plus fort pour plus de sécurité. Détails: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Votre clé de chiffrement semble faible. Pensez à en choisir une plus forte pour plus sécurité. Détails: {0}</value>

View File

@@ -695,7 +695,7 @@ Tempo di attività: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>La tua password di Steam per '{0}' sembra essere debole. Considera di sceglierne una più forte per una maggiore sicurezza. Dettagli: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>La tua chiave di crittografia sembra essere debole. Considera di sceglierne una più forte per una maggiore sicurezza. Dettagli: {0}</value>

View File

@@ -609,10 +609,22 @@ Proces uptime: {1}</value>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>Uw IPC wachtwoord is zwak. Vanwege beveiliging redenen zal het veiliger zijn om een sterker wachtwoord te kiezen. Details: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Je Steam wachtwoord voor '{0}' lijkt zwak te zijn. Overweeg om een sterker wachtwoord te kiezen voor betere veiligheid. Details: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Uw IPC wachtwoord is zwak. Vanwege beveiliging redenen zal het veiliger zijn om een sterker wachtwoord te kiezen. Details: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Uw encryptiesleutel is te kort. We raden u aan om er één te gebruiken die minstens {0} bytes (tekens) lang is.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>

View File

@@ -697,7 +697,7 @@ Czas procesu: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Twoje hasło Steam dla '{0}' wydaje się słabe. Rozważ wybór silniejszego dla zwiększenia bezpieczeństwa. Szczegóły: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Twój klucz szyfrowania wydaje się słaby. Rozważ wybór silniejszego dla zwiększenia bezpieczeństwa. Szczegóły: {0}</value>

View File

@@ -697,7 +697,7 @@ Tempo de execução: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>A senha da conta Steam "{0}" é muito fraca. Escolha uma senha mais forte para aumentar a segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>A chave de criptografia é muito fraca. Escolha uma senha mais forte para aumentar a segurança. Detalhes: {0}</value>

View File

@@ -75,27 +75,46 @@
{0}</value>
<comment>{0} will be replaced by content string. Please note that this string should include newline for formatting.</comment>
</data>
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
<value>A propriedade configurada {0} é invalida: {1}</value>
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
</data>
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
<value>ASF V{0} encontrou uma exceção fatal antes de o módulo de registo ter sido inicializado!</value>
<comment>{0} will be replaced by version number</comment>
</data>
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
<value>Exceção: {0}() {1}
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>A fechar com um código de erro não zero!</value>
</data>
<data name="ErrorFailingRequest" xml:space="preserve">
<value>Falha na solicitação: {0}</value>
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>A configuração global não pôde ser carregada. Certifica-te de que {0} existe e é valido! Segue o guia "configuração" na wiki caso estejas confuso.</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
<value>{0} é inválido!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Nenhum bot está definido. Esqueceste-te de configurar o teu ASF? Segue o guia "configuração" na wiki se estiveres confuso.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} é nulo!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorParsingObject" xml:space="preserve">
<value>Falha ao analisar {0}!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
<value>O pedido falhou após {0} tentativas!</value>
<comment>{0} will be replaced by maximum number of tries</comment>
@@ -103,9 +122,15 @@ StackTrace:
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
<value>Não foi possível verificar a versão mais recente!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>Não foi possível continuar a atualização, pois não existe nenhum recurso relacionado com a versão em execução! A atualização automática para essa versão não foi possível.</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>Não foi possível prosseguir com uma atualização, pois essa versão não inclui nenhum recurso!</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>Solitação para input do utilizador foi recebida mas o processo está a ser executado em modo 'headless'!</value>
</data>
<data name="Exiting" xml:space="preserve">
<value>A sair...</value>
</data>
@@ -119,7 +144,7 @@ StackTrace:
<value>O arquivo de configuração global foi removido!</value>
</data>
<data name="IgnoringTrade" xml:space="preserve">
<value>A rejeitar a troca: {0}</value>
<value>A ignorar a troca: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="LoggingIn" xml:space="preserve">
@@ -129,8 +154,13 @@ StackTrace:
<data name="NoBotsAreRunning" xml:space="preserve">
<value>Não existe bots em execução, a sair...</value>
</data>
<data name="RefreshingOurSession" xml:space="preserve">
<value>A atualizar a sessão!</value>
</data>
<data name="RejectingTrade" xml:space="preserve">
<value>A rejeitar troca: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="Restarting" xml:space="preserve">
<value>A reiniciar...</value>
</data>
@@ -140,62 +170,149 @@ StackTrace:
<data name="Success" xml:space="preserve">
<value>Sucesso!</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>A verificar por novas versões...</value>
<data name="UnlockingParentalAccount" xml:space="preserve">
<value>Desbloqueando conta parental...</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>A procurar por novas versões...</value>
</data>
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
<value>A transferir a nova versão: {0} ({1} MB)... Enquanto esperas, considera doar se aprecias o trabalho feito! :)</value>
<comment>{0} will be replaced by version string, {1} will be replaced by update size (in megabytes)</comment>
</data>
<data name="UpdateFinished" xml:space="preserve">
<value>Processo de atualização terminado!</value>
</data>
<data name="UpdateNewVersionAvailable" xml:space="preserve">
<value>Uma nova versão do ASF está disponível! Considera atualizá-la manualmente!</value>
</data>
<data name="UpdateVersionInfo" xml:space="preserve">
<value>Versão local: {0} | Versão remota: {1}</value>
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
</data>
<data name="UserInputSteam2FA" xml:space="preserve">
<value>Por favor, insere to teu código de autenticação de dois fatores (2FA) da tua app de autenticador da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Por favor insere o código de autenticação do SteamGuard que foi enviado para o teu e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Por favor insere o teu login da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
<value>Por favor insere o código parental da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
<value>Por favor insere a tua senha da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
<value>Um valor desconhecido para {0} foi recebido, por favor reporta isto: {1}</value>
<comment>{0} will be replaced by object's name, {1} will be replaced by value for that object</comment>
</data>
<data name="IPCReady" xml:space="preserve">
<value>Servidor IPC pronto!</value>
</data>
<data name="IPCStarting" xml:space="preserve">
<value>A inicializar o servidor IPC...</value>
</data>
<data name="BotAlreadyStopped" xml:space="preserve">
<value>Este bot já parou!</value>
</data>
<data name="BotNotFound" xml:space="preserve">
<value>Não foi possível encontrar qualquer bot chamado {0}!</value>
<value>Não foi possível encontrar nenhum bot chamado {0}!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Há {0}/{1} bots em execução, com um total de {2} jogos ({3} cards) restantes para coletar.</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>O bot está a farmar o jogo: {0} ({1}, {2} cartas restantes) de um total de {3} jogos ({4} cartas) restantes para farmar (~{5} restantes).</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>O bot está a farmar jogos: {0} de um total de {1} jogos ({2} cartas) restantes para coletar (~{3} restantes).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>A verificar a primeira página de medalhas...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>A verificar as outras páginas de medalhas...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Algoritmo de 'farming' escolhido: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Feito!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Temos um total de {0} jogos ({1} cartas) restantes para coletar (~{2} restantes)...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>O 'farming' terminou!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>'Farming' terminado: {0} ({1}) após {2} de tempo de jogo!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Acabou de 'farmar' jogos: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Estado do 'farming' para {0} ({1}): {2} cartas restantes</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>O 'farming' parou!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>A ignorar este pedido, pois a pausa permanente está ligada!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>Não temos nada para 'farmar' nesta conta!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Agora a 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Agora a 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Jogar está atualmente indisponível, tentaremos mais tarde!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Ainda a 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Ainda a 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Parou de 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>Parou de 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Comando desconhecido!</value>
</data>
<data name="WarningCouldNotCheckBadges" xml:space="preserve">
<value>Não foi possível de obter a informação das medalhas, tentaremos novamente mais tarde!</value>
</data>
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
<value>Não foi possível verificar o estado das cartas para o jogo: {0} ({1}), tentaremos mais tarde!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
@@ -204,7 +321,9 @@ StackTrace:
<value>A aceitar presente: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>Esta conta está limitada, o processo de 'farming' está indisponível até que a restrição seja removida!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID: {0} | Estado: {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string</comment>
@@ -219,28 +338,43 @@ StackTrace:
<data name="BotAuthenticatorConverting" xml:space="preserve">
<value>A converter ficheiro .maFile em formato ASF...</value>
</data>
<data name="BotAuthenticatorImportFinished" xml:space="preserve">
<value>Autenticação móvel importada com sucesso!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>Token 2FA: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
<value>O 'farm' automático foi pausado!</value>
</data>
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
<value>O 'farm' automático foi continuado!</value>
</data>
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
<value>O 'farm' automático já está pausado!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>O 'farm' automático já foi continuado!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>Conectado ao Steam!</value>
</data>
<data name="BotDisconnected" xml:space="preserve">
<value>Desconectado do Steam!</value>
</data>
<data name="BotDisconnecting" xml:space="preserve">
<value>Desconectando...</value>
</data>
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
<value>Não é possível iniciar este bot porque está desativado no ficheiro de configuração!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>O código de erro TwoFactorCodeMismatch foi recebido {0} vezes de seguida. Ou as tuas credenciais de 2FA perderam a validade ou o teu relógio está dessincronizado, a abortar!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
<value>Desconectado da Steam: {0}</value>
<value>Desconectado do Steam: {0}</value>
<comment>{0} will be replaced by logging off reason (string)</comment>
</data>
<data name="BotLoggedOn" xml:space="preserve">
@@ -251,33 +385,38 @@ StackTrace:
<value>A iniciar sessão...</value>
</data>
<data name="BotLogonSessionReplaced" xml:space="preserve">
<value>Esta conta parece estar sendo usada em outra instância do ASF, o que é um comportamento indefinido, recusando-se a mantê-la em execução!</value>
<value>Esta conta parece estar a ser usada noutra instância do ASF, que é um comportamento não definido, a recusar mantê-lo em execução!</value>
</data>
<data name="BotLootingFailed" xml:space="preserve">
<value>A proposta de troca falhou!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>A troca não pôde ser enviada porque não há nenhum usuário com permissão master definida!</value>
<value>A troca não pôde ser enviada porque não há nenhum usuário com permissão mestra definida!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>Proposta enviada com sucesso!</value>
</data>
<data name="BotSendingTradeToYourself" xml:space="preserve">
<value>Não podes enviar uma troca para ti mesmo!</value>
</data>
<data name="BotNoASFAuthenticator" xml:space="preserve">
<value>Esse bot não tem a autenticação de dois fatores ligada! Esqueceu-se de importar seu autenticador como autenticação de dois fatores?</value>
<value>Este bot não tem a autenticação de dois fatores ligada! Esqueceste-te de importar o teu autenticador como ASF 2FA?</value>
</data>
<data name="BotNotConnected" xml:space="preserve">
<value>A instância deste bot não está conectado!</value>
</data>
<data name="BotNotOwnedYet" xml:space="preserve">
<value>Ainda não possui: {0}</value>
<value>Ainda não possuído: {0}</value>
<comment>{0} will be replaced by query (string)</comment>
</data>
<data name="BotOwnedAlreadyWithName" xml:space="preserve">
<value>Já possui: {0} | {1}</value>
<value>Já possuído: {0} | {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotPointsBalance" xml:space="preserve">
<value>Saldo dos pontos: {0}</value>
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>Taxa de limite excedida, tentaremos novamente daqui a {0}...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
@@ -293,17 +432,23 @@ StackTrace:
<value>Chave: {0} | Estado: {1} | Itens: {2}</value>
<comment>{0} will be replaced by cd-key (string), {1} will be replaced by status string, {2} will be replaced by list of key-value pairs, separated by a comma</comment>
</data>
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
<value>Chave de login expirada removida!</value>
</data>
<data name="BotStatusNotIdling" xml:space="preserve">
<value>O bot não está a 'farmar' nada.</value>
</data>
<data name="BotStatusLimited" xml:space="preserve">
<value>O bot está limitado e não pode coletar quaisquer cartas via 'farming'.</value>
</data>
<data name="BotStatusConnecting" xml:space="preserve">
<value>O bot está a conectar-se à rede da Steam.</value>
</data>
<data name="BotStatusNotRunning" xml:space="preserve">
<value>O bot não está ligado.</value>
<value>O bot não está em execução.</value>
</data>
<data name="BotStatusPaused" xml:space="preserve">
<value>O Bot está parado ou está a ser executado no modo manual.</value>
<value>O bot está pausado ou está a ser executado no modo manual.</value>
</data>
<data name="BotStatusPlayingNotAvailable" xml:space="preserve">
<value>O bot está a ser usado.</value>
@@ -327,8 +472,12 @@ StackTrace:
<data name="BotConnectionLost" xml:space="preserve">
<value>A conexão com a rede da Steam foi perdida. Reconectando...</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>A conta já não está ocupada: o processo de 'farming' foi continuado!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>A conta está a ser usada neste momento: o ASF irá continuar o 'farming' mal esteja livre...</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>A ligar...</value>
</data>
@@ -362,8 +511,14 @@ StackTrace:
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>O seu CurrentCulture fornecido é inválido, o ASF continuará executando com o valor padrão!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>O ASF tentará usar o teu idioma preferido {0}, mas a traudção para essa língua está apenas {1} completa. Talvez queiras ajudar-nos a melhorar a tradução do ASF para a tua língua?</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
<value>'Farming' {0} ({1}) está temporariamente desativado, pois o ASF não é capaz de jogar esse jogo neste momento.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningIdlingGameMismatch" xml:space="preserve">
<value>O ASF detectou uma incompatibilidade de ID para {0} ({1}) e usará o ID do {2} como alternativa.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by game's ID (number)</comment>
@@ -372,22 +527,38 @@ StackTrace:
<value>{0} V{1}</value>
<comment>{0} will be replaced by program's name (e.g. "ASF"), {1} will be replaced by program's version (e.g. "1.0.0.0"). This string typically has nothing to translate and you should leave it as it is, unless you need to change the format, e.g. in RTL languages.</comment>
</data>
<data name="BotAccountLocked" xml:space="preserve">
<value>Esta conta está bloqueada, o processo de 'farming' está permanentemente indisponível!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>O bot está bloqueado e não pode coletar nenhuma carta via 'farming'.</value>
</data>
<data name="ErrorFunctionOnlyInHeadlessMode" xml:space="preserve">
<value>Esta função só está disponível no modo headless!</value>
</data>
<data name="BotOwnedAlready" xml:space="preserve">
<value>Já possuído: {0}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="ErrorAccessDenied" xml:space="preserve">
<value>Acesso negado!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>Estás a usar uma versão que é mais recente que a versão mais recente lançada no teu canal de atualizações. Por favor nota que versões de pré-lançamento são destinadas para utilizadores que sabem como relatar bugs, lidar com problemas e dar feedback - nenhum suporte técnico será dado.</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>Uso de memória atual: {0} MB.
Tempo de execução: {1}</value>
<comment>{0} will be replaced by number (in megabytes) of memory being used, {1} will be replaced by translated TimeSpan string (such as "25 minutes"). Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ClearingDiscoveryQueue" xml:space="preserve">
<value>A limpar a fila de descoberta da Steam #{0}...</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="DoneClearingDiscoveryQueue" xml:space="preserve">
<value>Limpeza da lista de descoberta da Steam #{0} completada.</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="BotOwnsOverviewPerGame" xml:space="preserve">
<value>{0}/{1} bots já possuem o jogo {2}.</value>
<comment>{0} will be replaced by number of bots that already own particular game being checked, {1} will be replaced by total number of bots that were checked during the process, {2} will be replaced by game's ID (number)</comment>
@@ -395,12 +566,18 @@ StackTrace:
<data name="BotRefreshingPackagesData" xml:space="preserve">
<value>Atualizando dados de pacotes...</value>
</data>
<data name="WarningDeprecated" xml:space="preserve">
<value>A utilização de {0} é obsoleto e será removido nas versões futuras do programa. Por favor usa {1}.</value>
<comment>{0} will be replaced by the name of deprecated property (such as argument, config property or likewise), {1} will be replaced by the name of valid replacement (such as another argument or config property)</comment>
</data>
<data name="BotAcceptedDonationTrade" xml:space="preserve">
<value>Doação aceite: {0}</value>
<comment>{0} will be replaced by trade's ID (number)</comment>
</data>
<data name="WarningWorkaroundTriggered" xml:space="preserve">
<value>Uma solução para o erro {0} foi ativada.</value>
<comment>{0} will be replaced by the bug's name provided by ASF</comment>
</data>
<data name="TargetBotNotConnected" xml:space="preserve">
<value>A instância do bot alvo não está conectada!</value>
</data>
@@ -409,14 +586,20 @@ StackTrace:
<comment>{0} will be replaced by wallet balance value, {1} will be replaced by currency name</comment>
</data>
<data name="BotHasNoWallet" xml:space="preserve">
<value>Bot não tem carteira.</value>
<value>O bot não tem carteira.</value>
</data>
<data name="BotLevel" xml:space="preserve">
<value>O bot está a nível {0}.</value>
<comment>{0} will be replaced by bot's level</comment>
</data>
<data name="ActivelyMatchingItems" xml:space="preserve">
<value>Correspondendo itens da Steam, ronda #{0}...</value>
<comment>{0} will be replaced by round number</comment>
</data>
<data name="DoneActivelyMatchingItems" xml:space="preserve">
<value>Itens da Steam correspondidos, ronda #{0}.</value>
<comment>{0} will be replaced by round number</comment>
</data>
<data name="ErrorAborted" xml:space="preserve">
<value>Cancelado!</value>
</data>
@@ -424,7 +607,10 @@ StackTrace:
<value>Corresponde a um total de {0} conjuntos nesta rodada.</value>
<comment>{0} will be replaced by number of sets traded</comment>
</data>
<data name="WarningExcessiveBotsCount" xml:space="preserve">
<value>Estás a executar mais contas de bots pessoais que o nosso limite máximo recomendado ({0}). Está ciente que esta configuração não é suportada e pode causar problemas variados relacionados com o Steam, incluindo suspensão da conta. Confere o FAQ para mais detalhes.</value>
<comment>{0} will be replaced by our maximum recommended bots count (number)</comment>
</data>
<data name="PluginLoaded" xml:space="preserve">
<value>{0} foi carregado com sucesso!</value>
<comment>{0} will be replaced by the name of the custom ASF plugin</comment>
@@ -436,7 +622,9 @@ StackTrace:
<data name="NothingFound" xml:space="preserve">
<value>Nada encontrado!</value>
</data>
<data name="PluginsWarning" xml:space="preserve">
<value>Abriste um ou múltiplos plugins personalizados no ASF. Já que não podemos oferecer apoio para configurações modificadas, por favor contacta os programadores apropriados dos plugins que decidiste usar caso haja problemas.</value>
</data>
<data name="PleaseWait" xml:space="preserve">
<value>Por favor, aguarde...</value>
</data>
@@ -444,37 +632,108 @@ StackTrace:
<value>Inserir comando: </value>
</data>
<data name="Executing" xml:space="preserve">
<value>Executando...</value>
<value>A executar...</value>
</data>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>A consola interativa está agora ativa, digite 'c' para entrar no modo de comando.</value>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>O bot tem {0} jogos restantes na fila de segundo plano.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
</data>
<data name="ErrorSingleInstanceRequired" xml:space="preserve">
<value>O ASF já está em execução nesta diretoria de trabalho, a abortar!</value>
</data>
<data name="BotHandledConfirmations" xml:space="preserve">
<value>{0} confirmações tratadas com sucesso!</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>À espera até {0} para garantir que estamos livres para começarmos a 'farmar'...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>A limpar ficheiros antigos após a atualização...</value>
</data>
<data name="BotGeneratingSteamParentalCode" xml:space="preserve">
<value>A gerar o código parental da Steam, isto pode demorar um bocado, considera colocá-lo no 'config'...</value>
</data>
<data name="IPCConfigChanged" xml:space="preserve">
<value>A configuração IPC foi alterada!</value>
</data>
<data name="BotTradeOfferResult" xml:space="preserve">
<value>A proposta de troca {0} foi determinada a ser {1} devido a {2}.</value>
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>O código de erro InvalidPassword foi recebido {0} vezes seguidas. A tua senha para esta conta está provavelmente errada, a abortar!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
<value>Resultado: {0}</value>
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>Estás a tentar executar a {0} variante do ASF num ambiente não suportado: {1}. Fornece o argumento --ignore-unsupported-environment se tens a certeza do que estás a fazer.</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>Argumento da linha de comando desconhecido: {0}</value>
<comment>{0} will be replaced by unrecognized command that has been provided</comment>
</data>
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
<value>O diretório da configuração não foi encontrado, a abortar!</value>
</data>
<data name="BotIdlingSelectedGames" xml:space="preserve">
<value>A jogar o selecionado {0}: {1}</value>
<comment>{0} will be replaced by internal name of the config property (e.g. "GamesPlayedWhileIdle"), {1} will be replaced by comma-separated list of appIDs that user has chosen</comment>
</data>
<data name="AutomaticFileMigration" xml:space="preserve">
<value>{0} ficheiro de configuração vai ser migrado para a sintaxe mais recente...</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>A tua senha IPC parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>A tua senha do Steam para '{0}' parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>A tua chave de encriptação parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>A tua chave de encriptação é demasiado curta. Recomendamos uma que seja pelo menos {0} bytes (carateres) de comprimento.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Estás a usar a definição {0} da propriedade {1}, mas não forneceste uma --cryptkey personalizada. Deves fornecer uma --cryptkey personalizada para uma melhor segurança.</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>Estás a usar a definição {0} da propriedade {1}, mas não forneceste uma --cryptkey personalizada. Isto futiliza a proteção, pois o ASF é forçado a usar a sua chave (que é conhecida). Deves fornecer uma --cryptkey personalizada para usufruires da segurança oferecida por esta definição.</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>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Estás a tentar executar o ASF como administrador (root). Isto causa um risco de segurança significativo para o teu computador e como o ASF não requer acesso root para o seu funcionamento, recomendamos executá-lo como um utilizador não-administador se for possível.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Estás a executar o ASF num ambiente não suportado, fornecendo o argumento --ignore-unsupported-environment. Toma atenção que não oferecemos qualquer apoio para este cenário e estás a fazê-lo inteiramente por tua conta. Foste avisado.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>A obter checksum do servidor remoto...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>A verificar checksum do binário transferido contra o do servidor remoto...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>O servidor remoto não sabe nada sobre a versão para a qual estamos a atualizar. Esta situção é possível se a versão foi publicada recentemente - a recusar prosseguir com a atualização imediatamente como uma medida de segurança adicional.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>O servidor remoto respondeu com uma 'checksum' diferente, isto pode indicar um download corrompido ou um ataque MITM, recusando prosseguir com a atualização!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>A atualizar os ficheiros do ASF...</value>
</data>
</root>

View File

@@ -697,7 +697,7 @@ PROCES UPTIME: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>UR STEAM PASWORD 4 '{0}' SEEMS 2 BE WEAK. CONSIDR CHOOSIN STRONGR WAN 4 INCREASD SECURITY. DETAILS: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>UR ENCRYPSHUN KEY SEEMS 2 BE WEAK. CONSIDR CHOOSIN STRONGR WAN 4 INCREASD SECURITY. DETAILS: {0}</value>

View File

@@ -697,7 +697,7 @@
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Ваш пароль Steam для '{0}' кажется ненадежным. Подумайте о том, чтобы использовать более надежный пароль для повышения безопасности. Подробности: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Ваш ключ шифрования кажется слабым. Подумайте о том, чтобы использовать более надежный вариант для повышения безопасности. Подробности: {0}</value>

View File

@@ -97,7 +97,7 @@ Yığın izleme:
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>Genel yapılandırma yüklenemedi, lütfen {0} öğesinin var ve geçerli olduğundan emin olun! Eğer kafanız karıştıysa; wikideki kurulum kılavuzuna göz atın.</value>
<value>Genel yapılandırma yüklenemedi, lütfen {0} öğesinin var ve geçerli olduğundan emin olun! Eğer kafanız karıştıysa; wikideki 'setting up / kurulum' rehberine göz atın.</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
@@ -105,14 +105,14 @@ Yığın izleme:
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Tanımlı bot yok. ASF'ni yapılandırmayı mı unuttun? Ne olduğunu anlayamadıysan, viki'de 'setting up' rehberine bak.</value>
<value>Tanımlanmış bot yok. ASF'yi yapılandırmayı unuttunuz mu? Kafası karıştıysa wiki'deki 'setting up / kurulum' rehberine bakın.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} boş!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorParsingObject" xml:space="preserve">
<value>{0} nesnesi işlenirken bir hata oluştu!</value>
<value>{0} ayrıştırılamadı!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
@@ -123,10 +123,10 @@ Yığın izleme:
<value>En son sürüm kontrol edilemedi!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>Şu anda çalışan sürüme ait hiçbir dosya olmadığı için güncelleme işlemine devam edemedi! Bu sürüme otomatik güncelleme yapmak mümkün değil.</value>
<value>Şu anda çalışan sürüme ait hiçbir dosya olmadığı için güncelleme işlemine devam edilemedi! Bu sürüme otomatik güncelleme yapmak mümkün değil.</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>Sürüm herhangi bir öğe içermediğinden güncelleme ile devam edemedi!</value>
<value>Sürüm herhangi bir öğe içermediğinden güncelleme devam edemedi!</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>Kullanıcı girdisi için bir istek alındı; ancak işlem headless modda çalışıyor!</value>
@@ -171,7 +171,7 @@ Yığın izleme:
<value>Başarılı!</value>
</data>
<data name="UnlockingParentalAccount" xml:space="preserve">
<value>Ebeveyn hesabının kilidi açıliyor...</value>
<value>Aile görünümünün kilidi açılıyor...</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>Yeni sürüm kontrol ediliyor...</value>
@@ -203,7 +203,7 @@ Yığın izleme:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
<value>Lütfen Steam aile kodunu girin: </value>
<value>Lütfen Steam aile kilidini girin: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
@@ -281,11 +281,11 @@ Yığın izleme:
<value>Bu hesapta çalıştırılacak hiçbir şey bulamadık!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Şimdi çalıştırılan: {0} ({1})</value>
<value>Şu an çalıştırılan: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Şimdi çalıştırılan: {0}</value>
<value>Şu an çalıştırılan: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
@@ -342,7 +342,7 @@ Yığın izleme:
<value>Mobil kimlik doğrulayıcısının aktarılması başarıyla tamamlandı!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>2FD Kodu: {0}</value>
<value>2AD Kodu: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
@@ -370,7 +370,7 @@ Yığın izleme:
<value>Bu bot örneği, yapılandırma dosyasında devre dışı bırakıldığından başlatılmıyor!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>Üst üste TwoFactorCodeMismatch hata kodu {0} alındı. 2FA kimlik bilgileriniz artık geçerli değil veya saatiniz eşitlenmemiş, iptal ediliyor!</value>
<value>Üst üste {0} kez İki Adımlı Doğrulama Kodunuz (TwoFactorCodeMismatch) hataya uğradı. Ya 2AD kodlarınız artık geçerli değil ya da saatiniz eşitlenmemiş, iptal ediliyor!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
@@ -391,7 +391,7 @@ Yığın izleme:
<value>Takas teklifi başarısız oldu!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>Takas gönderilemedi çünkü master izniyle tanımlanmış hiçbir kullanıcı yok!</value>
<value>Ana Steam hesabınız tanımlanmadığı için takas teklifi gönderilemedi!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>Takas teklifi başarıyla gönderildi!</value>
@@ -697,7 +697,7 @@ Süreç çalışma zamanı: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>'{0}' için Steam parolanız zayıf görünüyor. Daha fazla güvenlik için daha güçlü bir tane seçmeyi düşünün. Ayrıntılar: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Şifreleme anahtarınız zayıf görünüyor. Daha fazla güvenlik için daha güçlü bir tane seçmeyi düşünün. Ayrıntılar: {0}</value>

View File

@@ -697,7 +697,7 @@ Thời gian hoạt động: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Mật khẩu Steam cho '{0}' của bạn có vẻ yếu. Hãy cân nhắc việc chọn mật khẩu mạnh hơn để tăng tính bảo mật. Chi tiết: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Khóa mã hóa của bạn có vẻ yếu. Hãy cân nhắc việc chọn một cái mạnh hơn để tăng tính bảo mật. Chi tiết: {0}</value>

View File

@@ -697,7 +697,7 @@
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>您 '{0}' 的 Steam 密码似乎很弱。请考虑选择更强的密码来增强安全性,详情 {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>您的加密密钥似乎很弱。请考虑选择更强的密钥来增强安全性,详情 {0}</value>

View File

@@ -96,7 +96,7 @@
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>無法載入全域設定檔,請確保 {0} 存在且有效!如果您覺得困惑,請參閱 Wiki 中的「安裝指南」。</value>
<value>無法載入全域設定檔,請確保 {0} 存在且有效!如果仍有問題,請參閱 Wiki 中的「安裝指南」。</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
@@ -104,7 +104,7 @@
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>沒有設定任何 Bot。是否忘記設定 ASF 了?如果不明白發生了什麼,請閱讀 Wiki 上的「設定指南」。</value>
<value>沒有設定任何 Bot。是否忘記設定 ASF 了?如果不明白發生了什麼,請閱讀 Wiki 上的「設定指南」。</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} 為空值!</value>
@@ -122,16 +122,16 @@
<value>無法檢查最新版本!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>無法進行更新,因為沒有與目前執行中的版本相關的資!無法自動更新到該版本。</value>
<value>無法進行更新,因為沒有與目前執行中的版本相關的資源檔案!無法自動更新到該版本。</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>無法進行更新,因為此版本沒有提供任何資</value>
<value>無法進行更新,因為此版本沒有提供任何資源檔案</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>收到一個使用者輸入請求,但進程目前正以無介面模式執行!</value>
</data>
<data name="Exiting" xml:space="preserve">
<value>正在退出...</value>
<value>正在退出</value>
</data>
<data name="WarningFailed" xml:space="preserve">
<value>失敗!</value>
@@ -190,15 +190,15 @@
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
</data>
<data name="UserInputSteam2FA" xml:space="preserve">
<value>請輸入的 Steam Guard 行動驗證器上的雙重驗證代碼: </value>
<value>請輸入的 Steam Guard 行動驗證器上的雙重驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>請輸入寄送至的電子信箱的 Steam Guard 驗證代碼: </value>
<value>請輸入寄送至的電子信箱的 Steam Guard 驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>請輸入的 Steam 帳號: </value>
<value>請輸入的 Steam 帳號: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
@@ -206,7 +206,7 @@
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
<value>請輸入的 Steam 密碼:</value>
<value>請輸入的 Steam 密碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
@@ -369,7 +369,7 @@
<value>這個 Bot 將不會啟動,因為它在設定檔中被停用!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>已連續收到 {0} 次 TwoFactorCodeMismatch 錯誤訊息。的雙重驗證憑證可能已失效,或者時間不同步,正在中止!</value>
<value>已連續收到 {0} 次 TwoFactorCodeMismatch 錯誤訊息。的雙重驗證憑證可能已失效,或者時間不同步,正在中止!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
@@ -396,7 +396,7 @@
<value>交易提案發送成功!</value>
</data>
<data name="BotSendingTradeToYourself" xml:space="preserve">
<value>無法對自己發出交易請求!</value>
<value>無法對自己發出交易請求!</value>
</data>
<data name="BotNoASFAuthenticator" xml:space="preserve">
<value>這個 Bot 並未啟用 ASF 雙重驗證!您是否忘記將雙重驗證導入至 ASF</value>
@@ -469,7 +469,7 @@
<comment>{0} will be replaced by failure reason (string)</comment>
</data>
<data name="BotConnectionLost" xml:space="preserve">
<value>與 Steam 網路的連線中斷,正在重新連線…</value>
<value>與 Steam 網路的連線中斷,正在重新連線…</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>帳號不再被佔用,已恢復掛卡!</value>
@@ -490,11 +490,11 @@
<value>正在停止…</value>
</data>
<data name="ErrorBotConfigInvalid" xml:space="preserve">
<value>的 Bot 設定無效,請確認 {0} 的內容然後再試一次!</value>
<value>的 Bot 設定無效,請確認 {0} 的內容然後再試一次!</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorDatabaseInvalid" xml:space="preserve">
<value>無法載入長存資料庫,如果問題仍然存在,請刪除 {0} 以重建資料庫!</value>
<value>無法載入持久性資料庫,如果問題仍然存在,請刪除 {0} 以重建資料庫!</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="Initializing" xml:space="preserve">
@@ -502,16 +502,16 @@
<comment>{0} will be replaced by service name that is being initialized</comment>
</data>
<data name="WarningPrivacyPolicy" xml:space="preserve">
<value>如果對 ASF 的實際運作方式有疑慮,請查看 Wiki 中的隱私政策章節!</value>
<value>如果對 ASF 的實際運作方式有疑慮,請查看 Wiki 中的隱私政策章節!</value>
</data>
<data name="Welcome" xml:space="preserve">
<value>看來這是您首次使用本程式,歡迎!</value>
</data>
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>提供的 CurrentCulture 無效ASF 將以預設值繼續執行!</value>
<value>提供的 CurrentCulture 無效ASF 將以預設值繼續執行!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>ASF 將使用的偏好語系 {0},但該語言的翻譯只完成了 {1}。或許能協助我們完善 ASF 的翻譯。</value>
<value>ASF 將使用的偏好語系 {0},但該語言的翻譯只完成了 {1}。或許能協助我們完善 ASF 的翻譯。</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
@@ -543,7 +543,7 @@
<value>存取被拒!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>目前使用的版本高於最新的正式版本。請注意:預覽版本是專門給了解如何回報錯誤、處理問題並提供回饋的使用者使用 (將不會提供任何技術支援)。</value>
<value>目前使用的版本高於最新的正式版本。請注意:預覽版本是專門給了解如何回報錯誤、處理問題並提供回饋的使用者使用 (將不會提供任何技術支援)。</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>目前記憶體使用量:{0} MB。
@@ -607,7 +607,7 @@
<comment>{0} will be replaced by number of sets traded</comment>
</data>
<data name="WarningExcessiveBotsCount" xml:space="preserve">
<value>執行的個人 Bot 帳號數量超過我們的建議上限 ({0})。請留意,此設定不受支援,且可能會導致各種 Steam 相關問題,包括帳號停權。請參閱常見問答了解詳情。</value>
<value>執行的個人 Bot 帳號數量超過我們的建議上限 ({0})。請留意,此設定不受支援,且可能會導致各種 Steam 相關問題,包括帳號停權。請參閱常見問答了解詳情。</value>
<comment>{0} will be replaced by our maximum recommended bots count (number)</comment>
</data>
<data name="PluginLoaded" xml:space="preserve">
@@ -628,7 +628,7 @@
<value>請稍候…</value>
</data>
<data name="EnterCommand" xml:space="preserve">
<value>輸入指令:</value>
<value>輸入指令: </value>
</data>
<data name="Executing" xml:space="preserve">
<value>正在執行…</value>
@@ -673,7 +673,7 @@
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>正嘗試執行 {0} 不同的 ASF 於不支援的環境中:{1}。如果真的知道在做什麼的話,請加上 --ignore-unsupported-environment 參數。</value>
<value>正嘗試執行 {0} 不同的 ASF 於不支援的環境中:{1}。如果真的知道在做什麼的話,請加上 --ignore-unsupported-environment 參數。</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>未知的命令列參數:{0}</value>
@@ -691,31 +691,31 @@
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>的 IPC 密碼看起來很弱。請考慮換一個強度更高的密碼來增加安全性。詳細資訊: {0}</value>
<value>的 IPC 密碼看起來很弱。請考慮換一個強度更高的密碼來增加安全性。詳細資訊: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>你的 Steam 密碼「{0}」看起來很弱。請考慮換一個強度更高的密碼來增加安全性。詳細資訊: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>的加密金鑰看起來很弱。請考慮換一個強度更高的金鑰來增加安全性。詳細資訊: {0}</value>
<value>的加密金鑰看起來很弱。請考慮換一個強度更高的金鑰來增加安全性。詳細資訊: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>的加密金鑰太短。我們推薦使用 {0} 位元組 (字元) 以上長度的金鑰。</value>
<value>的加密金鑰太短。我們推薦使用 {0} 位元組 (字元) 以上長度的金鑰。</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>正在使用 {0} 設定 {1} 屬性。但沒有提供一個自定義的 --cryptkey。應該提供自定義 --cryptkey 以提高安全性。</value>
<value>正在使用 {0} 設定 {1} 屬性。但沒有提供一個自定義的 --cryptkey。應該提供自定義 --cryptkey 以提高安全性。</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>正在使用 {0} 設定 {1} 屬性。但沒有提供一個自定義的 --cryptkey。這完全破壞了保護因為 ASF 被迫使用自己的 (已知) 金鑰。應該提供自定義 --cryptkey 用於使用此設定提供的安全優勢。</value>
<value>正在使用 {0} 設定 {1} 屬性。但沒有提供一個自定義的 --cryptkey。這完全破壞了保護因為 ASF 被迫使用自己的 (已知) 金鑰。應該提供自定義 --cryptkey 用於使用此設定提供的安全優勢。</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>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>正在以管理員權限 (Root) 執行 ASF。這會給的機器帶來重大的安全風險,且由於 ASF 的操作不需要 Root 權限,我們建議盡可能以非管理員使用者身份執行它。</value>
<value>正在以管理員權限 (Root) 執行 ASF。這會給的機器帶來重大的安全風險,且由於 ASF 的操作不需要 Root 權限,我們建議盡可能以非管理員使用者身份執行它。</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>您在不受支援的環境中執行 ASF並提供 --ignore-unsupported-environment 引數。請注意,我們不對這種情況提供任何形式的支援,您完全需要自行承擔風險。你已經被警告過了。</value>
@@ -727,7 +727,7 @@
<value>正在驗證已下載的二進制檔案與來自遠端伺服器的核對和…</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>遠端伺服器對我們要更新到的版本一無所知。如果該版本是最近發布的,則可能出現這種情況——立刻拒絕進行更新程序作為額外的安全措施。</value>
<value>遠端伺服器對我們要更新到的版本一無所知。如果該版本是最近發布的,則可能出現這種情況──立刻拒絕進行更新程序作為額外的安全措施。</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>遠端伺服器回覆了不同的核對和,這可能意味著下載檔案損毀或遭受中間人攻擊,拒絕繼續更新程序!</value>

View File

@@ -180,7 +180,7 @@ public sealed class Bot : IAsyncDisposable {
/// </remarks>
private bool ShouldUseLoginKeys => BotConfig.UseLoginKeys && (!BotConfig.IsSteamPasswordSet || !HasMobileAuthenticator);
[JsonProperty(PropertyName = $"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamID)}")]
[JsonProperty($"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamID)}")]
private string SSteamID => SteamID.ToString(CultureInfo.InvariantCulture);
[JsonProperty]
@@ -2384,18 +2384,10 @@ public sealed class Bot : IAsyncDisposable {
// Do not attempt to reconnect, those failures are permanent
return;
case EResult.InvalidPassword when !string.IsNullOrEmpty(BotDatabase.LoginKey):
// We can retry immediately
BotDatabase.LoginKey = null;
ArchiLogger.LogGenericInfo(Strings.BotRemovedExpiredLoginKey);
break;
case EResult.InvalidPassword:
case EResult.NoConnection:
case EResult.ServiceUnavailable:
case EResult.Timeout:
case EResult.TryAnotherCM:
case EResult.TwoFactorCodeMismatch:
await Task.Delay(5000).ConfigureAwait(false);
break;
case EResult.RateLimitExceeded:
ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRateLimitExceeded, TimeSpan.FromMinutes(LoginCooldownInMinutes).ToHumanReadable()));
@@ -2410,6 +2402,11 @@ public sealed class Bot : IAsyncDisposable {
ASF.LoginRateLimitingSemaphore.Release();
}
break;
default:
// Generic delay before retrying
await Task.Delay(5000).ConfigureAwait(false);
break;
}

View File

@@ -58,11 +58,11 @@ public sealed class CardsFarmer : IAsyncDisposable {
// Games that were confirmed to show false status on general badges page
private static readonly ImmutableHashSet<uint> UntrustedAppIDs = ImmutableHashSet.Create<uint>(440, 570, 730);
[JsonProperty(PropertyName = nameof(CurrentGamesFarming))]
[JsonProperty(nameof(CurrentGamesFarming))]
[PublicAPI]
public IReadOnlyCollection<Game> CurrentGamesFarmingReadOnly => CurrentGamesFarming;
[JsonProperty(PropertyName = nameof(GamesToFarm))]
[JsonProperty(nameof(GamesToFarm))]
[PublicAPI]
public IReadOnlyCollection<Game> GamesToFarmReadOnly => GamesToFarm;
@@ -144,7 +144,7 @@ public sealed class CardsFarmer : IAsyncDisposable {
private bool KeepFarming;
private bool ParsingScheduled;
private bool PermanentlyPaused;
private bool ShouldResumeFarming = true;
private bool ShouldResumeFarming;
internal CardsFarmer(Bot bot) {
Bot = bot ?? throw new ArgumentNullException(nameof(bot));
@@ -291,7 +291,7 @@ public sealed class CardsFarmer : IAsyncDisposable {
internal void SetInitialState(bool paused) {
PermanentlyPaused = Paused = paused;
ShouldResumeFarming = true;
ShouldResumeFarming = false;
}
internal async Task StartFarming() {

View File

@@ -26,7 +26,7 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class AccessTokenResponse : ResultResponse {
[JsonProperty(PropertyName = "data", Required = Required.Always)]
[JsonProperty("data", Required = Required.Always)]
internal readonly AccessTokenData Data = new();
[JsonConstructor]
@@ -34,7 +34,7 @@ internal sealed class AccessTokenResponse : ResultResponse {
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class AccessTokenData {
[JsonProperty(PropertyName = "webapi_token", Required = Required.Always)]
[JsonProperty("webapi_token", Required = Required.Always)]
internal readonly string WebAPIToken = "";
[JsonConstructor]

View File

@@ -46,7 +46,7 @@ public sealed class Asset {
[PublicAPI]
public uint Amount { get; internal set; }
[JsonProperty(PropertyName = "appid", Required = Required.DisallowNull)]
[JsonProperty("appid", Required = Required.DisallowNull)]
public uint AppID { get; private set; }
[JsonIgnore]
@@ -92,7 +92,7 @@ public sealed class Asset {
[JsonExtensionData(WriteData = false)]
internal Dictionary<string, JToken>? AdditionalProperties { private get; set; }
[JsonProperty(PropertyName = "amount", Required = Required.Always)]
[JsonProperty("amount", Required = Required.Always)]
private string AmountText {
get => Amount.ToString(CultureInfo.InvariantCulture);
@@ -113,7 +113,7 @@ public sealed class Asset {
}
}
[JsonProperty(PropertyName = "assetid", Required = Required.DisallowNull)]
[JsonProperty("assetid", Required = Required.DisallowNull)]
private string AssetIDText {
get => AssetID.ToString(CultureInfo.InvariantCulture);
@@ -134,7 +134,7 @@ public sealed class Asset {
}
}
[JsonProperty(PropertyName = "classid", Required = Required.DisallowNull)]
[JsonProperty("classid", Required = Required.DisallowNull)]
private string ClassIDText {
set {
if (string.IsNullOrEmpty(value)) {
@@ -151,7 +151,7 @@ public sealed class Asset {
}
}
[JsonProperty(PropertyName = "contextid", Required = Required.DisallowNull)]
[JsonProperty("contextid", Required = Required.DisallowNull)]
private string ContextIDText {
get => ContextID.ToString(CultureInfo.InvariantCulture);
@@ -172,12 +172,12 @@ public sealed class Asset {
}
}
[JsonProperty(PropertyName = "id", Required = Required.DisallowNull)]
[JsonProperty("id", Required = Required.DisallowNull)]
private string IDText {
set => AssetIDText = value;
}
[JsonProperty(PropertyName = "instanceid", Required = Required.DisallowNull)]
[JsonProperty("instanceid", Required = Required.DisallowNull)]
private string InstanceIDText {
set {
if (string.IsNullOrEmpty(value)) {
@@ -256,6 +256,7 @@ public sealed class Asset {
ChatEffect,
MiniProfileBackground,
AvatarProfileFrame,
AnimatedAvatar
AnimatedAvatar,
KeyboardSkin
}
}

View File

@@ -30,7 +30,7 @@ namespace ArchiSteamFarm.Steam.Data;
public class BooleanResponse {
// You say it works in a RESTFUL way
// Then your errors come back as 200 OK
[JsonProperty(PropertyName = "success", Required = Required.Always)]
[JsonProperty("success", Required = Required.Always)]
public bool Success { get; private set; }
[JsonConstructor]

View File

@@ -33,23 +33,23 @@ using Newtonsoft.Json.Linq;
namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class InventoryResponse : ResultResponse {
[JsonProperty(PropertyName = "assets", Required = Required.DisallowNull)]
internal sealed class InventoryResponse : OptionalResultResponse {
[JsonProperty("assets", Required = Required.DisallowNull)]
internal readonly ImmutableHashSet<Asset> Assets = ImmutableHashSet<Asset>.Empty;
[JsonProperty(PropertyName = "descriptions", Required = Required.DisallowNull)]
[JsonProperty("descriptions", Required = Required.DisallowNull)]
internal readonly ImmutableHashSet<Description> Descriptions = ImmutableHashSet<Description>.Empty;
[JsonProperty(PropertyName = "error", Required = Required.DisallowNull)]
[JsonProperty("error", Required = Required.DisallowNull)]
internal readonly string Error = "";
[JsonProperty(PropertyName = "total_inventory_count", Required = Required.DisallowNull)]
[JsonProperty("total_inventory_count", Required = Required.DisallowNull)]
internal readonly uint TotalInventoryCount;
internal ulong LastAssetID { get; private set; }
internal bool MoreItems { get; private set; }
[JsonProperty(PropertyName = "last_assetid", Required = Required.DisallowNull)]
[JsonProperty("last_assetid", Required = Required.DisallowNull)]
private string LastAssetIDText {
set {
if (string.IsNullOrEmpty(value)) {
@@ -68,7 +68,7 @@ internal sealed class InventoryResponse : ResultResponse {
}
}
[JsonProperty(PropertyName = "more_items", Required = Required.DisallowNull)]
[JsonProperty("more_items", Required = Required.DisallowNull)]
private byte MoreItemsNumber {
set => MoreItems = value > 0;
}
@@ -180,6 +180,8 @@ internal sealed class InventoryResponse : ResultResponse {
return Asset.EType.AvatarProfileFrame;
case "item_class_15":
return Asset.EType.AnimatedAvatar;
case "item_class_16":
return Asset.EType.KeyboardSkin;
default:
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(tag.Value), tag.Value));
@@ -199,19 +201,19 @@ internal sealed class InventoryResponse : ResultResponse {
set;
}
[JsonProperty(PropertyName = "appid", Required = Required.Always)]
[JsonProperty("appid", Required = Required.Always)]
internal uint AppID { get; set; }
internal ulong ClassID { get; set; }
internal ulong InstanceID { get; set; }
internal bool Marketable { get; set; }
[JsonProperty(PropertyName = "tags", Required = Required.DisallowNull)]
[JsonProperty("tags", Required = Required.DisallowNull)]
internal ImmutableHashSet<Tag> Tags { get; set; } = ImmutableHashSet<Tag>.Empty;
internal bool Tradable { get; set; }
[JsonProperty(PropertyName = "classid", Required = Required.Always)]
[JsonProperty("classid", Required = Required.Always)]
private string ClassIDText {
set {
if (string.IsNullOrEmpty(value)) {
@@ -230,7 +232,7 @@ internal sealed class InventoryResponse : ResultResponse {
}
}
[JsonProperty(PropertyName = "instanceid", Required = Required.DisallowNull)]
[JsonProperty("instanceid", Required = Required.DisallowNull)]
private string InstanceIDText {
set {
if (string.IsNullOrEmpty(value)) {
@@ -247,12 +249,12 @@ internal sealed class InventoryResponse : ResultResponse {
}
}
[JsonProperty(PropertyName = "marketable", Required = Required.Always)]
[JsonProperty("marketable", Required = Required.Always)]
private byte MarketableNumber {
set => Marketable = value > 0;
}
[JsonProperty(PropertyName = "tradable", Required = Required.Always)]
[JsonProperty("tradable", Required = Required.Always)]
private byte TradableNumber {
set => Tradable = value > 0;
}

View File

@@ -27,7 +27,7 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class NewDiscoveryQueueResponse {
[JsonProperty(PropertyName = "queue", Required = Required.Always)]
[JsonProperty("queue", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> Queue = ImmutableHashSet<uint>.Empty;
[JsonConstructor]

View File

@@ -0,0 +1,35 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2022 Ł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 JetBrains.Annotations;
using Newtonsoft.Json;
using SteamKit2;
namespace ArchiSteamFarm.Steam.Data;
[PublicAPI]
public class OptionalResultResponse {
[JsonProperty("success", Required = Required.DisallowNull)]
public EResult? Result { get; private set; }
[JsonConstructor]
protected OptionalResultResponse() { }
}

View File

@@ -27,7 +27,7 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class RedeemWalletResponse : ResultResponse {
[JsonProperty(PropertyName = "detail", Required = Required.DisallowNull)]
[JsonProperty("detail", Required = Required.DisallowNull)]
internal readonly EPurchaseResultDetail PurchaseResultDetail;
[JsonConstructor]

View File

@@ -19,7 +19,6 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System.Diagnostics.CodeAnalysis;
using JetBrains.Annotations;
using Newtonsoft.Json;
using SteamKit2;
@@ -27,9 +26,8 @@ using SteamKit2;
namespace ArchiSteamFarm.Steam.Data;
[PublicAPI]
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
public class ResultResponse {
[JsonProperty(PropertyName = "success", Required = Required.Always)]
[JsonProperty("success", Required = Required.Always)]
public EResult Result { get; private set; }
[JsonConstructor]

View File

@@ -26,11 +26,11 @@ using Newtonsoft.Json;
namespace ArchiSteamFarm.Steam.Data;
public sealed class Tag {
[JsonProperty(PropertyName = "category", Required = Required.Always)]
[JsonProperty("category", Required = Required.Always)]
[PublicAPI]
public string Identifier { get; private set; } = "";
[JsonProperty(PropertyName = "internal_name", Required = Required.Always)]
[JsonProperty("internal_name", Required = Required.Always)]
[PublicAPI]
public string Value { get; private set; } = "";

View File

@@ -26,10 +26,10 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class TradeOfferAcceptResponse {
[JsonProperty(PropertyName = "strError", Required = Required.DisallowNull)]
[JsonProperty("strError", Required = Required.DisallowNull)]
internal readonly string ErrorText = "";
[JsonProperty(PropertyName = "needs_mobile_confirmation", Required = Required.DisallowNull)]
[JsonProperty("needs_mobile_confirmation", Required = Required.DisallowNull)]
internal readonly bool RequiresMobileConfirmation;
[JsonConstructor]

View File

@@ -25,14 +25,14 @@ using Newtonsoft.Json;
namespace ArchiSteamFarm.Steam.Data;
internal sealed class TradeOfferSendRequest {
[JsonProperty(PropertyName = "me", Required = Required.Always)]
[JsonProperty("me", Required = Required.Always)]
internal readonly ItemList ItemsToGive = new();
[JsonProperty(PropertyName = "them", Required = Required.Always)]
[JsonProperty("them", Required = Required.Always)]
internal readonly ItemList ItemsToReceive = new();
internal sealed class ItemList {
[JsonProperty(PropertyName = "assets", Required = Required.Always)]
[JsonProperty("assets", Required = Required.Always)]
internal readonly HashSet<Asset> Assets = new();
}
}

View File

@@ -27,15 +27,15 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class TradeOfferSendResponse {
[JsonProperty(PropertyName = "strError", Required = Required.DisallowNull)]
[JsonProperty("strError", Required = Required.DisallowNull)]
internal readonly string ErrorText = "";
[JsonProperty(PropertyName = "needs_mobile_confirmation", Required = Required.DisallowNull)]
[JsonProperty("needs_mobile_confirmation", Required = Required.DisallowNull)]
internal readonly bool RequiresMobileConfirmation;
internal ulong TradeOfferID { get; private set; }
[JsonProperty(PropertyName = "tradeofferid", Required = Required.DisallowNull)]
[JsonProperty("tradeofferid", Required = Required.DisallowNull)]
private string TradeOfferIDText {
set {
if (string.IsNullOrEmpty(value)) {

View File

@@ -29,10 +29,10 @@ namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class UserPrivacy {
[JsonProperty(PropertyName = "eCommentPermission", Required = Required.Always)]
[JsonProperty("eCommentPermission", Required = Required.Always)]
internal readonly ECommentPermission CommentPermission;
[JsonProperty(PropertyName = "PrivacySettings", Required = Required.Always)]
[JsonProperty("PrivacySettings", Required = Required.Always)]
internal readonly PrivacySettings Settings = new();
// Constructed from privacy change request
@@ -45,22 +45,22 @@ internal sealed class UserPrivacy {
private UserPrivacy() { }
internal sealed class PrivacySettings {
[JsonProperty(PropertyName = "PrivacyFriendsList", Required = Required.Always)]
[JsonProperty("PrivacyFriendsList", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting FriendsList;
[JsonProperty(PropertyName = "PrivacyInventory", Required = Required.Always)]
[JsonProperty("PrivacyInventory", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting Inventory;
[JsonProperty(PropertyName = "PrivacyInventoryGifts", Required = Required.Always)]
[JsonProperty("PrivacyInventoryGifts", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting InventoryGifts;
[JsonProperty(PropertyName = "PrivacyOwnedGames", Required = Required.Always)]
[JsonProperty("PrivacyOwnedGames", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting OwnedGames;
[JsonProperty(PropertyName = "PrivacyPlaytime", Required = Required.Always)]
[JsonProperty("PrivacyPlaytime", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting Playtime;
[JsonProperty(PropertyName = "PrivacyProfile", Required = Required.Always)]
[JsonProperty("PrivacyProfile", Required = Required.Always)]
internal readonly ArchiHandler.EPrivacySetting Profile;
// Constructed from privacy change request

View File

@@ -208,8 +208,8 @@ public sealed class ArchiWebHandler : IDisposable {
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(response)));
}
if (response.Content.Result != EResult.OK) {
throw new HttpRequestException(!string.IsNullOrEmpty(response.Content.Error) ? string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Content.Error) : Strings.WarningFailed);
if (response.Content.Result is not EResult.OK) {
throw new HttpRequestException(!string.IsNullOrEmpty(response.Content.Error) ? string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Content.Error) : response.Content.Result.HasValue ? string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Content.Result) : Strings.WarningFailed);
}
if (response.Content.TotalInventoryCount == 0) {
@@ -240,7 +240,7 @@ public sealed class ArchiWebHandler : IDisposable {
}
foreach (Asset asset in response.Content.Assets) {
if (!descriptions.TryGetValue((asset.ClassID, asset.InstanceID), out InventoryResponse.Description? description) || assetIDs.Contains(asset.AssetID)) {
if (!descriptions.TryGetValue((asset.ClassID, asset.InstanceID), out InventoryResponse.Description? description) || !assetIDs.Add(asset.AssetID)) {
continue;
}
@@ -255,8 +255,6 @@ public sealed class ArchiWebHandler : IDisposable {
asset.AdditionalProperties = description.AdditionalProperties;
}
assetIDs.Add(asset.AssetID);
yield return asset;
}
@@ -416,7 +414,7 @@ public sealed class ArchiWebHandler : IDisposable {
{ "tradeoffermessage", $"Sent by {SharedInfo.PublicIdentifier}/{SharedInfo.Version}" }
};
HashSet<ulong> mobileTradeOfferIDs = new();
HashSet<ulong> mobileTradeOfferIDs = new(trades.Count);
foreach (TradeOfferSendRequest trade in trades) {
data["json_tradeoffer"] = JsonConvert.SerializeObject(trade);

View File

@@ -56,10 +56,10 @@ public sealed class MobileAuthenticator : IDisposable {
private readonly ArchiCacheable<string> CachedDeviceID;
[JsonProperty(PropertyName = "identity_secret", Required = Required.Always)]
[JsonProperty("identity_secret", Required = Required.Always)]
private readonly string IdentitySecret = "";
[JsonProperty(PropertyName = "shared_secret", Required = Required.Always)]
[JsonProperty("shared_secret", Required = Required.Always)]
private readonly string SharedSecret = "";
private Bot? Bot;

View File

@@ -295,7 +295,7 @@ public sealed class BotConfig {
private string? BackingSteamParentalCode = DefaultSteamParentalCode;
private string? BackingSteamPassword = DefaultSteamPassword;
[JsonProperty(PropertyName = $"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamMasterClanID)}", Required = Required.DisallowNull)]
[JsonProperty($"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamMasterClanID)}", Required = Required.DisallowNull)]
private string SSteamMasterClanID {
get => SteamMasterClanID.ToString(CultureInfo.InvariantCulture);

View File

@@ -88,10 +88,10 @@ internal sealed class BotDatabase : SerializableFile {
}
}
[JsonProperty(PropertyName = $"_{nameof(LoginKey)}")]
[JsonProperty($"_{nameof(LoginKey)}")]
private string? BackingLoginKey;
[JsonProperty(PropertyName = $"_{nameof(MobileAuthenticator)}")]
[JsonProperty($"_{nameof(MobileAuthenticator)}")]
private MobileAuthenticator? BackingMobileAuthenticator;
private BotDatabase(string filePath) {

View File

@@ -279,7 +279,7 @@ public sealed class GlobalConfig {
[Range(ushort.MinValue, ushort.MaxValue)]
public ushort WebLimiterDelay { get; private set; } = DefaultWebLimiterDelay;
[JsonProperty(PropertyName = nameof(WebProxy))]
[JsonProperty(nameof(WebProxy))]
public string? WebProxyText { get; private set; } = DefaultWebProxyText;
[JsonProperty]
@@ -315,7 +315,7 @@ public sealed class GlobalConfig {
private WebProxy? BackingWebProxy;
private string? BackingWebProxyPassword = DefaultWebProxyPassword;
[JsonProperty(PropertyName = $"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamOwnerID)}", Required = Required.DisallowNull)]
[JsonProperty($"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(SteamOwnerID)}", Required = Required.DisallowNull)]
private string SSteamOwnerID {
get => SteamOwnerID.ToString(CultureInfo.InvariantCulture);

View File

@@ -96,10 +96,10 @@ public sealed class GlobalDatabase : SerializableFile {
}
}
[JsonProperty(PropertyName = $"_{nameof(CellID)}", Required = Required.DisallowNull)]
[JsonProperty($"_{nameof(CellID)}", Required = Required.DisallowNull)]
private uint BackingCellID;
[JsonProperty(PropertyName = $"_{nameof(LastChangeNumber)}", Required = Required.DisallowNull)]
[JsonProperty($"_{nameof(LastChangeNumber)}", Required = Required.DisallowNull)]
private uint BackingLastChangeNumber;
private GlobalDatabase(string filePath) : this() {

View File

@@ -204,16 +204,16 @@ internal static class GitHub {
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ReleaseResponse {
[JsonProperty(PropertyName = "assets", Required = Required.Always)]
[JsonProperty("assets", Required = Required.Always)]
internal readonly ImmutableHashSet<Asset> Assets = ImmutableHashSet<Asset>.Empty;
[JsonProperty(PropertyName = "prerelease", Required = Required.Always)]
[JsonProperty("prerelease", Required = Required.Always)]
internal readonly bool IsPreRelease;
[JsonProperty(PropertyName = "published_at", Required = Required.Always)]
[JsonProperty("published_at", Required = Required.Always)]
internal readonly DateTime PublishedAt;
[JsonProperty(PropertyName = "tag_name", Required = Required.Always)]
[JsonProperty("tag_name", Required = Required.Always)]
internal readonly string Tag = "";
internal string? ChangelogHTML {
@@ -266,7 +266,7 @@ internal static class GitHub {
}
}
[JsonProperty(PropertyName = "body", Required = Required.Always)]
[JsonProperty("body", Required = Required.Always)]
private readonly string? MarkdownBody = "";
private MarkdownDocument? Changelog {
@@ -293,13 +293,13 @@ internal static class GitHub {
private ReleaseResponse() { }
internal sealed class Asset {
[JsonProperty(PropertyName = "browser_download_url", Required = Required.Always)]
[JsonProperty("browser_download_url", Required = Required.Always)]
internal readonly Uri? DownloadURL;
[JsonProperty(PropertyName = "name", Required = Required.Always)]
[JsonProperty("name", Required = Required.Always)]
internal readonly string? Name;
[JsonProperty(PropertyName = "size", Required = Required.Always)]
[JsonProperty("size", Required = Required.Always)]
internal readonly uint Size;
[JsonConstructor]

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>5.2.3.6</Version>
<Version>5.2.4.2</Version>
</PropertyGroup>
<PropertyGroup>

View File

@@ -5,7 +5,7 @@
<PackageVersion Include="CryptSharpStandard" Version="1.0.0" />
<PackageVersion Include="Humanizer" Version="2.14.1" />
<PackageVersion Include="JetBrains.Annotations" Version="2021.3.0" />
<PackageVersion Include="Markdig.Signed" Version="0.27.0" />
<PackageVersion Include="Markdig.Signed" Version="0.28.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageVersion Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageVersion Include="MSTest.TestFramework" Version="2.2.8" />
@@ -13,9 +13,9 @@
<PackageVersion Include="Nito.AsyncEx.Coordination" Version="5.1.2" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageVersion Include="SteamKit2" Version="2.4.1" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.2.3" />
<PackageVersion Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.2.3" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.3.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.3.0" />
<PackageVersion Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.3.0" />
<PackageVersion Include="System.Composition" Version="6.0.0" />
<PackageVersion Include="System.Composition.AttributedModel" Version="6.0.0" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
@@ -31,13 +31,12 @@
<PackageVersion Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Localization" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageVersion Include="Microsoft.AspNetCore.ResponseCaching" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="3.1.22" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="3.1.23" />
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="3.1.23" />
</ItemGroup>
</Project>

View File

@@ -25,7 +25,7 @@ COPY resources resources
COPY .editorconfig .editorconfig
COPY Directory.Build.props Directory.Build.props
COPY Directory.Packages.props Directory.Packages.props
COPY LICENSE-2.0.txt LICENSE-2.0.txt
COPY LICENSE.txt LICENSE.txt
RUN dotnet --info && \
case "$TARGETOS" in \
"linux") ;; \

View File

@@ -25,7 +25,7 @@ COPY resources resources
COPY .editorconfig .editorconfig
COPY Directory.Build.props Directory.Build.props
COPY Directory.Packages.props Directory.Packages.props
COPY LICENSE-2.0.txt LICENSE-2.0.txt
COPY LICENSE.txt LICENSE.txt
RUN dotnet --info && \
case "$TARGETOS" in \
"linux") ;; \

View File

@@ -9,7 +9,7 @@
[![Build status (Docker)](https://img.shields.io/github/workflow/status/JustArchiNET/ArchiSteamFarm/ASF-docker-publish-main.svg?label=Docker&logo=docker&cacheSeconds=600)](https://hub.docker.com/r/justarchi/archisteamfarm)
[![Github last commit date](https://img.shields.io/github/last-commit/JustArchiNET/ArchiSteamFarm.svg?label=Updated&logo=github&cacheSeconds=600)](https://github.com/JustArchiNET/ArchiSteamFarm/commits)
[![Total downloads](https://img.shields.io/github/downloads/JustArchiNET/ArchiSteamFarm/total.svg?label=Downloads&logo=github&cacheSeconds=600)](https://github.com/JustArchiNET/ArchiSteamFarm/releases)
[![License](https://img.shields.io/github/license/JustArchiNET/ArchiSteamFarm.svg?label=License&logo=apache&cacheSeconds=2592000)](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE-2.0.txt)
[![License](https://img.shields.io/github/license/JustArchiNET/ArchiSteamFarm.svg?label=License&logo=apache&cacheSeconds=2592000)](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE.txt)
[![Localization](https://badges.crowdin.net/archisteamfarm/localized.svg)](https://crowdin.com/project/archisteamfarm)
[![ConfigGenerator status](https://img.shields.io/website-up-down-green-red/https/justarchinet.github.io/ASF-WebConfigGenerator.svg?label=ConfigGenerator&logo=html5&cacheSeconds=3600)](https://justarchinet.github.io/ASF-WebConfigGenerator)

2
wiki

Submodule wiki updated: 98a9726544...aadb2f84dc