mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2025-12-24 18:26:49 +00:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aea7c7640c | ||
|
|
7118185ac5 | ||
|
|
b681b74ee6 | ||
|
|
cc83222c3e | ||
|
|
6c570738ee | ||
|
|
393ddf6f10 | ||
|
|
75a7df2751 | ||
|
|
0c3dfaa4ae | ||
|
|
94e70e5ac2 | ||
|
|
9ce527c938 | ||
|
|
660b05e4c4 | ||
|
|
b39efb2b03 | ||
|
|
53e0b62ced | ||
|
|
d3980962fe | ||
|
|
517787efb8 | ||
|
|
d06afa26d4 | ||
|
|
4562e71e47 | ||
|
|
894471fa82 | ||
|
|
e9f6c15ba1 | ||
|
|
814b93d1cf | ||
|
|
beafbd8f43 | ||
|
|
dbd0e006ed | ||
|
|
4661803836 | ||
|
|
99ecd72660 | ||
|
|
799ec2965f | ||
|
|
c7e9c0c3b0 | ||
|
|
1f3e861612 | ||
|
|
159b0620a7 | ||
|
|
e508602be7 | ||
|
|
6edf62d849 | ||
|
|
021d414143 | ||
|
|
813587508e | ||
|
|
0e3d124663 | ||
|
|
91115b7cb7 | ||
|
|
0f12174564 | ||
|
|
d087aacbfb | ||
|
|
1c0d2d88ed | ||
|
|
6b170c345d | ||
|
|
bc8a4a50d2 |
2
.github/CONTRIBUTING.md
vendored
2
.github/CONTRIBUTING.md
vendored
@@ -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
1
.github/crowdin.yml
vendored
@@ -1,3 +1,4 @@
|
||||
"base_path": ".."
|
||||
"preserve_hierarchy": true
|
||||
"files": [
|
||||
{
|
||||
|
||||
8
.github/renovate.json5
vendored
8
.github/renovate.json5
vendored
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
1
.github/workflows/ci.yml
vendored
1
.github/workflows/ci.yml
vendored
@@ -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:
|
||||
|
||||
2
.github/workflows/docker-ci.yml
vendored
2
.github/workflows/docker-ci.yml
vendored
@@ -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 }}
|
||||
|
||||
2
.github/workflows/docker-publish-latest.yml
vendored
2
.github/workflows/docker-publish-latest.yml
vendored
@@ -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
|
||||
|
||||
4
.github/workflows/docker-publish-main.yml
vendored
4
.github/workflows/docker-publish-main.yml
vendored
@@ -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 }}
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
56
.github/workflows/publish.yml
vendored
56
.github/workflows/publish.yml
vendored
@@ -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
|
||||
|
||||
2
.github/workflows/translations.yml
vendored
2
.github/workflows/translations.yml
vendored
@@ -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
2
ASF-ui
Submodule ASF-ui updated: 156992e88d...871721c699
@@ -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]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
|
||||
35
ArchiSteamFarm/Steam/Data/OptionalResultResponse.cs
Normal file
35
ArchiSteamFarm/Steam/Data/OptionalResultResponse.cs
Normal 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() { }
|
||||
}
|
||||
@@ -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]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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; } = "";
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>5.2.3.6</Version>
|
||||
<Version>5.2.4.2</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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") ;; \
|
||||
|
||||
@@ -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") ;; \
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
[](https://hub.docker.com/r/justarchi/archisteamfarm)
|
||||
[](https://github.com/JustArchiNET/ArchiSteamFarm/commits)
|
||||
[](https://github.com/JustArchiNET/ArchiSteamFarm/releases)
|
||||
[](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE-2.0.txt)
|
||||
[](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE.txt)
|
||||
|
||||
[](https://crowdin.com/project/archisteamfarm)
|
||||
[](https://justarchinet.github.io/ASF-WebConfigGenerator)
|
||||
|
||||
2
wiki
2
wiki
Submodule wiki updated: 98a9726544...aadb2f84dc
Reference in New Issue
Block a user