Compare commits

..

40 Commits

Author SHA1 Message Date
renovate[bot]
f69ee6364d chore(deps): update asf-ui digest to a46fdc3 2025-10-24 04:45:55 +00:00
renovate[bot]
a468f9301d chore(deps): update opentelemetry-dotnet-contrib monorepo to 1.13.0 2025-10-22 11:11:05 +00:00
renovate[bot]
efa541d68d chore(deps): update dependency markdig.signed to 0.43.0 2025-10-21 11:34:18 +00:00
ArchiBot
068ad1b06a Automatic translations update 2025-10-21 02:23:27 +00:00
renovate[bot]
f3bec05e1f chore(deps): update asf-ui digest to c906498 2025-10-20 18:34:44 +00:00
renovate[bot]
a84dc1b01e chore(deps): update crowdin/github-action action to v2.12.0 2025-10-20 09:46:36 +00:00
renovate[bot]
ca4a3ee972 chore(deps): update dependency scalar.aspnetcore to 2.9.0 2025-10-15 13:53:30 +00:00
Łukasz Domeradzki
1c817426b8 Misc 2025-10-15 13:06:14 +02:00
Łukasz Domeradzki
5ec9bc14a9 Misc 2025-10-15 09:09:46 +02:00
renovate[bot]
67f451069a chore(deps): update dotnet monorepo to 9.0.10 2025-10-15 03:41:02 +00:00
ArchiBot
4eb73af250 Automatic translations update 2025-10-15 02:23:14 +00:00
renovate[bot]
ef60e23a53 chore(deps): update dependency mstest to 4.0.1 2025-10-14 20:09:53 +00:00
renovate[bot]
2b57d0a9e6 chore(deps): update asf-ui digest to 4386078 2025-10-14 14:05:08 +00:00
Łukasz Domeradzki
ae183ae3ad Slightly improve error-reporting related to cross-process semaphore 2025-10-14 13:01:34 +02:00
renovate[bot]
725a3a5106 chore(deps): update actions/setup-node action to v6 (#3494)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-14 12:30:12 +02:00
ArchiBot
289f573b00 Automatic translations update 2025-10-14 02:22:34 +00:00
renovate[bot]
a8a6e658e2 chore(deps): update wiki digest to da954cf 2025-10-13 21:56:40 +00:00
Łukasz Domeradzki
797bb6fc98 Bump 2025-10-11 17:00:21 +02:00
Łukasz Domeradzki
41f61503fb Misc 2025-10-11 16:59:06 +02:00
ArchiBot
764c979560 Automatic translations update 2025-10-11 02:20:05 +00:00
renovate[bot]
a0531ff1f3 chore(deps): update dependency opentelemetry.exporter.prometheus.aspnetcore to 1.13.1-beta.1 2025-10-10 10:40:31 +00:00
renovate[bot]
30d5a4cdc2 chore(deps): update dependency opentelemetry.extensions.hosting to 1.13.1 2025-10-09 20:56:31 +00:00
renovate[bot]
750ff1a09a chore(deps): update dependency nlog.web.aspnetcore to 6.0.5 2025-10-09 14:30:11 +00:00
renovate[bot]
c5cc247e2d chore(deps): update dependency humanizer to 3.0.0-rc.6 2025-10-09 11:32:16 +00:00
renovate[bot]
813bac5e52 chore(deps): update dependency scalar.aspnetcore to 2.8.11 2025-10-08 21:59:49 +00:00
renovate[bot]
267cf1597e chore(deps): update dependency mstest to v4 (#3493)
* chore(deps): update dependency mstest to v4

* Misc improvement

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Łukasz Domeradzki <JustArchi@JustArchi.net>
2025-10-07 22:12:51 +02:00
Łukasz Domeradzki
4716312c3f Handle super rare login failure 2025-10-07 21:35:01 +02:00
renovate[bot]
31b735c3d3 chore(deps): update dependency scalar.aspnetcore to 2.8.10 2025-10-03 01:33:33 +00:00
renovate[bot]
e9baae4d03 chore(deps): update opentelemetry-dotnet monorepo 2025-10-02 06:26:19 +00:00
ArchiBot
f97142200f Automatic translations update 2025-10-02 02:21:12 +00:00
renovate[bot]
34bc25b023 chore(deps): update dependency mstest to 3.11.0 2025-10-01 21:18:07 +00:00
renovate[bot]
ede24b9fd5 chore(deps): update peter-evans/dockerhub-description action to v5 (#3490)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-10-01 23:17:07 +02:00
ArchiBot
c656b61ce2 Automatic translations update 2025-10-01 02:25:26 +00:00
renovate[bot]
3fb804fbd1 chore(deps): update dependency mstest to 3.10.5 2025-09-30 15:43:59 +00:00
ArchiBot
eb5f126c76 Automatic translations update 2025-09-30 02:21:04 +00:00
renovate[bot]
815d0732c3 chore(deps): update dependency scalar.aspnetcore to 2.8.8 2025-09-29 20:30:19 +00:00
renovate[bot]
a517cf216d chore(deps): update docker/login-action action to v3.6.0 2025-09-29 11:06:26 +00:00
ArchiBot
e5a6eede24 Automatic translations update 2025-09-29 02:22:48 +00:00
ArchiBot
7a3c28f3f6 Automatic translations update 2025-09-28 02:24:01 +00:00
Łukasz Domeradzki
49381cea84 Bump 2025-09-27 14:28:20 +02:00
17 changed files with 93 additions and 51 deletions

View File

@@ -20,7 +20,7 @@ jobs:
submodules: recursive
- name: Upload latest strings for translation on Crowdin
uses: crowdin/github-action@0749939f635900a2521aa6aac7a3766642b2dc71 # v2.11.0
uses: crowdin/github-action@08713f00a50548bfe39b37e8f44afb53e7a802d4 # v2.12.0
with:
crowdin_branch_name: main
config: '.github/crowdin.yml'

View File

@@ -27,14 +27,14 @@ jobs:
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- name: Login to ghcr.io
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

View File

@@ -28,14 +28,14 @@ jobs:
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- name: Login to ghcr.io
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -69,7 +69,7 @@ jobs:
push: true
- name: Update DockerHub repository description
uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2
uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

View File

@@ -28,14 +28,14 @@ jobs:
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
- name: Login to ghcr.io
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

View File

@@ -25,7 +25,7 @@ jobs:
submodules: recursive
- name: Setup Node.js with npm
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
with:
check-latest: true
node-version: ${{ env.NODE_JS_VERSION }}

View File

@@ -31,7 +31,7 @@ jobs:
git reset --hard origin/master
- name: Download latest translations from Crowdin
uses: crowdin/github-action@0749939f635900a2521aa6aac7a3766642b2dc71 # v2.11.0
uses: crowdin/github-action@08713f00a50548bfe39b37e8f44afb53e7a802d4 # v2.12.0
with:
upload_sources: false
download_translations: true

2
ASF-ui

Submodule ASF-ui updated: d3b89fc7c3...a46fdc376d

View File

@@ -526,7 +526,7 @@ internal sealed class Bot {
ArgumentNullException.ThrowIfNull(itemsToSend);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), long> realResult = itemsToSend.GroupBy(static asset => (asset.RealAppID, asset.ContextID, asset.ClassID)).ToDictionary(static group => group.Key, static group => group.Sum(static asset => asset.Amount));
Assert.AreEqual(expectedResult.Count, realResult.Count);
Assert.HasCount(expectedResult.Count, realResult);
Assert.IsTrue(expectedResult.All(expectation => realResult.TryGetValue(expectation.Key, out long reality) && (expectation.Value == reality)));
}

View File

@@ -86,7 +86,11 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
try {
while (true) {
if (!await EnsureFileExists().ConfigureAwait(false)) {
throw new IOException(Strings.FormatWarningFailedWithError(nameof(EnsureFileExists)));
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningFailedWithError(nameof(EnsureFileExists)));
await Task.Delay(SpinLockDelay * 25, cancellationToken).ConfigureAwait(false);
continue;
}
try {
@@ -128,7 +132,7 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
try {
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds >= millisecondsTimeout) {
if (stopwatch.ElapsedMilliseconds > millisecondsTimeout) {
return false;
}
@@ -136,7 +140,18 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
while (true) {
if (!await EnsureFileExists().ConfigureAwait(false)) {
throw new IOException(Strings.FormatWarningFailedWithError(nameof(EnsureFileExists)));
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningFailedWithError(nameof(EnsureFileExists)));
if (millisecondsTimeout <= 0) {
return false;
}
int sleep = Math.Min(millisecondsTimeout, SpinLockDelay * 25);
await Task.Delay(sleep, cancellationToken).ConfigureAwait(false);
millisecondsTimeout -= sleep;
continue;
}
try {
@@ -154,12 +169,14 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
} catch (FileNotFoundException) {
throw;
} catch (IOException) {
if (millisecondsTimeout <= SpinLockDelay) {
if (millisecondsTimeout <= 0) {
return false;
}
await Task.Delay(SpinLockDelay, cancellationToken).ConfigureAwait(false);
millisecondsTimeout -= SpinLockDelay;
int sleep = Math.Min(millisecondsTimeout, SpinLockDelay);
await Task.Delay(sleep, cancellationToken).ConfigureAwait(false);
millisecondsTimeout -= sleep;
}
}
} finally {
@@ -184,20 +201,26 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
}
if (!Directory.Exists(directoryPath)) {
if (OperatingSystem.IsWindows()) {
DirectoryInfo directoryInfo = Directory.CreateDirectory(directoryPath);
try {
if (OperatingSystem.IsWindows()) {
DirectoryInfo directoryInfo = Directory.CreateDirectory(directoryPath);
try {
DirectorySecurity directorySecurity = new(directoryPath, AccessControlSections.All);
try {
DirectorySecurity directorySecurity = new(directoryPath, AccessControlSections.All);
directoryInfo.SetAccessControl(directorySecurity);
} catch (PrivilegeNotHeldException e) {
// Non-critical, user might have no rights to manage the resource
ASF.ArchiLogger.LogGenericDebuggingException(e);
directoryInfo.SetAccessControl(directorySecurity);
} catch (PrivilegeNotHeldException e) {
// Non-critical, user might have no rights to manage the resource
ASF.ArchiLogger.LogGenericDebuggingException(e);
}
} else if (OperatingSystem.IsFreeBSD() || OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) {
// We require global access from all users, as other ASFs might need to put additional files in there
Directory.CreateDirectory(directoryPath, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute | UnixFileMode.OtherRead | UnixFileMode.OtherWrite | UnixFileMode.OtherExecute);
}
} else if (OperatingSystem.IsFreeBSD() || OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) {
// We require global access from all users, as other ASFs might need to put additional files in there
Directory.CreateDirectory(directoryPath, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite | UnixFileMode.GroupExecute | UnixFileMode.OtherRead | UnixFileMode.OtherWrite | UnixFileMode.OtherExecute);
} catch (IOException e) {
ASF.ArchiLogger.LogGenericException(e);
return false;
}
}
@@ -228,11 +251,21 @@ internal sealed class CrossProcessFileBasedSemaphore : IAsyncDisposable, ICrossP
await new FileStream(FilePath, fileStreamOptions).DisposeAsync().ConfigureAwait(false);
}
} catch (IOException e) {
// Ignored, if the file was already created in the meantime by another instance, this is fine
ASF.ArchiLogger.LogGenericDebuggingException(e);
if (i == 0) {
// Ignored, if the file was already created in the meantime by another instance, this is fine
ASF.ArchiLogger.LogGenericDebuggingException(e);
continue;
}
// It's not fine if the same issue happened again
ASF.ArchiLogger.LogGenericException(e);
return false;
}
}
return false;
// It's also not fine if we failed to create the file twice in a row
return File.Exists(FilePath);
}
}

View File

@@ -75,7 +75,6 @@ public sealed class ASFResponse {
internal ASFResponse(string buildVariant, bool canUpdate, GlobalConfig globalConfig, uint memoryUsage, DateTime processStartTime, Version version) {
ArgumentException.ThrowIfNullOrEmpty(buildVariant);
ArgumentNullException.ThrowIfNull(globalConfig);
ArgumentOutOfRangeException.ThrowIfZero(memoryUsage);
ArgumentOutOfRangeException.ThrowIfLessThanOrEqual(processStartTime, DateTime.UnixEpoch);
ArgumentNullException.ThrowIfNull(version);

View File

@@ -584,7 +584,10 @@
<value>Рівень бота {0}.</value>
<comment>{0} will be replaced by bot's level</comment>
</data>
<data name="BotInventory" xml:space="preserve">
<value>{0}/{1} ({2}/{3}): {4} активів</value>
<comment>{0} will be replaced by appID (number), {1} will be replaced by contextID (number), {2} will be replaced by app's name (string), {3} will be replaced by name of the context (string), {4} will be replaced by number of assets in the specified inventory (number).</comment>
</data>
<data name="ActivelyMatchingItems" xml:space="preserve">
<value>Підбір предметів Steam, раунд #{0}...</value>
<comment>{0} will be replaced by round number</comment>

View File

@@ -2323,6 +2323,7 @@ public sealed class Bot : IAsyncDisposable, IDisposable {
case EResult.Busy: // No clue, might be some internal gateway timeout, just try again
case EResult.DuplicateRequest: // This will happen if user reacts to popup and tries to use the code afterwards, we have the code saved in ASF, we just need to try again
case EResult.Expired: // Usually means refresh token is no longer authorized to use, otherwise just try again
case EResult.Fail: // Usually some internal issue during authorization, just try again
case EResult.FileNotFound: // User denied approval despite telling us that they accepted it, just try again
case EResult.InvalidPassword: // Usually means refresh token is no longer authorized to use, otherwise just try again
case EResult.NoConnection: // Usually network issues

View File

@@ -1031,7 +1031,8 @@ public sealed class CardsFarmer : IAsyncDisposable, IDisposable {
IElement? nameNode = htmlDocument.QuerySelectorAll("span[class='profile_small_header_location']").LastOrDefault();
if (nameNode == null) {
Bot.ArchiLogger.LogNullError(nameNode);
// Normally we should log null error here, but here's why we don't: https://www.youtube.com/watch?v=nSKp2StlS6s&t=40s
Bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorIsInvalid(nameof(nameNode)));
return null;
}

View File

@@ -23,11 +23,13 @@
using System;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json.Serialization;
using ArchiSteamFarm.Helpers.Json;
namespace ArchiSteamFarm.Steam.Data;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
public sealed class InventoryAppData {
[JsonInclude]
[JsonPropertyName("appid")]
@@ -88,4 +90,7 @@ public sealed class InventoryAppData {
[JsonPropertyName("trade_permissions")]
[JsonRequired]
public string TradePermissions { get; private init; } = "";
[JsonConstructor]
private InventoryAppData() { }
}

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>6.2.2.3</Version>
<Version>6.2.3.0</Version>
</PropertyGroup>
<PropertyGroup>

View File

@@ -2,25 +2,25 @@
<ItemGroup>
<PackageVersion Include="AngleSharp" Version="1.3.0" />
<PackageVersion Include="CryptSharpStandard" Version="1.0.0" />
<PackageVersion Include="Humanizer" Version="3.0.0-beta.96" />
<PackageVersion Include="Humanizer" Version="3.0.0-rc.6" />
<PackageVersion Include="JetBrains.Annotations.Sources" Version="2025.2.2" />
<PackageVersion Include="Markdig.Signed" Version="0.42.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.9" />
<PackageVersion Include="Markdig.Signed" Version="0.43.0" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="9.0.10" />
<PackageVersion Include="Microsoft.CodeAnalysis.ResxSourceGenerator" Version="5.0.0-1.25277.114" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.14.0" />
<PackageVersion Include="MSTest" Version="3.10.4" />
<PackageVersion Include="MSTest" Version="4.0.1" />
<PackageVersion Include="Nito.AsyncEx.Coordination" Version="5.1.2" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="6.0.4" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.12.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.8.7" />
<PackageVersion Include="NLog.Web.AspNetCore" Version="6.0.5" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.13.1-beta.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.13.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.13.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.13.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.13.0" />
<PackageVersion Include="Scalar.AspNetCore" Version="2.9.0" />
<PackageVersion Include="SteamKit2" Version="3.3.1" />
<PackageVersion Include="System.Composition" Version="9.0.9" />
<PackageVersion Include="System.Composition.AttributedModel" Version="9.0.9" />
<PackageVersion Include="System.Composition" Version="9.0.10" />
<PackageVersion Include="System.Composition.AttributedModel" Version="9.0.10" />
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="9.0.9" />
<PackageVersion Include="System.Security.Cryptography.ProtectedData" Version="9.0.10" />
</ItemGroup>
</Project>

2
wiki

Submodule wiki updated: 51924d6ec1...6cf74f5de9