Compare commits

..

1070 Commits

Author SHA1 Message Date
Archi
2be8a8b2a8 Avoid a potential synchronous flush when serializing api authentication middleware response
Might result in something along:

2021-07-30 16:39:43|ArchiSteamFarm-6766|ERROR|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HMAJF2E5IVHB", Request id "0HMAJF2E5IVHB:00000005": An unhandled exception was thrown by the application. System.InvalidOperationException: Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.Flush()
   at Microsoft.AspNetCore.ResponseCaching.ResponseCachingStream.Flush()
   at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionBody.Flush()
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Dispose(Boolean disposing)
   at System.IO.StreamWriter.Close()
   at Newtonsoft.Json.JsonTextWriter.CloseBufferAndWriter()
   at Newtonsoft.Json.JsonTextWriter.Close()
   at Newtonsoft.Json.JsonWriter.Dispose(Boolean disposing)
   at Newtonsoft.Json.JsonWriter.System.IDisposable.Dispose()
   at ArchiSteamFarm.IPC.WebUtilities.WriteJsonAsync[TValue](HttpResponse response, TValue value, JsonSerializerSettings jsonSerializerSettings)
   at ArchiSteamFarm.IPC.WebUtilities.WriteJsonAsync[TValue](HttpResponse response, TValue value, JsonSerializerSettings jsonSerializerSettings)
   at ArchiSteamFarm.IPC.Integration.ApiAuthenticationMiddleware.InvokeAsync(HttpContext context, IOptions`1 jsonOptions)
   at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
2021-07-30 20:54:52 +02:00
Archi
0b32862efe Use 4096-bit private key for public sign 2021-07-30 16:19:52 +02:00
Archi
77d34a2ac8 Enable public signing of ASF binaries
Pending tests whether this is going to have any drawbacks, but so far looks good
2021-07-30 16:09:46 +02:00
Archi
13ea9df707 Fix STD plugin for generic-netf
It failed because it couldn't find immutable collections, ASF doesn't have it either, it doesn't look like it's needed to satisfy the compiler anymore (SK2 includes it through protobuf-net)
2021-07-30 16:09:05 +02:00
renovate[bot]
97a5a94220 Update dependency SteamKit2 to v2.4.0-Alpha.3 (#2392)
* Update dependency SteamKit2 to v2.4.0-Alpha.3

* Address SK2 breaking changes

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Archi <JustArchi@JustArchi.net>
2021-07-30 15:33:29 +02:00
Renovate Bot
0d93706a49 Update ASF-ui commit hash to 0692fb3 2021-07-30 10:00:00 +00:00
ArchiBot
677fcfa198 Automatic translations update 2021-07-30 02:14:21 +00:00
Renovate Bot
8bdca25988 Update ASF-ui commit hash to 83e81ee 2021-07-29 23:48:46 +00:00
Archi
ef801eb15f Update Bug-report.yml 2021-07-30 01:33:41 +02:00
Archi
c1af6f545c Update Bug-report.yml 2021-07-30 01:33:03 +02:00
Archi
927ca76cca Update CODE_OF_CONDUCT.md 2021-07-30 01:07:11 +02:00
Archi
ad660d13cb Update CODE_OF_CONDUCT.md 2021-07-30 01:06:07 +02:00
Archi
18f701fce1 Use brand new wiki suggestion form 2021-07-30 00:56:32 +02:00
Archi
39d5f9c348 Use brand new enhancement idea form 2021-07-30 00:07:23 +02:00
Archi
1cca6caa0c Use brand new bug report form 2021-07-29 22:52:29 +02:00
Renovate Bot
460e57e137 Update ASF-ui commit hash to 285c9d7 2021-07-29 19:16:31 +00:00
Renovate Bot
ed613bcea9 Update ASF-ui commit hash to 5eef8fe 2021-07-29 02:25:53 +00:00
Sebastian Göls
5cbc25c44e Fix command mabadd working incorrectly (#2390)
* Fix command mabadd working incorrectly

* Do the same for mabrm
2021-07-28 22:43:17 +02:00
Sebastian Göls
862238f46b Delete old ISSUE_TEMPLATEmd (#2389) 2021-07-28 21:14:32 +02:00
Renovate Bot
0ae4a4c8b9 Update ASF-ui commit hash to 6b0000c 2021-07-28 02:26:16 +00:00
ArchiBot
9811d5973b Automatic translations update 2021-07-28 02:11:59 +00:00
Renovate Bot
256f8c4679 Update ASF-ui commit hash to bac7806 2021-07-27 18:48:32 +00:00
Archi
1df9c6290b Misc 2021-07-27 20:28:33 +02:00
Renovate Bot
5994030881 Update ASF-ui commit hash to 519a0a1 2021-07-27 02:41:28 +00:00
Renovate Bot
35d767f0b4 Update ASF-ui commit hash to bf22332 2021-07-27 00:48:24 +00:00
Renovate Bot
7f4c83ad49 Update ASF-ui commit hash to 2803ff0 2021-07-26 22:49:07 +00:00
ArchiBot
98c18756c5 Automatic translations update 2021-07-26 02:11:26 +00:00
Archi
0e2510528b Cleanup program initialization
Initial string[] args actually can't be null according to MSDN
2021-07-26 00:19:09 +02:00
Archi
ead2d460f5 Make program args case-insensitive
There is no good reason why it should be case-sensitive
2021-07-25 23:50:02 +02:00
Archi
3b31313c64 Bump 2021-07-25 23:41:08 +02:00
Archi
21c3e4a1a3 Refuse to handle Resart() when in --no-restart mode
While AutoRestart property in the config is a hint for ASF what it should be doing, --no-restart cmd-line argument is used in scripts and environments that must directly monitor the process, e.g. Docker. In such environments, we should refuse a call to Restart() action, as it's never feasible.
2021-07-25 23:35:56 +02:00
Renovate Bot
517ced1e14 Update ASF-ui commit hash to eb45427 2021-07-25 02:29:28 +00:00
ArchiBot
a875c2377f Automatic translations update 2021-07-25 02:09:17 +00:00
Renovate Bot
e805a3e7ad Update ASF-ui commit hash to 40f0e8f 2021-07-24 11:03:16 +00:00
Renovate Bot
93270be636 Update ASF-ui commit hash to f9af6f1 2021-07-24 03:12:20 +00:00
Renovate Bot
c923f93902 Update ASF-ui commit hash to 4f785cc 2021-07-23 22:30:06 +00:00
Archi
a785acf416 Use /bin/sh as entrypoint in docker containers
This way we can avoid a potential update process corruption which happened e.g. at https://github.com/JustArchiNET/ArchiSteamFarm/issues/2382
2021-07-24 00:29:22 +02:00
Sebastian Göls
66bbc56b02 Set end year of assembly copyright during build process (#2380)
* Set end year of assembly copyright during build process

* Use year property instead of string format

Co-authored-by: Łukasz Domeradzki <JustArchi@JustArchi.net>

Co-authored-by: Łukasz Domeradzki <JustArchi@JustArchi.net>
2021-07-23 23:56:00 +02:00
Archi
6e285178d4 Misc 2021-07-23 20:35:48 +02:00
Łukasz Domeradzki
95b17d4e79 Update SECURITY.md 2021-07-23 20:30:58 +02:00
Łukasz Domeradzki
c97985c793 Update SECURITY.md 2021-07-23 20:30:49 +02:00
Renovate Bot
cee50b500d Update ASF-ui commit hash to 7c41ba5 2021-07-23 16:19:01 +00:00
Archi
b19303d4b6 Bump 2021-07-23 17:06:48 +02:00
Archi
7ff747fb6e Misc 2021-07-23 17:05:43 +02:00
Sebastian Göls
4b7edf388c Fix GlobalConfig update via IPC removing IPCPassword (#2379) 2021-07-23 16:54:20 +02:00
Renovate Bot
8b0052ad73 Update ASF-ui commit hash to 44f44e8 2021-07-23 12:01:02 +00:00
Renovate Bot
b6dd969fee Update crowdin/github-action action to v1.3.0 2021-07-23 08:40:09 +00:00
Archi
8ee77fb126 Bump 2021-07-22 18:43:51 +02:00
Renovate Bot
b1cc17bc3e Update ASF-ui commit hash to cf95b19 2021-07-22 12:04:17 +00:00
Renovate Bot
6a9d6526ad Update ASF-ui commit hash to 158317b 2021-07-22 02:53:59 +00:00
Renovate Bot
7aaab660f4 Update dependency JetBrains.Annotations to v2021.2.0 2021-07-21 13:09:42 +00:00
Archi
859d2d54c6 Misc 2021-07-21 09:58:09 +02:00
Renovate Bot
f33b014957 Update ASF-ui commit hash to 1260058 2021-07-21 04:12:01 +00:00
ArchiBot
2533b05ede Automatic translations update 2021-07-21 02:11:34 +00:00
Archi
96c4243264 Bump 2021-07-20 21:46:07 +02:00
Renovate Bot
7a31626609 Update ASF-ui commit hash to 854c599 2021-07-20 17:04:38 +00:00
Renovate Bot
0672e4393c Update actions/setup-node action to v2.3.0 2021-07-20 14:51:21 +00:00
Renovate Bot
ec21240c47 Update wiki commit hash to e306c79 2021-07-20 12:56:40 +00:00
Archi
a92c212a69 Misc 2021-07-20 14:43:16 +02:00
Archi
1b3ef7a41d Add support for supplying additional information on 401/403 status codes
In particular permanent: true/false value indicating whether 403 comes from rate limiting or ASF block due to lack of IPCPassword
2021-07-20 14:32:53 +02:00
Renovate Bot
37326c7ab6 Update wiki commit hash to 40da59e 2021-07-20 11:08:35 +00:00
Łukasz Domeradzki
81eb5c2b7c Update Strings.resx 2021-07-20 11:40:11 +02:00
Archi
5d5baca72e Include more information as program identifier and user-agent 2021-07-19 14:37:58 +02:00
Renovate Bot
d5a07f6eaa Update ASF-ui commit hash to e97a16f 2021-07-19 02:58:18 +00:00
Renovate Bot
52dbf98d94 Update ASF-ui commit hash to c86c0ac 2021-07-18 10:35:32 +00:00
Renovate Bot
2ce6be154e Update ASF-ui commit hash to f2586c2 2021-07-18 02:55:21 +00:00
ArchiBot
b5396ae7d4 Automatic translations update 2021-07-18 02:08:47 +00:00
Renovate Bot
a4bd659288 Update ASF-ui commit hash to 8167c91 2021-07-16 22:00:18 +00:00
Renovate Bot
1bcd574174 Update ASF-ui commit hash to 365a565 2021-07-16 09:51:48 +00:00
Renovate Bot
00601f6d52 Update crowdin/github-action action to v1.2.0 2021-07-16 07:23:17 +00:00
Archi
37689f4de6 Misc XML cleanup 2021-07-15 23:06:16 +02:00
ArchiBot
2049bb987b Automatic translations update 2021-07-15 02:09:52 +00:00
Renovate Bot
b7fc38eaaa Update dependency NLog.Web.AspNetCore to v4.13.0 2021-07-14 18:52:43 +00:00
Renovate Bot
cec1f387c1 Update wiki commit hash to e4d8efd 2021-07-14 10:13:55 +00:00
Renovate Bot
316af8c542 Update ASF-ui commit hash to 393ca6a 2021-07-14 02:20:05 +00:00
ArchiBot
dd8fd251cc Automatic translations update 2021-07-14 02:08:07 +00:00
Renovate Bot
1139733608 Update ASF-ui commit hash to 7ed6a70 2021-07-13 16:26:38 +00:00
Renovate Bot
5649a8ffcd Update ASF-ui commit hash to d9d5b8d 2021-07-13 11:12:33 +00:00
Renovate Bot
dc2db4626a Update ASF-ui commit hash to 57005d5 2021-07-13 07:31:00 +00:00
Renovate Bot
e9e134cd99 Update ASF-ui commit hash to 04b9c53 2021-07-13 04:00:26 +00:00
ArchiBot
6aef4ad5ed Automatic translations update 2021-07-13 02:10:08 +00:00
Archi
d479eb9f97 Address Rider EAP inspections/cleanup 2021-07-12 21:45:17 +02:00
Renovate Bot
f160a25fb0 Update docker/setup-buildx-action action to v1.5.1 2021-07-12 12:49:15 +00:00
Archi
22311c6278 Bump 2021-07-12 13:43:19 +02:00
Łukasz Domeradzki
13e9f1ac2a Closes #2371 (#2372)
* Closes #2371

* Change the default to no known networks

* Address @Vital7 note

* Handle both IPv4 and IPv6 when mapped

This follows ASP.NET Core logic

* Refactor forwarded headers usage
2021-07-12 13:40:23 +02:00
ArchiBot
485caab0f4 Automatic translations update 2021-07-12 02:09:02 +00:00
Renovate Bot
9be84010dd Update wiki commit hash to 9fe5fe6 2021-07-11 21:02:54 +00:00
Renovate Bot
a5424243f8 Update wiki commit hash to dc5bd12 2021-07-11 14:33:11 +00:00
ArchiBot
a049c92c23 Automatic translations update 2021-07-11 02:10:55 +00:00
Renovate Bot
977bcec5f6 Update wiki commit hash to 8bd498c 2021-07-10 23:58:53 +00:00
Archi
dad474c8bf Fix docker builds 2021-07-11 01:58:11 +02:00
Archi
5d9bb8f2bb Include ASF's license in output of the build 2021-07-11 01:56:44 +02:00
Renovate Bot
7a6746572a Update wiki commit hash to 246d0ff 2021-07-10 18:31:27 +00:00
Vitaliya
fd4c1ef59b Use ArchiHandler to fetch owned games (#2370)
* Use ArchiHandler to fetch owned games

* Mark deprecated methods with Obsolete attribute
2021-07-10 17:31:48 +02:00
Renovate Bot
1e30b843e0 Update ASF-ui commit hash to 6ee6f9c 2021-07-09 23:54:37 +00:00
Archi
05e36b4cb9 CI: Misc 2021-07-10 00:53:34 +02:00
Renovate Bot
25fa116058 Update dessant/lock-threads action to v2.1.1 2021-07-09 20:07:46 +00:00
Renovate Bot
021d8436fd Update ASF-ui commit hash to 3e97894 2021-07-09 18:52:49 +00:00
Renovate Bot
13ce17e7cc Update ASF-ui commit hash to caafc44 2021-07-09 10:07:10 +00:00
Renovate Bot
0c9fa2e9c1 Update crowdin/github-action action to v1.1.2 2021-07-09 06:49:18 +00:00
Renovate Bot
a961c48771 Update ASF-ui commit hash to 0f96f9f 2021-07-08 23:08:43 +00:00
Archi
2dc2202e30 Misc 2021-07-09 00:19:39 +02:00
Renovate Bot
4d71958b9f Update ASF-ui commit hash to 7796db6 2021-07-08 14:55:34 +00:00
Renovate Bot
2077a0a2fc Update crowdin/github-action action to v1.1.1 2021-07-08 12:50:06 +00:00
Renovate Bot
287a19cdcb Update ASF-ui commit hash to 941fb44 2021-07-08 10:04:49 +00:00
Archi
e6ecb1ac30 CI: Update token for translations.yml 2021-07-08 10:48:01 +02:00
Renovate Bot
e55d8d6650 Update wiki commit hash to c6e2621 2021-07-08 03:04:43 +00:00
Renovate Bot
6cc51856e4 Update ASF-ui commit hash to 2aed76a 2021-07-07 22:37:42 +00:00
Renovate Bot
ebfdd0cf2d Update wiki commit hash to 9c6ccda 2021-07-07 15:58:17 +00:00
Łukasz Domeradzki
bca1cbb32b Update CONTRIBUTING.md 2021-07-07 16:02:28 +02:00
ArchiBot
5edca9b548 Automatic translations update 2021-07-07 10:26:42 +00:00
Renovate Bot
dfb3e4f967 Update ASF-ui commit hash to e231763 2021-07-06 22:05:16 +00:00
Renovate Bot
005438c610 Update ASF-ui commit hash to b176ae5 2021-07-06 12:52:14 +00:00
Renovate Bot
b012a91090 Update ASF-ui commit hash to 90bcfee 2021-07-06 08:57:53 +00:00
Archi
69f3d0fdcb CI: Update token for translations.yml 2021-07-06 10:00:00 +02:00
Renovate Bot
60b05dfd46 Update wiki commit hash to 8d48a30 2021-07-06 03:02:45 +00:00
Renovate Bot
e32c2560d8 Update ASF-ui commit hash to aa044b6 2021-07-05 17:06:16 +00:00
Archi
28242aa6e8 IPC: Implement ResponseCaching
This actually does two things: client caching and server caching

Client caching considers only static files, for which we instruct the web browser to revalidate each cache usage with our server to ensure that it's up-to-date.

Server caching with those settings actually doesn't work (nothing to do), but may in the future as lack of no-store means that server is technically allowed to cache I/O read files for as long as it can guarantee they didn't change on the disk.
2021-07-04 21:36:54 +02:00
Archi
f58a9be02a IPC: Add optional SRI support for ASF-ui
In theory, this is required only in specific proxy/CDN solutions accessing ASF data over http that would somehow want to transform the responses

https://github.com/JustArchiNET/ASF-ui/pull/1470
2021-07-04 18:51:35 +02:00
Archi
dcacdd802c Optimize LoadAssemblies()
We can be smart about it and avoid loading the same assemblies twice
2021-07-04 18:33:24 +02:00
Archi
c3c1eb8295 Address SYSLIB0021 warning
Applies from net6.0 onwards, but can be fixed already
2021-07-04 16:02:16 +02:00
renovate[bot]
5405ce7f8b Update ASF-ui commit hash to d953b30 (#2367)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-07-04 14:59:04 +02:00
Archi
1a3b436216 Mis 2021-07-03 14:25:13 +02:00
Renovate Bot
8f32f34374 Update ASF-ui commit hash to ffe10ce 2021-07-03 03:02:35 +00:00
ArchiBot
60cfef3706 Automatic translations update 2021-07-03 02:06:22 +00:00
Archi
13613f3f89 Bump 2021-07-03 00:17:12 +02:00
Renovate Bot
c90f343386 Update docker/setup-buildx-action action to v1.5.0 2021-07-02 14:34:11 +00:00
Renovate Bot
18e3dd8ecc Update ASF-ui commit hash to 0527fa8 2021-07-02 11:17:34 +00:00
Renovate Bot
f65fc1b3ae Update ASF-ui commit hash to dc959bb 2021-07-02 03:36:35 +00:00
ArchiBot
a82ca56bb1 Automatic translations update 2021-07-02 02:09:46 +00:00
Renovate Bot
b82e9454f5 Update docker/build-push-action action to v2.6.1 2021-07-01 15:49:02 +00:00
Renovate Bot
0525177434 Update wiki commit hash to 705882c 2021-07-01 14:07:23 +00:00
Archi
cfa23ffe21 Misc 2021-07-01 12:00:23 +02:00
Archi
14edd03c9d Bump 2021-07-01 12:00:03 +02:00
Archi
1d317dcb76 Misc 2021-07-01 10:30:12 +02:00
Renovate Bot
cd58936850 Update ASF-ui commit hash to 4c0827b 2021-07-01 03:23:00 +00:00
ArchiBot
447a66c824 Automatic translations update 2021-07-01 02:10:55 +00:00
Archi
aa6b9b9bea STD: Add support for new custom swagger attributes 2021-06-30 23:12:15 +02:00
Archi
da7adbe415 Make custom swagger attributes also work with parameter info
If somebody ever uses it as such, that is
2021-06-30 23:04:36 +02:00
Archi
19bd497362 Extract custom attributes to CustomSwaggerAttribute
This also allows plugins to inherit from it and add custom attributes while utilizing the same ASF mechanism for extending the schema
2021-06-30 22:53:01 +02:00
Archi
d7cbf0ced2 Misc 2021-06-30 22:29:17 +02:00
Archi
a063d2f424 Misc 2021-06-30 22:26:25 +02:00
Archi
aebf432fce Misc 2021-06-30 22:24:28 +02:00
Archi
0060e76829 Make custom swagger limitations more generic to use 2021-06-30 22:23:01 +02:00
Archi
ccc7a3ed32 Misc 2021-06-30 20:46:44 +02:00
Archi
162ecf93ac Misc 2021-06-30 20:41:55 +02:00
Archi
874eb4d3a6 Add helpful limitations on properties for https://github.com/JustArchiNET/ASF-ui/issues/1445
Monologue explaining how it works: https://ptb.discord.com/channels/267292556709068800/332735075315744768/859854787634004049

(eventually also on wiki)
2021-06-30 20:39:38 +02:00
Renovate Bot
689dbc4db5 Update ASF-ui commit hash to d1fcdee 2021-06-30 14:35:57 +00:00
Archi
e7bc2e5e1c CI: Use latest node LTS 2021-06-30 16:26:33 +02:00
Archi
2f7478b968 CI: Pin versions
While floating tags are nice to use and fancy, we already had situations where the fixed source code did not result in the same deterministic build as the one built e.g. a week ago due to non-pinned versions that resulted in a different set of dependencies than originally.

Since GitHub actions follow similar pattern, we want to do our best to ensure that if CI in given fixed version passed on a fixed source, then it should also result in the same deterministic output. Of course this is impossible to achieve in 100% (e.g. resources no longer being available over the network), but this is something we can do.

It wasn't like that before renovate since we didn't have a standarized bot that could handle bumping those versions for us.
2021-06-30 16:19:41 +02:00
Archi
8982e1dcd8 Misc 2021-06-30 13:17:15 +02:00
Archi
ef0509998e Misc cleanup 2021-06-30 13:10:05 +02:00
Ryzhehvost
807db7f365 Implement splitting of steam messages on newlines (#2348)
* implement split on newlines

* replace test of splitting on newlines

* sugar-sugar syntax

* Revert "sugar-sugar syntax"

This reverts commit ee9b558faf.

* add test to confirm that paragraph character size is less or equal to continuation character size
2021-06-30 12:45:58 +02:00
Renovate Bot
501818eed1 Update ASF-ui commit hash to e5b2bb1 2021-06-30 03:06:52 +00:00
Renovate Bot
3764071834 Update ASF-ui commit hash to 80501f5 2021-06-29 23:34:46 +00:00
Renovate Bot
a734af0e64 Update ASF-ui commit hash to 555ad0f 2021-06-29 20:42:39 +00:00
Renovate Bot
624b5c9789 Update ASF-ui commit hash to a2da9a0 2021-06-29 17:37:07 +00:00
Archi
b36fc74488 Fix regex inside json 2021-06-29 13:16:57 +02:00
Archi
9f02bebe4a Group MSTest packages together
As per advice in https://github.com/microsoft/testfx/issues/895#issuecomment-870457008
2021-06-29 13:15:57 +02:00
Renovate Bot
6810cbebc8 Update ASF-ui commit hash to 0df7ec8 2021-06-29 02:56:58 +00:00
ArchiBot
d71dc045a3 Automatic translations update 2021-06-29 02:10:04 +00:00
Archi
b7d98d1739 Update renovate.json 2021-06-29 00:12:41 +02:00
Archi
a38dea80e9 Downgrade MSTest.TestAdapter to 2.2.4
https://github.com/microsoft/testfx/issues/895
2021-06-29 00:11:17 +02:00
Renovate Bot
6bc903a3b1 Update dependency MSTest.TestAdapter to v2.2.5 2021-06-28 21:58:11 +00:00
Renovate Bot
f658f18920 Update ASF-ui commit hash to b788207 2021-06-28 19:50:11 +00:00
Renovate Bot
2a3f7cfc60 Update dependency MSTest.TestFramework to v2.2.5 2021-06-28 14:34:13 +00:00
Archi
bf2c1717b4 Misc logging 2021-06-27 23:18:24 +02:00
ArchiBot
da061e5d69 Automatic translations update 2021-06-27 02:13:04 +00:00
Archi
74d3efaf4b Misc 2021-06-26 14:43:20 +02:00
Archi
e824607456 Closes #2344 2021-06-26 14:12:49 +02:00
ArchiBot
c72f26500b Automatic translations update 2021-06-26 02:08:56 +00:00
Archi
1c31e2a3cc Misc 2021-06-25 20:35:17 +02:00
Archi
f3d6f92404 Correct /Api/NLog reaction to close message
https://mcguirev10.com/2019/08/17/how-to-close-websocket-correctly.html
2021-06-25 19:49:37 +02:00
Renovate Bot
ef9f6b01bc Update ASF-ui commit hash to df5bdc2 2021-06-25 15:22:32 +00:00
Renovate Bot
86c50fb5c5 Update wiki commit hash to cea2c07 2021-06-25 14:17:36 +00:00
Archi
d5a10ca7eb Misc 2021-06-25 14:43:46 +02:00
Renovate Bot
ee5874159d Update ASF-ui commit hash to 20310e6 2021-06-25 12:35:20 +00:00
Renovate Bot
b5850bc463 Update ASF-ui commit hash to 726b867 2021-06-25 02:57:02 +00:00
ArchiBot
3a1b404cdf Automatic translations update 2021-06-25 02:12:38 +00:00
Renovate Bot
4a0e0808ee Update ASF-ui commit hash to 664b71d 2021-06-24 02:36:20 +00:00
ArchiBot
ab92da5a15 Automatic translations update 2021-06-24 02:07:04 +00:00
Archi
2b41fd5983 Unify idling -> farming
We should use farm when we mean automatically playing games in order to receive card drops.
2021-06-23 23:48:48 +02:00
Archi
897e7150e2 Make reset command return back to GamesPlayedWhileIdle 2021-06-23 23:39:21 +02:00
Renovate Bot
b01d25fb28 Update ASF-ui commit hash to 8f2698f 2021-06-23 14:00:21 +00:00
Archi
abd8d41d06 Closes #2342 2021-06-23 12:51:24 +02:00
Vitaliya
f316bf7b49 Add controllers as services (#2343) 2021-06-23 12:21:01 +02:00
Renovate Bot
817d3da1b6 Update ASF-ui commit hash to 6593eb0 2021-06-23 02:07:43 +00:00
Renovate Bot
b79a87463f Update ASF-ui commit hash to 49c42b6 2021-06-22 02:35:18 +00:00
Renovate Bot
8fb0cbc5bf Update ASF-ui commit hash to f7f71e2 2021-06-21 23:42:13 +00:00
Archi
165d8622df Update .gitignore 2021-06-22 00:28:00 +02:00
Archi
ff4e9aa22a Use more appropriate exception 2021-06-21 23:58:03 +02:00
Archi
2c9d131ceb Actually throw on invalid input
Handling duplicates is fine, but this is userspace error
2021-06-21 23:56:49 +02:00
Archi
2cee5e442f Add extra bulltetproofing to AH's PlayGames()
We don't want to ever have duplicates there, even if userspace supplies them (which should never happen)
2021-06-21 23:51:26 +02:00
Archi
db3d4e465d Include more helpful output for Play() Bot action 2021-06-21 23:38:02 +02:00
Archi
6a8e48fd38 Optimize UrlGetToBinary() method 2021-06-21 23:20:32 +02:00
Archi
ed10eee974 Improve ASF codebase 2021-06-21 22:45:18 +02:00
Archi
c76decda35 Improve ASF codebase 2021-06-21 22:07:35 +02:00
Archi
b083587d46 Bump 2021-06-21 20:48:23 +02:00
Archi
6320657aee Correct MaxMessageBytesForLimitedAccounts
Thanks @Ryzhehvost
2021-06-21 20:06:55 +02:00
Renovate Bot
cb0cf03739 Update ASF-ui commit hash to 8f1aa00 2021-06-21 16:32:28 +00:00
Archi
d01a26e48a OS: Add FreeBSD support inside ASF code
#2129
2021-06-21 11:47:20 +02:00
Renovate Bot
a355c1a4ba Update ASF-ui commit hash to d8a29d4 2021-06-21 03:07:19 +00:00
ArchiBot
e5c69a7786 Automatic translations update 2021-06-21 02:17:15 +00:00
Renovate Bot
38e164e41a Update ASF-ui commit hash to c2fb776 2021-06-20 17:49:23 +00:00
Archi
38dc1730ab Misc 2021-06-20 13:44:04 +02:00
Renovate Bot
97c99da204 Update ASF-ui commit hash to b0fee5a 2021-06-20 03:03:30 +00:00
Archi
7f3ddcddcc Remove debugging leftovers 2021-06-19 17:18:00 +02:00
Renovate Bot
7bc584c520 Update ASF-ui commit hash to 2d88de2 2021-06-19 02:46:23 +00:00
ArchiBot
f9dd40c2c6 Automatic translations update 2021-06-19 02:16:40 +00:00
Renovate Bot
747f3cbd90 Update ASF-ui commit hash to e200206 2021-06-18 23:58:30 +00:00
Archi
cca2ab4174 Misc 2021-06-18 23:29:27 +02:00
Archi
346ed72fc7 Enable new storage functionality for plugins usage 2021-06-18 23:27:51 +02:00
Archi
398c93e9b7 Closes #2337 2021-06-18 20:56:32 +02:00
Łukasz Domeradzki
2aab56b775 Rewrite SendMessage() functions to account for new rate-limits (#2335)
* Rewrite SendMessage() functions to account for new rate-limits

* Refactor new message splitting logic into SteamChatMessage.cs

This makes it ready for unit tests

* Change the concept into UTF8-oriented logic

* Misc

* Add fix for another unit test

* Update

* Fix failing test

I SPENT HOURS ON THIS

* Misc

* Misc

* Add additional unit tests ensuring this works as designed

* Misc

* Misc

* Add one more unit test

* Rework the logic to account for new findings

* Misc

* Add unit test verifying exception on too long prefix

* Address first @Abrynos concern

Because we can

* Throw also on too long prefix in regards to newlines

* Correct wrong bytesRead calculation

This worked previously only because we actually never had enough of room for escaped chars anyway and skipped over (2 + 2 missing bytes was smaller than 5 required to make a line)

* Add unit test verifying if calculation was done properly

* Address @Ryzhehvost concern

* Handle empty newlines in the message properly

* Misc

No reason to even calculate utf8 bytes for empty lines

* Misc

* Add unit test verifying the reserved escape message bytes count

* Correct calculation of lines by taking into account \r

* Update ArchiSteamFarm/Steam/Bot.cs

Co-authored-by: Sebastian Göls <6608231+Abrynos@users.noreply.github.com>

* @Abrynos next time check if it compiles without warnings

* Update SteamChatMessage.cs

* Apply @Abrynos idea in a different way

* Rewrite bot part to remove unnecessary delegate

* Add @Ryzhehvost test

* Add debug output

* Extend @Ryzhehvost test for prefix

* Misc

* Misc refactor

* Misc

* Misc

* Add logic for limited accounts, correct for unlimited

Thanks @Ryzhehvost

* Misc

Co-authored-by: Sebastian Göls <6608231+Abrynos@users.noreply.github.com>
2021-06-18 19:50:14 +02:00
Archi
4367134380 Bump 2021-06-18 12:20:14 +02:00
Archi
0a0497ccaf Add Steam Summer Sale 2021 to SalesBlacklist 2021-06-17 20:03:43 +02:00
Renovate Bot
49faa357a9 Update ASF-ui commit hash to 0d3ed86 2021-06-17 12:17:56 +00:00
ArchiBot
640f7be017 Automatic translations update 2021-06-17 02:13:47 +00:00
ArchiBot
e089d1692e Automatic translations update 2021-06-16 02:15:56 +00:00
Renovate Bot
c52483f66c Update ASF-ui commit hash to 80c3516 2021-06-15 23:54:49 +00:00
Archi
b64eec8def Misc for netf
Doesn't make sense to check further if index points to the end of the string, this also handles previous check
2021-06-16 00:48:28 +02:00
Archi
47813a0eb6 Misc
In very unlikely situation where something other than our executable would reference our code, version and module of SharedInfo should refer to ASF code, not that executable.
2021-06-15 13:11:27 +02:00
Archi
edf46c0ff4 Misc: copyright notice on program startup 2021-06-15 13:10:45 +02:00
Renovate Bot
dcb0ec8c7b Update ASF-ui commit hash to fb1ad2f 2021-06-15 04:19:42 +00:00
Renovate Bot
0303b7e4f2 Update ASF-ui commit hash to f1bd804 2021-06-15 02:48:46 +00:00
Renovate Bot
a662d517a2 Update ASF-ui commit hash to 2a3fd2e 2021-06-14 03:12:35 +00:00
ArchiBot
e23cfb3a9c Automatic translations update 2021-06-14 02:16:34 +00:00
Renovate Bot
083c527b42 Update ASF-ui commit hash to e2c7a7b 2021-06-13 23:35:57 +00:00
Archi
05d45bb8cd Misc 2021-06-14 00:32:23 +02:00
Renovate Bot
74d834cd40 Update ASF-ui commit hash to d40bb84 2021-06-13 18:43:45 +00:00
Renovate Bot
1defef4fd3 Update wiki commit hash to f8c404e 2021-06-13 11:45:44 +00:00
Renovate Bot
81bbfaadc2 Update ASF-ui commit hash to 511b0f9 2021-06-13 09:12:01 +00:00
Renovate Bot
c6ff4cf5db Update ASF-ui commit hash to 41888bc 2021-06-13 02:59:22 +00:00
ArchiBot
d71a40fbf3 Automatic translations update 2021-06-13 02:15:49 +00:00
Renovate Bot
772b87ca18 Update ASF-ui commit hash to 01132bc 2021-06-12 23:39:35 +00:00
Renovate Bot
eb732e30ee Update ASF-ui commit hash to 9af2714 2021-06-12 02:44:37 +00:00
ArchiBot
eefc5a2b07 Automatic translations update 2021-06-12 02:11:17 +00:00
Renovate Bot
1cd32a88d8 Update ASF-ui commit hash to b11f603 2021-06-11 08:56:29 +00:00
Renovate Bot
12e81619d6 Update ASF-ui commit hash to 69ad7e2 2021-06-11 03:43:50 +00:00
Renovate Bot
9f1cfaa8b3 Update ASF-ui commit hash to a373206 2021-06-10 23:24:15 +00:00
Renovate Bot
b5b7dcfbd2 Update dependency Markdig.Signed to v0.25.0 2021-06-10 08:07:15 +00:00
Renovate Bot
ab0470dc0f Update ASF-ui commit hash to 2cf02e0 2021-06-10 03:45:46 +00:00
ArchiBot
977dfc55cc Automatic translations update 2021-06-10 02:22:27 +00:00
Renovate Bot
865e4473ad Update ASF-ui commit hash to ecae823 2021-06-09 04:14:07 +00:00
ArchiBot
3517edaa8f Automatic translations update 2021-06-09 02:23:53 +00:00
Renovate Bot
abe7bdb635 Update ASF-ui commit hash to ec4debf 2021-06-08 04:54:51 +00:00
ArchiBot
658e7c21b1 Automatic translations update 2021-06-08 02:33:18 +00:00
Renovate Bot
7435007093 Update ASF-ui commit hash to 7fb41cb 2021-06-08 01:34:41 +00:00
Renovate Bot
259476de4a Update ASF-ui commit hash to 88c55dc 2021-06-07 20:09:24 +00:00
Renovate Bot
fc86bd3b5e Update dependency Humanizer to v2.11.10 2021-06-07 18:22:27 +00:00
Renovate Bot
cbdc6b43c3 Update ASF-ui commit hash to 6383433 2021-06-07 15:39:52 +00:00
Renovate Bot
1bd753dfd5 Update ASF-ui commit hash to 15ad021 2021-06-07 13:50:51 +00:00
Archi
84d18874a2 Avoid saving the same content in SerializableFile calls
Normally this should not matter and it does not, but https://github.com/JustArchiNET/ASF-ui/pull/1409#issuecomment-855873098 highlighted a potential enhancement idea in which the caller requests ASF to save the same content as currently exists. Since write operation could emit unnecessary event which forces ASF to start/stop/restart bot/process, I believe that it's justified to add a read operation in front of it to ensure that the file actually needs to be written over.
2021-06-07 14:34:15 +02:00
Renovate Bot
8e4e0fbbee Update ASF-ui commit hash to 80c6d10 2021-06-07 04:11:27 +00:00
ArchiBot
d8e3f66641 Automatic translations update 2021-06-07 02:39:35 +00:00
Renovate Bot
3f87d6fed8 Update ASF-ui commit hash to 77b6a13 2021-06-06 04:41:19 +00:00
ArchiBot
36a7e1f1fe Automatic translations update 2021-06-06 02:37:40 +00:00
Renovate Bot
e3a38adf33 Update ASF-ui commit hash to 9ce616a 2021-06-05 23:19:46 +00:00
Renovate Bot
747537180a Update ASF-ui commit hash to 82a65c1 2021-06-05 16:26:17 +00:00
Renovate Bot
278fac6cbc Update ASF-ui commit hash to 9305fb7 2021-06-05 14:17:35 +00:00
Renovate Bot
e3066d5742 Update ASF-ui commit hash to 19c84fb 2021-06-05 04:24:26 +00:00
ArchiBot
817096b70f Automatic translations update 2021-06-05 02:39:04 +00:00
Renovate Bot
dd9be6c336 Update wiki commit hash to b4dd70b 2021-06-04 15:26:19 +00:00
Archi
dae10747a3 CI: Change cron for translations 2021-06-04 12:46:24 +02:00
Renovate Bot
f2bdf8bc05 Update ASF-ui commit hash to a45a508 2021-06-04 05:28:59 +00:00
ArchiBot
1ca6debef5 Automatic translations update 2021-06-04 02:59:47 +00:00
Archi
535e6fb334 STD: Explicitly refuse to initialize upon any config parsing issue 2021-06-03 12:58:15 +02:00
Archi
844b6fa796 Bump 2021-06-03 12:29:57 +02:00
Archi
31a06a8af3 STD: Fix wrong logic interpreting custom config 2021-06-03 11:51:11 +02:00
ArchiBot
06b564e2d1 Automatic translations update 2021-06-03 03:13:13 +00:00
Renovate Bot
11436af1ad Update ASF-ui commit hash to 35ae3a9 2021-06-02 23:40:14 +00:00
Archi
e05ff83bee Revert "CI: Add os to the matrix of docker-ci.yml"
This reverts commit 0152e4e918.
2021-06-03 01:35:50 +02:00
Archi
0152e4e918 CI: Add os to the matrix of docker-ci.yml
Publish jobs won't have those as it's pointless for them to build and throw away the result, that's what CI is for
2021-06-03 01:30:40 +02:00
Archi
aab6b9cb5c CI: Use parallel jobs in a matrix for docker-ci 2021-06-03 01:22:39 +02:00
Renovate Bot
118434acb1 Update wiki commit hash to 8bf324a 2021-06-02 13:34:37 +00:00
ArchiBot
ac573c073d Automatic translations update 2021-06-02 03:16:09 +00:00
Renovate Bot
6f5c713664 Update ASF-ui commit hash to 6bc51c7 2021-06-01 18:38:49 +00:00
Renovate Bot
037ec1175a Update ASF-ui commit hash to f49cc02 2021-06-01 08:08:38 +00:00
ArchiBot
010f5ffcdf Automatic translations update 2021-06-01 03:16:20 +00:00
Renovate Bot
8139886427 Update ASF-ui commit hash to e99da07 2021-05-31 13:26:11 +00:00
Łukasz Domeradzki
791d48f94b Remove link to GitHub issues from support
Not making it clickable decreases chance of invalid issues posted!
2021-05-31 15:22:15 +02:00
Renovate Bot
77d8105912 Update ASF-ui commit hash to 8afa332 2021-05-31 05:34:51 +00:00
ArchiBot
91f64c52d8 Automatic translations update 2021-05-31 03:13:11 +00:00
Renovate Bot
888caef3ba Update wiki commit hash to d63288f 2021-05-30 16:50:29 +00:00
Archi
df8967b79d Update Strings.Designer.cs 2021-05-30 17:21:43 +02:00
Archi
2c2ee38f57 Correct BotPointsBalance string 2021-05-30 17:21:18 +02:00
Archi
90e4d93c5c Bump 2021-05-30 17:18:21 +02:00
Archi
7e75e4c8ab Misc 2021-05-30 17:12:39 +02:00
Archi
299f2ef934 Close V5.1.0 release with one more breaking change
Technically I don't agree with R# about EResultResponse, neither the roslyn analyzers, but I also don't see a reason why it couldn't be just ResultResponse as suggested.
2021-05-30 17:05:43 +02:00
Archi
ae9f3bd380 Post-cleanup after #2330 2021-05-30 17:02:58 +02:00
Chr_
ad9a0d6768 Commands added: (#2330)
* add `BotPointsBalance` strings

* add command `points`

* Merge branch 'main' of https://github.com/chr233/ArchiSteamFarm into main

* reset changes to `ResponseRedeem` by mistake

* fix code style
GetPointsBalance now returns `uint` instead of `int`

* fix code style

* fix code style
2021-05-30 16:42:08 +02:00
Renovate Bot
2eaa5e785f Update ASF-ui commit hash to 33e8d49 2021-05-30 07:27:17 +00:00
ArchiBot
da615677c0 Automatic translations update 2021-05-30 03:11:15 +00:00
Renovate Bot
a65e93ed8c Update ASF-ui commit hash to 314fe7e 2021-05-29 23:32:25 +00:00
Renovate Bot
62f5cb47b9 Update ASF-ui commit hash to d679fd2 2021-05-29 20:26:42 +00:00
Archi
5a29903dc8 Bump 2021-05-29 21:11:02 +02:00
Archi
93af13ec47 I missed one call 2021-05-29 21:10:18 +02:00
Archi
ddfb498a82 Bump 2021-05-29 21:06:25 +02:00
Archi
4a9c8b59d6 Add workaround for https://github.com/SteamRE/SteamKit/pull/992 2021-05-29 21:04:13 +02:00
Renovate Bot
5175fad5e2 Update ASF-ui commit hash to 2a5ff5e 2021-05-29 13:18:18 +00:00
Renovate Bot
4d462e617e Update ASF-ui commit hash to e6c933e 2021-05-29 08:14:05 +00:00
Renovate Bot
70084d2f77 Update ASF-ui commit hash to 8008301 2021-05-29 04:37:12 +00:00
ArchiBot
fa8fbee67f Automatic translations update 2021-05-29 03:07:16 +00:00
Renovate Bot
38374e51d8 Update ASF-ui commit hash to 7c9ac99 2021-05-29 01:09:12 +00:00
ArchiBot
60f459f923 Automatic translations update 2021-05-28 03:02:27 +00:00
Renovate Bot
3a3cf4eb7f Update ASF-ui commit hash to 93e0caa 2021-05-28 00:33:02 +00:00
Renovate Bot
634e0d8066 Update ASF-ui commit hash to 7c5c995 2021-05-27 14:48:00 +00:00
Archi
1564d6dcfa Update .editorconfig 2021-05-27 15:48:32 +02:00
Archi
976e0e2900 Improve editorconfig for EPascalCase and misc 2021-05-27 15:46:57 +02:00
ArchiBot
ec66a15317 Automatic translations update 2021-05-27 02:56:28 +00:00
Renovate Bot
6a897de9b6 Update dependency MSTest.TestFramework to v2.2.4 2021-05-26 07:23:19 +00:00
Renovate Bot
03c0d083be Update ASF-ui commit hash to 8f7b19a 2021-05-26 03:24:27 +00:00
ArchiBot
552652b5bb Automatic translations update 2021-05-26 02:47:42 +00:00
Renovate Bot
8c9d98d0fc Update dependency MSTest.TestAdapter to v2.2.4 2021-05-25 23:54:01 +00:00
Renovate Bot
f435f32ed5 Update dependency Microsoft.NET.Test.Sdk to v16.10.0 2021-05-25 20:22:52 +00:00
Renovate Bot
0ad732cc57 Update ASF-ui commit hash to 84f0883 2021-05-25 04:20:29 +00:00
ArchiBot
716acb0468 Automatic translations update 2021-05-25 02:42:38 +00:00
Archi
1de63f6d00 Correct run.sh
Why do I always have to screw up things
2021-05-25 00:33:55 +02:00
Archi
910af8242c Bump 2021-05-25 00:17:53 +02:00
Archi
59ae27c0d0 Avoid even asking for login keys if it's not needed
ASF is already smart enough to not >use< a login key when it's not needed, but the sole fact of asking for it might screw up Valve's backend and in result cause issues for the client, totally for no reason, as we're not going to use it anyway.

The original idea was to keep it around "just in case" if the user removed his password or 2FA, but that is completely moot the moment we realize the alone fact of that bool property being set can cause the problems.

Login keys should only be used if both:
a) User left it enabled in the config
b) We can't guarantee all the details during login procedure, that is mainly a missing password in the config and/or lack of ASF 2FA. We're not going to enhance the logic for completely insecure accounts as they should opt into SteamGuard or 2FA ASAP, making the login key needed.

Also fix setter visibility for BotConfig while at it, if plugins want to set those properties themselves, they have Bot.SetUserInput() function instead.
2021-05-25 00:08:16 +02:00
Renovate Bot
eb9e864f38 Update ASF-ui commit hash to 728ec4d 2021-05-24 15:50:25 +00:00
Archi
54445474e5 CI: Use GITHUB_TOKEN instead of GH_PACKAGES_PAT
It was not possible previously, but it should be now: https://docs.github.com/en/packages/working-with-a-github-packages-registry/migrating-to-the-container-registry-from-the-docker-registry#authenticating-to-the-container-registry
2021-05-24 10:25:47 +02:00
ArchiBot
f1de87e719 Automatic translations update 2021-05-24 02:39:33 +00:00
Renovate Bot
f6355a1c62 Update ASF-ui commit hash to 41dac15 2021-05-24 00:41:43 +00:00
Renovate Bot
7e7dcb64f4 Update ASF-ui commit hash to cfee590 2021-05-23 20:57:29 +00:00
Renovate Bot
0cf22e5759 Update ASF-ui commit hash to 483512a 2021-05-23 15:04:37 +00:00
Archi
adb85b71f6 Bump 2021-05-23 16:41:17 +02:00
Łukasz Domeradzki
b2300a6458 Update CONTRIBUTING.md 2021-05-23 16:32:13 +02:00
Archi
68baaae614 Misc 2021-05-23 14:41:22 +02:00
Archi
20629e008a Update config.yml 2021-05-23 14:39:24 +02:00
Archi
b0186341e4 Update issue templates 2021-05-23 14:38:39 +02:00
Archi
57265e902c Update CONTRIBUTING.md 2021-05-23 13:59:34 +02:00
Archi
4e9324ff9f Update CONTRIBUTING.md 2021-05-23 13:57:42 +02:00
ArchiBot
b834261b88 Automatic translations update 2021-05-23 02:40:11 +00:00
Renovate Bot
f27467b2e4 Update ASF-ui commit hash to adfeef8 2021-05-22 22:17:45 +00:00
Archi
027347aee0 Update issue templates 2021-05-22 22:27:24 +02:00
Archi
817b818dfd Update renovate.json 2021-05-22 22:01:35 +02:00
Archi
4bec13b175 Use default Api route for controllers that do not declare one
We don't have any like that, but third-party plugins might
2021-05-22 21:25:20 +02:00
Archi
a75f160ada Second SLN cleanup 2021-05-22 19:57:33 +02:00
Archi
ff212683c9 SLN cleanup
The removed section does not exist in dotnet new sln
2021-05-22 19:54:21 +02:00
Archi
14c8e60ea9 Two more 2021-05-22 19:45:56 +02:00
Archi
fe43aa6cb6 Convert UTF-8 BOM to files to UTF-8 2021-05-22 19:45:27 +02:00
Archi
fb20108de3 AppVeyor: Remove dotnet clean, as it's not needed 2021-05-22 19:10:19 +02:00
Archi
a30ed27268 Update DH short description automatically as well 2021-05-22 18:47:03 +02:00
Archi
125f073eef Misc 2021-05-22 17:11:51 +02:00
Archi
6b0058cea5 Final touches 2021-05-22 17:06:22 +02:00
ArchiBot
a692c32d8f Automatic translations update 2021-05-22 14:33:11 +00:00
Archi
199f7862bd Update translations.yml 2021-05-22 16:32:13 +02:00
Archi
991e78d985 Remove gpgsign for pushes as GitHub doesn't support it 2021-05-22 16:22:47 +02:00
Archi
e8136490c8 Closes #2327
In addition to that change the cron and remove localization to test this in a second
2021-05-22 16:18:19 +02:00
Renovate Bot
c9c33de266 Update ASF-ui commit hash to c2a6f3e 2021-05-22 10:26:31 +00:00
Renovate Bot
d7771e89da Update ASF-ui commit hash to 6de10f4 2021-05-22 04:35:48 +00:00
GitHub Action
bcd0f802a9 Automatic translations update 2021-05-22 02:32:53 +00:00
Renovate Bot
84298cacb3 Update ASF-ui commit hash to 76c0f24 2021-05-22 00:11:25 +00:00
Renovate Bot
b80d750a35 Update ASF-ui commit hash to 3e63f6a 2021-05-21 05:50:14 +00:00
GitHub Action
14102416b5 Automatic translations update 2021-05-21 02:33:34 +00:00
Renovate Bot
9467bc1d41 Update wiki commit hash to f0bfd5b 2021-05-20 23:56:41 +00:00
Archi
795af015af CI: Supply STD token to docker-ci
This allows to verify that STD plugin also builds, normally we skip it when token is not provided (for a reason)
2021-05-21 01:05:59 +02:00
Archi
c73a12bf49 Speed up docker builds
That dotnet clean is not needed here, and building STD plugin when not having a token is stupid
2021-05-21 00:30:16 +02:00
Archi
10ba141a80 Bump 2021-05-21 00:07:03 +02:00
Archi
0159a918cd CI: Extract docker platforms to env variable 2021-05-20 23:47:22 +02:00
Archi
feb73a94aa Misc dockerfile update 2021-05-20 23:36:25 +02:00
Łukasz Domeradzki
8c4a0d7f06 Workflow enhancements (#2326)
1. Split publish part of ci.yml into independent publish.yml action (run on the same schedule)
2. Add docker-ci.yml without pushing capability on the same schedule as ci
2021-05-20 23:36:02 +02:00
Archi
bdf541b058 Implement --no-config-migrate option 2021-05-20 22:42:30 +02:00
Renovate Bot
039ea6038a Update ASF-ui commit hash to 250360f 2021-05-20 15:12:56 +00:00
Renovate Bot
9b30df620f Update ASF-ui commit hash to 0049e2e 2021-05-20 04:00:16 +00:00
GitHub Action
b3c7480c22 Automatic translations update 2021-05-20 02:31:28 +00:00
Archi
2012994f28 Empty commit to sign ASF repo with GPG 2021-05-19 12:41:07 +02:00
JustArchi
0b64979f92 Update FUNDING.yml 2021-05-19 11:46:58 +02:00
JustArchi
2d0e3b84d5 Update readme and release template 2021-05-19 11:45:25 +02:00
Renovate Bot
aac181ac53 Update ASF-ui commit hash to 4780904 2021-05-19 04:06:37 +00:00
GitHub Action
f8257c953c Automatic translations update 2021-05-19 02:30:39 +00:00
Renovate Bot
9fa1521555 Update wiki commit hash to 64aa147 2021-05-18 19:14:10 +00:00
GitHub Action
97f3ccda8d Automatic translations update 2021-05-18 02:34:20 +00:00
Renovate Bot
10cb329330 Update ASF-ui commit hash to dc650a6 2021-05-17 23:56:01 +00:00
Renovate Bot
4871f06d18 Update ASF-ui commit hash to 7c671a9 2021-05-17 17:41:27 +00:00
GitHub Action
4d0597ef32 Automatic translations update 2021-05-17 02:34:01 +00:00
Renovate Bot
e163d33419 Update wiki commit hash to 43f8a6c 2021-05-16 22:51:46 +00:00
Renovate Bot
96d68a015a Update wiki commit hash to 7cd7038 2021-05-16 19:54:12 +00:00
Renovate Bot
255b872180 Update ASF-ui commit hash to a595dce 2021-05-16 17:28:38 +00:00
JustArchi
cd0f64ec80 Create ASF_512x512.png
For discord usage
2021-05-16 15:44:55 +02:00
JustArchi
7d88fb9da2 Create ASF_184x184.jpg
For Steam group, generated with:

convert ASF.psd[0] -resize 184x184 -background black -flatten ASF_184x184.jpg

Then ran through jpegoptim:

jpegoptim -s -o ASF_184x184.jpg
2021-05-16 15:38:44 +02:00
JustArchi
0bab0fde53 Compress remaining 3 images
optipng -strip all -o7 -zm1-9
2021-05-16 15:11:14 +02:00
JustArchi
daed49a61d Compress ASF.ico
I've generated this one with:

convert ASF.psd -define icon:auto-resize=16,32,48,256 -define png:compression-level=9 +compress ASF.ico
2021-05-16 14:59:22 +02:00
GitHub Action
1220435fdd Automatic translations update 2021-05-16 02:36:43 +00:00
Renovate Bot
64af1c7094 Update wiki commit hash to 238145f 2021-05-15 21:44:23 +00:00
JustArchi
5644cf0353 Correct build/run scripts for osx compatibility 2021-05-15 23:37:52 +02:00
JustArchi
b06deaa149 chmod +x 2021-05-15 23:31:46 +02:00
JustArchi
8559604332 Correct scripts for osx compatibility 2021-05-15 23:31:16 +02:00
JustArchi
e25f0a371e Bump 2021-05-15 22:37:30 +02:00
Renovate Bot
a1381ac09f Update ASF-ui commit hash to a52a9aa 2021-05-15 17:40:43 +00:00
Renovate Bot
94f105bb51 Update ASF-ui commit hash to d63d9cc 2021-05-15 06:56:19 +00:00
GitHub Action
0c045feac5 Automatic translations update 2021-05-15 02:30:56 +00:00
Renovate Bot
52f4cd58f4 Update dependency NLog to v4.7.10 2021-05-14 13:22:30 +00:00
Renovate Bot
abe75d3006 Update ASF-ui commit hash to 8ca704a 2021-05-14 10:05:51 +00:00
GitHub Action
5ddf049ec4 Automatic translations update 2021-05-14 02:33:37 +00:00
Renovate Bot
170df72ced Update ASF-ui commit hash to 5e3512f 2021-05-13 20:55:25 +00:00
GitHub Action
9517f60d98 Automatic translations update 2021-05-13 02:33:16 +00:00
Renovate Bot
f26377b00b Update ASF-ui commit hash to 7f5b1e3 2021-05-12 22:25:36 +00:00
GitHub Action
797ac9c0e9 Automatic translations update 2021-05-12 02:29:09 +00:00
JustArchi
00c217959d Rename FarmNonRefundableGamesOnly to SkipRefundableGames 2021-05-11 23:14:33 +02:00
JustArchi
e5872156c3 Add support for custom encodings 2021-05-11 23:10:16 +02:00
JustArchi
73c8321486 Bump 2021-05-11 19:19:07 +02:00
Renovate Bot
2d46dd56de Update ASF-ui commit hash to dcac08c 2021-05-11 10:22:55 +00:00
GitHub Action
d484d563da Automatic translations update 2021-05-11 02:28:12 +00:00
Renovate Bot
72bcd99106 Update wiki commit hash to 5194788 2021-05-10 22:28:18 +00:00
Renovate Bot
061959ab75 Update ASF-ui commit hash to a3e5179 2021-05-10 21:03:48 +00:00
Renovate Bot
16953abfa7 Update ASF-ui commit hash to e69eba8 2021-05-10 17:50:22 +00:00
Renovate Bot
95ab5bd26f Update wiki commit hash to 317ad7e 2021-05-10 15:50:12 +00:00
GitHub Action
e4f093d853 Automatic translations update 2021-05-10 02:29:35 +00:00
Renovate Bot
a1e2232fea Update ASF-ui commit hash to 7944c1b 2021-05-09 17:48:27 +00:00
JustArchi
8f41e90ade STD: Api V2 2021-05-09 18:59:17 +02:00
JustArchi
14f4a9f58d Move appveyor.yml to .github directory 2021-05-09 18:35:46 +02:00
Renovate Bot
d732b40810 Update ASF-ui commit hash to 8be8931 2021-05-09 12:41:33 +00:00
JustArchi
1f12c73b2e Do not throw InvalidOperationException on null Config
Lack of config will happen e.g. with invalid submission token, the plugin should not crash in this case, even if it's unusable.
2021-05-09 13:56:59 +02:00
JustArchi
40b3f35177 Do not restart the PICS cache on empty apps and packages
As suggested by @xPaw
2021-05-09 13:47:24 +02:00
JustArchi
5b5d62d1e8 Move crowdin.yml to .github directory 2021-05-09 13:40:00 +02:00
JustArchi
5a5a4462f8 Delete dependabot.yml.off 2021-05-09 13:20:50 +02:00
GitHub Action
e31f2d0e40 Automatic translations update 2021-05-09 02:26:58 +00:00
Renovate Bot
5918c13050 Update ASF-ui commit hash to d2eac09 2021-05-09 00:24:44 +00:00
JustArchi
b069bd3ecc Remove packages lock
Maybe it'd be a nice feature if it worked for once
2021-05-09 02:07:45 +02:00
JustArchi
04f3507b91 Fix the packages lock (?) 2021-05-09 02:02:28 +02:00
JustArchi
33643bcaf2 CI: Add support for lock files 2021-05-09 01:57:49 +02:00
JustArchi
e146db732c Misc 2021-05-09 00:05:40 +02:00
JustArchi
a38aa8511a CI: Simplify the flow 2021-05-09 00:00:02 +02:00
JustArchi
5edfaa9840 IPC: true is the new default 2021-05-08 23:44:36 +02:00
JustArchi
44e6a97509 Bump 2021-05-08 23:34:46 +02:00
JustArchi
2d969758f6 Add auto-migration of global config, remove unnecessary delay 2021-05-08 23:23:34 +02:00
JustArchi
55cd466a1e Use simplified logic also for global config 2021-05-08 22:21:50 +02:00
JustArchi
64b9aa409e Correct migration logic 2021-05-08 22:19:27 +02:00
JustArchi
bf89c005d7 Refactor a few bot config properties, add auto-migration 2021-05-08 22:00:25 +02:00
Renovate Bot
bf6f4b8362 Update ASF-ui commit hash to ca69b1c 2021-05-08 11:04:31 +00:00
JustArchi
fda60037bb Further refactor 2021-05-08 12:49:46 +02:00
GitHub Action
590e044391 Automatic translations update 2021-05-08 02:26:37 +00:00
JustArchi
8ffdd8bca0 Remove obsolete property 2021-05-08 01:49:06 +02:00
JustArchi
d21d2473fe RuntimeCompatibility -> Compatibility 2021-05-08 01:43:08 +02:00
JustArchi
e60b54e402 Refactor EVERYTHING
Directories structure + namespaces relevant to them
2021-05-08 01:37:22 +02:00
JustArchi
cbabde1b38 Reorganize Web directory 2021-05-08 01:03:08 +02:00
JustArchi
2f96ae9e8f Correct host of the AWH requests 2021-05-08 00:42:17 +02:00
JustArchi
5ea6a167e4 Add --no-analysis to cc.sh 2021-05-08 00:17:27 +02:00
JustArchi
daf37c723c Document all the pragmas, final code corrections 2021-05-07 23:56:45 +02:00
JustArchi
8605c71f81 Resolve CA5394 2021-05-07 23:12:58 +02:00
JustArchi
bc74c69ac5 Resolve CA5392 2021-05-07 23:04:50 +02:00
JustArchi
69a12fadcf Resolve CA5389 2021-05-07 22:57:59 +02:00
JustArchi
89d41e7cb3 Resolve CA3075 2021-05-07 21:32:09 +02:00
JustArchi
64bbfa19cd Resolve 3012 2021-05-07 21:15:20 +02:00
JustArchi
462b720d89 Resolve CA3003 2021-05-07 21:10:00 +02:00
JustArchi
48922300d0 Implement security hardening for IsValidBotName()
And add missing support on netf for it...
2021-05-07 20:22:23 +02:00
JustArchi
e7537ca996 Resolve CA2002 2021-05-07 19:04:38 +02:00
JustArchi
809a4bbfbf Resolve CA2000 2021-05-07 18:55:50 +02:00
JustArchi
1661cf4be9 Resolve CA1823 2021-05-07 18:10:51 +02:00
JustArchi
4a91b997a2 Resolve CA1812 2021-05-07 18:02:21 +02:00
JustArchi
804008a5d1 Resolve CA1819 2021-05-07 17:14:22 +02:00
JustArchi
90ff43dc98 Resolve CA1508 2021-05-07 16:49:02 +02:00
JustArchi
377df12924 Resolve CA1308 2021-05-07 16:30:57 +02:00
JustArchi
04ff460d69 Resolve CA1307 2021-05-07 15:59:06 +02:00
GitHub Action
a3d352c64d Automatic translations update 2021-05-07 02:27:06 +00:00
Renovate Bot
79a9a4e7c5 Update ASF-ui commit hash to cc48b49 2021-05-06 23:51:00 +00:00
JustArchi
5a8e2720fa Hide info about loaded assemblies under debug option 2021-05-07 00:30:31 +02:00
JustArchi
272cd1ff29 Delete 5.0-to-5.1.md 2021-05-07 00:08:26 +02:00
JustArchi
5745e00bda Resolve CA1303 2021-05-07 00:06:03 +02:00
JustArchi
0e9b956ae9 Resolve CA1063 2021-05-06 23:45:10 +02:00
JustArchi
559fdb34c6 Resolve CA1062 2021-05-06 23:32:50 +02:00
JustArchi
9a8a61e111 Resolve CA1054 2021-05-06 22:50:59 +02:00
JustArchi
143039c584 Resolve CA1044 2021-05-06 21:18:39 +02:00
JustArchi
a8e3bd6473 Cleanup round 2021-05-06 21:00:21 +02:00
JustArchi
aed11c59ee Cleanup round 2021-05-06 20:44:17 +02:00
JustArchi
ef52e076d3 Cleanup round 2021-05-06 20:28:25 +02:00
JustArchi
b6772b9b1e Resolve CA1034 2021-05-06 20:16:06 +02:00
JustArchi
57bf294553 Resolve CA1027 2021-05-06 18:53:07 +02:00
JustArchi
93c38ff4d4 Create 5.0-to-5.1.md 2021-05-06 18:34:29 +02:00
JustArchi
65dc5def01 Resolve CA1002 2021-05-06 18:26:29 +02:00
JustArchi
3903ef0dfb Misc 2021-05-06 18:07:01 +02:00
JustArchi
c9b01910d0 Update .editorconfig 2021-05-06 17:55:09 +02:00
JustArchi
4f3aa4f8f6 Fix docker build 2021-05-06 17:20:47 +02:00
JustArchi
dfffc3384b More code inspections! 2021-05-06 17:14:03 +02:00
JustArchi
ae2713c0df .editorconfig naming rules 2021-05-06 15:48:15 +02:00
JustArchi
371bbd8ff1 .editorconfig update 2021-05-06 15:28:24 +02:00
JustArchi
efb182c5c5 Remove no-longer-needed workaround 2021-05-06 10:44:19 +02:00
GitHub Action
cbf06a359d Automatic translations update 2021-05-06 02:24:53 +00:00
Renovate Bot
150e22f302 Update dependency Humanizer to v2.10.1 2021-05-05 20:56:47 +00:00
JustArchi
c818fbedd9 Update README.md 2021-05-05 10:48:50 +02:00
GitHub Action
b51bd498cd Automatic translations update 2021-05-05 02:23:57 +00:00
Renovate Bot
9a86f6f522 Update ASF-ui commit hash to 203f57b 2021-05-04 03:43:18 +00:00
GitHub Action
3f8a715334 Automatic translations update 2021-05-04 02:26:34 +00:00
Renovate Bot
7e5943bd24 Update ASF-ui commit hash to 14263a7 2021-05-04 00:31:13 +00:00
Renovate Bot
f4d7b22441 Update wiki commit hash to 73f8864 2021-05-03 12:00:19 +00:00
JustArchi
db632145fb STD: Skip AutoGrant also when doing full resolve 2021-05-03 13:42:37 +02:00
JustArchi
eb39a081d7 STD: Implement SkipAutoGrantPackages 2021-05-03 13:20:34 +02:00
JustArchi
823f077cf2 STD: Correct extra config path 2021-05-03 12:21:00 +02:00
Renovate Bot
7f283be03a Update ASF-ui commit hash to 35067d9 2021-05-03 04:47:38 +00:00
GitHub Action
6dc5cee846 Automatic translations update 2021-05-03 02:30:04 +00:00
JustArchi
9afbcee163 STD: Add feature to skip appIDs, packageIDs and depotIDs 2021-05-03 01:08:12 +02:00
JustArchi
47184cb139 Renovate: use :automergeBranch 2021-05-03 00:28:50 +02:00
renovate[bot]
96dc24ed46 Update ASF-ui commit hash to b73cdd5 (#2322)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-05-03 00:28:08 +02:00
Renovate Bot
59e409f320 Update crowdin/github-action action to v1.1.0 2021-05-02 21:41:07 +00:00
Renovate Bot
2ba714feb6 Update wiki commit hash to 2db3100 2021-05-02 20:35:09 +00:00
Renovate Bot
6e744e0181 Update ASF-ui commit hash to c1c1501 2021-05-02 19:23:42 +00:00
renovate[bot]
c35d1be12d Configure Renovate (#2318)
* Add renovate.json

* Configure renovate.json

* Add a rule for mono support

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: JustArchi <JustArchi@JustArchi.net>
2021-05-02 20:03:54 +02:00
JustArchi
d6af1ae973 Bump 2021-05-02 19:59:46 +02:00
JustArchi
e26aec339f Catch proper exception instead 2021-05-02 19:39:41 +02:00
JustArchi
cac5d5fadb Try catching any exception 2021-05-02 19:18:46 +02:00
JustArchi
d394ba60c7 Add a workaround for lack of Humanizer support 2021-05-02 18:54:46 +02:00
JustArchi
bd82af62c6 Bump 2021-05-02 14:58:56 +02:00
JustArchi
ecec08af9f Fix docker build... 2021-05-02 14:56:30 +02:00
JustArchi
c524e003b5 Bump 2021-05-02 14:52:37 +02:00
Łukasz Domeradzki
0808a38f48 Manage package versions centrally (#2317)
Closes #2316

The issue we're facing right now comes from the fact of desynchronization of packages between different projects. Since I didn't find any way to "fix" the package versions of our plugins to the main ASF project, we'll instead use centralized Directory.packages.props which specifies appropriate versions
2021-05-02 14:51:08 +02:00
GitHub Action
8a2b0c9eea Automatic translations update 2021-05-01 02:29:25 +00:00
dependabot-preview[bot]
24ca82c526 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.1.3 to 6.1.4
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.3...v6.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-30 13:18:11 +00:00
dependabot-preview[bot]
a400ebccee Bump Swashbuckle.AspNetCore from 6.1.3 to 6.1.4
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.3...v6.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-30 12:27:22 +00:00
dependabot-preview[bot]
c7dbaa0828 Bump Swashbuckle.AspNetCore.Annotations from 6.1.3 to 6.1.4
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.3 to 6.1.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.3...v6.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-30 11:22:29 +00:00
GitHub Action
48471ca5a8 Automatic translations update 2021-04-30 02:27:13 +00:00
dependabot-preview[bot]
687021fd08 Bump ASF-ui from 9e5c7d8 to 24a750d
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `9e5c7d8` to `24a750d`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](9e5c7d866f...24a750d9db)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-30 00:33:39 +00:00
GitHub Action
a6f634cae4 Automatic translations update 2021-04-29 02:26:20 +00:00
dependabot-preview[bot]
742857832a Bump ASF-ui from 7e4f3cf to 9e5c7d8
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7e4f3cf` to `9e5c7d8`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7e4f3cf81d...9e5c7d866f)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-29 00:51:34 +00:00
dependabot-preview[bot]
3ea5efe4e2 Bump wiki from 67283b7 to ee8750c
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `67283b7` to `ee8750c`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](67283b72b3...ee8750c46a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-29 00:35:36 +00:00
dependabot-preview[bot]
e7a19e0e9f Bump Humanizer from 2.8.26 to 2.9.9
Bumps [Humanizer](https://github.com/Humanizr/Humanizer) from 2.8.26 to 2.9.9.
- [Release notes](https://github.com/Humanizr/Humanizer/releases)
- [Changelog](https://github.com/Humanizr/Humanizer/blob/main/release_notes.md)
- [Commits](https://github.com/Humanizr/Humanizer/compare/v2.8.26...v2.9.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-28 09:39:18 +00:00
GitHub Action
739b3d5a9d Automatic translations update 2021-04-28 02:29:09 +00:00
JustArchi
40a9a88f43 Bump 2021-04-27 13:25:23 +02:00
GitHub Action
fcd7848643 Automatic translations update 2021-04-27 02:28:03 +00:00
JustArchi
b70af76a5e Revert "Update links"
This reverts commit 3695335927.
2021-04-26 11:01:25 +02:00
GitHub Action
1cfc3a7c71 Automatic translations update 2021-04-26 02:31:43 +00:00
dependabot-preview[bot]
198ada7d2a Bump ASF-ui from f1738d6 to 7e4f3cf
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `f1738d6` to `7e4f3cf`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](f1738d6e54...7e4f3cf81d)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-26 00:47:51 +00:00
JustArchi
3695335927 Update links 2021-04-26 00:18:34 +02:00
JustArchi
890648e604 Update official markdowns mentioning the new support channel 2021-04-26 00:11:31 +02:00
JustArchi
9ed27b5f66 Finish STD localization 2021-04-25 23:44:47 +02:00
JustArchi
1cfa11d316 Correct Copy-Item not being recurse when expected 2021-04-25 20:52:06 +02:00
JustArchi
249e226662 Add a localization note 2021-04-25 20:09:02 +02:00
JustArchi
49c35108e5 Upload Strings.pl-PL.resx manually for testing purposes 2021-04-25 20:08:14 +02:00
JustArchi
dc5da86322 Add support for automatic commit for STD strings 2021-04-25 19:57:11 +02:00
JustArchi
857e9a140f Initialize localization strings for STD plugin 2021-04-25 19:55:30 +02:00
GitHub Action
426626e3fe Automatic translations update 2021-04-25 02:31:44 +00:00
GitHub Action
fb9616561d Automatic translations update 2021-04-24 02:28:42 +00:00
JustArchi
3c4755ab4c Remove unused string 2021-04-23 23:47:12 +02:00
GitHub Action
0349923a08 Automatic translations update 2021-04-23 02:31:06 +00:00
dependabot-preview[bot]
6a11b473ca Bump ASF-ui from 3ed4c3a to f1738d6
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3ed4c3a` to `f1738d6`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3ed4c3a032...f1738d6e54)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-23 00:35:18 +00:00
JustArchi
8248864133 Misc optimization 2021-04-23 00:25:30 +02:00
JustArchi
ac2551987a Make ResetSteamTimeDifference() more robust
Cover up for extremely rare situation when those two variables could get desynced due to reset + resolve happening at the same time
2021-04-23 00:22:54 +02:00
JustArchi
e99f3adcb5 Bump 2021-04-23 00:12:31 +02:00
JustArchi
260797b61c Fix a possibility of invalid Steam time cached 2021-04-23 00:01:25 +02:00
GitHub Action
4ecb5f55f8 Automatic translations update 2021-04-22 02:26:55 +00:00
JustArchi
2522bb2cf2 Bump 2021-04-21 23:50:57 +02:00
JustArchi
64ce7a15c4 Correct success when using waitIfNeeded with no IDs specified
We return success if we handled anything in this case
2021-04-21 23:15:20 +02:00
JustArchi
377c12e71b Make properties of Confirmation class public 2021-04-21 22:49:25 +02:00
JustArchi
cd261ff626 Enhance HandleTwoFactorAuthenticationConfirmations() function
This modification allows to retrieve all the details about confirmations that were actually handled
2021-04-21 22:44:47 +02:00
GitHub Action
8815fa32dd Automatic translations update 2021-04-21 02:27:03 +00:00
dependabot-preview[bot]
33bb981778 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.1.2 to 6.1.3
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.2...v6.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-20 12:59:10 +00:00
dependabot-preview[bot]
1b8da1971f Bump Swashbuckle.AspNetCore.Annotations from 6.1.2 to 6.1.3
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.2...v6.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-20 12:10:18 +00:00
dependabot-preview[bot]
a32e5e4f04 Bump Swashbuckle.AspNetCore from 6.1.2 to 6.1.3
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.2 to 6.1.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.2...v6.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-20 11:06:13 +00:00
GitHub Action
975cb8184d Automatic translations update 2021-04-20 02:26:13 +00:00
GitHub Action
1d142f9346 Automatic translations update 2021-04-19 02:27:21 +00:00
dependabot-preview[bot]
f10caae94e Bump ASF-ui from 0b8bba5 to 3ed4c3a
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `0b8bba5` to `3ed4c3a`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](0b8bba58bd...3ed4c3a032)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-19 00:46:00 +00:00
JustArchi
e54414477f Bump 2021-04-18 13:27:26 +02:00
Łukasz Domeradzki
171e510fbe CI: Use latest SDK once again (#2285) 2021-04-18 13:23:40 +02:00
JustArchi
f4e4ea9aed Closes #2292 2021-04-18 12:22:16 +02:00
JustArchi
a77c0d0599 Closes #2293 2021-04-18 11:58:45 +02:00
GitHub Action
9387c0f0e8 Automatic translations update 2021-04-18 02:27:33 +00:00
GitHub Action
36a9319b87 Automatic translations update 2021-04-17 02:24:13 +00:00
GitHub Action
a79e9839f8 Automatic translations update 2021-04-16 02:27:07 +00:00
dependabot-preview[bot]
a1b3710ff0 Bump ASF-ui from cc46e95 to 0b8bba5
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `cc46e95` to `0b8bba5`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](cc46e95381...0b8bba58bd)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-16 01:07:32 +00:00
dependabot-preview[bot]
6d2c32a55f Bump wiki from 4b5651a to 20285f9
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `4b5651a` to `20285f9`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](4b5651a1cd...20285f9d63)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-16 00:34:47 +00:00
GitHub Action
f6299324a8 Automatic translations update 2021-04-15 02:23:57 +00:00
GitHub Action
649ff093be Automatic translations update 2021-04-14 02:25:33 +00:00
dependabot-preview[bot]
a65e9d01f6 Bump ASF-ui from 34cc7d0 to cc46e95
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `34cc7d0` to `cc46e95`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](34cc7d01c3...cc46e95381)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-14 00:52:09 +00:00
GitHub Action
f9eb6bfcff Automatic translations update 2021-04-13 02:27:58 +00:00
dependabot-preview[bot]
fa451da923 Bump ASF-ui from 3169b1e to 34cc7d0
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3169b1e` to `34cc7d0`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3169b1e8b6...34cc7d01c3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-13 00:37:15 +00:00
GitHub Action
3bae07682f Automatic translations update 2021-04-12 02:28:52 +00:00
dependabot-preview[bot]
17d1648064 Bump ASF-ui from a041dfe to 3169b1e
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `a041dfe` to `3169b1e`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](a041dfe309...3169b1e8b6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-12 00:51:18 +00:00
JustArchi
89264d1e70 CI: Disable fail-fast
This gives precise information which OSes failed instead of the first one that did, useful for analyzing failures related to specific OS only
2021-04-11 13:27:32 +02:00
GitHub Action
ddbec692dc Automatic translations update 2021-04-11 02:28:23 +00:00
JustArchi
efec44e593 R# code improvements & cleanups 2021-04-11 00:33:32 +02:00
GitHub Action
53a06126e8 Automatic translations update 2021-04-10 02:25:45 +00:00
JustArchi
f2eb9d9b37 Bump 2021-04-10 00:10:55 +02:00
JustArchi
6f001567fc Rewrite the BadActivationCode to CannotRedeemCodeFromClient when currency is not set
This also gives feedback to the user that we're unable to redeem the key
2021-04-10 00:07:01 +02:00
JustArchi
bb21bb3cb4 Use CannotRedeemCodeFromClient error instead of BadActivationCode for unknown wallet keys redemptions
BadActivationCode doesn't signalize to the user that we tried to redeem the key but failed and Steam didn't tell us why. CannotRedeemCodeFromClient seems more appropriate because we indeed can't redeem it from client and we don't know why.
2021-04-10 00:00:23 +02:00
dependabot-preview[bot]
4b80fbaf7a Bump Swashbuckle.AspNetCore.Newtonsoft from 6.1.1 to 6.1.2
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.1...v6.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-09 19:08:20 +00:00
dependabot-preview[bot]
92e1a55583 Bump Swashbuckle.AspNetCore.Annotations from 6.1.1 to 6.1.2
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.1...v6.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-09 18:18:34 +00:00
dependabot-preview[bot]
4a8c97353d Bump Swashbuckle.AspNetCore from 6.1.1 to 6.1.2
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.1...v6.1.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-09 17:11:41 +00:00
dependabot-preview[bot]
49d85807c7 Bump ASF-ui from f1734e9 to a041dfe
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `f1734e9` to `a041dfe`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](f1734e97fe...a041dfe309)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-09 00:33:55 +00:00
GitHub Action
68b0a34d94 Automatic translations update 2021-04-08 02:30:13 +00:00
dependabot-preview[bot]
f86c07fc06 Bump ASF-ui from d70eacf to f1734e9
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `d70eacf` to `f1734e9`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](d70eacfb34...f1734e97fe)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-07 19:27:59 +00:00
FREDERICK
17141ac982 Update lol-US.png (#2279) 2021-04-07 20:40:18 +02:00
JustArchi
d3a09ebc8c CI: Switch to 5.0.201 SDK due to problems with latest 2021-04-07 20:37:38 +02:00
GitHub Action
9cd173908f Automatic translations update 2021-04-07 02:30:44 +00:00
dependabot-preview[bot]
b6445aed86 Bump JetBrains.Annotations from 2020.3.0 to 2021.1.0
Bumps JetBrains.Annotations from 2020.3.0 to 2021.1.0.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-06 09:00:18 +00:00
GitHub Action
9d3c816950 Automatic translations update 2021-04-06 03:15:13 +00:00
dependabot-preview[bot]
f3baf7101f Bump ASF-ui from 62e94fb to d70eacf
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `62e94fb` to `d70eacf`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](62e94fb92f...d70eacfb34)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-06 00:32:47 +00:00
JustArchi
a07403a8af Misc cron change 2021-04-05 12:49:52 +02:00
GitHub Action
5f2dc48dac Automatic translations update 2021-04-05 10:45:30 +00:00
dependabot-preview[bot]
a5d06a406f Bump ASF-ui from 93acdb9 to 62e94fb
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `93acdb9` to `62e94fb`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](93acdb97aa...62e94fb92f)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-05 00:40:29 +00:00
GitHub Action
4033874a67 Automatic translations update 2021-04-04 02:23:42 +00:00
GitHub Action
e9afd0ea5b Automatic translations update 2021-04-03 02:21:31 +00:00
GitHub Action
f526d0f94a Automatic translations update 2021-04-02 02:27:00 +00:00
dependabot-preview[bot]
de8a83347e Bump Microsoft.NET.Test.Sdk from 16.9.1 to 16.9.4
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 16.9.1 to 16.9.4.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Commits](https://github.com/microsoft/vstest/compare/v16.9.1...v16.9.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-02 01:23:25 +00:00
dependabot-preview[bot]
9b6b4fd690 Bump ASF-ui from 206f1f5 to 93acdb9
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `206f1f5` to `93acdb9`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](206f1f5883...93acdb97aa)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-02 00:53:44 +00:00
dependabot-preview[bot]
d6e82680e7 Bump wiki from ccb0725 to 231962e
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `ccb0725` to `231962e`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](ccb0725b44...231962ec0b)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-04-02 00:36:33 +00:00
JustArchi
8de7df2b9d Update LICENSE-2.0.txt
Official byte content
2021-04-01 11:30:54 +02:00
JustArchi
2bc4e8acc1 Add lol-US png flag to resources 2021-04-01 10:17:14 +02:00
GitHub Action
663b4b05fc Automatic translations update 2021-04-01 02:25:25 +00:00
GitHub Action
20cb23bc1a Automatic translations update 2021-03-31 02:21:03 +00:00
dependabot-preview[bot]
7dc47549c1 Bump wiki from cf05c7d to 16f2c14
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `cf05c7d` to `16f2c14`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](cf05c7d78b...16f2c14cea)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-31 00:33:36 +00:00
JustArchi
1317d86fb3 Bump 2021-03-30 23:40:33 +02:00
JustArchi
345ef35b00 Update ASF-ui 2021-03-30 23:40:06 +02:00
JustArchi
0d93735e59 Bump 2021-03-30 10:19:03 +02:00
JustArchi
f8e01ec0e5 Bump ASF-ui 2021-03-30 10:17:11 +02:00
JustArchi
bfe453d9ca Rename 2/2 2021-03-30 10:14:23 +02:00
JustArchi
0ae12f09f3 Rename 1/2 2021-03-30 10:12:28 +02:00
GitHub Action
27648db509 Automatic translations update 2021-03-30 02:21:27 +00:00
dependabot-preview[bot]
2288305fde Bump wiki from 0067c93 to 5d73323
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `0067c93` to `5d73323`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](0067c9328c...5d733233f3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-30 00:47:17 +00:00
dependabot-preview[bot]
cd8d095c8c Bump ASF-ui from 2d60ce3 to 35e25e8
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `2d60ce3` to `35e25e8`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](2d60ce377a...35e25e8d00)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-30 00:30:51 +00:00
JustArchi
82a007968e Bump 2021-03-30 00:18:22 +02:00
JustArchi
614f671962 Initial upload of lol-US and mapping in crowdin 2021-03-29 23:45:59 +02:00
dependabot-preview[bot]
ae4f97f5c1 Bump NLog.Web.AspNetCore from 4.11.0 to 4.12.0
Bumps [NLog.Web.AspNetCore](https://github.com/NLog/NLog.Web) from 4.11.0 to 4.12.0.
- [Release notes](https://github.com/NLog/NLog.Web/releases)
- [Changelog](https://github.com/NLog/NLog.Web/blob/master/CHANGELOG.MD)
- [Commits](https://github.com/NLog/NLog.Web/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 20:31:40 +00:00
JustArchi
e122939906 Misc 2021-03-29 21:47:25 +02:00
JustArchi
1c1c292082 Add April Fools easter egg 2021-03-29 21:42:42 +02:00
JustArchi
1f7a2c21d9 Correct sr-CS localization 2021-03-29 20:59:39 +02:00
JustArchi
fc3c758b5f Bump 2021-03-29 20:24:33 +02:00
GitHub Action
442c780e71 Automatic translations update 2021-03-29 02:22:32 +00:00
dependabot-preview[bot]
07ce579cd8 Bump ASF-ui from eef9b47 to 2d60ce3
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `eef9b47` to `2d60ce3`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](eef9b475b3...2d60ce377a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-29 00:43:55 +00:00
GitHub Action
8457e68639 Automatic translations update 2021-03-28 02:20:09 +00:00
JustArchi
1711a464d3 Add Mobile user interface mode 2021-03-27 16:30:38 +01:00
JustArchi
7a5a2537a3 Closes #2260 2021-03-27 15:40:37 +01:00
GitHub Action
9d7e2482f2 Automatic translations update 2021-03-27 02:21:00 +00:00
GitHub Action
ca05c83442 Automatic translations update 2021-03-26 02:13:45 +00:00
JustArchi
62e6acc037 Add log entry stating GamesPlayedWhileIdle 2021-03-25 23:58:41 +01:00
GitHub Action
b1aec367f8 Automatic translations update 2021-03-25 02:09:20 +00:00
dependabot-preview[bot]
2497ab6c41 Bump wiki from a07e578 to a0213b9
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `a07e578` to `a0213b9`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](a07e578193...a0213b9f4b)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-25 00:50:26 +00:00
dependabot-preview[bot]
5b14586ee3 Bump ASF-ui from bc05f26 to eef9b47
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `bc05f26` to `eef9b47`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](bc05f2685b...eef9b475b3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-25 00:34:37 +00:00
dependabot-preview[bot]
335f65546c Bump NLog from 4.7.8 to 4.7.9
Bumps [NLog](https://github.com/NLog/NLog) from 4.7.8 to 4.7.9.
- [Release notes](https://github.com/NLog/NLog/releases)
- [Changelog](https://github.com/NLog/NLog/blob/v4.7.9/CHANGELOG.md)
- [Commits](https://github.com/NLog/NLog/compare/v4.7.8...v4.7.9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-24 22:50:52 +00:00
GitHub Action
d0c0f6ed33 Automatic translations update 2021-03-24 02:30:32 +00:00
dependabot-preview[bot]
f2487e4a03 Bump wiki from 3e57f4b to b65206a
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `3e57f4b` to `b65206a`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](3e57f4bf24...b65206a680)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-24 00:49:13 +00:00
dependabot-preview[bot]
e0fab89bdb Bump ASF-ui from 9d5736e to bc05f26
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `9d5736e` to `bc05f26`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](9d5736e45c...bc05f2685b)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-24 00:32:35 +00:00
GitHub Action
2123e0022b Automatic translations update 2021-03-23 02:29:54 +00:00
dependabot-preview[bot]
6e4e4e9157 Bump ASF-ui from 2dcd39d to 9d5736e
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `2dcd39d` to `9d5736e`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](2dcd39d0f3...9d5736e45c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-23 00:31:04 +00:00
JustArchi
ae591d3ea8 Remove no-longer-needed warning suppressions 2021-03-22 23:35:44 +01:00
dependabot-preview[bot]
f305561f47 Bump Newtonsoft.Json from 12.0.3 to 13.0.1
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.3 to 13.0.1.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-22 22:25:09 +00:00
GitHub Action
511c3f956a Automatic translations update 2021-03-22 02:30:40 +00:00
dependabot-preview[bot]
1ea2a1ff8e Bump ASF-ui from effc5cf to 2dcd39d
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `effc5cf` to `2dcd39d`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](effc5cf3f2...2dcd39d0f3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-22 01:01:18 +00:00
dependabot-preview[bot]
ad6efc8279 Bump wiki from a335ce1 to e2fd535
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `a335ce1` to `e2fd535`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](a335ce15e2...e2fd535d58)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-22 00:46:18 +00:00
GitHub Action
e6bc1c0d1c Automatic translations update 2021-03-21 02:28:20 +00:00
JustArchi
7d0aeaa422 Correct warnings 2021-03-20 14:10:48 +00:00
dependabot-preview[bot]
2c14846c2f Bump Markdig.Signed from 0.23.0 to 0.24.0
Bumps [Markdig.Signed](https://github.com/xoofx/markdig) from 0.23.0 to 0.24.0.
- [Release notes](https://github.com/xoofx/markdig/releases)
- [Changelog](https://github.com/xoofx/markdig/blob/master/changelog.md)
- [Commits](https://github.com/xoofx/markdig/compare/0.23.0...0.24.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-20 14:10:48 +00:00
GitHub Action
9b7b595de8 Automatic translations update 2021-03-20 02:27:43 +00:00
JustArchi
c2b4a7a5fd Misc 2021-03-19 13:45:57 +01:00
JustArchi
691faced26 Update RELEASE_TEMPLATE.md 2021-03-19 13:39:50 +01:00
JustArchi
d23a75d2d1 Update README.md 2021-03-19 13:37:04 +01:00
JustArchi
0313e7a3a4 Update README.md 2021-03-19 13:31:04 +01:00
JustArchi
f39d34371b Update README.md 2021-03-19 13:30:18 +01:00
JustArchi
e7f2d4d89c Update README.md 2021-03-19 13:29:15 +01:00
GitHub Action
193e6f8078 Automatic translations update 2021-03-19 02:27:51 +00:00
GitHub Action
c68514dafc Automatic translations update 2021-03-18 02:26:37 +00:00
dependabot-preview[bot]
7a5e73667b Bump ASF-ui from 91c796f to effc5cf
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `91c796f` to `effc5cf`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](91c796fcaa...effc5cf3f2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-18 00:32:28 +00:00
GitHub Action
51828c56ae Automatic translations update 2021-03-17 02:27:16 +00:00
dependabot-preview[bot]
821dee0c37 Bump ASF-ui from ced8737 to 91c796f
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `ced8737` to `91c796f`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](ced8737aa1...91c796fcaa)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-17 00:34:29 +00:00
dependabot-preview[bot]
a7c38bb844 Bump Swashbuckle.AspNetCore from 6.1.0 to 6.1.1
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.0...v6.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 23:02:00 +00:00
Łukasz Domeradzki
6a216819fa AppVeyor: Ignore network issues (#2243) 2021-03-16 23:13:17 +01:00
dependabot-preview[bot]
50e792f8a7 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.1.0 to 6.1.1
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.0...v6.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 20:08:20 +00:00
dependabot-preview[bot]
63c1f74064 Bump Swashbuckle.AspNetCore.Annotations from 6.1.0 to 6.1.1
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.1.0 to 6.1.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.1.0...v6.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 19:01:47 +00:00
dependabot-preview[bot]
f6fce273cf Bump MSTest.TestFramework from 2.2.2 to 2.2.3
Bumps [MSTest.TestFramework](https://github.com/microsoft/testfx) from 2.2.2 to 2.2.3.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.2.2...v2.2.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 15:02:51 +00:00
dependabot-preview[bot]
f5e1a1ce20 Bump MSTest.TestAdapter from 2.2.2 to 2.2.3
Bumps [MSTest.TestAdapter](https://github.com/microsoft/testfx) from 2.2.2 to 2.2.3.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.2.2...v2.2.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 14:13:45 +00:00
JustArchi
4102f59f5a Code cleanup 2021-03-16 11:07:45 +01:00
JustArchi
487cfbd733 Remove obsolete /Api/WWW/Send endpoint 2021-03-16 11:07:21 +01:00
GitHub Action
338c0ff48d Automatic translations update 2021-03-16 02:25:25 +00:00
dependabot-preview[bot]
876664d5fe Bump MSTest.TestAdapter from 2.2.1 to 2.2.2
Bumps [MSTest.TestAdapter](https://github.com/microsoft/testfx) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.2.1...v2.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 01:53:33 +00:00
dependabot-preview[bot]
e037ac885c Bump MSTest.TestFramework from 2.2.1 to 2.2.2
Bumps [MSTest.TestFramework](https://github.com/microsoft/testfx) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.2.1...v2.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 00:51:39 +00:00
dependabot-preview[bot]
34c990e5cf Bump ASF-ui from 65e470f to ced8737
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `65e470f` to `ced8737`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](65e470f3df...ced8737aa1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-16 00:35:23 +00:00
JustArchi
d1ea5755a4 Bump 2021-03-15 12:46:58 +01:00
JustArchi
47dcbb80f9 Misc 2021-03-15 12:46:08 +01:00
dependabot-preview[bot]
7ad5d63955 Bump ASF-ui from cd4fe97 to 65e470f
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `cd4fe97` to `65e470f`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](cd4fe9703f...65e470f3df)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-15 11:31:46 +00:00
GitHub Action
f60f3b313c Automatic translations update 2021-03-15 02:26:07 +00:00
JustArchi
52bc1b3845 Remove remaining tools
Originally NH2 and NHA2 were added to the repo in early days because I was too lazy to compile those myself and needed to work with them on daily basis.

Since SK2 provides up-to-date binaries now through their CIs, it clutters the repo for no good reason, as everybody who might want to make use of those tools (including me), can just download the official binaries directly.

No reason for this to stay in the repo, as it's not used for any deployment step.
2021-03-14 23:24:57 +01:00
JustArchi
b332e7b913 Correct remaining warnings 2021-03-14 14:33:26 +00:00
JustArchi
0bd8ff2d7d Correct some warnings 2021-03-14 14:33:26 +00:00
dependabot-preview[bot]
cfa8b61f31 Bump ConfigureAwaitChecker.Analyzer from 4.0.0 to 5.0.0
Bumps [ConfigureAwaitChecker.Analyzer](https://github.com/cincuranet/ConfigureAwaitChecker) from 4.0.0 to 5.0.0.
- [Release notes](https://github.com/cincuranet/ConfigureAwaitChecker/releases)
- [Commits](https://github.com/cincuranet/ConfigureAwaitChecker/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-14 14:33:26 +00:00
GitHub Action
6810e3324b Automatic translations update 2021-03-14 02:25:30 +00:00
GitHub Action
6d0583e15a Automatic translations update 2021-03-13 02:25:24 +00:00
dependabot-preview[bot]
888ce68963 Bump ASF-ui from c0dca96 to cd4fe97
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `c0dca96` to `cd4fe97`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](c0dca96cd7...cd4fe9703f)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-12 00:34:25 +00:00
dependabot-preview[bot]
0012e627c6 Bump ASF-ui from 3f23478 to c0dca96
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3f23478` to `c0dca96`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3f23478525...c0dca96cd7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-11 09:04:32 +00:00
GitHub Action
c60edf3c63 Automatic translations update 2021-03-11 02:23:46 +00:00
JustArchi
2ac3619885 Misc 2021-03-10 20:01:42 +01:00
dependabot-preview[bot]
79f3cdfb75 Bump ASF-ui from 477be73 to 3f23478
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `477be73` to `3f23478`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](477be733ad...3f23478525)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-10 00:34:32 +00:00
Sebastian Göls
69ac799ef6 Fix System.FormatException (#2228) 2021-03-09 18:49:56 +01:00
JustArchi
ee3d2cdd72 Bump 2021-03-09 10:05:29 +01:00
GitHub Action
ed802999cf Automatic translations update 2021-03-09 02:23:52 +00:00
dependabot-preview[bot]
08832816c6 Bump ASF-ui from 53f7672 to 477be73
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `53f7672` to `477be73`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](53f7672c6c...477be733ad)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-09 01:36:58 +00:00
JustArchi
a653aef04e Misc 2021-03-08 22:45:30 +01:00
JustArchi
0e29aaf20f Mark /Api/WWW/Send as obsolete 2021-03-08 22:33:26 +01:00
JustArchi
a4310d28f7 Add /Api/WWW/GitHub/Wiki/History endpoint 2021-03-08 22:27:03 +01:00
JustArchi
d7c7b3813e Misc 2021-03-08 21:48:27 +01:00
JustArchi
1f3a064dc0 Add /Api/WWW/GitHub/Wiki/Page endpoint 2021-03-08 21:46:12 +01:00
JustArchi
210e89be8e Remove /Api/WWW/Directory/{directory} endpoint
No longer used by ASF-ui
2021-03-08 20:13:29 +01:00
JustArchi
e83597db7a Misc 2021-03-08 20:04:07 +01:00
GitHub Action
dce96b9097 Automatic translations update 2021-03-08 02:28:39 +00:00
dependabot-preview[bot]
5b776dc2a0 Bump wiki from 861ead0 to fdd15a7
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `861ead0` to `fdd15a7`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](861ead0973...fdd15a71d7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-08 00:36:47 +00:00
GitHub Action
f33cd01667 Automatic translations update 2021-03-07 02:24:07 +00:00
JustArchi
9183421b0f Misc 2021-03-06 17:21:32 +01:00
dependabot-preview[bot]
6f6a9d06b5 Bump Swashbuckle.AspNetCore from 6.0.7 to 6.1.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.7 to 6.1.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.7...v6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-06 10:36:45 +00:00
dependabot-preview[bot]
ffdaa87702 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.7 to 6.1.0
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.7 to 6.1.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.7...v6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-06 09:50:03 +00:00
dependabot-preview[bot]
e6e96cb2a6 Bump Swashbuckle.AspNetCore.Annotations from 6.0.7 to 6.1.0
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.7 to 6.1.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.7...v6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-06 08:49:40 +00:00
GitHub Action
9cc29462a3 Automatic translations update 2021-03-06 02:21:33 +00:00
GitHub Action
61b8f83a40 Automatic translations update 2021-03-05 02:26:49 +00:00
JustArchi
998c9c47a0 Bump 2021-03-04 17:31:09 +01:00
dependabot-preview[bot]
65a1e80cf8 Bump ASF-ui from 3a4e282 to 53f7672
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3a4e282` to `53f7672`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3a4e282eb4...53f7672c6c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-04 00:30:11 +00:00
Łukasz Domeradzki
2ef64b08f1 Don't apply TargetLatestRuntimePatch for generic variants (#2219)
* Publish generic packages without targetting latest patch

* Forgot about this one

* Fix screwup
2021-03-03 09:55:00 +01:00
GitHub Action
40b2312e0e Automatic translations update 2021-03-03 02:20:10 +00:00
dependabot-preview[bot]
9fd31406e5 Bump ASF-ui from d2e1a1d to 3a4e282
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `d2e1a1d` to `3a4e282`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](d2e1a1df6c...3a4e282eb4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-03 00:30:13 +00:00
JustArchi
4d67a44d82 Follow-up on SteamTarget rewrite
That went much smoother than I expected
2021-03-02 17:10:10 +01:00
GitHub Action
fe72d361e2 Automatic translations update 2021-03-02 02:10:47 +00:00
dependabot-preview[bot]
ff3d48340f Bump MSTest.TestFramework from 2.1.2 to 2.2.1
Bumps [MSTest.TestFramework](https://github.com/microsoft/testfx) from 2.1.2 to 2.2.1.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.1.2...v2.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-02 01:58:25 +00:00
dependabot-preview[bot]
42f09e0d81 Bump MSTest.TestAdapter from 2.1.2 to 2.2.1
Bumps [MSTest.TestAdapter](https://github.com/microsoft/testfx) from 2.1.2 to 2.2.1.
- [Release notes](https://github.com/microsoft/testfx/releases)
- [Commits](https://github.com/microsoft/testfx/compare/v2.1.2...v2.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-02 00:55:05 +00:00
dependabot-preview[bot]
ea773cb4d1 Bump ASF-ui from 71aa004 to d2e1a1d
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `71aa004` to `d2e1a1d`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](71aa00463a...d2e1a1df6c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-02 00:38:50 +00:00
JustArchi
137f46ec3b SteamTarget: Add back the required logic 2021-03-02 00:26:12 +01:00
JustArchi
6d853c7379 SteamTarget: Report Write() progress properly
Okay so this is a nasty one. If somebody has configured SteamTarget to notify about e.g. ASF crash, our LogManager.Flush() will NOT wait for that message to be sent before returning, as the Write() operation will return the moment it hits any async operation, at the very latest, the operation to write to a socket.

Our expectation is that we want to send that message (emptying our logging queue) before actually shutting down the process, and for that we need that Write() operation to block until the request is actually sent.

This is a quick fix for that while a pending rewrite for AsyncTaskTarget is in order - https://github.com/NLog/NLog/wiki/How-to-write-a-custom-async-target
2021-03-02 00:16:46 +01:00
JustArchi
c688942a23 Bump 2021-03-02 00:01:40 +01:00
GitHub Action
45e500069e Automatic translations update 2021-03-01 02:22:32 +00:00
dependabot-preview[bot]
f93f3f177d Bump wiki from 4cf1ba6 to b50199e
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `4cf1ba6` to `b50199e`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](4cf1ba6dd4...b50199ed92)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 01:57:05 +00:00
dependabot-preview[bot]
5120027a66 Bump ASF-ui from 122d5d0 to 71aa004
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `122d5d0` to `71aa004`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](122d5d09c0...71aa00463a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-03-01 01:41:56 +00:00
JustArchi
bb8430c056 Misc: Include OS architecture in variant 2021-03-01 00:19:26 +01:00
GitHub Action
989b2c4772 Automatic translations update 2021-02-28 02:20:56 +00:00
dependabot-preview[bot]
1f6e2e00bd Bump NLog.Web.AspNetCore from 4.10.0 to 4.11.0
Bumps [NLog.Web.AspNetCore](https://github.com/NLog/NLog.Web) from 4.10.0 to 4.11.0.
- [Release notes](https://github.com/NLog/NLog.Web/releases)
- [Changelog](https://github.com/NLog/NLog.Web/blob/master/CHANGELOG.MD)
- [Commits](https://github.com/NLog/NLog.Web/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-27 16:50:23 +00:00
JustArchi
7b2e804a62 Bump 2021-02-27 14:01:06 +01:00
Vitaliya
c34812e4bc Fix RandomNext behaviour (#2212) 2021-02-27 13:49:29 +01:00
GitHub Action
45b1454fde Automatic translations update 2021-02-27 02:17:54 +00:00
JustArchi
9d9a8af94f Delete auto-merge.yml.off 2021-02-27 02:07:43 +01:00
JustArchi
b2336504a3 Misc 2021-02-27 02:05:40 +01:00
GitHub Action
b19c9048bf Automatic translations update 2021-02-26 02:18:22 +00:00
dependabot-preview[bot]
5ba3b7d81e Bump ASF-ui from daad283 to 122d5d0
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `daad283` to `122d5d0`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](daad283e39...122d5d09c0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 01:30:59 +00:00
dependabot-preview[bot]
0e48280d29 Bump NLog from 4.7.7 to 4.7.8
Bumps [NLog](https://github.com/NLog/NLog) from 4.7.7 to 4.7.8.
- [Release notes](https://github.com/NLog/NLog/releases)
- [Changelog](https://github.com/NLog/NLog/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/NLog/NLog/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-26 00:26:33 +00:00
GitHub Action
15f784e1d5 Automatic translations update 2021-02-25 02:17:08 +00:00
dependabot-preview[bot]
b6b0bb192e Bump ASF-ui from 97e68d1 to daad283
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `97e68d1` to `daad283`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](97e68d15d2...daad283e39)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-25 01:49:21 +00:00
dependabot-preview[bot]
fc9cb55d51 Bump wiki from 0fbb433 to a462eb8
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `0fbb433` to `a462eb8`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](0fbb433617...a462eb8a70)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-25 01:33:48 +00:00
GitHub Action
2c7204c3ae Automatic translations update 2021-02-24 02:18:03 +00:00
dependabot-preview[bot]
68981e0ee9 Bump ASF-ui from 83eb492 to 97e68d1
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `83eb492` to `97e68d1`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](83eb49278e...97e68d15d2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-24 01:34:33 +00:00
dependabot-preview[bot]
b273fcd2e8 Bump Microsoft.NET.Test.Sdk from 16.8.3 to 16.9.1
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 16.8.3 to 16.9.1.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Commits](https://github.com/microsoft/vstest/compare/v16.8.3...v16.9.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-23 14:19:47 +00:00
GitHub Action
19fbd1b919 Automatic translations update 2021-02-23 02:16:54 +00:00
dependabot-preview[bot]
9d7c78b609 Bump ASF-ui from 65b0c40 to 83eb492
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `65b0c40` to `83eb492`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](65b0c4074d...83eb49278e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-23 01:49:51 +00:00
dependabot-preview[bot]
8376be250c Bump wiki from 0b1fcbb to 8dfaaa7
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `0b1fcbb` to `8dfaaa7`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](0b1fcbb7e0...8dfaaa744e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-23 01:34:14 +00:00
JustArchi
bfc48425d3 CI: check-latest for node 2021-02-22 19:05:34 +01:00
JustArchi
f9775fd17b CI: Update crowdin and setup-node 2021-02-22 18:57:36 +01:00
JustArchi
16c03d85c9 CI: Use node.js 14 (LTS) 2021-02-22 18:48:21 +01:00
JustArchi
b98974a482 STD: Misc 2021-02-22 18:25:29 +01:00
JustArchi
e0062449db Bump 2021-02-22 18:18:13 +01:00
JustArchi
9b362cb08f Fix warning 2021-02-22 18:09:48 +01:00
JustArchi
e836cb66e4 STD: Make data field in response optional
Data field is not included in case of non-200 status codes.
2021-02-22 17:56:03 +01:00
JustArchi
34fbb9f86d CI: Remove travis
Travis introduced OSS credits a while ago, which artificially limit the OSS development by putting a pressure on how much time we can take for a build. While I can understand this decision, considering they're providing the service for free, there is no longer any reason for us to keep using it, due to heavy maintenance burden and pressure, something we really don't need considering other CIs (especially GitHub actions) do not have such limitations.

This is on top of other issues, which make Travis one of the most problematic CIs that I've ever tried to use.
2021-02-22 16:37:17 +01:00
JustArchi
4054e60592 CI: Use latest SDK version 2021-02-22 16:20:54 +01:00
GitHub Action
3acaa530b4 Automatic translations update 2021-02-22 02:17:30 +00:00
dependabot-preview[bot]
e7617fec5c Bump wiki from 45eb4f0 to 55e800c
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `45eb4f0` to `55e800c`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](45eb4f008f...55e800c878)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-22 02:02:58 +00:00
dependabot-preview[bot]
904fe2c53f Bump ASF-ui from 2b28a24 to 65b0c40
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `2b28a24` to `65b0c40`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](2b28a24470...65b0c4074d)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-22 01:47:51 +00:00
GitHub Action
887049bf4a Automatic translations update 2021-02-21 02:17:02 +00:00
JustArchi
835611547f Mist optimization
No need to initialize assetIDs if inventory is empty. Also we know exact amount of items this way.
2021-02-20 23:49:05 +01:00
JustArchi
e87ef9498a Misc 2021-02-20 23:40:24 +01:00
JustArchi
29d1f9ff7a Misc code improvements 2021-02-20 23:38:48 +01:00
JustArchi
26cab42476 Misc
No point in refreshing all of the packages, just the packages we already know about.

In 99.9% cases it'll be exactly the same data anyway.
2021-02-20 17:29:13 +01:00
GitHub Action
6acd516a36 Automatic translations update 2021-02-20 02:14:55 +00:00
GitHub Action
302d59ecdd Automatic translations update 2021-02-19 02:15:25 +00:00
dependabot-preview[bot]
fdef8e8326 Bump ASF-ui from 6c110b8 to 2b28a24
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `6c110b8` to `2b28a24`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](6c110b8e16...2b28a24470)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-19 01:32:25 +00:00
GitHub Action
bee1731f13 Automatic translations update 2021-02-18 02:15:07 +00:00
JustArchi
7f7a0030b9 Bump 2021-02-17 09:43:33 +01:00
JustArchi
6f3a3fe06b Misc fix 2021-02-17 09:43:00 +01:00
GitHub Action
2b55393dd6 Automatic translations update 2021-02-17 02:13:09 +00:00
dependabot-preview[bot]
52f45998d0 Bump wiki from e899c68 to 21bfd17
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `e899c68` to `21bfd17`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](e899c6831e...21bfd17ed1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-17 01:34:33 +00:00
dependabot-preview[bot]
9580eb5155 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.6 to 6.0.7
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.6 to 6.0.7.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.6...v6.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-17 00:47:46 +00:00
dependabot-preview[bot]
16cef4ccbe Bump Swashbuckle.AspNetCore.Annotations from 6.0.6 to 6.0.7
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.6 to 6.0.7.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.6...v6.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-17 00:00:07 +00:00
dependabot-preview[bot]
646050f8a3 Bump Swashbuckle.AspNetCore from 6.0.6 to 6.0.7
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.6 to 6.0.7.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.6...v6.0.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-16 22:59:12 +00:00
dependabot-preview[bot]
f32fb2c094 Bump Swashbuckle.AspNetCore.Annotations from 6.0.5 to 6.0.6
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.5 to 6.0.6.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.5...v6.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-16 21:52:47 +00:00
dependabot-preview[bot]
82310b2cbf Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.5 to 6.0.6
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.5 to 6.0.6.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.5...v6.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-16 21:06:02 +00:00
dependabot-preview[bot]
6b68969357 Bump Swashbuckle.AspNetCore from 6.0.5 to 6.0.6
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.5 to 6.0.6.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.5...v6.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-16 20:02:37 +00:00
JustArchi
c18e94714e Bump 2021-02-16 20:02:28 +01:00
Vitaliya
7289f3bae4 Add blacklisting of AppIDs for MatchActively (#2183)
* Add blacklisting of AppIDs for MatchActively

* Add serialization and modification event
2021-02-16 19:30:16 +01:00
JustArchi
61873cfd72 Avoid complete purge on each PICS restart
There is no easy way for us to retrieve access tokens again without a full relog procedure, and those are needed for refresh of packages, which should also be optional due to excessive amount of PICS restarts emitted by Steam.

At worst, we'll just have outdated data until a full relog procedure, as opposed to having no data at all until relog procedure...
2021-02-16 19:27:00 +01:00
JustArchi
9c8fe06bfe Bump 2021-02-16 19:24:21 +01:00
JustArchi
47a90042a2 Misc 2021-02-16 09:27:15 +01:00
JustArchi
e56fb73997 Misc 2021-02-16 09:27:10 +01:00
GitHub Action
9ff55b69b3 Automatic translations update 2021-02-16 02:15:39 +00:00
dependabot-preview[bot]
023b159c32 Bump ASF-ui from c01f990 to 6c110b8
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `c01f990` to `6c110b8`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](c01f9900f5...6c110b8e16)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-16 01:30:55 +00:00
dependabot-preview[bot]
42f0692d8c Bump ASF-ui from 7869ac6 to c01f990
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7869ac6` to `c01f990`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7869ac68fe...c01f9900f5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-15 01:43:49 +00:00
dependabot-preview[bot]
1c13b89e6f Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.4 to 6.0.5
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.4 to 6.0.5.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.4...v6.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-13 18:00:17 +00:00
dependabot-preview[bot]
7c5bf81e24 Bump Swashbuckle.AspNetCore.Annotations from 6.0.4 to 6.0.5
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.4 to 6.0.5.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.4...v6.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-13 13:39:36 +00:00
dependabot-preview[bot]
52547ee3d9 Bump Swashbuckle.AspNetCore from 6.0.4 to 6.0.5
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.4 to 6.0.5.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.4...v6.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-13 12:40:00 +00:00
GitHub Action
74d5ddaba7 Automatic translations update 2021-02-12 02:14:50 +00:00
dependabot-preview[bot]
29c8f408b5 Bump ASF-ui from a5989bc to 7869ac6
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `a5989bc` to `7869ac6`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](a5989bcc1c...7869ac68fe)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-12 01:31:19 +00:00
GitHub Action
0697e49011 Automatic translations update 2021-02-11 02:14:30 +00:00
dependabot-preview[bot]
dff6a8aca2 Bump ASF-ui from 7040199 to a5989bc
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7040199` to `a5989bc`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7040199856...a5989bcc1c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-11 01:31:14 +00:00
dependabot-preview[bot]
f9bd230ca2 Bump Swashbuckle.AspNetCore from 6.0.3 to 6.0.4
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.3...v6.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-11 00:04:47 +00:00
dependabot-preview[bot]
b4a0ecdcff Bump Swashbuckle.AspNetCore.Annotations from 6.0.3 to 6.0.4
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.3...v6.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 23:16:02 +00:00
dependabot-preview[bot]
32429ab687 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.3 to 6.0.4
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.3...v6.0.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 22:13:03 +00:00
dependabot-preview[bot]
fd343c56d5 Bump Swashbuckle.AspNetCore.Annotations from 6.0.2 to 6.0.3
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.2...v6.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 16:52:11 +00:00
dependabot-preview[bot]
fe7cd72f13 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.2 to 6.0.3
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.2...v6.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 16:02:19 +00:00
dependabot-preview[bot]
fcd3a469bc Bump Swashbuckle.AspNetCore from 6.0.2 to 6.0.3
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.2...v6.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 14:56:24 +00:00
GitHub Action
4388fb7dcf Automatic translations update 2021-02-10 02:10:53 +00:00
dependabot-preview[bot]
45b87a1272 Bump ASF-ui from 3b3eaca to 7040199
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3b3eaca` to `7040199`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3b3eaca810...7040199856)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-10 01:39:32 +00:00
JustArchi
713d725e03 Bump 2021-02-09 18:02:25 +01:00
JustArchi
be2f59ef88 Misc 2021-02-09 17:48:24 +01:00
GitHub Action
e2444d93cf Automatic translations update 2021-02-09 02:13:52 +00:00
dependabot-preview[bot]
f80cab3fc6 Bump ASF-ui from ad75c7b to 3b3eaca
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `ad75c7b` to `3b3eaca`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](ad75c7b5c2...3b3eaca810)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-09 01:32:22 +00:00
dependabot-preview[bot]
f491a6a9af Bump ASF-ui from 64a6750 to ad75c7b
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `64a6750` to `ad75c7b`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](64a67506ed...ad75c7b5c2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-08 02:18:02 +00:00
dependabot-preview[bot]
074f199ee9 Bump Swashbuckle.AspNetCore from 6.0.1 to 6.0.2
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-08 02:02:11 +00:00
dependabot-preview[bot]
69b5488f54 Bump Swashbuckle.AspNetCore.Newtonsoft from 6.0.1 to 6.0.2
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-08 01:14:41 +00:00
dependabot-preview[bot]
d15b911fd9 Bump Swashbuckle.AspNetCore.Annotations from 6.0.1 to 6.0.2
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-08 00:12:27 +00:00
GitHub Action
5aa345df57 Automatic translations update 2021-02-07 02:14:47 +00:00
dependabot-preview[bot]
2fa0cf041b Bump Swashbuckle.AspNetCore.Newtonsoft from 5.6.3 to 6.0.1
Bumps [Swashbuckle.AspNetCore.Newtonsoft](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 5.6.3 to 6.0.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v5.6.3...v6.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-06 17:13:50 +00:00
dependabot-preview[bot]
9d15bb1355 Bump Swashbuckle.AspNetCore from 5.6.3 to 6.0.1
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 5.6.3 to 6.0.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v5.6.3...v6.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-06 16:27:09 +00:00
dependabot-preview[bot]
f23cde93e0 Bump Swashbuckle.AspNetCore.Annotations from 6.0.0 to 6.0.1
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.0.0...v6.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-06 13:28:26 +00:00
dependabot-preview[bot]
05e0885362 Bump Swashbuckle.AspNetCore.Annotations from 5.6.3 to 6.0.0
Bumps [Swashbuckle.AspNetCore.Annotations](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 5.6.3 to 6.0.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v5.6.3...v6.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-06 12:20:41 +00:00
GitHub Action
b613a561f5 Automatic translations update 2021-02-06 02:13:33 +00:00
GitHub Action
3ed79cae84 Automatic translations update 2021-02-05 02:14:49 +00:00
dependabot-preview[bot]
6e4e6cebd8 Bump ASF-ui from 2ff0ff2 to 64a6750
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `2ff0ff2` to `64a6750`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](2ff0ff25b5...64a67506ed)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-05 01:31:44 +00:00
GitHub Action
2a5754305e Automatic translations update 2021-02-04 02:15:00 +00:00
dependabot-preview[bot]
65dfc08b95 Bump ASF-ui from 5b2e827 to 2ff0ff2
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `5b2e827` to `2ff0ff2`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](5b2e82771a...2ff0ff25b5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-04 01:32:08 +00:00
GitHub Action
f96e142042 Automatic translations update 2021-02-03 02:25:28 +00:00
Luckz
6c4763db47 Minor English grammar improvements (Strings.resx) (#2151)
No changes to the meaning.
2021-02-02 09:05:59 +01:00
GitHub Action
8366f6c8da Automatic translations update 2021-02-02 02:31:32 +00:00
dependabot-preview[bot]
5f21702592 Bump ASF-ui from e8e2085 to 5b2e827
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `e8e2085` to `5b2e827`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](e8e20859fd...5b2e82771a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-02 01:31:49 +00:00
GitHub Action
28401d668f Automatic translations update 2021-02-01 02:33:11 +00:00
dependabot-preview[bot]
e95f29b42c Bump ASF-ui from e23ac6f to e8e2085
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `e23ac6f` to `e8e2085`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](e23ac6f96d...e8e20859fd)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-02-01 01:38:41 +00:00
JustArchi
b4ebd3e0f5 Bump 2021-01-31 13:19:49 +01:00
JustArchi
4d9b214735 Misc 2021-01-31 13:19:17 +01:00
GitHub Action
2732fdfcff Automatic translations update 2021-01-31 02:31:50 +00:00
GitHub Action
de7d7f857e Automatic translations update 2021-01-30 02:29:43 +00:00
dependabot-preview[bot]
384b6ad329 Bump ASF-ui from 4bfc9ea to e23ac6f
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `4bfc9ea` to `e23ac6f`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](4bfc9eaafb...e23ac6f96d)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-27 01:31:33 +00:00
JustArchi
2e0cc7ce87 Change HoursToIgnore to 1 2021-01-26 11:56:10 +01:00
JustArchi
ce4984f8dc Update issue templates 2021-01-26 09:58:10 +01:00
GitHub Action
899fb93e4b Automatic translations update 2021-01-26 02:28:48 +00:00
dependabot-preview[bot]
1d7809a93a Bump ASF-ui from 98c9140 to 4bfc9ea
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `98c9140` to `4bfc9ea`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](98c9140b0c...4bfc9eaafb)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-26 01:32:51 +00:00
dependabot-preview[bot]
3adf1db1d0 Bump ASF-ui from 13e2902 to 98c9140
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `13e2902` to `98c9140`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](13e2902e58...98c9140b0c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-25 01:37:08 +00:00
GitHub Action
924ff86bdc Automatic translations update 2021-01-24 03:08:06 +00:00
GitHub Action
5520d75b54 Automatic translations update 2021-01-23 03:05:28 +00:00
JustArchi
05973a65c1 Bump 2021-01-22 16:00:45 +01:00
GitHub Action
58ddf450c7 Automatic translations update 2021-01-22 03:06:35 +00:00
dependabot-preview[bot]
349a1912d4 Bump ASF-ui from ee70bfa to 13e2902
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `ee70bfa` to `13e2902`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](ee70bfa817...13e2902e58)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-22 01:33:23 +00:00
GitHub Action
89939e76fa Automatic translations update 2021-01-21 03:07:20 +00:00
dependabot-preview[bot]
bd8f753ea5 Bump wiki from 4401eb5 to 93f3f70
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `4401eb5` to `93f3f70`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](4401eb5b0b...93f3f70f99)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-21 01:47:56 +00:00
dependabot-preview[bot]
c92718e73f Bump ASF-ui from 0a1d9ea to ee70bfa
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `0a1d9ea` to `ee70bfa`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](0a1d9ea72c...ee70bfa817)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-21 01:32:19 +00:00
dependabot-preview[bot]
403993e5a6 Bump NLog from 4.7.6 to 4.7.7
Bumps [NLog](https://github.com/NLog/NLog) from 4.7.6 to 4.7.7.
- [Release notes](https://github.com/NLog/NLog/releases)
- [Changelog](https://github.com/NLog/NLog/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/NLog/NLog/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-20 23:50:09 +00:00
JustArchi
f0c3b0bfa9 Update README.md 2021-01-20 21:28:38 +01:00
JustArchi
00bc2daeac Correct wiki to follow master
Impossible to change for now
2021-01-20 21:26:55 +01:00
JustArchi
01bc30e49c master -> main 2021-01-20 21:14:45 +01:00
GitHub Action
724cc8f6d4 Automatic translations update 2021-01-20 03:07:59 +00:00
dependabot-preview[bot]
e3436d6935 Bump ASF-ui from 8990971 to 0a1d9ea
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `8990971` to `0a1d9ea`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](899097182e...0a1d9ea72c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-20 01:45:50 +00:00
dependabot-preview[bot]
641eee88e5 Bump wiki from 6983d3a to ce6bfda
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `6983d3a` to `ce6bfda`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](6983d3a6cf...ce6bfda0c1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-20 01:32:41 +00:00
JustArchi
b6a2bcd89e Misc 2021-01-19 23:21:53 +01:00
GitHub Action
fb0eb9aec4 Automatic translations update 2021-01-19 03:05:44 +00:00
dependabot-preview[bot]
0eb5a4de82 Bump wiki from 6d4459e to 8e86108
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `6d4459e` to `8e86108`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](6d4459e881...8e86108ab4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-19 01:32:04 +00:00
Sebastian Göls
b8fe02e2b6 Limit full set trades (#2133)
* Limit items to send when looting full sets

* Add test for item limit when looting full sets

* Fix small mistakes

* Change another type to byte

* And another one

* Add test to verify that the amount of appIDs does not matter in limiting the amount of items

* Add maxItems parameter to GetFullItemSets

* Test for exception with too small parameter value

* Let's get the finishing touches on that PR :'<,'>s/byte/ushort/g

* Use named const instead of hard-coded magic number

* Fix the last remaining typecast (hopefully)

* Send as many sets as possible and Add test for this and Check values of amountsToExtract as it is part of the public API

* Remove check for minimum items per set. Plugins could still use this with smaller sets on non-steam items

* Correct force of habit to match the projects code-style
2021-01-18 14:58:25 +01:00
GitHub Action
434ea8096b Automatic translations update 2021-01-18 03:03:26 +00:00
dependabot-preview[bot]
5e85ca7e5a Bump ASF-ui from 6b6f9dc to 8990971
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `6b6f9dc` to `8990971`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](6b6f9dcef7...899097182e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-18 01:38:07 +00:00
GitHub Action
cc175b9847 Automatic translations update 2021-01-17 03:04:18 +00:00
dependabot-preview[bot]
945e94dd80 Bump Markdig.Signed from 0.22.1 to 0.23.0
Bumps [Markdig.Signed](https://github.com/xoofx/markdig) from 0.22.1 to 0.23.0.
- [Release notes](https://github.com/xoofx/markdig/releases)
- [Changelog](https://github.com/xoofx/markdig/blob/master/changelog.md)
- [Commits](https://github.com/xoofx/markdig/compare/0.22.1...0.23.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-16 12:39:35 +00:00
GitHub Action
447850f2ed Automatic translations update 2021-01-16 03:03:20 +00:00
GitHub Action
c3fbd60564 Automatic translations update 2021-01-15 03:02:45 +00:00
dependabot-preview[bot]
795c3d914e Bump ASF-ui from b527871 to 6b6f9dc
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `b527871` to `6b6f9dc`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](b5278714b6...6b6f9dcef7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-15 01:32:39 +00:00
JustArchi
fc16e7b29a Misc 2021-01-14 20:05:43 +01:00
JustArchi
00fba90928 Misc STD enhancements in cc.sh 2021-01-14 11:03:42 +01:00
JustArchi
24d82503ff Closes #2129 2021-01-14 10:54:15 +01:00
GitHub Action
4b76d6875b Automatic translations update 2021-01-14 03:06:01 +00:00
dependabot-preview[bot]
222c26bcc5 Bump ASF-ui from 3f9913d to b527871
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3f9913d` to `b527871`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3f9913da01...b5278714b6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-14 01:34:34 +00:00
dependabot-preview[bot]
d03209c98f Bump ASF-ui from 718bc6e to 3f9913d
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `718bc6e` to `3f9913d`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](718bc6efcf...3f9913da01)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 01:47:59 +00:00
dependabot-preview[bot]
56091070e8 Bump System.Composition from 5.0.0 to 5.0.1
Bumps [System.Composition](https://github.com/dotnet/runtime) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v5.0.0...v5.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 01:32:15 +00:00
GitHub Action
323258b5cb Automatic translations update 2021-01-12 02:58:38 +00:00
dependabot-preview[bot]
2df7afded1 Bump ASF-ui from e0032a9 to 718bc6e
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `e0032a9` to `718bc6e`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](e0032a97a1...718bc6efcf)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-12 01:31:13 +00:00
GitHub Action
c6f5a8d252 Automatic translations update 2021-01-11 02:55:43 +00:00
dependabot-preview[bot]
a1d68d0827 Bump ASF-ui from 39743c7 to e0032a9
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `39743c7` to `e0032a9`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](39743c7455...e0032a97a1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-11 01:37:18 +00:00
JustArchi
253d8bf269 NH2 Update 2021-01-10 21:28:01 +01:00
JustArchi
8c702a4d2d Misc 2021-01-10 21:27:52 +01:00
GitHub Action
95a55e9c47 Automatic translations update 2021-01-10 02:55:34 +00:00
GitHub Action
b2988e4829 Automatic translations update 2021-01-09 02:51:31 +00:00
GitHub Action
ba870d07b9 Automatic translations update 2021-01-08 02:51:16 +00:00
dependabot-preview[bot]
9efe6ceb9a Bump wiki from 6aa24aa to eceef9c
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `6aa24aa` to `eceef9c`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](6aa24aa3a5...eceef9c295)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-08 01:50:28 +00:00
dependabot-preview[bot]
51a809d95d Bump ASF-ui from 546a0cb to 39743c7
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `546a0cb` to `39743c7`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](546a0cbf2b...39743c7455)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-08 01:34:53 +00:00
GitHub Action
ddd7a0403e Automatic translations update 2021-01-07 02:50:55 +00:00
dependabot-preview[bot]
9d619ee269 Bump ASF-ui from be5c4c3 to 546a0cb
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `be5c4c3` to `546a0cb`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](be5c4c35a6...546a0cbf2b)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-07 01:50:52 +00:00
dependabot-preview[bot]
cc1272026f Bump wiki from 0eed60b to 280330e
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `0eed60b` to `280330e`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](0eed60bd0a...280330e85e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-07 01:33:37 +00:00
JustArchi
432b18acd7 Bump 2021-01-06 22:30:48 +01:00
JustArchi
e00e615b02 Misc 2021-01-06 20:43:51 +01:00
JustArchi
3b9a63d9bf Bump 2021-01-06 18:54:41 +01:00
JustArchi
08f35dd6e3 Misc 2021-01-06 17:14:06 +01:00
GitHub Action
83dcbc48db Automatic translations update 2021-01-06 02:47:44 +00:00
dependabot-preview[bot]
b3deaaec27 Bump wiki from 3d1dd61 to b20557a
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `3d1dd61` to `b20557a`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](3d1dd61f4d...b20557aeaf)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-06 01:32:22 +00:00
JustArchi
8a9f25edcb Bump 2021-01-05 11:34:51 +01:00
GitHub Action
ff67231514 Automatic translations update 2021-01-05 02:46:49 +00:00
dependabot-preview[bot]
fc7f0571f9 Bump ASF-ui from ab7aaf0 to be5c4c3
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `ab7aaf0` to `be5c4c3`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](ab7aaf0cd3...be5c4c35a6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-05 02:00:00 +00:00
JustArchi
400b19d190 Further remove restrictions 2021-01-04 17:59:59 +01:00
JustArchi
4700ed2706 Further code cleanup 2021-01-04 17:42:31 +01:00
JustArchi
3d39583fa2 Misc 2021-01-04 15:40:35 +01:00
JustArchi
e45f06debf Misc 2021-01-04 15:32:28 +01:00
JustArchi
9eebd2e6e8 Always provide content to StreamResponse
A failed request that returned object will have empty stream at worst, but never null. That stream is required in userspace for working with.
2021-01-04 15:29:47 +01:00
JustArchi
0b74f65c3b Misc 2021-01-04 15:06:34 +01:00
GitHub Action
0c199b10f8 Automatic translations update 2021-01-04 02:46:22 +00:00
dependabot-preview[bot]
1509591a50 Bump ASF-ui from c2cea77 to ab7aaf0
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `c2cea77` to `ab7aaf0`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](c2cea77e0c...ab7aaf0cd3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-04 01:53:53 +00:00
dependabot-preview[bot]
55c856755a Bump wiki from 3370a17 to 27b0f64
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `3370a17` to `27b0f64`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](3370a179ee...27b0f64b96)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-04 01:38:33 +00:00
JustArchi
3756a62eac Misc 2021-01-04 00:58:52 +01:00
JustArchi
aa372d020b Misc 2021-01-04 00:56:27 +01:00
JustArchi
df527b03e0 Closes #2116 2021-01-04 00:26:05 +01:00
JustArchi
74ff715a62 Misc rework of change number delay 2021-01-04 00:15:29 +01:00
JustArchi
a9ccc27f81 Add a delay in initial resolve
This will avoid unnecessary purge in the first run and missing packages
2021-01-03 23:36:28 +01:00
JustArchi
71b023c16d Save LastChangeNumber also on normal update 2021-01-03 22:55:17 +01:00
JustArchi
45a5fec95a Happy 2021
And let's hope it'll be better than 2020
2021-01-03 22:24:22 +01:00
JustArchi
32a8f4bed4 Misc optimization
If we're starting from 0, pointless to ask plugins what they prefer.
2021-01-03 22:12:17 +01:00
JustArchi
e2c7671f00 STD: Perform Save() of GlobalCache in background
We don't need to slow down the process with I/O there, at all. ASF already handles its own database like that.
2021-01-03 22:02:24 +01:00
JustArchi
cc1eb6bee2 Start saving LastChangeNumber in GlobalDatabase
Due to the fact that we're now dependent on PICS changes ourselves, we have to start saving our own LastChangeNumber in order to avoid invalidating cache every time.
2021-01-03 21:58:41 +01:00
JustArchi
273a6b0fbe Invalidate cache upon pics changes
PICS restart indicates that we don't know what changes exactly we've missed. If package doesn't emit any change number (and it doesn't have to), we might miss the update that happened in the meantime without being aware of that happening.
2021-01-03 21:37:16 +01:00
JustArchi
c7547e3b40 Add branch to translations 2021-01-03 11:36:02 +01:00
JustArchi
71f3dd5e5c Add opencontainers labels to docker images 2021-01-02 18:33:16 +01:00
JustArchi
bf21280cf7 Add IMAGESUFFIX to dockerfiles 2021-01-02 17:03:11 +01:00
JustArchi
4ff038f62f Update README.md 2021-01-02 16:04:01 +01:00
JustArchi
d15dcb337f Update README.md 2021-01-02 16:01:43 +01:00
JustArchi
a847585450 Misc 2021-01-02 15:47:30 +01:00
JustArchi
346b7d5182 Bump 2021-01-02 15:39:59 +01:00
JustArchi
d6de2bf7b9 Fix released docker builds 2021-01-02 15:38:36 +01:00
JustArchi
fd3837beba Bump 2021-01-02 15:37:28 +01:00
JustArchi
9b31e334b2 Misc 2021-01-02 15:13:33 +01:00
JustArchi
a27b08e563 Switch to DOCKERHUB_PASSWORD for solving the upload error, and make the step optional 2021-01-02 15:03:53 +01:00
JustArchi
46891d6be2 Add checkout code action to make DH readme updates possible 2021-01-02 14:56:27 +01:00
Łukasz Domeradzki
e5efb86bd2 CI updates related to Docker containers (#2112)
* Initial commit trying to get ghcr running

* Move to v2

* Add lowercasing

* Replace docker hub worker

* Update

* Attempt to solve .net limitations

* Correct platforms

* Update docker-publish-master.yml

* Add remaining docker tags

* Add automatic DockerHub repo description update
2021-01-02 14:49:03 +01:00
JustArchi
08ff0ac7e5 Degrade Microsoft.Extensions libraries for mono support 2021-01-02 14:05:57 +01:00
GitHub Action
fef9582f52 Automatic translations update 2021-01-02 02:40:05 +00:00
JustArchi
0c727603a2 Add --no-config-watch command-line argument 2021-01-02 01:33:31 +01:00
JustArchi
454e69b144 Misc 2021-01-01 15:57:19 +01:00
GitHub Action
c4d6bb26a6 Automatic translations update 2021-01-01 02:42:48 +00:00
dependabot-preview[bot]
a054a9dbf0 Bump ASF-ui from 0ef3e52 to c2cea77
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `0ef3e52` to `c2cea77`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](0ef3e5229a...c2cea77e0c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-01 01:46:29 +00:00
dependabot-preview[bot]
a43fd5f48d Bump wiki from 654856f to 1ecf869
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `654856f` to `1ecf869`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](654856feee...1ecf869a7d)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-01 01:31:47 +00:00
JustArchi
541d5aac0d Closes #2109 2020-12-31 18:30:11 +01:00
GitHub Action
4962076089 Automatic translations update 2020-12-31 02:41:09 +00:00
dependabot-preview[bot]
c543941320 Bump ASF-ui from b893e78 to 0ef3e52
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `b893e78` to `0ef3e52`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](b893e78e90...0ef3e5229a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-31 01:32:21 +00:00
JustArchi
34a355f0ea Misc 2020-12-31 01:00:26 +01:00
JustArchi
eb14d75430 Add result to the logged friend invite 2020-12-31 00:59:18 +01:00
JustArchi
a81ba225c2 Merge branch 'master' of https://github.com/JustArchiNET/ArchiSteamFarm 2020-12-30 21:35:05 +01:00
JustArchi
2cddf69322 Misc 2020-12-30 21:34:56 +01:00
dependabot-preview[bot]
b361b287cd Bump NLog.Web.AspNetCore from 4.9.3 to 4.10.0
Bumps [NLog.Web.AspNetCore](https://github.com/NLog/NLog.Web) from 4.9.3 to 4.10.0.
- [Release notes](https://github.com/NLog/NLog.Web/releases)
- [Changelog](https://github.com/NLog/NLog.Web/blob/master/CHANGELOG.MD)
- [Commits](https://github.com/NLog/NLog.Web/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-30 20:33:18 +00:00
GitHub Action
d229ef90ff Automatic translations update 2020-12-30 02:38:25 +00:00
dependabot-preview[bot]
565c6300cf Bump ASF-ui from eac6b26 to b893e78
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `eac6b26` to `b893e78`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](eac6b266c2...b893e78e90)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-30 01:31:36 +00:00
GitHub Action
5f551f58dc Automatic translations update 2020-12-29 02:38:04 +00:00
dependabot-preview[bot]
b4d1925e45 Bump ASF-ui from b9bf013 to eac6b26
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `b9bf013` to `eac6b26`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](b9bf013235...eac6b266c2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-29 01:33:12 +00:00
GitHub Action
b0e18edc9a Automatic translations update 2020-12-28 02:37:09 +00:00
dependabot-preview[bot]
26de0e1a59 Bump ASF-ui from 959f573 to b9bf013
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `959f573` to `b9bf013`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](959f5739e0...b9bf013235)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-28 01:43:11 +00:00
GitHub Action
1ddf3c6f02 Automatic translations update 2020-12-27 02:36:05 +00:00
GitHub Action
0e4b6ab807 Automatic translations update 2020-12-26 02:34:39 +00:00
JustArchi
cb5f2a27cc Misc 2020-12-25 23:12:42 +01:00
GitHub Action
fe9b3b2bc0 Automatic translations update 2020-12-25 02:35:14 +00:00
dependabot-preview[bot]
88ac54ae1a Bump wiki from 273a6ef to a9a6fca
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `273a6ef` to `a9a6fca`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](273a6ef1e3...a9a6fca988)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-25 01:50:26 +00:00
dependabot-preview[bot]
21eee5adec Bump ASF-ui from f9f42c5 to 959f573
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `f9f42c5` to `959f573`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](f9f42c54c4...959f5739e0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-25 01:34:48 +00:00
JustArchi
ff36cd4733 Always save global database if doesn't exist
Bot database doesn't have any crucial info to save, but global database is used at least with its ASF identifier (that we don't really want to regenerate) as well as for first run detection.
2020-12-24 21:30:16 +01:00
JustArchi
32bd163416 Replace Bitcoin donate with Crypto donate 2020-12-24 21:14:48 +01:00
JustArchi
b320a3e95e Bump 2020-12-24 20:23:15 +01:00
Vitaliy
5a44403cf0 Add check for appIDs after intersection (#2099) 2020-12-24 20:20:57 +01:00
GitHub Action
affe8b26eb Automatic translations update 2020-12-24 02:38:36 +00:00
dependabot-preview[bot]
c6f5c89cb0 Bump wiki from 785aa27 to 2f8a040
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `785aa27` to `2f8a040`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](785aa275cf...2f8a0406d4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-24 01:32:26 +00:00
GitHub Action
513af9f83c Automatic translations update 2020-12-23 02:36:28 +00:00
Vitaliy
4bc2c3ecd8 Fix interface members visibility (#2094) 2020-12-22 09:49:19 +01:00
GitHub Action
12d5425453 Automatic translations update 2020-12-22 02:33:53 +00:00
dependabot-preview[bot]
e9374aaf1c Bump wiki from 2486c47 to 3ef377b
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `2486c47` to `3ef377b`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](2486c472f3...3ef377ba8c)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-22 01:32:13 +00:00
GitHub Action
6fa354c221 Automatic translations update 2020-12-21 02:29:40 +00:00
dependabot-preview[bot]
2358211b47 Bump ASF-ui from 458e9e0 to f9f42c5
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `458e9e0` to `f9f42c5`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](458e9e02d2...f9f42c54c4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-21 01:36:13 +00:00
GitHub Action
9c78a3334c Automatic translations update 2020-12-20 02:24:01 +00:00
JustArchi
0db004ae35 Misc reordering 2020-12-19 00:25:22 +01:00
JustArchi
4ebed5a046 Misc 2020-12-19 00:14:45 +01:00
JustArchi
34c5f5cf8b Closes #2012 2020-12-18 22:06:15 +01:00
Vitaliy
c5c55dc44e Add base path support for swagger (#2091) 2020-12-18 12:05:54 +01:00
dependabot-preview[bot]
aad3458ce2 Bump ASF-ui from 605d4aa to 458e9e0
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `605d4aa` to `458e9e0`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](605d4aac50...458e9e02d2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-18 01:33:45 +00:00
GitHub Action
be05a411cf Automatic translations update 2020-12-17 02:21:57 +00:00
dependabot-preview[bot]
302cd1dc44 Bump ASF-ui from 459682a to 605d4aa
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `459682a` to `605d4aa`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](459682ab2f...605d4aac50)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-17 01:32:38 +00:00
JustArchi
626fa7f059 Use the cancellation token logic also with sends 2020-12-16 12:47:46 +01:00
JustArchi
79a9f97157 Add two more exceptions to NLogGet
Even with cancellation token, it seems that it's not always possible to abort the connection in the clean way, pointless to throw on them since there is nothing else we can do.
2020-12-16 12:11:21 +01:00
JustArchi
c140b302eb Correct CI
I forgot this is a struct, not a class
2020-12-16 10:21:16 +01:00
JustArchi
58ae29d1eb Small fixes after #2087
- Add guard against cancellationToken being null
- Use cancellationToken for all webSocket operations
- Use no cancellation token for semaphore release
- Log TaskCanceledException on user-debugging level
2020-12-16 10:18:05 +01:00
Bartosz Chrostowski
3e2c7dcf2c Add cancellation token to web socket (#2087)
* Add cancelation token to web socket

* Add catching cancelation exception from web scoket
2020-12-16 10:03:13 +01:00
GitHub Action
610667c6e6 Automatic translations update 2020-12-16 02:21:07 +00:00
dependabot-preview[bot]
1e1924b913 Bump ASF-ui from dacb4d6 to 459682a
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `dacb4d6` to `459682a`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](dacb4d6d4d...459682ab2f)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-16 01:35:14 +00:00
JustArchi
e8898e6871 Bump 2020-12-15 20:24:27 +01:00
Vitaliy
7c4b2638d1 Add Steam Awards 2020 to blacklist (#2086) 2020-12-15 20:20:24 +01:00
GitHub Action
b60b5cfa71 Automatic translations update 2020-12-15 02:20:37 +00:00
dependabot-preview[bot]
aa1f3fbe6a Bump wiki from b382fc0 to 2abd05a
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `b382fc0` to `2abd05a`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](b382fc0c80...2abd05a2f3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-15 01:31:43 +00:00
GitHub Action
080adfa133 Automatic translations update 2020-12-12 02:17:44 +00:00
JustArchi
9d2bb9939d Misc 2020-12-11 23:00:54 +01:00
GitHub Action
fcba8adedd Automatic translations update 2020-12-11 02:18:04 +00:00
GitHub Action
edd9bb8f2a Automatic translations update 2020-12-10 02:17:31 +00:00
dependabot-preview[bot]
0d10382cef Bump ASF-ui from 0d1c70d to dacb4d6
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `0d1c70d` to `dacb4d6`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](0d1c70d75e...dacb4d6d4d)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-10 01:39:37 +00:00
JustArchi
978cac9c01 Orange was a mistake 2020-12-09 12:43:09 +01:00
JustArchi
5d3f1f308c Add revolut as donation option 2020-12-09 12:41:39 +01:00
GitHub Action
192aab5371 Automatic translations update 2020-12-09 02:15:06 +00:00
dependabot-preview[bot]
1314e81937 Bump ASF-ui from 7c1b566 to 0d1c70d
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7c1b566` to `0d1c70d`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7c1b566bc5...0d1c70d75e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-09 01:33:23 +00:00
GitHub Action
e5cff3c496 Automatic translations update 2020-12-08 02:15:06 +00:00
dependabot-preview[bot]
98efacb4f2 Bump ASF-ui from e65e331 to 7c1b566
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `e65e331` to `7c1b566`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](e65e331696...7c1b566bc5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-08 01:32:52 +00:00
GitHub Action
7061f135e6 Automatic translations update 2020-12-07 02:14:01 +00:00
dependabot-preview[bot]
8fef6bfb71 Bump ASF-ui from b6e4dc8 to e65e331
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `b6e4dc8` to `e65e331`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](b6e4dc8cac...e65e331696)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-07 01:40:43 +00:00
dependabot-preview[bot]
9fd1d4ce7f Bump NLog from 4.7.5 to 4.7.6
Bumps [NLog](https://github.com/NLog/NLog) from 4.7.5 to 4.7.6.
- [Release notes](https://github.com/NLog/NLog/releases)
- [Changelog](https://github.com/NLog/NLog/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/NLog/NLog/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-06 19:48:41 +00:00
JustArchi
bc8ee3592d Cleanup some obsolete warnings 2020-12-05 21:53:18 +01:00
JustArchi
4e190b7dfd Misc code improvements 2020-12-05 20:30:15 +01:00
JustArchi
6265aa7271 Misc code improvements 2020-12-05 20:27:10 +01:00
JustArchi
f66d5e6116 Remove unneeded restriction 2020-12-04 20:05:45 +01:00
GitHub Action
fda7755102 Automatic translations update 2020-12-04 02:09:53 +00:00
GitHub Action
5f8482cdae Automatic translations update 2020-12-03 02:09:56 +00:00
dependabot-preview[bot]
31bc1a10b0 Bump ASF-ui from 906dfdf to b6e4dc8
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `906dfdf` to `b6e4dc8`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](906dfdf315...b6e4dc8cac)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-03 01:33:17 +00:00
dependabot-preview[bot]
a9080ba01a Bump Microsoft.NET.Test.Sdk from 16.8.0 to 16.8.3
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 16.8.0 to 16.8.3.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Commits](https://github.com/microsoft/vstest/compare/v16.8.0...v16.8.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-02 23:34:29 +00:00
JustArchi
31257449ed STD: Make loading GlobalCache fully async 2020-12-03 00:10:52 +01:00
JustArchi
b712706149 Remove no-longer-needed casts after C# compiler got smarter 2020-12-02 23:50:49 +01:00
JustArchi
82ff7762f2 Convert possible substring calls to string ranges 2020-12-02 23:45:20 +01:00
dependabot-preview[bot]
6acca200c1 Bump ASF-ui from bddaee9 to 906dfdf (#2073)
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `bddaee9` to `906dfdf`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](bddaee99fc...906dfdf315)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-12-02 11:55:53 +01:00
dependabot-preview[bot]
dc1ef983c2 Bump Markdig.Signed from 0.22.0 to 0.22.1
Bumps [Markdig.Signed](https://github.com/lunet-io/markdig) from 0.22.0 to 0.22.1.
- [Release notes](https://github.com/lunet-io/markdig/releases)
- [Changelog](https://github.com/lunet-io/markdig/blob/master/changelog.md)
- [Commits](https://github.com/lunet-io/markdig/compare/0.22.0...0.22.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-02 10:53:20 +00:00
GitHub Action
9c845fb614 Automatic translations update 2020-12-02 02:09:14 +00:00
JustArchi
93582696fe Avoid attempting to save database without a FilePath 2020-12-01 23:32:00 +01:00
GitHub Action
a0dc81804e Automatic translations update 2020-12-01 02:09:52 +00:00
dependabot-preview[bot]
da129386a1 Bump ASF-ui from 4fac17a to bddaee9
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `4fac17a` to `bddaee9`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](4fac17af0e...bddaee99fc)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-12-01 01:35:38 +00:00
GitHub Action
3b5b20c3e4 Automatic translations update 2020-11-30 02:10:16 +00:00
dependabot-preview[bot]
9eba229c91 Bump ASF-ui from 7520acb to 4fac17a
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7520acb` to `4fac17a`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7520acbe3a...4fac17af0e)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-30 01:36:52 +00:00
JustArchi
627d7ca371 Correct outdated database serialization 2020-11-29 18:33:11 +01:00
JustArchi
8ff0ea1bb5 Misc 2020-11-29 16:18:40 +01:00
JustArchi
14f58d5aec Code cleanup 2020-11-29 16:15:20 +01:00
JustArchi
e522602535 Implement OnModified event to our ConcurrentHashSet and make use of it in bot database 2020-11-29 16:03:25 +01:00
GitHub Action
698bf7b788 Automatic translations update 2020-11-29 02:09:53 +00:00
JustArchi
835d567fec Abort startup if config directory could not be found
We do not require any config files, but config directory - yes, we won't bother creating it manually as it heavily suggests user mistake, such as --path to the wrong directory.
2020-11-28 23:55:09 +01:00
JustArchi
ba702a1dae Misc 2020-11-28 23:18:23 +01:00
JustArchi
97ee4eaef2 Misc 2020-11-28 23:16:03 +01:00
JustArchi
8fb91fe58b Misc 2020-11-28 22:06:54 +01:00
dependabot-preview[bot]
be808be3db Bump JetBrains.Annotations from 2020.1.0 to 2020.3.0
Bumps JetBrains.Annotations from 2020.1.0 to 2020.3.0.

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-28 20:10:25 +00:00
JustArchi
eebd7d6f45 Misc 2020-11-28 20:45:47 +01:00
JustArchi
2aaffaa208 Misc 2020-11-28 19:51:09 +01:00
JustArchi
bf89a162e2 Misc 2020-11-28 19:25:17 +01:00
GitHub Action
fe5d3b4626 Automatic translations update 2020-11-28 02:09:57 +00:00
GitHub Action
f3a1cfacf8 Automatic translations update 2020-11-27 02:09:43 +00:00
dependabot-preview[bot]
8f25f562e9 Bump ASF-ui from 3b62205 to 7520acb
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `3b62205` to `7520acb`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](3b622058ab...7520acbe3a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-27 01:29:47 +00:00
JustArchi
8bfbab57f7 Bump 2020-11-26 18:36:13 +01:00
JustArchi
e31f194938 Misc 2020-11-26 18:24:31 +01:00
JustArchi
8aeee1e238 Allow retry in mutex acquire process 2020-11-26 18:22:55 +01:00
dependabot-preview[bot]
0a25ee9197 Bump wiki from 9ccf1b4 to 2755a49
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `9ccf1b4` to `2755a49`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](9ccf1b4073...2755a49842)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-26 16:48:26 +00:00
GitHub Action
c83c86592a Automatic translations update 2020-11-26 02:09:36 +00:00
dependabot-preview[bot]
f5300ecdf1 Bump ASF-ui from 0586542 to 3b62205
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `0586542` to `3b62205`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](0586542cb0...3b622058ab)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-26 01:54:00 +00:00
JustArchi
198db60c51 Misc 2020-11-25 21:15:42 +01:00
JustArchi
bb25c94aef Bump 2020-11-25 12:33:01 +01:00
JustArchi
d1ca1e9b2c Add a pre-container assembly verification for detecting failing plugins 2020-11-25 12:26:46 +01:00
JustArchi
178509eb21 Avoid loading assemblies in IPC when no plugins are active
Apart from small optimization, this avoids the problem of starting IPC server if one of the assemblies fail to load (as ASF will abort the rest of the plugins loading routine, and therefore no plugins will be loaded at all).
2020-11-25 11:52:02 +01:00
GitHub Action
2d6e8ed673 Automatic translations update 2020-11-25 02:09:37 +00:00
dependabot-preview[bot]
95eeba8e53 Bump ASF-ui from 7acc033 to 0586542
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `7acc033` to `0586542`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](7acc033156...0586542cb0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-25 01:33:02 +00:00
JustArchi
f0fbf318f4 Bump 2020-11-24 17:40:34 +01:00
GitHub Action
4cb822cbf2 Automatic translations update 2020-11-24 02:09:33 +00:00
dependabot-preview[bot]
e1ad30ebe8 Bump wiki from f8ce64c to fb005a3
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `f8ce64c` to `fb005a3`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](f8ce64c006...fb005a3444)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-24 01:47:13 +00:00
dependabot-preview[bot]
63b92bd4a9 Bump ASF-ui from e5b334b to 7acc033
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `e5b334b` to `7acc033`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](e5b334bc74...7acc033156)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-24 01:46:46 +00:00
GitHub Action
c5de5cb1af Automatic translations update 2020-11-23 02:09:42 +00:00
dependabot-preview[bot]
71cf55be3f Bump ASF-ui from 1f52d6a to e5b334b
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `1f52d6a` to `e5b334b`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](1f52d6a635...e5b334bc74)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-23 01:37:43 +00:00
JustArchi
74a30a8215 Make GetOwnedGames display also profile-limited games 2020-11-22 18:16:32 +01:00
GitHub Action
db452a2da0 Automatic translations update 2020-11-22 02:09:24 +00:00
JustArchi
0b5d1211fa Bump 2020-11-21 19:07:08 +01:00
JustArchi
084388087e Revert "Make --ignore-unsupported-environment emit a warning instead of nothing"
This reverts commit dd1bb75b8a.
2020-11-21 18:30:49 +01:00
JustArchi
cbbd6fab2d Work around OS X limitations 2020-11-21 18:14:15 +01:00
JustArchi
d9e3496e5e Optimize csprojs and STD plugin publishing
thanks to @Vital7 for the idea
2020-11-21 18:09:05 +01:00
JustArchi
d896f16cbf Bump 2020-11-21 17:12:13 +01:00
JustArchi
10381dfdba Add extra safeguard in STD against zeros 2020-11-21 17:07:18 +01:00
JustArchi
310048acf9 Bump 2020-11-21 15:43:43 +01:00
Vitaliy
3ac04c6aaf Fix parsing tags in GetActiveTradeOffers (#2060)
* Fix parsing tags in GetActiveTradeOffers

* Accept empty values in Tag constructor

* Throw on null value in constructor

* Fix mindless copypaste
2020-11-21 15:42:19 +01:00
JustArchi
6a8a3b9c8a Travis: using you is a mistake 2020-11-21 14:39:17 +01:00
JustArchi
d892661acd Travis: OS updates 2020-11-21 14:34:35 +01:00
JustArchi
dd1bb75b8a Make --ignore-unsupported-environment emit a warning instead of nothing 2020-11-21 14:18:23 +01:00
JustArchi
2d7979e9ee STD: Save information about submitted tokens/keys
This also allows us to resubmit the same app/package/depot upon token/key change, which didn't happen previously.
2020-11-21 13:54:09 +01:00
GitHub Action
f6c1c04394 Automatic translations update 2020-11-21 02:09:09 +00:00
GitHub Action
38e1ece16f Automatic translations update 2020-11-20 02:09:16 +00:00
dependabot-preview[bot]
7513f136ba Bump ASF-ui from d066be5 to 1f52d6a
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `d066be5` to `1f52d6a`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](d066be50da...1f52d6a635)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-20 01:31:20 +00:00
JustArchi
f429a7b618 Misc CIs 2020-11-19 21:32:06 +01:00
JustArchi
1c1c9d107b Try to guess what is wrong with GitHub 2020-11-19 21:21:48 +01:00
JustArchi
f259d2a846 Misc fixes 2020-11-19 21:08:50 +01:00
JustArchi
792babb049 Misc cleanup 2020-11-19 21:04:45 +01:00
JustArchi
a34b1724b1 Misc cleanup 2020-11-19 21:03:09 +01:00
JustArchi
51ad3b0c76 Improve runtime compatibility
This commit does 3 things:
- adds safeguard against running generic-netf in unsupported environments
- adds notice about providing ASF with unknown command-line arguments
- refactors old pre+post args parsing into a single window
2020-11-19 21:01:17 +01:00
GitHub Action
fc36174953 Automatic translations update 2020-11-19 02:08:54 +00:00
dependabot-preview[bot]
7e731b9826 Bump ASF-ui from c4f2a07 to d066be5
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `c4f2a07` to `d066be5`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](c4f2a0703a...d066be50da)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-19 01:33:57 +00:00
GitHub Action
63bec34d7a Automatic translations update 2020-11-18 02:09:09 +00:00
dependabot-preview[bot]
fc97cc7d70 Bump wiki from 748e008 to f32a499
Bumps [wiki](https://github.com/JustArchiNET/ArchiSteamFarm.wiki) from `748e008` to `f32a499`.
- [Release notes](https://github.com/JustArchiNET/ArchiSteamFarm.wiki/releases)
- [Commits](748e0087ff...f32a499cf9)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-18 01:48:04 +00:00
dependabot-preview[bot]
4e302d0b7a Bump ASF-ui from 021a4e0 to c4f2a07
Bumps [ASF-ui](https://github.com/JustArchiNET/ASF-ui) from `021a4e0` to `c4f2a07`.
- [Release notes](https://github.com/JustArchiNET/ASF-ui/releases)
- [Commits](021a4e0f26...c4f2a0703a)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-11-18 01:32:43 +00:00
JustArchi
3bdd6c76b9 Update ArchiSteamFarm.sln.DotSettings 2020-11-17 20:13:29 +01:00
JustArchi
e0e26f57aa Bump 2020-11-17 14:14:20 +01:00
325 changed files with 36583 additions and 38782 deletions

View File

@@ -7,6 +7,9 @@
# Ignore all files in custom in-tree config directory (if exists)
ArchiSteamFarm/config
# Ignore private SNK key (if exists)
resources/ArchiSteamFarm.snk
# Ignore local log + debug of development builds
ArchiSteamFarm/log.txt
ArchiSteamFarm/debug
@@ -29,7 +32,6 @@ ArchiSteamFarm/logs
ArchiSteamFarm.CustomPlugins.*
ASF-ui/dist
tools
wiki
# _ _
@@ -130,6 +132,9 @@ test-results/
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
@@ -137,12 +142,14 @@ test-results/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
@@ -156,9 +163,10 @@ Generated\ Files/
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
@@ -173,6 +181,9 @@ project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
@@ -198,6 +209,7 @@ StyleCopReport.xml
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
@@ -239,9 +251,6 @@ _ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
@@ -252,6 +261,11 @@ _TeamCity*
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
@@ -299,6 +313,8 @@ PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
@@ -309,6 +325,9 @@ PublishScripts/
*.nuget.props
*.nuget.targets
# Nuget personal access tokens and Credentials
nuget.config
# Microsoft Azure Build Output
csx/
*.build.csdef
@@ -323,6 +342,8 @@ BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
@@ -348,8 +369,6 @@ orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true
**/wwwroot/lib/
# RIA/Silverlight projects
Generated_Code/
@@ -374,6 +393,9 @@ ServiceFabricBackup/
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
@@ -409,10 +431,6 @@ paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
@@ -454,22 +472,39 @@ ASALocalRun/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
# BeatPulse healthcheck temp database
healthchecksdb
# __ __ _ _ ____ _ _ _ ____ _
# \ \ / /(_) ___ _ _ __ _ | |/ ___| | |_ _ _ __| |(_) ___ / ___| ___ __| | ___
# \ \ / / | |/ __|| | | | / _` || |\___ \ | __|| | | | / _` || | / _ \ | | / _ \ / _` | / _ \
# \ V / | |\__ \| |_| || (_| || | ___) || |_ | |_| || (_| || || (_) || |___| (_) || (_| || __/
# \_/ |_||___/ \__,_| \__,_||_||____/ \__| \__,_| \__,_||_| \___/ \____|\___/ \__,_| \___|
#
# https://github.com/github/gitignore/blob/master/Global/VisualStudioCode.gitignore
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
.idea/
*.sln.iml
# __ __ _ _
# \ \ / /(_) _ __ __| | ___ __ __ ___
@@ -481,6 +516,7 @@ healthchecksdb
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db

View File

@@ -1,9 +1,9 @@
root = true
###############################
# Core EditorConfig Options #
###############################
root = true
[*]
charset = utf-8
indent_style = tab
@@ -11,10 +11,17 @@ insert_final_newline = true
trim_trailing_whitespace = true
###############################
# .NET Coding Conventions #
# C# Coding Conventions #
###############################
[*.cs]
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = false
csharp_indent_labels = flush_left
csharp_indent_switch_labels = true
csharp_new_line_before_catch = false
csharp_new_line_before_else = false
csharp_new_line_before_finally = false
@@ -23,57 +30,185 @@ csharp_new_line_before_members_in_object_initializers = false
csharp_new_line_before_open_brace = none
csharp_new_line_between_query_expression_clauses = false
csharp_prefer_braces = true:suggestion
csharp_prefer_braces = true:warning
csharp_prefer_simple_default_expression = true:warning
csharp_prefer_simple_using_statement = true:warning
csharp_prefer_static_local_function = true:warning
csharp_preferred_modifier_order = public,protected,internal,private,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
csharp_preferred_modifier_order = public, protected, internal, private, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:warning
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
csharp_space_after_cast = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = none
csharp_space_between_square_brackets = false
csharp_style_expression_bodied_accessors = true:suggestion
csharp_style_expression_bodied_constructors = true:suggestion
csharp_style_expression_bodied_indexers = true:suggestion
csharp_style_expression_bodied_methods = true:suggestion
csharp_style_expression_bodied_operators = true:suggestion
csharp_style_expression_bodied_properties = true:suggestion
csharp_style_conditional_delegate_call = true:warning
csharp_style_deconstructed_variable_declaration = true:warning
csharp_style_var_elsewhere = false:suggestion
csharp_style_var_for_built_in_types = false:suggestion
csharp_style_var_when_type_is_apparent = false:suggestion
csharp_style_expression_bodied_accessors = true:warning
csharp_style_expression_bodied_constructors = true:warning
csharp_style_expression_bodied_indexers = true:warning
csharp_style_expression_bodied_lambdas = true:warning
csharp_style_expression_bodied_local_functions = true:warning
csharp_style_expression_bodied_methods = true:warning
csharp_style_expression_bodied_operators = true:warning
csharp_style_expression_bodied_properties = true:warning
csharp_using_directive_placement = outside_namespace:suggestion
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
csharp_style_inlined_variable_declaration = true:warning
csharp_style_pattern_local_over_anonymous_function = true:warning
csharp_style_pattern_matching_over_as_with_null_check = true:warning
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
csharp_style_prefer_index_operator = true:warning
csharp_style_prefer_not_pattern = true:warning
csharp_style_prefer_pattern_matching = true:warning
csharp_style_prefer_range_operator = true:warning
csharp_style_prefer_switch_expression = true:warning
csharp_style_throw_expression = true:warning
csharp_style_unused_value_assignment_preference = discard_variable :warning
csharp_style_unused_value_expression_statement_preference = discard_variable:warning
csharp_style_var_elsewhere = false:warning
csharp_style_var_for_built_in_types = false:warning
csharp_style_var_when_type_is_apparent = false:warning
csharp_using_directive_placement = outside_namespace
###############################
# .NET Coding Conventions #
###############################
[*.{cs,vb}]
# PascalCase for naming everything but parameters
dotnet_naming_rule.all_members_must_be_capitalized.severity = suggestion
dotnet_naming_rule.all_members_must_be_capitalized.style = all_symbols
dotnet_naming_rule.all_members_must_be_capitalized.symbols = all_symbols
dotnet_naming_style.all_symbols.capitalization = pascal_case
dotnet_naming_symbols.all_symbols.applicable_accessibilities = *
dotnet_naming_symbols.all_symbols.applicable_kinds = class,struct,interface,enum,property,method,field,event,delegate
dotnet_analyzer_diagnostic.severity = warning
# camelCase for naming parameters
dotnet_naming_rule.parameters_must_be_camel_case.severity = suggestion
dotnet_naming_rule.parameters_must_be_camel_case.style = params
dotnet_naming_rule.parameters_must_be_camel_case.symbols = params
dotnet_naming_style.params.capitalization = camel_case
dotnet_naming_symbols.params.applicable_accessibilities = *
dotnet_naming_symbols.params.applicable_kinds = parameter
dotnet_code_quality.ca3003.excluded_symbol_names = BotController
dotnet_code_quality.ca3012.excluded_symbol_names = BotController|CommandController
dotnet_sort_system_directives_first = true:suggestion
dotnet_code_quality_unused_parameters = all:warning
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:suggestion
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:suggestion
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_prefer_auto_properties = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = false:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_require_accessibility_modifiers = always:suggestion
dotnet_diagnostic.ca1028.severity = silent
dotnet_diagnostic.ca1031.severity = silent
# Rule - almost everything
dotnet_naming_rule.almost_everything_must_be_pascal_case.severity = warning
dotnet_naming_rule.almost_everything_must_be_pascal_case.style = pascal_case
dotnet_naming_rule.almost_everything_must_be_pascal_case.symbols = almost_everything
# Rule - enums
dotnet_naming_rule.enums_must_be_e_pascal_case.severity = warning
dotnet_naming_rule.enums_must_be_e_pascal_case.style = e_pascal_case
dotnet_naming_rule.enums_must_be_e_pascal_case.symbols = enums
# Rule - interfaces
dotnet_naming_rule.interfaces_must_be_i_pascal_case.severity = warning
dotnet_naming_rule.interfaces_must_be_i_pascal_case.style = i_pascal_case
dotnet_naming_rule.interfaces_must_be_i_pascal_case.symbols = interfaces
# Rule - local parameters
dotnet_naming_rule.local_parameters_must_be_camel_case.severity = warning
dotnet_naming_rule.local_parameters_must_be_camel_case.style = camel_case
dotnet_naming_rule.local_parameters_must_be_camel_case.symbols = local_parameters
# Rule - type parameters
dotnet_naming_rule.type_parameters_must_be_t_pascal_case.severity = warning
dotnet_naming_rule.type_parameters_must_be_t_pascal_case.style = t_pascal_case
dotnet_naming_rule.type_parameters_must_be_t_pascal_case.symbols = type_parameters
# Style - camelCase
dotnet_naming_style.camel_case.capitalization = camel_case
# Style - EPascalCase
dotnet_naming_style.e_pascal_case.capitalization = pascal_case
dotnet_naming_style.e_pascal_case.required_prefix = E
# Style - IPascalCase
dotnet_naming_style.i_pascal_case.capitalization = pascal_case
dotnet_naming_style.i_pascal_case.required_prefix = I
# Style - PascalCase
dotnet_naming_style.pascal_case.capitalization = pascal_case
# Style - TPascalCase
dotnet_naming_style.t_pascal_case.capitalization = pascal_case
dotnet_naming_style.t_pascal_case.required_prefix = T
# Symbol - almost everything
dotnet_naming_symbols.almost_everything.applicable_accessibilities = *
dotnet_naming_symbols.almost_everything.applicable_kinds = namespace,class,struct,property,method,field,event,delegate
# Symbol - enums
dotnet_naming_symbols.enums.applicable_accessibilities = *
dotnet_naming_symbols.enums.applicable_kinds = enum
# Symbol - interfaces
dotnet_naming_symbols.interfaces.applicable_accessibilities = *
dotnet_naming_symbols.interfaces.applicable_kinds = interface
# Symbol - local parameters
dotnet_naming_symbols.local_parameters.applicable_accessibilities = *
dotnet_naming_symbols.local_parameters.applicable_kinds = parameter,local,local_function
# Symbol - type parameters
dotnet_naming_symbols.type_parameters.applicable_accessibilities = *
dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter
dotnet_remove_unnecessary_suppression_exclusions = none:warning
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = true
dotnet_style_coalesce_expression = true:warning
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:warning
dotnet_style_null_propagation = true:warning
dotnet_style_object_initializer = true:warning
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
dotnet_style_predefined_type_for_locals_parameters_members = true:warning
dotnet_style_predefined_type_for_member_access = true:warning
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_prefer_compound_assignment = true:warning
dotnet_style_prefer_conditional_expression_over_assignment = true:warning
dotnet_style_prefer_conditional_expression_over_return = true:warning
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
dotnet_style_prefer_inferred_tuple_names = true:warning
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
dotnet_style_prefer_simplified_boolean_expressions = true:warning
dotnet_style_prefer_simplified_interpolation = true:warning
dotnet_style_qualification_for_event = false:warning
dotnet_style_qualification_for_field = false:warning
dotnet_style_qualification_for_method = false:warning
dotnet_style_qualification_for_property = false:warning
dotnet_style_readonly_field = true:warning
dotnet_style_require_accessibility_modifiers = always:warning

View File

@@ -1,3 +1,4 @@
# Contributor Covenant Code of Conduct
## Our Pledge
@@ -6,7 +7,7 @@ We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
nationality, personal appearance, race, caste, color, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
@@ -59,7 +60,7 @@ representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at ASF@JustArchi.net.
reported to the community leaders responsible for enforcement at **[ASF@JustArchi.net](mailto:ASF@JustArchi.net)**.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
@@ -114,14 +115,18 @@ the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
at [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -4,7 +4,7 @@ Before making an issue or pull request, you should carefully read **[ASF wiki](h
## Issues
GitHub **[issues](https://github.com/JustArchiNET/ArchiSteamFarm/issues)** page is being used for ASF "todo" list, regarding both features and bugs. It has **strict policy** that applies to everybody - GitHub is **NOT** technical support, it's a place dedicated **only** to ASF bugs and suggestions. It's **not** proper place for technical issues, general discussion or questions that are unrelated to development. In short, GitHub is for the **development** part of the ASF, and all issues should be **development-oriented**. You have **[ASF chat](https://discord.gg/hSQgt8j)** and **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)** for general discussion, questions, technical issues and everything else that is not related to ASF development. If you decide to use GitHub issues, please make sure that you're in fact dealing with a bug, or your suggestion makes sense, preferably by asking on chat/steam group first. Invalid issues will be closed immediately and won't be answered - if you're not sure if your issue is valid, then most likely it's not, and you shouldn't post it here. Valid bugs/suggestions will be forwarded and added as GitHub issues by us, if needed.
**[GitHub issues](https://github.com/JustArchiNET/ArchiSteamFarm/issues)** page is being used for ASF "todo" list, regarding both features and bugs. It has **strict policy** that applies to everybody - GitHub issues is **NOT** technical support, it's a place dedicated **only** to ASF bugs and suggestions. It's **not** proper place for technical issues, general discussion or questions that are unrelated to development. In short, GitHub is for the **development** part of the ASF, and all issues should be **development-oriented**. You have **[GitHub discussions](https://github.com/JustArchiNET/ArchiSteamFarm/discussions/categories/support)**, **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)** and **[Discord server](https://discord.gg/hSQgt8j)** for general discussion, questions, technical issues and everything else that is not related to ASF development. If you decide to use GitHub issues, please make sure that you're in fact dealing with a bug, or your suggestion makes sense, preferably by asking on one of our support channels first. Invalid issues will be closed immediately and won't be answered - if you're not sure if your issue is valid, then most likely it's not, and you shouldn't post it here. Valid bugs/suggestions will be forwarded and added as GitHub issues by us, if needed.
Examples of **invalid** issues:
- Asking how to install the program or use one of its functions
@@ -33,9 +33,9 @@ It would also be cool if you could reproduce your issue on latest **[pre-release
### Suggestions
While everybody is able to create suggestions how to improve ASF, GitHub issues is not the proper place to discuss if your enhancement makes sense - by posting it you already **believe** that it makes sense, and you're **ready to convince us how**. If you have some idea but you're not sure if it's possible, makes sense, or fits ASF purpose - you have **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)** discussions where we'll be happy to discuss given enhancement in calm atmosphere, evaluating possibilities and pros/cons. This is what we suggest to do in the first place, as in GitHub issue you're switching from **having an idea** into **having a valid enhancement with general concept, given purpose and fixed details - you're ready to defend your idea and convince us how it can be useful for ASF**. This is the general reason why many issues are rejected - because you're lacking details that would prove your suggestion being worthy.
While everybody is able to create suggestions how to improve ASF, GitHub issues is not the proper place to discuss if your enhancement makes sense - by posting it you already **believe** that it makes sense, and you're **ready to convince us how**. If you have some idea but you're not sure if it's possible, makes sense, or fits ASF purpose - you have our support channels where we'll be happy to discuss given enhancement in calm atmosphere, evaluating possibilities and pros/cons. This is what we suggest to do in the first place, as in GitHub issue you're switching from **having an idea** into **having a valid enhancement with general concept, given purpose and fixed details - you're ready to defend your idea and convince us how it can be useful for ASF**. This is the general reason why many issues are rejected - because you're lacking details that would prove your suggestion being worthy.
ASF has a strict scope - idling Steam cards from Steam games + basic bots management. ASF scope is very subjective and evaluated on practical/moral basis - how much this feature fits ASF, how much actual coding effort is required to make it happen, how useful/wanted this feature is by the community and likewise. In general we don't mind further enhancements to the program, as there is always a room for improvement, but at the same time we consider ASF to be feature-complete and vast majority of things that are suggested today are simply out of the scope of ASF as a program. This is why we've rejected **[a lot](https://github.com/JustArchiNET/ArchiSteamFarm/issues?q=label%3AEnhancement+label%3A%22Not+going+to+happen%22)** of general enhancements, for various different reasons, mainly regarding the scope of the program. Some people may find it hard to understand why we're rather sceptical towards suggestions, while the answer for that isn't obvious at first.
ASF has a strict scope - farming Steam cards from Steam games + basic bots management. ASF scope is very subjective and evaluated on practical/moral basis - how much this feature fits ASF, how much actual coding effort is required to make it happen, how useful/wanted this feature is by the community and likewise. In general we don't mind further enhancements to the program, as there is always a room for improvement, but at the same time we consider ASF to be feature-complete and vast majority of things that are suggested today are simply out of the scope of ASF as a program. This is why we've rejected **[a lot](https://github.com/JustArchiNET/ArchiSteamFarm/issues?q=label%3A"✨+Enhancement"+label%3A"👎+Not+going+to+happen")** of general enhancements, for various different reasons, mainly regarding the scope of the program. Some people may find it hard to understand why we're rather sceptical towards suggestions, while the answer for that isn't obvious at first.
> In the lifetime of an Open Source project, only 10 percent of the time spent adding a feature will be spent coding it. The other 90 percent will be spent in support of that feature.
@@ -51,9 +51,9 @@ In any case, you should be able to explain to us in the issue why you consider y
## Pull requests
Pull requests are a bit different compared to issues, as in PR you're asking us to review the code and accept it, unless **we** have a reason against it. Very often we won't have enough arguments to accept given suggestion and code something, but we also won't have enough arguments **against** given suggestion, which makes it possible for you to code it yourself, then send a PR for review, and hopefully include your feature in ASF, even if we wouldn't code it otherwise. Such issues are appropriately tagged with **[PR-ok](https://github.com/JustArchiNET/ArchiSteamFarm/issues?q=is%3Aissue+is%3Aclosed+label%3APR-ok)** so you can easily take a look at those features that we wouldn't mind, but neither code ourselves. All of that is possible thanks to the fact that when dealing with PR, **we** are in position to find reasoning against it, and not necessarily you defending your own code. This is how **[a lot](https://github.com/JustArchiNET/ArchiSteamFarm/pulls?q=is%3Apr+is%3Amerged)** of ASF features were actually made possible, but at the same time there are still **[cases](https://github.com/JustArchiNET/ArchiSteamFarm/pulls?q=is%3Apr+is%3Aclosed+label%3A%22Not+going+to+happen%22)** of PRs that we decided to reject.
Pull requests are a bit different compared to issues, as in PR you're asking us to review the code and accept it, unless **we** have a reason against it. Very often we won't have enough arguments to accept given suggestion and code something, but we also won't have enough arguments **against** given suggestion, which makes it possible for you to code it yourself, then send a PR for review, and hopefully include your feature in ASF, even if we wouldn't code it otherwise. Such issues are appropriately tagged with **[PR-ok](https://github.com/JustArchiNET/ArchiSteamFarm/issues?q=label%3A"👍+PR-ok"+-label%3A"🏁+Finished")** so you can easily take a look at those features that we wouldn't mind, but neither code ourselves. All of that is possible thanks to the fact that when dealing with PR, **we** are in position to find reasoning against it, and not necessarily you defending your own code. This is how **[a lot](https://github.com/JustArchiNET/ArchiSteamFarm/pulls?q=is%3Apr+is%3Amerged+-label%3A"🤖+Automatic")** of ASF features were actually made possible, but at the same time there are still **[cases](https://github.com/JustArchiNET/ArchiSteamFarm/pulls?q=is%3Apr+is%3Aclosed+label%3A"👎+Not+going+to+happen")** of PRs that we decided to reject.
In general any pull request is welcome and should be accepted, unless there is a strong reason against it. A strong reason includes mainly only things we directly do not agree with, such as features that are against Steam ToS (like explained above), greatly against ASF scope (to the point it'd hurt overall maintenance), or likewise. If there is nothing severe enough to justify rejecting PR, we'll tell you how to fix it (if needed), so we can allow it in ASF. If you're improving existing code, rewriting it to be more efficient, clean, better commented - there is absolutely no reason to reject such PR, as long as it's in fact correct. If you want to add a missing feature, and you're not sure if it should be included in ASF, for example because you're not sure if it fits ASF scope - it won't hurt to ask before spending your own time, preferably in **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)** discussions, so we can evaluate the idea and give feedback instead of accepting/rejecting the concept which is usually happening with GitHub issues - after all you want to code it yourself, so you shouldn't use GitHub issues that are being used for expecting us to add things. Still, as stated above, our entire GitHub repo is dedicated to development part of ASF, so feel free to post an issue in which you'll ask if given feature would be accepted in PR, if you prefer that way instead of using the Steam group.
In general any pull request is welcome and should be accepted, unless there is a strong reason against it. A strong reason includes mainly only things we directly do not agree with, such as features that are against Steam ToS (like explained above), greatly against ASF scope (to the point it'd hurt overall maintenance), or likewise. If there is nothing severe enough to justify rejecting PR, we'll tell you how to fix it (if needed), so we can allow it in ASF. If you're improving existing code, rewriting it to be more efficient, clean, better commented - there is absolutely no reason to reject such PR, as long as it's in fact correct. If you want to add a missing feature, and you're not sure if it should be included in ASF, for example because you're not sure if it fits ASF scope - it won't hurt to ask before spending your own time, preferably on one of our support channels, so we can evaluate the idea and give feedback instead of accepting/rejecting the concept which is usually happening with GitHub issues - after all you want to code it yourself, so you shouldn't use GitHub issues that are being used for expecting us to add things. Still, as stated above, our entire GitHub repo is dedicated to development part of ASF, so feel free to post an issue in which you'll ask if given feature would be accepted in PR, if you prefer that way instead of using the Steam group.
Every pull request is carefully examined by our continuous integration system - it won't be accepted if it doesn't compile properly or causes any test to fail. We also expect that you at least barely tested the modification you're trying to add, so we can be sure that it works. Consider the fact that you're not coding it only for yourself, but for thousands of users.
@@ -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/master/LICENSE-2.0.txt)**.
ASF is using **[Apache License 2.0](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE-2.0.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.
@@ -79,8 +79,8 @@ For more info about the license, please check out **[license](https://github.com
Please stick with ASF code style when submitting PRs. In repo you can find several different files dedicated to making it easier for you:
- **[EditorConfig](https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.editorconfig)** file which is supported by all major IDEs and requires no further setup. It's a good starting point, although it doesn't include all the rules that we'd like to see.
- **[VS settings](https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/CodeStyle.vssettings)** file that you can use in Visual Studio for import. This one includes far more options than EditorConfig alone, and it's a very good choice if you're using bare VS.
- **[DotSettings](https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/ArchiSteamFarm.sln.DotSettings)** file that is being used by **[ReSharper](https://www.jetbrains.com/resharper)** and **[Rider](https://www.jetbrains.com/rider)**. This one is the most complete config file that is also being loaded automatically when you're using ReSharper/Rider with our code.
- **[EditorConfig](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.editorconfig)** file which is supported by all major IDEs and requires no further setup. It's a good starting point, although it doesn't include all the rules that we'd like to see.
- **[VS settings](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/CodeStyle.vssettings)** file that you can use in Visual Studio for import. This one includes far more options than EditorConfig alone, and it's a very good choice if you're using bare VS.
- **[DotSettings](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/ArchiSteamFarm.sln.DotSettings)** file that is being used by JetBrains products, namely **[ReSharper](https://www.jetbrains.com/resharper)** and **[Rider](https://www.jetbrains.com/rider)**. This one is the most complete config file that is also being loaded automatically when you're using ReSharper/Rider with our code.
Personally we're using Visual Studio + ReSharper, so no other action is needed after opening `ArchiSteamFarm.sln` solution. If you're using VS alone, it's probably a good idea to import our code style settings, although even editor config should be enough for majority of cases. If you can save us those few extra seconds cleaning up your code after accepting it, it would be great and surely improve overall code history.
Personally we're using **[JetBrains Rider](https://www.jetbrains.com/rider)**, so no other action is needed after opening `ArchiSteamFarm.sln` solution. If you're using VS alone, it's probably a good idea to import our code style settings, although even editor config should be enough for majority of cases. If you can save us those few extra seconds cleaning up your code after accepting it, it would be great and surely improve overall code history.

2
.github/FUNDING.yml vendored
View File

@@ -2,4 +2,4 @@
github: JustArchi
patreon: JustArchi
custom: ["https://www.paypal.me/JustArchi/5eur", "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4", "https://blockstream.info/address/bc1q8archy9jneaqw6s3cs44azt6duyqdt8c6quml0", "https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_"]
custom: ["https://paypal.me/JustArchi", "https://pay.revolut.com/profile/ukaszyxm", "https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e", "https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_"]

View File

@@ -1,13 +0,0 @@
<!--
I fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
I UNDERSTAND THAT IF MY ISSUE IS NOT MEETING CONTRIBUTING GUIDELINES SPECIFIED ABOVE, ESPECIALLY IF IT'S A QUESTION OR TECHNICAL ISSUE THAT IS NOT RELATED TO ASF DEVELOPMENT IN ANY WAY, THEN IT WILL BE CLOSED AND LEFT UNANSWERED.
Feel free to remove our notice and fill the template below with your details.
-->
## Other
<!--
You're about to open a generic issue that isn't available as one of our issue templates. In most cases this is invalid and will be closed immediately - please ensure that your issue is really related to ASF development prior to posting it.
-->

149
.github/ISSUE_TEMPLATE/Bug-report.yml vendored Normal file
View File

@@ -0,0 +1,149 @@
name: 🐛 Bug report
description: Unexpected program behaviour that requires code correction
labels: ["🐛 Bug", "👀 Evaluation"]
body:
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Ensure that our bug report form is appropriate for you.
options:
- label: I read and understood ASF's **[Contributing Guidelines](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md)**
required: true
- label: I also read **[Setting-up](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Setting-up)** and **[FAQ](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/FAQ)**, I don't need **[help](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/SUPPORT.md)**, this is a bug report
required: true
- label: I don't own more than **[10 accounts in total](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/FAQ#how-many-bots-can-i-run-with-asf)**
required: true
- label: I'm not using **[custom plugins](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Plugins)**
required: true
- label: This is not a **[question](https://github.com/JustArchiNET/ArchiSteamFarm/discussions)**
required: true
- label: This is not a **[technical issue](https://github.com/JustArchiNET/ArchiSteamFarm/discussions)**
required: true
- label: This is not **[ASF-ui problem](https://github.com/JustArchiNET/ASF-ui/issues/new/choose)**
required: true
- type: dropdown
id: version
attributes:
label: ASF version
description: If you're using a different version than the current **[stable](https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest)** or **[pre-release](https://github.com/JustArchiNET/ArchiSteamFarm/releases)**, ensure that your bug report is reproducible on one of the below.
options:
- Latest stable release
- Latest pre-release
validations:
required: true
- type: dropdown
id: variant
attributes:
label: ASF variant
description: If you're using a different variant, ensure that your bug report is reproducible on one of the below.
options:
- generic (with latest .NET runtime)
- generic-netf (with latest Mono runtime)
- linux-arm
- linux-arm64
- linux-x64
- osx-x64
- win-x64
validations:
required: true
- type: textarea
id: bug-description
attributes:
label: Bug description
description: Short explanation of what you were going to do, what did you want to accomplish?
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected behavior
description: What did you expect to happen?
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: Actual behavior
description: What happened instead?
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: Steps to reproduce
description: Every command or action that happened after launching ASF, which leads to the bug.
placeholder: |
If launching ASF with provided configs (below) is everything that is needed, then this section is not mandatory.
- type: textarea
id: possible-solution
attributes:
label: Possible reason/solution
description: Not mandatory, but you can suggest a fix/reason for the bug, if known to you.
placeholder: If you observed something peculiar about your issue that could help us locate and fix the culprit, this is the right place.
- type: dropdown
id: help
attributes:
label: Can you help us with this bug report?
description: ASF is offered for free and our resources are limited. Helping us increases the chance of fixing the problem.
options:
- Yes, I can code the solution myself and send a pull request
- Somehow, I can test and offer feedback, but can't code
- No, I don't have time, skills or willings for any of that
validations:
required: true
- type: textarea
id: asf-log
attributes:
label: Full log.txt recorded during reproducing the problem
description: You can find `log.txt` file directly in ASF directory. If the bug report doesn't come from the last run of the program, you can find logs from previous runs of the program in the `logs` directory instead.
placeholder: |
If no log.txt was recorded due to crash at the very early stage, console output should be pasted instead.
render: text
validations:
required: true
- type: textarea
id: global-config
attributes:
label: Global ASF.json config file
description: The config can be found in `config` directory under `ASF.json` name. You can leave this field empty if not using one.
placeholder: |
Paste the file content here, no need for triple backtick tags
Ensure that your config has redacted (but NOT removed) potentially-sensitive properties, such as:
- IPCPassword (recommended)
- SteamOwnerID (optionally)
- WebProxy (optionally, if exposing private details)
- WebProxyPassword (optionally, if exposing private details)
- WebProxyUsername (optionally, if exposing private details)
Redacting involves replacing sensitive details, for example with stars (***). You should refrain from removing config lines entirely, as their pure existence may be relevant and should be preserved.
render: json
- type: textarea
id: bot-config
attributes:
label: BotName.json config of all affected bot instances
description: Bot config files can be found in `config` directory, ending with `json` extension. You can leave this field empty if you don't have any defined.
placeholder: |
Paste the file content here, no need for triple backtick tags
Ensure that your config has redacted (but NOT removed) potentially-sensitive properties, such as:
- SteamLogin (mandatory)
- SteamPassword (mandatory)
- SteamMasterClanID (optionally)
- SteamParentalCode (optionally)
- SteamTradeToken (optionally)
- SteamUserPermissions (optionally, only SteamIDs)
Redacting involves replacing sensitive details, for example with stars (***). You should refrain from removing config lines entirely, as their pure existence may be relevant and should be preserved.
render: json
- type: textarea
id: additional-info
attributes:
label: Additional info
description: Everything else you consider worthy that we didn't ask for.
- type: markdown
attributes:
value: |
---
#### Thank you for taking the time to fill out this bug report.

View File

@@ -1,82 +0,0 @@
---
name: Bug report
about: Unexpected program behaviour that needs code correction
title: ''
labels: Bug, Evaluation
assignees: ''
---
<!--
I fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
I UNDERSTAND THAT IF MY ISSUE IS NOT MEETING CONTRIBUTING GUIDELINES SPECIFIED ABOVE, ESPECIALLY IF IT'S A QUESTION OR TECHNICAL ISSUE THAT IS NOT RELATED TO ASF DEVELOPMENT IN ANY WAY, THEN IT WILL BE CLOSED AND LEFT UNANSWERED.
Feel free to remove our notice and fill the template below with your details.
-->
## Bug report
### Description
<!-- Short explanation of what you were going to do, what did you want to accomplish? -->
### Expected behavior
<!-- What did you expect to happen? -->
### Current behavior
<!-- What happened instead? -->
### Possible solution
<!-- Not mandatory, but you can suggest a fix/reason for the bug, if known to you. -->
### Steps to reproduce
<!-- Every command or action that happened after launching ASF, which leads to the bug. -->
<!-- If launching ASF with provided configs (below) is everything that is needed, then this section is not mandatory. -->
### Full log.txt recorded during reproducing the problem
```text
Paste here, in-between triple backtick tags
Ensure that your log is complete and was NOT recorded in Debug mode, as debug log may contain sensitive information that should not be shared publicly, as per our wiki statement. Standard ASF log does not include sensitive information.
```
### Global ASF.json config (if using one)
```json
Paste here, in-between triple backtick tags
Ensure that your config has redacted (but NOT removed) potentially-sensitive properties, such as:
- IPCPassword (recommended)
- SteamOwnerID (optionally)
- WebProxy (optionally, if exposing private details)
- WebProxyPassword (optionally, if exposing private details)
- WebProxyUsername (optionally, if exposing private details)
Redacting involves replacing sensitive details, for example with stars (***). You should refrain from removing config lines entirely, as their pure existence may be relevant and should be preserved.
```
### BotName.json config of all affected bot instances (if more than one)
```json
Paste here, in-between triple backtick tags
Ensure that your config has redacted (but NOT removed) potentially-sensitive properties, such as:
- SteamLogin (mandatory)
- SteamPassword (mandatory)
- SteamMasterClanID (optionally)
- SteamParentalCode (optionally)
- SteamTradeToken (optionally)
- SteamUserPermissions (optionally, only SteamIDs)
Redacting involves replacing sensitive details, for example with stars (***). You should refrain from removing config lines entirely, as their pure existence may be relevant and should be preserved.
```
### Additional info
<!-- Everything else you consider worthy that we didn't ask for. -->

View File

@@ -0,0 +1,72 @@
name: ✨ Enhancement idea
description: General idea for improving the project
labels: ["✨ Enhancement", "👀 Evaluation"]
body:
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Ensure that our enhancement idea form is appropriate for you.
options:
- label: I read and understood ASF's **[Contributing Guidelines](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md)**
required: true
- label: I also read **[Setting-up](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Setting-up)** and **[FAQ](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/FAQ)**, I don't need **[help](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/SUPPORT.md)**, this is an enhancement idea
required: true
- label: My idea doesn't duplicate existing ASF functionality described on the **[wiki](https://github.com/JustArchiNET/ArchiSteamFarm/wiki)**
required: true
- label: I believe that my idea falls into ASF's scope and should be offered as part of ASF built-in functionality
required: true
- label: My idea doesn't violate the **[Steam Subscriber Agreement](https://store.steampowered.com/subscriber_agreement)**
required: true
- label: My idea doesn't violate the **[Steam Online Conduct](https://store.steampowered.com/online_conduct)**
required: true
- label: This is not **[ASF-ui suggestion](https://github.com/JustArchiNET/ASF-ui/issues/new/choose)**
required: true
- type: textarea
id: enhancement-purpose
attributes:
label: Enhancement purpose
description: Purpose of the enhancement - if it solves some problem, precise in particular which. If it benefits the program in some other way, precise in particular why.
placeholder: Present the underlying reason why this enhancement makes sense, and what is the context of it.
validations:
required: true
- type: textarea
id: solution
attributes:
label: Solution
description: What would you like to see as a solution to the purpose specified by you above?
placeholder: What would work for you?
validations:
required: true
- type: textarea
id: why-existing-not-sufficient
attributes:
label: Why currently available solutions are not sufficient?
description: Evaluate the existing solutions in regards to your requirements.
placeholder: |
If something you're suggesting is already possible, then explain to us why the currently available solutions are not sufficient.
If it's not possible yet, then explain to us why it should be.
validations:
required: true
- type: dropdown
id: help
attributes:
label: Can you help us with this enhancement idea?
description: ASF is offered for free and our resources are limited. Helping us increases the chance of making it happen.
options:
- Yes, I can code the solution myself and send a pull request
- Somehow, I can test and offer feedback, but can't code
- No, I don't have time, skills or willings for any of that
validations:
required: true
- type: textarea
id: additional-info
attributes:
label: Additional info
description: Everything else you consider worthy that we didn't ask for.
- type: markdown
attributes:
value: |
---
#### Thank you for taking the time to fill out this enhancement idea.

View File

@@ -1,42 +0,0 @@
---
name: Feature request
about: General idea for improving the project
title: ''
labels: Enhancement, Evaluation
assignees: ''
---
<!--
I fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
I UNDERSTAND THAT IF MY ISSUE IS NOT MEETING CONTRIBUTING GUIDELINES SPECIFIED ABOVE, ESPECIALLY IF IT'S A QUESTION OR TECHNICAL ISSUE THAT IS NOT RELATED TO ASF DEVELOPMENT IN ANY WAY, THEN IT WILL BE CLOSED AND LEFT UNANSWERED.
Feel free to remove our notice and fill the template below with your details.
-->
## Feature request
### Purpose
<!-- Purpose of the feature request - if it solves some problem, precise in particular what. If it benefits the program in some other way, precise in particular why. Present the underlying reason why this feature request makes sense, and what is the context of it. -->
### Solution
<!-- What would you like to see as a solution to the purpose specified by you above? What would work for you? -->
### Why currently available solutions are not sufficient?
<!-- If something you're suggesting is already possible, then explain to us why currently available solutions are not sufficient. If it's not possible yet, then explain to us why it should be. -->
### Does your suggestion fall into ASF scope?
<!-- Is ASF really the proper tool to include your enhancement in the first place? Is it connected with idling Steam cards? -->
### Is your suggestion abiding to Steam guidelines?
<!-- If not, it will not be considered. Please make sure that you're not suggesting anything potentially unwanted, botting Steam Market is just a single example of such thing - https://store.steampowered.com/subscriber_agreement / https://store.steampowered.com/online_conduct -->
### Additional info
<!-- Everything else you consider worthy that we didn't ask for. -->

View File

@@ -0,0 +1,86 @@
name: 📕 Wiki suggestion
description: All issues related to our wiki documentation, mainly corrections and ideas
labels: ["📕 Wiki", "👀 Evaluation"]
body:
- type: checkboxes
id: checklist
attributes:
label: Checklist
description: Ensure that our wiki suggestion form is appropriate for you.
options:
- label: I read and understood ASF's **[Contributing Guidelines](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md)**
required: true
- label: I also read **[Setting-up](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Setting-up)** and **[FAQ](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/FAQ)**, I don't need **[help](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/SUPPORT.md)**, this is a wiki suggestion
required: true
- label: This is not a **[translation issue](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Localization)**
required: true
- label: This is not **[ASF-ui wiki suggestion](https://github.com/JustArchiNET/ASF-ui/issues/new/choose)**
required: true
- type: input
id: wiki-page
attributes:
label: Wiki page
description: If this is a suggestion regarding an existing wiki page, please link it for reference. If the wiki page doesn't exist, suggest its title.
placeholder: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/???
validations:
required: true
- type: textarea
id: issue
attributes:
label: The issue
description: Please specify your issue in regards to our wiki documentation.
placeholder: |
If you're reporting a mistake/correction, state what is wrong.
If you're suggesting an idea, explain the details.
validations:
required: true
- type: textarea
id: wrong-text
attributes:
label: Wrong text
description: The existing text on the wiki which you classify as wrong.
placeholder: |
If you're suggesting a new page, paragraph or other addition to the wiki, then this section is not mandatory.
render: markdown
- type: textarea
id: suggested-improvement
attributes:
label: Suggested improvement
description: The new or corrected text that would satisfy your issue stated above. You may use **[markdown](https://guides.github.com/features/mastering-markdown)** for formatting.
placeholder: |
# Never Gonna Give You Up by Rick Astley
## Verse 1
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
## Pre-Chorus
I just wanna tell you how I'm feeling
Gotta make you understand
## Chorus
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
## More
See **[full version](https://www.youtube.com/watch?v=dQw4w9WgXcQ)**.
render: markdown
validations:
required: true
- type: textarea
id: additional-info
attributes:
label: Additional info
description: Everything else you consider worthy that we didn't ask for.
- type: markdown
attributes:
value: |
---
#### Thank you for taking the time to fill out this wiki suggestion.

View File

@@ -1,34 +0,0 @@
---
name: Wiki correction
about: All issues related to our wiki documentation, mainly corrections and ideas
title: ''
labels: Wiki, Evaluation
assignees: ''
---
<!--
I fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
I UNDERSTAND THAT IF MY ISSUE IS NOT MEETING CONTRIBUTING GUIDELINES SPECIFIED ABOVE, ESPECIALLY IF IT'S A QUESTION OR TECHNICAL ISSUE THAT IS NOT RELATED TO ASF DEVELOPMENT IN ANY WAY, THEN IT WILL BE CLOSED AND LEFT UNANSWERED.
Feel free to remove our notice and fill the template below with your details.
-->
## Wiki correction
### Wiki page
<!-- Please link the appropriate URL of the wiki page with the issue, if applicable. -->
### The issue
<!-- Please explain the problem with the current state of things. If you're reporting a mistake/correction, state which one, if you're suggesting an idea, explain the details. -->
### Possible solution
<!-- Not mandatory, but if you have an idea how to address the issue explained by you above, e.g. helpful sentences, words or resources, you can include them here. -->
### Additional info
<!-- Everything else you consider worthy that we didn't ask for. -->

View File

@@ -1,14 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: ASF-ui issue
- name: 🖥️ ASF-ui issue
url: https://github.com/JustArchiNET/ASF-ui/issues/new/choose
about: Please open issue in ASF-ui repo.
- name: Localization improvement
about: Please open issue in ASF-ui repo
- name: 🌐 Localization improvement
url: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Localization
about: Please use our crowdin platform.
- name: Support question or technical issue
url: https://github.com/JustArchiNET/ArchiSteamFarm/blob/master/.github/SUPPORT.md
about: Please review our support guidelines.
- name: Negative feedback, complaints and demands
about: Please use our crowdin platform
- name: Support question or technical issue
url: https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/SUPPORT.md
about: Please review our support guidelines
- name: 🗯️ Negative feedback, complaints and demands
url: https://www.youtube.com/watch?v=dQw4w9WgXcQ
about: We're taking those very seriously.
about: We're taking those very seriously

View File

@@ -6,7 +6,7 @@
### Changelog
This is automated GitHub deployment, human-readable changelog should be available soon. In the meantime please refer to **[GitHub commits](https://github.com/JustArchiNET/ArchiSteamFarm/commits/master)**.
This is automated GitHub deployment, human-readable changelog should be available soon. In the meantime please refer to **[GitHub commits](https://github.com/JustArchiNET/ArchiSteamFarm/commits/main)**.
---
@@ -14,4 +14,4 @@ This is automated GitHub deployment, human-readable changelog should be availabl
ASF is available for free, this release was made possible thanks to the people that decided to support the project. If you're grateful for what we're doing, please consider donating. Developing ASF requires massive amount of time and knowledge, especially when it comes to Steam (and its problems). Even $1 is highly appreciated and shows that you care. Thank you!
[![GitHub sponsor](https://img.shields.io/badge/GitHub-sponsor-yellow.svg?logo=github)](https://github.com/sponsors/JustArchi) [![Patreon support](https://img.shields.io/badge/Patreon-support-yellow.svg?logo=patreon)](https://www.patreon.com/JustArchi) [![PayPal.me donate](https://img.shields.io/badge/PayPal.me-donate-yellow.svg?logo=paypal)](https://www.paypal.me/JustArchi/5eur) [![PayPal donate](https://img.shields.io/badge/PayPal-donate-yellow.svg?logo=paypal)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4) [![Bitcoin donate](https://img.shields.io/badge/Bitcoin-donate-yellow.svg?logo=bitcoin)](https://blockstream.info/address/bc1q8archy9jneaqw6s3cs44azt6duyqdt8c6quml0) [![Steam donate](https://img.shields.io/badge/Steam-donate-yellow.svg?logo=steam)](https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_)
[![GitHub sponsor](https://img.shields.io/badge/GitHub-sponsor-ea4aaa.svg?logo=github-sponsors)](https://github.com/sponsors/JustArchi) [![Patreon support](https://img.shields.io/badge/Patreon-support-f96854.svg?logo=patreon)](https://www.patreon.com/JustArchi) [![Crypto donate](https://img.shields.io/badge/Crypto-donate-f7931a.svg?logo=bitcoin)](https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e) [![PayPal.me donate](https://img.shields.io/badge/PayPal.me-donate-00457c.svg?logo=paypal)](https://paypal.me/JustArchi) [![PayPal donate](https://img.shields.io/badge/PayPal-donate-00457c.svg?logo=paypal)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4) [![Revolut donate](https://img.shields.io/badge/Revolut-donate-0075eb.svg?logo=revolut)](https://pay.revolut.com/profile/ukaszyxm) [![Steam donate](https://img.shields.io/badge/Steam-donate-000000.svg?logo=steam)](https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_)

6
.github/SECURITY.md vendored
View File

@@ -8,6 +8,12 @@ We support **[the latest stable](https://github.com/JustArchiNET/ArchiSteamFarm/
---
## Security advisories
We announce security advisories for our program on **[GitHub](https://github.com/JustArchiNET/ArchiSteamFarm/security/advisories)**. Every entry includes detailed information about the security vulnerability it describes, especially affected versions, attack vectors, fixed versions as well as possible workarounds (if any).
---
## Reporting a vulnerability
We're doing our best to protect our community from all harm, therefore we take security vulnerabilities very seriously.

4
.github/SUPPORT.md vendored
View File

@@ -2,6 +2,6 @@
Our **[wiki](https://github.com/JustArchiNET/ArchiSteamFarm/wiki)** is the official online documentation which covers at least a significant majority (if not all) of ASF subjects you could be interested in. We recommend to start with **[setting up](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Setting-up)**, **[configuration](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Configuration)** and our **[FAQ](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/FAQ)** which should help you with setting up ASF, configuring it, as well as answering the most common questions that you might have. For more advanced matters, as well as further elaboration, we have other pages available on our **[wiki](https://github.com/JustArchiNET/ArchiSteamFarm/wiki)** that you can visit.
We also have two support channels dedicated to our ASF users, in case you couldn't manage to solve the issue yourself. We answer all support and technical matters on our **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)**, which should be used for majority of the issues and questions, especially advanced ones. In addition to that, we have a **[Discord server](https://discord.gg/hSQgt8j)**, also known as "ASF chat", which is a good choice for more casual, simple questions. You're free to use the support channel that matches your preferences, although keep in mind that you have a higher chance solving your issue on the Steam group, where we're doing our best to answer all questions that couldn't be answered by our community itself (as opposed to ASF chat where we're not active 24/7 and therefore we're not able to help everybody).
We also have three independent support channels dedicated to our ASF users, in case you couldn't manage to solve the issue yourself. We answer all support and technical matters in our **[GitHub discussions](https://github.com/JustArchiNET/ArchiSteamFarm/discussions/categories/support)**, **[Steam group](https://steamcommunity.com/groups/archiasf/discussions/1)**, and on our **[Discord server](https://discord.gg/hSQgt8j)**. You're free to use the support channel that matches your preferences, although keep in mind that you have a higher chance solving your issue on the GitHub or Steam, where we're doing our best to answer all questions that couldn't be answered by our community itself (as opposed to Discord server where we're not active 24/7 and therefore not always able to answer).
GitHub **[issues](https://github.com/JustArchiNET/ArchiSteamFarm/issues)** page is being used for ASF development, especially in regards to bugs and enhancements. We have a very strict policy regarding that, as GitHub is **not** a general support channel, it's dedicated exclusively to ASF development and we're not answering common ASF matters there, as we have appropriate support channels (mentioned above) for that. Common matters include not only general questions or issues that are obviously related to program usage, but also users reporting "bugs" that are clearly considered intended behaviour coming for example (and mainly) from misconfiguration or lack of understanding how the program works. If you're not sure whether your matter relates to ASF development or not, especially if you're not sure if it's a bug or intended behaviour coming from misconfiguration or lack of understanding how the program works, we recommend to use a support channel instead, where we'll answer you and forward your matter to GitHub if deemed appropriate. Invalid GitHub issues will be closed immediately and won't be answered.
GitHub issues are being used solely for ASF development, especially in regards to bugs and enhancements. We have a very strict policy regarding that, as GitHub issues is **not** a general support channel, it's dedicated exclusively to ASF development and we're not answering common ASF matters there, as we have appropriate support channels (mentioned above) for that. Common matters include not only general questions or issues that are obviously related to program usage, but also users reporting "bugs" that are clearly considered intended behaviour coming for example (and mainly) from misconfiguration or lack of understanding how the program works. If you're not sure whether your matter relates to ASF development or not, especially if you're not sure if it's a bug or intended behaviour, we recommend to use a support channel instead, where we'll answer you in calm atmosphere and forward your matter to GitHub if deemed appropriate. Invalid GitHub issues will be closed immediately and won't be answered.

View File

@@ -6,11 +6,11 @@ image: Visual Studio 2019
configuration: Release
clone_depth: 10
environment:
# DOTNET_CHANNEL: 5.0
DOTNET_CHANNEL: 5.0
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_INSTALL_DIR: C:\Program Files\dotnet
DOTNET_NOLOGO: true
DOTNET_SDK: 5.0.100
# DOTNET_SDK: 5.0.103
NET_CORE_VERSION: net5.0
NET_FRAMEWORK_VERSION: net48
NODE_JS_VERSION: lts
@@ -50,14 +50,24 @@ install:
if ($env:DOTNET_CHANNEL) {
dotnet --info
&([scriptblock]::Create((Invoke-WebRequest 'https://dot.net/v1/dotnet-install.ps1'))) -Channel "$env:DOTNET_CHANNEL" -InstallDir "$env:DOTNET_INSTALL_DIR" -NoPath
try {
&([scriptblock]::Create((Invoke-WebRequest 'https://dot.net/v1/dotnet-install.ps1'))) -Channel "$env:DOTNET_CHANNEL" -InstallDir "$env:DOTNET_INSTALL_DIR" -NoPath
} catch [System.Net.WebException],[System.IO.IOException] {
# Not fatal for the remaining part of the script
Write-Host $_
}
}
if ($env:DOTNET_SDK) {
dotnet --info
&([scriptblock]::Create((Invoke-WebRequest 'https://dot.net/v1/dotnet-install.ps1'))) -Channel 'Current' -Version "$env:DOTNET_SDK" -InstallDir "$env:DOTNET_INSTALL_DIR" -NoPath
try {
&([scriptblock]::Create((Invoke-WebRequest 'https://dot.net/v1/dotnet-install.ps1'))) -Channel 'Current' -Version "$env:DOTNET_SDK" -InstallDir "$env:DOTNET_INSTALL_DIR" -NoPath
} catch [System.Net.WebException],[System.IO.IOException] {
# Not fatal for the remaining part of the script
Write-Host $_
}
}
- ps: Install-Product node "$env:NODE_JS_VERSION"
before_build:
@@ -116,31 +126,7 @@ build_script:
}
dotnet build ArchiSteamFarm -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
dotnet build ArchiSteamFarm.CustomPlugins.ExamplePlugin -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
dotnet build ArchiSteamFarm.CustomPlugins.PeriodicGC -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
dotnet build "$env:STEAM_TOKEN_DUMPER_NAME" -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
dotnet build -c "$env:CONFIGURATION" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
@@ -155,7 +141,7 @@ test_script:
$ProgressPreference = 'SilentlyContinue'
dotnet test ArchiSteamFarm.Tests -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
dotnet test ArchiSteamFarm.Tests -c "$env:CONFIGURATION" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
@@ -175,7 +161,7 @@ after_test:
}
dotnet publish "$env:STEAM_TOKEN_DUMPER_NAME" -c "$env:CONFIGURATION" -f "$env:NET_CORE_VERSION" -o "out/$env:STEAM_TOKEN_DUMPER_NAME/$env:NET_CORE_VERSION" -p:UseAppHost=false --nologo
dotnet publish "$env:STEAM_TOKEN_DUMPER_NAME" -c "$env:CONFIGURATION" -f "$env:NET_CORE_VERSION" -o "out/$env:STEAM_TOKEN_DUMPER_NAME/$env:NET_CORE_VERSION" -p:ContinuousIntegrationBuild=true -p:TargetLatestRuntimePatch=false -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
@@ -183,14 +169,7 @@ after_test:
}
dotnet publish "$env:STEAM_TOKEN_DUMPER_NAME" -c "$env:CONFIGURATION" -f "$env:NET_FRAMEWORK_VERSION" -o "out/$env:STEAM_TOKEN_DUMPER_NAME/$env:NET_FRAMEWORK_VERSION" -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
dotnet clean ArchiSteamFarm -c "$env:CONFIGURATION" -p:UseAppHost=false --nologo
dotnet publish "$env:STEAM_TOKEN_DUMPER_NAME" -c "$env:CONFIGURATION" -f "$env:NET_FRAMEWORK_VERSION" -o "out/$env:STEAM_TOKEN_DUMPER_NAME/$env:NET_FRAMEWORK_VERSION" -p:ContinuousIntegrationBuild=true -p:TargetLatestRuntimePatch=false -p:UseAppHost=false --nologo
if ($LastExitCode -ne 0) {
@@ -198,7 +177,7 @@ after_test:
}
dotnet restore ArchiSteamFarm
dotnet restore ArchiSteamFarm -p:ContinuousIntegrationBuild=true
if ($LastExitCode -ne 0) {
@@ -222,12 +201,12 @@ after_test:
}
if ($variant -like 'generic*') {
$variantArgs = '-p:UseAppHost=false'
$variantArgs = '-p:TargetLatestRuntimePatch=false', '-p:UseAppHost=false'
} else {
$variantArgs = '-p:PublishSingleFile=true', '-p:PublishTrimmed=true', '-r', "$variant"
}
dotnet publish ArchiSteamFarm -c "$env:CONFIGURATION" -f "$targetFramework" -o "out\$variant" "-p:ASFVariant=$variant" --no-restore --nologo $variantArgs
dotnet publish ArchiSteamFarm -c "$env:CONFIGURATION" -f "$targetFramework" -o "out\$variant" "-p:ASFVariant=$variant" -p:ContinuousIntegrationBuild=true --no-restore --nologo $variantArgs
if ($LastExitCode -ne 0) {
throw "Last command failed."
@@ -235,16 +214,16 @@ after_test:
# If we're including any overlay for this variant, copy it to output directory
if (Test-Path "ArchiSteamFarm\overlay\$variant" -PathType Container) {
Copy-Item "ArchiSteamFarm\overlay\$variant\*" "out\$variant"
Copy-Item "ArchiSteamFarm\overlay\$variant\*" "out\$variant" -Recurse
}
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if (Test-Path "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\$env:STEAM_TOKEN_DUMPER_NAME.dll" -PathType Leaf) {
if (Test-Path "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework" -PathType Container) {
if (!(Test-Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" -PathType Container)) {
New-Item -ItemType Directory -Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" > $null
}
Copy-Item "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\$env:STEAM_TOKEN_DUMPER_NAME.dll" "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME"
Copy-Item "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\*" "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" -Recurse
}
# Icon is available only in .NET Framework and .NET Core Windows build, we'll bundle the .ico file for other flavours
@@ -259,7 +238,7 @@ after_test:
if ($env:APPVEYOR_REPO_TAG -eq 'true') {
# Update link in Changelog.html accordingly
if (Test-Path "out\$variant\Changelog.html" -PathType Leaf) {
(Get-Content "out\$variant\Changelog.html").Replace('ArchiSteamFarm/commits/master', "ArchiSteamFarm/releases/tag/$env:APPVEYOR_REPO_TAG_NAME") | Set-Content "out\$variant\Changelog.html"
(Get-Content "out\$variant\Changelog.html").Replace('ArchiSteamFarm/commits/main', "ArchiSteamFarm/releases/tag/$env:APPVEYOR_REPO_TAG_NAME") | Set-Content "out\$variant\Changelog.html"
}
}
@@ -279,7 +258,7 @@ after_test:
}
Get-Job | Receive-Job -Wait -AutoRemoveJob
Get-Job | Receive-Job -Wait
deploy: off
notifications:
- provider: Webhook

28
.github/crowdin.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
"preserve_hierarchy": true
"files": [
{
"source": "/ArchiSteamFarm/Localization/Strings.resx",
"translation": "/ArchiSteamFarm/Localization/Strings.%locale%.resx",
"translation_replace": {
".lol-US.resx": ".qps-Ploc.resx",
".sr-CS.resx": ".sr-Latn.resx"
}
},
{
"source": "/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization/Strings.resx",
"translation": "/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization/Strings.%locale%.resx",
"translation_replace": {
".lol-US.resx": ".qps-Ploc.resx",
".sr-CS.resx": ".sr-Latn.resx"
}
},
{
"source": "/wiki/*.md",
"translation": "/wiki/locale/%locale%/%file_name%-%locale%.%file_extension%",
"ignore": [ "/**/_*.md" ]
},
{
"source": "/wiki/_Sidebar.md",
"translation": "/wiki/locale/%locale%/_Sidebar.md"
}
]

View File

@@ -1,34 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
time: "01:00"
labels:
- "Automatic"
open-pull-requests-limit: 99
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "daily"
time: "01:15"
labels:
- "Automatic"
open-pull-requests-limit: 99
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "daily"
time: "01:30"
labels:
- "Automatic"
open-pull-requests-limit: 99
- package-ecosystem: "gitsubmodule"
directory: "/"
schedule:
interval: "daily"
time: "02:00"
labels:
- "Automatic"
open-pull-requests-limit: 99

25
.github/renovate.json vendored Normal file
View File

@@ -0,0 +1,25 @@
{
"extends": [
"config:base",
":assignee(JustArchi)",
":automergeBranch",
":automergeDigest",
":automergeMinor",
":disableRateLimiting",
":label(🤖 Automatic)"
],
"git-submodules": {
"enabled": true
},
"packageRules": [
{
"allowedVersions": "<= 3.0",
"matchPackageNames": [ "Microsoft.Extensions.Configuration.Json", "Microsoft.Extensions.Logging.Configuration" ]
},
{
"allowedVersions": "<= 2.2.4",
"groupName": "MSTest packages",
"matchPackagePatterns": ["^MSTest\\..+"]
}
]
}

View File

@@ -1,18 +0,0 @@
name: ASF-auto-merge
on:
pull_request:
jobs:
auto-merge:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
- name: Auto-merge PR if deemed appropriate
uses: ahmadnassri/action-dependabot-auto-merge@v2
with:
github-token: ${{ secrets.ASF_GITHUB_PERSONAL_TOKEN }}
target: digest # https://github.com/ahmadnassri/action-dependabot-auto-merge/issues/25

View File

@@ -1,4 +1,4 @@
name: ASF-CI
name: ASF-ci
on: [push, pull_request]
@@ -6,16 +6,12 @@ env:
CONFIGURATION: Release
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
DOTNET_SDK_VERSION: 5.0.100
NET_CORE_VERSION: net5.0
NET_FRAMEWORK_VERSION: net48
NODE_JS_VERSION: 12
STEAM_TOKEN_DUMPER_NAME: ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
STEAM_TOKEN_DUMPER_TOKEN: ${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
DOTNET_SDK_VERSION: 5.0.x
jobs:
main:
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
@@ -23,368 +19,30 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
uses: actions/setup-dotnet@v1.8.1
with:
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
- name: Verify .NET Core
run: dotnet --info
- name: Setup Node.js with npm
uses: actions/setup-node@v1
with:
node-version: ${{ env.NODE_JS_VERSION }}
- name: Verify Node.js
run: node -v
- name: Verify npm
run: npm -v
- name: Install npm modules for ASF-ui
run: npm ci --no-progress --prefix ASF-ui
- name: Build ASF-ui
run: npm run-script deploy --no-progress --prefix ASF-ui
- name: Build ArchiSteamFarm
run: dotnet build ArchiSteamFarm -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
- name: Build ArchiSteamFarm.CustomPlugins.ExamplePlugin
run: dotnet build ArchiSteamFarm.CustomPlugins.ExamplePlugin -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
- name: Build ArchiSteamFarm.CustomPlugins.PeriodicGC
run: dotnet build ArchiSteamFarm.CustomPlugins.PeriodicGC -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
- name: Build ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
run: dotnet build "${{ env.STEAM_TOKEN_DUMPER_NAME }}" -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
- name: Build ArchiSteamFarm and other projects
run: dotnet build -c "${{ env.CONFIGURATION }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
- name: Run ArchiSteamFarm.Tests
run: dotnet test ArchiSteamFarm.Tests -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
run: dotnet test ArchiSteamFarm.Tests -c "${{ env.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/master' && startsWith(matrix.os, 'ubuntu-') }}
uses: crowdin/github-action@1.0.9
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && startsWith(matrix.os, 'ubuntu-') }}
uses: crowdin/github-action@1.3.0
with:
crowdin_branch_name: master
crowdin_branch_name: main
config: '.github/crowdin.yml'
project_id: ${{ secrets.ASF_CROWDIN_PROJECT_ID }}
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
- name: Prepare ArchiSteamFarm.OfficialPlugins.SteamTokenDumper on Unix
if: startsWith(matrix.os, 'macos-') || startsWith(matrix.os, 'ubuntu-')
shell: sh
run: |
if [ -n "${STEAM_TOKEN_DUMPER_TOKEN-}" ] && [ -f "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" ]; then
sed "s/STEAM_TOKEN_DUMPER_TOKEN/${STEAM_TOKEN_DUMPER_TOKEN}/g" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" > "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new"
mv "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs"
fi
- name: Prepare ArchiSteamFarm.OfficialPlugins.SteamTokenDumper on Windows
if: startsWith(matrix.os, 'windows-')
shell: pwsh
run: |
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
if ((Test-Path env:STEAM_TOKEN_DUMPER_TOKEN) -and (Test-Path "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs" -PathType Leaf)) {
(Get-Content "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs").Replace('STEAM_TOKEN_DUMPER_TOKEN', "$env:STEAM_TOKEN_DUMPER_TOKEN") | Set-Content "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs"
}
- name: Publish ArchiSteamFarm.OfficialPlugins.SteamTokenDumper for .NET Core
run: dotnet publish "${{ env.STEAM_TOKEN_DUMPER_NAME }}" -c "${{ env.CONFIGURATION }}" -f "${{ env.NET_CORE_VERSION }}" -o "out/${{ env.STEAM_TOKEN_DUMPER_NAME }}/${{ env.NET_CORE_VERSION }}" -p:UseAppHost=false --nologo
- name: Publish ArchiSteamFarm.OfficialPlugins.SteamTokenDumper for .NET Framework
if: startsWith(matrix.os, 'windows-')
run: dotnet publish "${{ env.STEAM_TOKEN_DUMPER_NAME }}" -c "${{ env.CONFIGURATION }}" -f "${{ env.NET_FRAMEWORK_VERSION }}" -o "out/${{ env.STEAM_TOKEN_DUMPER_NAME }}/${{ env.NET_FRAMEWORK_VERSION }}" -p:UseAppHost=false --nologo
- name: Perform cleanup of ArchiSteamFarm in preparation for publishing
run: dotnet clean ArchiSteamFarm -c "${{ env.CONFIGURATION }}" -p:UseAppHost=false --nologo
- name: Restore packages in preparation for ArchiSteamFarm publishing
run: dotnet restore ArchiSteamFarm
- name: Publish ArchiSteamFarm on Unix
if: startsWith(matrix.os, 'macos-') || startsWith(matrix.os, 'ubuntu-')
env:
VARIANTS: generic linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs!
shell: sh
run: |
set -eu
publish() {
if [ "$1" = 'generic' ]; then
local variantArgs="-p:UseAppHost=false"
else
local variantArgs="-p:PublishSingleFile=true -p:PublishTrimmed=true -r $1"
fi
dotnet publish ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o "out/${1}" "-p:ASFVariant=$1" --no-restore --nologo $variantArgs
# If we're including any overlay for this variant, copy it to output directory
if [ -d "ArchiSteamFarm/overlay/${1}" ]; then
cp "ArchiSteamFarm/overlay/${1}/"* "out/${1}"
fi
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if [ -f "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}/${STEAM_TOKEN_DUMPER_NAME}.dll" ]; then
mkdir -p "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
cp "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}/${STEAM_TOKEN_DUMPER_NAME}.dll" "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
fi
# Include .ico file for all platforms, since only Windows script can bundle it inside the exe
cp "resources/ASF.ico" "out/${1}/ArchiSteamFarm.ico"
if command -v 7z >/dev/null; then
7z a -bd -slp -tzip -mm=Deflate -mx=1 "out/ASF-${1}.zip" "${GITHUB_WORKSPACE}/out/${1}/*"
elif command -v zip >/dev/null; then
(
cd "${GITHUB_WORKSPACE}/out/${1}"
zip -1 -q -r "../ASF-${1}.zip" .
)
else
echo "ERROR: No supported zip tool!"
return 1
fi
}
jobs=""
for variant in $VARIANTS; do
publish "$variant" &
jobs="$jobs $!"
done
for job in $jobs; do
wait "$job"
done
- name: Publish ArchiSteamFarm on Windows
if: startsWith(matrix.os, 'windows-')
env:
VARIANTS: generic generic-netf linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs!
shell: pwsh
run: |
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
$PublishBlock = {
param($variant)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
Set-Location "$env:GITHUB_WORKSPACE"
if ($variant -like '*-netf') {
$targetFramework = $env:NET_FRAMEWORK_VERSION
} else {
$targetFramework = $env:NET_CORE_VERSION
}
if ($variant -like 'generic*') {
$variantArgs = '-p:UseAppHost=false'
} else {
$variantArgs = '-p:PublishSingleFile=true', '-p:PublishTrimmed=true', '-r', "$variant"
}
dotnet publish ArchiSteamFarm -c "$env:CONFIGURATION" -f "$targetFramework" -o "out\$variant" "-p:ASFVariant=$variant" --no-restore --nologo $variantArgs
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
# If we're including any overlay for this variant, copy it to output directory
if (Test-Path "ArchiSteamFarm\overlay\$variant" -PathType Container) {
Copy-Item "ArchiSteamFarm\overlay\$variant\*" "out\$variant"
}
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if (Test-Path "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\$env:STEAM_TOKEN_DUMPER_NAME.dll" -PathType Leaf) {
if (!(Test-Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" -PathType Container)) {
New-Item -ItemType Directory -Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" > $null
}
Copy-Item "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\$env:STEAM_TOKEN_DUMPER_NAME.dll" "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME"
}
# Icon is available only in .NET Framework and .NET Core Windows build, we'll bundle the .ico file for other flavours
if (($targetFramework -eq "$env:NET_CORE_VERSION") -and !(Test-Path "out\$variant\ArchiSteamFarm.exe" -PathType Leaf)) {
Copy-Item 'resources\ASF.ico' "out\$variant\ArchiSteamFarm.ico"
}
# By default use fastest compression
$compressionArgs = '-mx=1'
# Include extra logic for builds marked for release
if ($env:GITHUB_REF -like 'refs/tags/*') {
$tag = $env:GITHUB_REF.Substring(10)
# Tweak compression args for release publishing
$compressionArgs = '-mx=9', '-mfb=258', '-mpass=15'
# Update link in Changelog.html accordingly
if (Test-Path "out\$variant\Changelog.html" -PathType Leaf) {
(Get-Content "out\$variant\Changelog.html").Replace('ArchiSteamFarm/commits/master', "ArchiSteamFarm/releases/tag/$tag") | Set-Content "out\$variant\Changelog.html"
}
}
7z a -bd -slp -tzip -mm=Deflate $compressionArgs "out\ASF-$variant.zip" "$env:GITHUB_WORKSPACE\out\$variant\*"
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
}
foreach ($variant in $env:VARIANTS.Split([char[]] $null, [System.StringSplitOptions]::RemoveEmptyEntries)) {
Start-Job -Name "$variant" $PublishBlock -ArgumentList "$variant"
}
Get-Job | Receive-Job -Wait -AutoRemoveJob
- name: Upload ASF-generic
continue-on-error: true
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.os }}_ASF-generic
path: out/ASF-generic.zip
- name: Upload ASF-generic-netf
continue-on-error: true
if: startsWith(matrix.os, 'windows-')
uses: actions/upload-artifact@v2
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
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
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
with:
name: ${{ matrix.os }}_ASF-linux-x64
path: out/ASF-linux-x64.zip
- name: Upload ASF-osx-x64
continue-on-error: true
uses: actions/upload-artifact@v2
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
with:
name: ${{ matrix.os }}_ASF-win-x64
path: out/ASF-win-x64.zip
- name: Create ArchiSteamFarm GitHub release
id: github_release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: ArchiSteamFarm V${{ github.ref }}
body_path: .github/RELEASE_TEMPLATE.md
prerelease: true
- name: Upload ASF-generic to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-generic.zip
asset_name: ASF-generic.zip
asset_content_type: application/zip
- name: Upload ASF-generic-netf to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-generic-netf.zip
asset_name: ASF-generic-netf.zip
asset_content_type: application/zip
- name: Upload ASF-linux-arm to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-arm.zip
asset_name: ASF-linux-arm.zip
asset_content_type: application/zip
- name: Upload ASF-linux-arm64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-arm64.zip
asset_name: ASF-linux-arm64.zip
asset_content_type: application/zip
- name: Upload ASF-linux-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-x64.zip
asset_name: ASF-linux-x64.zip
asset_content_type: application/zip
- name: Upload ASF-osx-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-osx-x64.zip
asset_name: ASF-osx-x64.zip
asset_content_type: application/zip
- name: Upload ASF-win-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-win-x64.zip
asset_name: ASF-win-x64.zip
asset_content_type: application/zip

32
.github/workflows/docker-ci.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: ASF-docker-ci
on: [push, pull_request]
env:
PLATFORMS: linux/amd64,linux/arm,linux/arm64
jobs:
main:
strategy:
fail-fast: false
matrix:
file: [Dockerfile, Dockerfile.Service]
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.5.1
- name: Build Docker image from ${{ matrix.file }}
uses: docker/build-push-action@v2.6.1
with:
context: .
file: ${{ matrix.file }}
platforms: ${{ env.PLATFORMS }}
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}

View File

@@ -0,0 +1,61 @@
name: ASF-docker-publish-latest
on:
release:
types: [released]
env:
PLATFORMS: linux/amd64,linux/arm,linux/arm64
TAG: latest
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.5.1
- name: Login to ghcr.io
uses: docker/login-action@v1.10.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.10.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Prepare environment outputs
shell: sh
run: |
set -eu
echo "FIXED_TAG=$(echo ${{ github.ref }} | cut -d '/' -f 3)" >> "$GITHUB_ENV"
echo "DATE_ISO8601=$(date --iso-8601=seconds --utc)" >> "$GITHUB_ENV"
echo "GHCR_REPOSITORY=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
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.6.1
with:
context: .
file: Dockerfile.Service
platforms: ${{ env.PLATFORMS }}
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
labels: |
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
org.opencontainers.image.version=${{ env.FIXED_TAG }}
org.opencontainers.image.revision=${{ github.sha }}
tags: |
ghcr.io/${{ env.GHCR_REPOSITORY }}:${{ env.TAG }}
${{ env.DH_REPOSITORY }}:${{ env.TAG }}
push: true

View File

@@ -0,0 +1,69 @@
name: ASF-docker-publish-main
on:
push:
branches:
- main
env:
PLATFORMS: linux/amd64,linux/arm,linux/arm64
TAG: main
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.5.1
- name: Login to ghcr.io
uses: docker/login-action@v1.10.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.10.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Prepare environment outputs
shell: sh
run: |
set -eu
echo "DATE_ISO8601=$(date --iso-8601=seconds --utc)" >> "$GITHUB_ENV"
echo "GHCR_REPOSITORY=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
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.6.1
with:
context: .
platforms: ${{ env.PLATFORMS }}
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
labels: |
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
org.opencontainers.image.version=${{ github.sha }}
org.opencontainers.image.revision=${{ github.sha }}
tags: |
ghcr.io/${{ env.GHCR_REPOSITORY }}:${{ env.TAG }}
${{ env.DH_REPOSITORY }}:${{ env.TAG }}
push: true
- name: Update DockerHub repository description
continue-on-error: true
uses: peter-evans/dockerhub-description@v2.4.3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
repository: ${{ env.DH_REPOSITORY }}
short-description: ${{ github.event.repository.description }}

View File

@@ -0,0 +1,63 @@
name: ASF-docker-publish-released
on:
push:
tags:
- '*'
env:
PLATFORMS: linux/amd64,linux/arm,linux/arm64
TAG: released
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.5.1
- name: Login to ghcr.io
uses: docker/login-action@v1.10.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.10.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Prepare environment outputs
shell: sh
run: |
set -eu
echo "FIXED_TAG=$(echo ${{ github.ref }} | cut -d '/' -f 3)" >> "$GITHUB_ENV"
echo "DATE_ISO8601=$(date --iso-8601=seconds --utc)" >> "$GITHUB_ENV"
echo "GHCR_REPOSITORY=$(echo ${{ github.repository }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
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.6.1
with:
context: .
platforms: ${{ env.PLATFORMS }}
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
labels: |
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
org.opencontainers.image.version=${{ env.FIXED_TAG }}
org.opencontainers.image.revision=${{ github.sha }}
tags: |
ghcr.io/${{ env.GHCR_REPOSITORY }}:${{ env.TAG }}
ghcr.io/${{ env.GHCR_REPOSITORY }}:${{ env.FIXED_TAG }}
${{ env.DH_REPOSITORY }}:${{ env.TAG }}
${{ env.DH_REPOSITORY }}:${{ env.FIXED_TAG }}
push: true

View File

@@ -9,8 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Lock inactive threads
uses: dessant/lock-threads@v2
uses: dessant/lock-threads@v2.1.1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
issue-lock-inactive-days: 30
pr-lock-inactive-days: 30

365
.github/workflows/publish.yml vendored Normal file
View File

@@ -0,0 +1,365 @@
name: ASF-publish
on: [push, pull_request]
env:
CONFIGURATION: Release
DOTNET_CLI_TELEMETRY_OPTOUT: 1
DOTNET_NOLOGO: 1
DOTNET_SDK_VERSION: 5.0.x
NET_CORE_VERSION: net5.0
NET_FRAMEWORK_VERSION: net48
NODE_JS_VERSION: 'lts/*'
STEAM_TOKEN_DUMPER_NAME: ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
STEAM_TOKEN_DUMPER_TOKEN: ${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
jobs:
main:
strategy:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v2.3.4
with:
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1.8.1
with:
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
- name: Verify .NET Core
run: dotnet --info
- name: Setup Node.js with npm
uses: actions/setup-node@v2.3.0
with:
check-latest: true
node-version: ${{ env.NODE_JS_VERSION }}
- name: Verify Node.js
run: node -v
- name: Verify npm
run: npm -v
- name: Install npm modules for ASF-ui
run: npm ci --no-progress --prefix ASF-ui
- name: Publish ASF-ui
run: npm run-script deploy --no-progress --prefix ASF-ui
- name: Prepare ArchiSteamFarm.OfficialPlugins.SteamTokenDumper on Unix
if: startsWith(matrix.os, 'macos-') || startsWith(matrix.os, 'ubuntu-')
shell: sh
run: |
if [ -n "${STEAM_TOKEN_DUMPER_TOKEN-}" ] && [ -f "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" ]; then
sed "s/STEAM_TOKEN_DUMPER_TOKEN/${STEAM_TOKEN_DUMPER_TOKEN}/g" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" > "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new"
mv "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs"
fi
- name: Prepare ArchiSteamFarm.OfficialPlugins.SteamTokenDumper on Windows
if: startsWith(matrix.os, 'windows-')
shell: pwsh
run: |
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
if ((Test-Path env:STEAM_TOKEN_DUMPER_TOKEN) -and (Test-Path "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs" -PathType Leaf)) {
(Get-Content "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs").Replace('STEAM_TOKEN_DUMPER_TOKEN', "$env:STEAM_TOKEN_DUMPER_TOKEN") | Set-Content "$env:STEAM_TOKEN_DUMPER_NAME\SharedInfo.cs"
}
- name: Publish ArchiSteamFarm.OfficialPlugins.SteamTokenDumper for .NET Core
run: dotnet publish "${{ env.STEAM_TOKEN_DUMPER_NAME }}" -c "${{ env.CONFIGURATION }}" -f "${{ env.NET_CORE_VERSION }}" -o "out/${{ env.STEAM_TOKEN_DUMPER_NAME }}/${{ env.NET_CORE_VERSION }}" -p:ContinuousIntegrationBuild=true -p:TargetLatestRuntimePatch=false -p:UseAppHost=false --nologo
- name: Publish ArchiSteamFarm.OfficialPlugins.SteamTokenDumper for .NET Framework
if: startsWith(matrix.os, 'windows-')
run: dotnet publish "${{ env.STEAM_TOKEN_DUMPER_NAME }}" -c "${{ env.CONFIGURATION }}" -f "${{ env.NET_FRAMEWORK_VERSION }}" -o "out/${{ env.STEAM_TOKEN_DUMPER_NAME }}/${{ env.NET_FRAMEWORK_VERSION }}" -p:ContinuousIntegrationBuild=true -p:TargetLatestRuntimePatch=false -p:UseAppHost=false --nologo
- name: Restore packages in preparation for ArchiSteamFarm publishing
run: dotnet restore ArchiSteamFarm -p:ContinuousIntegrationBuild=true
- name: Publish ArchiSteamFarm on Unix
if: startsWith(matrix.os, 'macos-') || startsWith(matrix.os, 'ubuntu-')
env:
VARIANTS: generic linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs!
shell: sh
run: |
set -eu
publish() {
if [ "$1" = 'generic' ]; then
local variantArgs="-p:TargetLatestRuntimePatch=false -p:UseAppHost=false"
else
local variantArgs="-p:PublishSingleFile=true -p:PublishTrimmed=true -r $1"
fi
dotnet publish ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o "out/${1}" "-p:ASFVariant=$1" -p:ContinuousIntegrationBuild=true --no-restore --nologo $variantArgs
# If we're including any overlay for this variant, copy it to output directory
if [ -d "ArchiSteamFarm/overlay/${1}" ]; then
cp -pR "ArchiSteamFarm/overlay/${1}/"* "out/${1}"
fi
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if [ -d "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}" ]; then
mkdir -p "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
cp -pR "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}/"* "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
fi
# Include .ico file for all platforms, since only Windows script can bundle it inside the exe
cp "resources/ASF.ico" "out/${1}/ArchiSteamFarm.ico"
if command -v 7z >/dev/null; then
7z a -bd -slp -tzip -mm=Deflate -mx=1 "out/ASF-${1}.zip" "${GITHUB_WORKSPACE}/out/${1}/*"
elif command -v zip >/dev/null; then
(
cd "${GITHUB_WORKSPACE}/out/${1}"
zip -1 -q -r "../ASF-${1}.zip" .
)
else
echo "ERROR: No supported zip tool!"
return 1
fi
}
jobs=""
for variant in $VARIANTS; do
publish "$variant" &
jobs="$jobs $!"
done
for job in $jobs; do
wait "$job"
done
- name: Publish ArchiSteamFarm on Windows
if: startsWith(matrix.os, 'windows-')
env:
VARIANTS: generic generic-netf linux-arm linux-arm64 linux-x64 osx-x64 win-x64 # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs!
shell: pwsh
run: |
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
$PublishBlock = {
param($variant)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
Set-Location "$env:GITHUB_WORKSPACE"
if ($variant -like '*-netf') {
$targetFramework = $env:NET_FRAMEWORK_VERSION
} else {
$targetFramework = $env:NET_CORE_VERSION
}
if ($variant -like 'generic*') {
$variantArgs = '-p:TargetLatestRuntimePatch=false', '-p:UseAppHost=false'
} else {
$variantArgs = '-p:PublishSingleFile=true', '-p:PublishTrimmed=true', '-r', "$variant"
}
dotnet publish ArchiSteamFarm -c "$env:CONFIGURATION" -f "$targetFramework" -o "out\$variant" "-p:ASFVariant=$variant" -p:ContinuousIntegrationBuild=true --no-restore --nologo $variantArgs
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
# If we're including any overlay for this variant, copy it to output directory
if (Test-Path "ArchiSteamFarm\overlay\$variant" -PathType Container) {
Copy-Item "ArchiSteamFarm\overlay\$variant\*" "out\$variant" -Recurse
}
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if (Test-Path "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework" -PathType Container) {
if (!(Test-Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" -PathType Container)) {
New-Item -ItemType Directory -Path "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" > $null
}
Copy-Item "out\$env:STEAM_TOKEN_DUMPER_NAME\$targetFramework\*" "out\$variant\plugins\$env:STEAM_TOKEN_DUMPER_NAME" -Recurse
}
# Icon is available only in .NET Framework and .NET Core Windows build, we'll bundle the .ico file for other flavours
if (($targetFramework -eq "$env:NET_CORE_VERSION") -and !(Test-Path "out\$variant\ArchiSteamFarm.exe" -PathType Leaf)) {
Copy-Item 'resources\ASF.ico' "out\$variant\ArchiSteamFarm.ico"
}
# By default use fastest compression
$compressionArgs = '-mx=1'
# Include extra logic for builds marked for release
if ($env:GITHUB_REF -like 'refs/tags/*') {
$tag = $env:GITHUB_REF.Substring(10)
# Tweak compression args for release publishing
$compressionArgs = '-mx=9', '-mfb=258', '-mpass=15'
# Update link in Changelog.html accordingly
if (Test-Path "out\$variant\Changelog.html" -PathType Leaf) {
(Get-Content "out\$variant\Changelog.html").Replace('ArchiSteamFarm/commits/main', "ArchiSteamFarm/releases/tag/$tag") | Set-Content "out\$variant\Changelog.html"
}
}
7z a -bd -slp -tzip -mm=Deflate $compressionArgs "out\ASF-$variant.zip" "$env:GITHUB_WORKSPACE\out\$variant\*"
if ($LastExitCode -ne 0) {
throw "Last command failed."
}
}
foreach ($variant in $env:VARIANTS.Split([char[]] $null, [System.StringSplitOptions]::RemoveEmptyEntries)) {
Start-Job -Name "$variant" $PublishBlock -ArgumentList "$variant"
}
Get-Job | Receive-Job -Wait
- name: Upload ASF-generic
continue-on-error: true
uses: actions/upload-artifact@v2.2.4
with:
name: ${{ matrix.os }}_ASF-generic
path: out/ASF-generic.zip
- name: Upload ASF-generic-netf
continue-on-error: true
if: startsWith(matrix.os, 'windows-')
uses: actions/upload-artifact@v2.2.4
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.2.4
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.2.4
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.2.4
with:
name: ${{ matrix.os }}_ASF-linux-x64
path: out/ASF-linux-x64.zip
- name: Upload ASF-osx-x64
continue-on-error: true
uses: actions/upload-artifact@v2.2.4
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.2.4
with:
name: ${{ matrix.os }}_ASF-win-x64
path: out/ASF-win-x64.zip
- name: Create ArchiSteamFarm GitHub release
id: github_release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/create-release@v1.1.4
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: ArchiSteamFarm V${{ github.ref }}
body_path: .github/RELEASE_TEMPLATE.md
prerelease: true
- name: Upload ASF-generic to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-generic.zip
asset_name: ASF-generic.zip
asset_content_type: application/zip
- name: Upload ASF-generic-netf to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-generic-netf.zip
asset_name: ASF-generic-netf.zip
asset_content_type: application/zip
- name: Upload ASF-linux-arm to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-arm.zip
asset_name: ASF-linux-arm.zip
asset_content_type: application/zip
- name: Upload ASF-linux-arm64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-arm64.zip
asset_name: ASF-linux-arm64.zip
asset_content_type: application/zip
- name: Upload ASF-linux-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-linux-x64.zip
asset_name: ASF-linux-x64.zip
asset_content_type: application/zip
- name: Upload ASF-osx-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-osx-x64.zip
asset_name: ASF-osx-x64.zip
asset_content_type: application/zip
- name: Upload ASF-win-x64 to GitHub release
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') && startsWith(matrix.os, 'windows-') }}
uses: actions/upload-release-asset@v1.0.2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.github_release.outputs.upload_url }}
asset_path: out/ASF-win-x64.zip
asset_name: ASF-win-x64.zip
asset_content_type: application/zip

View File

@@ -2,21 +2,18 @@ name: ASF-translations
on:
schedule:
- cron: '0 2 * * *'
- cron: '55 1 * * *'
jobs:
update:
strategy:
matrix:
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v2.3.4
with:
submodules: recursive
token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
- name: Reset wiki to follow origin
shell: sh
@@ -29,17 +26,24 @@ jobs:
git reset --hard origin/master
- name: Download latest translations from Crowdin
uses: crowdin/github-action@1.0.9
uses: crowdin/github-action@1.3.0
with:
upload_sources: false
download_translations: true
skip_untranslated_strings: true
push_translations: false
crowdin_branch_name: master
crowdin_branch_name: main
config: '.github/crowdin.yml'
project_id: ${{ secrets.ASF_CROWDIN_PROJECT_ID }}
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
env:
GITHUB_TOKEN: 'not-used' # TODO: https://github.com/crowdin/github-action/pull/30
- name: Import GPG key for wiki
uses: crazy-max/ghaction-import-gpg@v3.1.0
with:
gpg-private-key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
git-user-signingkey: true
git-commit-gpgsign: true
workdir: wiki
- name: Commit the changes to wiki
shell: sh
@@ -48,9 +52,6 @@ jobs:
cd wiki
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add -A "locale"
if ! git diff --cached --quiet; then
@@ -58,27 +59,33 @@ jobs:
fi
- name: Push changes to wiki
uses: ad-m/github-push-action@master
uses: ad-m/github-push-action@v0.6.0
with:
github_token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
branch: master
directory: wiki
github_token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.repository }}.wiki
- name: Import GPG key for ASF
uses: crazy-max/ghaction-import-gpg@v3.1.0
with:
gpg-private-key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
git-user-signingkey: true
git-commit-gpgsign: true
- name: Commit the changes to ASF
shell: sh
run: |
set -eu
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add -A "ArchiSteamFarm/Localization" "wiki"
git add -A "ArchiSteamFarm/Localization" "ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization" "wiki"
if ! git diff --cached --quiet; then
git commit -m "Automatic translations update"
fi
- name: Push changes to ASF
uses: ad-m/github-push-action@master
uses: ad-m/github-push-action@v0.6.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
github_token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
branch: ${{ github.ref }}

73
.gitignore vendored
View File

@@ -7,6 +7,9 @@
# Ignore all files in custom in-tree config directory (if exists)
ArchiSteamFarm/config
# Ignore private SNK key (if exists)
resources/ArchiSteamFarm.snk
# Ignore local log + debug of development builds
ArchiSteamFarm/log.txt
ArchiSteamFarm/debug
@@ -113,6 +116,9 @@ test-results/
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
@@ -120,12 +126,14 @@ test-results/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
@@ -139,9 +147,10 @@ Generated\ Files/
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
@@ -156,6 +165,9 @@ project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
@@ -181,6 +193,7 @@ StyleCopReport.xml
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
@@ -222,9 +235,6 @@ _ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
@@ -235,6 +245,11 @@ _TeamCity*
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
@@ -282,6 +297,8 @@ PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
@@ -292,6 +309,9 @@ PublishScripts/
*.nuget.props
*.nuget.targets
# Nuget personal access tokens and Credentials
nuget.config
# Microsoft Azure Build Output
csx/
*.build.csdef
@@ -306,6 +326,8 @@ BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
@@ -331,8 +353,6 @@ orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true
**/wwwroot/lib/
# RIA/Silverlight projects
Generated_Code/
@@ -357,6 +377,9 @@ ServiceFabricBackup/
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
@@ -392,10 +415,6 @@ paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
@@ -437,22 +456,39 @@ ASALocalRun/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
# BeatPulse healthcheck temp database
healthchecksdb
# __ __ _ _ ____ _ _ _ ____ _
# \ \ / /(_) ___ _ _ __ _ | |/ ___| | |_ _ _ __| |(_) ___ / ___| ___ __| | ___
# \ \ / / | |/ __|| | | | / _` || |\___ \ | __|| | | | / _` || | / _ \ | | / _ \ / _` | / _ \
# \ V / | |\__ \| |_| || (_| || | ___) || |_ | |_| || (_| || || (_) || |___| (_) || (_| || __/
# \_/ |_||___/ \__,_| \__,_||_||____/ \__| \__,_| \__,_||_| \___/ \____|\___/ \__,_| \___|
#
# https://github.com/github/gitignore/blob/master/Global/VisualStudioCode.gitignore
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
.idea/
*.sln.iml
# __ __ _ _
# \ \ / /(_) _ __ __| | ___ __ __ ___
@@ -464,6 +500,7 @@ healthchecksdb
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db

2
.gitmodules vendored
View File

@@ -1,6 +1,8 @@
[submodule "ASF-ui"]
path = ASF-ui
url = https://github.com/JustArchiNET/ASF-ui.git
branch = main
[submodule "wiki"]
path = wiki
url = https://github.com/JustArchiNET/ArchiSteamFarm.wiki.git
branch = master

View File

@@ -1,116 +0,0 @@
# ASF is a C# project with a solution file named ArchiSteamFarm.sln
language: csharp
solution: ArchiSteamFarm.sln
# We can save bandwidth by limiting git clone to only last 10 commits
git:
depth: 10
# ASF is based on .NET Core platform, we're not building with Mono
dotnet: 5.0
mono: none
env:
global:
- CONFIGURATION: Release
- DOTNET_CLI_TELEMETRY_OPTOUT: 1
- DOTNET_NOLOGO: 1
- NET_CORE_VERSION: net5.0
- STEAM_TOKEN_DUMPER_NAME: ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
- VARIANTS="generic linux-arm linux-arm64 linux-x64 osx-x64 win-x64" # NOTE: When modifying variants, don't forget to update ASF_VARIANT definitions in SharedInfo.cs!
addons:
homebrew:
packages: p7zip
before_script:
- |
set -eu
dotnet --info
set +u # This is needed to continue Travis build
script:
- |
set -eu
nvm install lts/*
npm ci --no-progress --prefix ASF-ui
npm run-script deploy --no-progress --prefix ASF-ui
dotnet build ArchiSteamFarm -c "$CONFIGURATION" -p:UseAppHost=false --nologo
dotnet build ArchiSteamFarm.CustomPlugins.ExamplePlugin -c "$CONFIGURATION" -p:UseAppHost=false --nologo
dotnet build ArchiSteamFarm.CustomPlugins.PeriodicGC -c "$CONFIGURATION" -p:UseAppHost=false --nologo
dotnet build "$STEAM_TOKEN_DUMPER_NAME" -c "$CONFIGURATION" -p:UseAppHost=false --nologo
dotnet test ArchiSteamFarm.Tests -c "$CONFIGURATION" -p:UseAppHost=false --nologo
if [ -n "${STEAM_TOKEN_DUMPER_TOKEN-}" ] && [ -f "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" ]; then
sed "s/STEAM_TOKEN_DUMPER_TOKEN/${STEAM_TOKEN_DUMPER_TOKEN}/g" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs" > "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new";
mv "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs.new" "${STEAM_TOKEN_DUMPER_NAME}/SharedInfo.cs"
fi
dotnet publish "$STEAM_TOKEN_DUMPER_NAME" -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}" -p:UseAppHost=false --nologo
dotnet clean ArchiSteamFarm -c "$CONFIGURATION" -p:UseAppHost=false --nologo
dotnet restore ArchiSteamFarm
publish() {
if [ "$1" = 'generic' ]; then
local variantArgs="-p:UseAppHost=false"
else
local variantArgs="-p:PublishSingleFile=true -p:PublishTrimmed=true -r $1"
fi
dotnet publish ArchiSteamFarm -c "$CONFIGURATION" -f "$NET_CORE_VERSION" -o "out/${1}" "-p:ASFVariant=$1" --no-restore --nologo $variantArgs
# If we're including any overlay for this variant, copy it to output directory
if [ -d "ArchiSteamFarm/overlay/${1}" ]; then
cp "ArchiSteamFarm/overlay/${1}/"* "out/${1}"
fi
# If we're including SteamTokenDumper plugin for this framework, copy it to output directory
if [ -f "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}/${STEAM_TOKEN_DUMPER_NAME}.dll" ]; then
mkdir -p "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
cp "out/${STEAM_TOKEN_DUMPER_NAME}/${NET_CORE_VERSION}/${STEAM_TOKEN_DUMPER_NAME}.dll" "out/${1}/plugins/${STEAM_TOKEN_DUMPER_NAME}"
fi
# Include .ico file for all platforms, since only Windows script can bundle it inside the exe
cp "resources/ASF.ico" "out/${1}/ArchiSteamFarm.ico"
if command -v 7z >/dev/null; then
7z a -bd -slp -tzip -mm=Deflate -mx=1 "out/ASF-${1}.zip" "${TRAVIS_BUILD_DIR}/out/${1}/*"
elif command -v zip >/dev/null; then
(
cd "${TRAVIS_BUILD_DIR}/out/${1}"
zip -1 -q -r "../ASF-${1}.zip" .
)
else
echo "ERROR: No supported zip tool!"
return 1
fi
}
jobs=""
for variant in $VARIANTS; do
publish "$variant" &
jobs="$jobs $!"
done
for job in $jobs; do
wait "$job"
done
set +u # This is needed to continue Travis build
matrix:
allow_failures:
- os: osx
# We can use fast finish, as we don't need to wait for allow_failures builds to mark build as success
fast_finish: true
include:
# We're building ASF with dotnet on latest versions of Linux and OS X
# Sadly, travis is still missing support for selecting latest images: https://github.com/travis-ci/travis-ci/issues/8922
- os: linux
# Ref: https://docs.travis-ci.com/user/reference/linux
dist: bionic
- os: osx
# Ref: https://docs.travis-ci.com/user/reference/osx
dotnet: 5.0.100 # For OSX, we need absolute dotnet version until https://github.com/dotnet/core-setup/issues/4187 is resolved
osx_image: xcode11.4

2
ASF-ui

Submodule ASF-ui updated: 021a4e0f26...0692fb39b5

View File

@@ -1,15 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="Newtonsoft.Json" IncludeAssets="compile" />
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net48'">
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,24 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2021 Ł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;
[assembly: CLSCompliant(false)]

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,8 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using ArchiSteamFarm.Web;
using ArchiSteamFarm.Web.Responses;
using Newtonsoft.Json;
namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
@@ -36,11 +38,11 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
throw new ArgumentNullException(nameof(webBrowser));
}
const string request = URL + "/meow";
Uri request = new(URL + "/meow");
WebBrowser.ObjectResponse<MeowResponse>? response = await webBrowser.UrlGetToJsonObject<MeowResponse>(request).ConfigureAwait(false);
ObjectResponse<MeowResponse>? response = await webBrowser.UrlGetToJsonObject<MeowResponse>(request).ConfigureAwait(false);
if (response?.Content == null) {
if (response == null) {
return null;
}
@@ -48,18 +50,18 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
throw new InvalidOperationException(nameof(response.Content.Link));
}
return Uri.EscapeUriString(response.Content!.Link!);
return Uri.EscapeUriString(response.Content.Link);
}
#pragma warning disable CA1812 // False positive, the class is used during json deserialization
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
private sealed class MeowResponse {
#pragma warning disable 649
[JsonProperty(PropertyName = "file", Required = Required.Always)]
internal readonly string? Link;
#pragma warning restore 649
internal readonly string Link = "";
[JsonConstructor]
private MeowResponse() { }
}
#pragma warning restore CA1812 // False positive, the class is used during json deserialization
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +22,7 @@
using System;
using System.Net;
using System.Threading.Tasks;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.IPC.Controllers.Api;
using ArchiSteamFarm.IPC.Responses;
using Microsoft.AspNetCore.Mvc;
@@ -40,7 +41,7 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
[ProducesResponseType(typeof(GenericResponse), (int) HttpStatusCode.ServiceUnavailable)]
public async Task<ActionResult<GenericResponse>> CatGet() {
if (ASF.WebBrowser == null) {
throw new ArgumentNullException(nameof(ASF.WebBrowser));
throw new InvalidOperationException(nameof(ASF.WebBrowser));
}
string? link = await CatAPI.GetRandomCatURL(ASF.WebBrowser).ConfigureAwait(false);

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,13 +19,19 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#if NETFRAMEWORK
using ArchiSteamFarm.Compatibility;
#endif
using System;
using System.Collections.Generic;
using System.Composition;
using System.Linq;
using System.Threading.Tasks;
using ArchiSteamFarm.Json;
using ArchiSteamFarm.Plugins;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.Plugins.Interfaces;
using ArchiSteamFarm.Steam;
using ArchiSteamFarm.Steam.Data;
using ArchiSteamFarm.Steam.Storage;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SteamKit2;
@@ -37,12 +43,7 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
// Your plugin class should inherit the plugin interfaces it wants to handle
// If you do not want to handle a particular action (e.g. OnBotMessage that is offered in IBotMessage), it's the best idea to not inherit it at all
// This will keep your code compact, efficient and less dependent. You can always add additional interfaces when you'll need them, this example project will inherit quite a bit of them to show you potential usage
// ReSharper disable once UnusedType.Global - this is example plugin class that isn't used in our main code
internal sealed class ExamplePlugin : IASF, IBot, IBotCommand, IBotConnection, IBotFriendRequest, IBotMessage, IBotModules, IBotTradeOffer {
// Plugins can expose custom properties for our GET /Api/Plugins API call, simply annotate them with [JsonProperty] (or keep public)
[JsonProperty]
public bool CustomIsEnabledField { get; private set; } = true;
// This is used for identification purposes, typically you want to use a friendly name of your plugin here, such as the name of your main class
// Please note that this property can have direct dependencies only on structures that were initialized by the constructor, as it's possible to be called before OnLoaded() takes place
public string Name => nameof(ExamplePlugin);
@@ -51,6 +52,10 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
// Please note that this property can have direct dependencies only on structures that were initialized by the constructor, as it's possible to be called before OnLoaded() takes place
public Version Version => typeof(ExamplePlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
// Plugins can expose custom properties for our GET /Api/Plugins API call, simply annotate them with [JsonProperty] (or keep public)
[JsonProperty]
public bool CustomIsEnabledField { get; private set; } = true;
// This method, apart from being called before any bot initialization takes place, allows you to read custom global config properties that are not recognized by ASF
// Thanks to that, you can extend default ASF config with your own stuff, then parse it here in order to customize your plugin during runtime
// Keep in mind that, as noted in the interface, additionalConfigProperties can be null if no custom, unrecognized properties are found by ASF, you should handle that case appropriately
@@ -60,12 +65,11 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
return;
}
// ReSharper disable once UseDeconstruction - deconstruction is not available in .NET Framework
foreach (KeyValuePair<string, JToken> configProperty in additionalConfigProperties) {
foreach ((string configProperty, JToken configValue) in additionalConfigProperties) {
// It's a good idea to prefix your custom properties with the name of your plugin, so there will be no possible conflict of ASF or other plugins using the same name, neither now or in the future
switch (configProperty.Key) {
case nameof(ExamplePlugin) + "TestProperty" when configProperty.Value.Type == JTokenType.Boolean:
bool exampleBooleanValue = configProperty.Value.Value<bool>();
switch (configProperty) {
case nameof(ExamplePlugin) + "TestProperty" when configValue.Type == JTokenType.Boolean:
bool exampleBooleanValue = configValue.Value<bool>();
ASF.ArchiLogger.LogGenericInfo(nameof(ExamplePlugin) + "TestProperty boolean property has been found with a value of: " + exampleBooleanValue);
break;
@@ -165,7 +169,7 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
// It allows you not only to analyze such trades, but generate a response whether ASF should accept it (true), or proceed like usual (false)
// Thanks to that, you can implement custom rules for all trades that aren't handled by ASF, for example cross-set trading on your own custom rules
// You'd implement your own logic here, as an example we'll allow all trades to be accepted if the bot's name starts from "TrashBot"
public Task<bool> OnBotTradeOffer(Bot bot, Steam.TradeOffer tradeOffer) => Task.FromResult(bot.BotName.StartsWith("TrashBot", StringComparison.OrdinalIgnoreCase));
public Task<bool> OnBotTradeOffer(Bot bot, TradeOffer tradeOffer) => Task.FromResult(bot.BotName.StartsWith("TrashBot", StringComparison.OrdinalIgnoreCase));
// This is the earliest method that will be called, right after loading the plugin, long before any bot initialization takes place
// It's a good place to initialize all potential (non-bot-specific) structures that you will need across lifetime of your plugin, such as global timers, concurrent dictionaries and alike

View File

@@ -1,15 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,24 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2021 Ł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;
[assembly: CLSCompliant(false)]

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -24,7 +24,8 @@ using System.Composition;
using System.Diagnostics.CodeAnalysis;
using System.Runtime;
using System.Threading;
using ArchiSteamFarm.Plugins;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.Plugins.Interfaces;
namespace ArchiSteamFarm.CustomPlugins.PeriodicGC {
[Export(typeof(IPlugin))]
@@ -32,6 +33,7 @@ namespace ArchiSteamFarm.CustomPlugins.PeriodicGC {
internal sealed class PeriodicGCPlugin : IPlugin {
private const byte GCPeriod = 60; // In seconds
private static readonly object LockObject = new();
private static readonly Timer PeriodicGCTimer = new(PerformGC);
public string Name => nameof(PeriodicGCPlugin);
@@ -43,7 +45,7 @@ namespace ArchiSteamFarm.CustomPlugins.PeriodicGC {
ASF.ArchiLogger.LogGenericWarning("Periodic GC will occur every " + timeSpan.ToHumanReadable() + ". Please keep in mind that this plugin should be used for debugging tests only.");
lock (PeriodicGCTimer) {
lock (LockObject) {
PeriodicGCTimer.Change(timeSpan, timeSpan);
}
}
@@ -51,7 +53,7 @@ namespace ArchiSteamFarm.CustomPlugins.PeriodicGC {
private static void PerformGC(object? state) {
ASF.ArchiLogger.LogGenericWarning("Performing GC, current memory: " + (GC.GetTotalMemory(false) / 1024) + " KB.");
lock (PeriodicGCTimer) {
lock (LockObject) {
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
}

View File

@@ -1,15 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="Newtonsoft.Json" IncludeAssets="compile" />
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" IncludeAssets="compile" />
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" ExcludeAssets="all" Private="false" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Localization\Strings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Update="Localization\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Strings.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,24 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2021 Ł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;
[assembly: CLSCompliant(false)]

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,14 +19,22 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#if NETFRAMEWORK
using ArchiSteamFarm.Compatibility;
using File = System.IO.File;
using Path = System.IO.Path;
#else
using System.IO;
#endif
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using ArchiSteamFarm.Collections;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.Helpers;
using ArchiSteamFarm.Localization;
using Newtonsoft.Json;
using SteamKit2;
@@ -47,13 +55,13 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
private readonly ConcurrentDictionary<uint, ulong> PackageTokens = new();
[JsonProperty(Required = Required.DisallowNull)]
private readonly ConcurrentHashSet<uint> SubmittedAppIDs = new();
private readonly ConcurrentDictionary<uint, ulong> SubmittedApps = new();
[JsonProperty(Required = Required.DisallowNull)]
private readonly ConcurrentHashSet<uint> SubmittedDepotIDs = new();
private readonly ConcurrentDictionary<uint, string> SubmittedDepots = new();
[JsonProperty(Required = Required.DisallowNull)]
private readonly ConcurrentHashSet<uint> SubmittedPackageIDs = new();
private readonly ConcurrentDictionary<uint, ulong> SubmittedPackages = new();
[JsonProperty(Required = Required.DisallowNull)]
internal uint LastChangeNumber { get; private set; }
@@ -62,37 +70,47 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
internal ulong GetAppToken(uint appID) => AppTokens[appID];
internal Dictionary<uint, ulong> GetAppTokensForSubmission() => AppTokens.Where(appToken => !SubmittedAppIDs.Contains(appToken.Key)).ToDictionary(appToken => appToken.Key, appToken => appToken.Value);
internal Dictionary<uint, string> GetDepotKeysForSubmission() => DepotKeys.Where(depotKey => !SubmittedDepotIDs.Contains(depotKey.Key)).ToDictionary(depotKey => depotKey.Key, depotKey => depotKey.Value);
internal Dictionary<uint, ulong> GetPackageTokensForSubmission() => PackageTokens.Where(packageToken => !SubmittedPackageIDs.Contains(packageToken.Key)).ToDictionary(packageToken => packageToken.Key, packageToken => packageToken.Value);
internal Dictionary<uint, ulong> GetAppTokensForSubmission() => AppTokens.Where(appToken => (SteamTokenDumperPlugin.Config?.SecretAppIDs.Contains(appToken.Key) == false) && (appToken.Value > 0) && (!SubmittedApps.TryGetValue(appToken.Key, out ulong token) || (appToken.Value != token))).ToDictionary(appToken => appToken.Key, appToken => appToken.Value);
internal Dictionary<uint, string> GetDepotKeysForSubmission() => DepotKeys.Where(depotKey => (SteamTokenDumperPlugin.Config?.SecretDepotIDs.Contains(depotKey.Key) == false) && !string.IsNullOrEmpty(depotKey.Value) && (!SubmittedDepots.TryGetValue(depotKey.Key, out string? key) || (depotKey.Value != key))).ToDictionary(depotKey => depotKey.Key, depotKey => depotKey.Value);
internal Dictionary<uint, ulong> GetPackageTokensForSubmission() => PackageTokens.Where(packageToken => (SteamTokenDumperPlugin.Config?.SecretPackageIDs.Contains(packageToken.Key) == false) && (packageToken.Value > 0) && (!SubmittedPackages.TryGetValue(packageToken.Key, out ulong token) || (packageToken.Value != token))).ToDictionary(packageToken => packageToken.Key, packageToken => packageToken.Value);
internal static async Task<GlobalCache> Load() {
internal static async Task<GlobalCache?> Load() {
if (!File.Exists(SharedFilePath)) {
return new GlobalCache();
GlobalCache result = new();
Utilities.InBackground(result.Save);
return result;
}
GlobalCache? globalCache = null;
GlobalCache? globalCache;
try {
string json = await RuntimeCompatibility.File.ReadAllTextAsync(SharedFilePath).ConfigureAwait(false);
string json = await Compatibility.File.ReadAllTextAsync(SharedFilePath).ConfigureAwait(false);
if (!string.IsNullOrEmpty(json)) {
globalCache = JsonConvert.DeserializeObject<GlobalCache>(json);
if (string.IsNullOrEmpty(json)) {
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
return null;
}
globalCache = JsonConvert.DeserializeObject<GlobalCache>(json);
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
return null;
}
if (globalCache == null) {
ASF.ArchiLogger.LogGenericError($"{nameof(GlobalCache)} could not be loaded, a fresh instance will be initialized.");
ASF.ArchiLogger.LogNullError(nameof(globalCache));
globalCache = new GlobalCache();
return null;
}
return globalCache;
}
internal async Task OnPICSChanges(uint currentChangeNumber, IReadOnlyCollection<KeyValuePair<uint, SteamApps.PICSChangesCallback.PICSChangeData>> appChanges) {
internal void OnPICSChanges(uint currentChangeNumber, IReadOnlyCollection<KeyValuePair<uint, SteamApps.PICSChangesCallback.PICSChangeData>> appChanges) {
if (currentChangeNumber == 0) {
throw new ArgumentOutOfRangeException(nameof(currentChangeNumber));
}
@@ -105,8 +123,6 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
ASF.ArchiLogger.LogGenericTrace($"{LastChangeNumber} => {currentChangeNumber}");
LastChangeNumber = currentChangeNumber;
foreach ((uint appID, SteamApps.PICSChangesCallback.PICSChangeData appData) in appChanges) {
@@ -115,13 +131,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
AppChangeNumbers.TryRemove(appID, out _);
ASF.ArchiLogger.LogGenericTrace($"App needs refresh: {appID}");
}
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
internal async Task OnPICSChangesRestart(uint currentChangeNumber) {
internal void OnPICSChangesRestart(uint currentChangeNumber) {
if (currentChangeNumber == 0) {
throw new ArgumentOutOfRangeException(nameof(currentChangeNumber));
}
@@ -130,19 +145,16 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
ASF.ArchiLogger.LogGenericDebug($"RESET {LastChangeNumber} => {currentChangeNumber}");
LastChangeNumber = currentChangeNumber;
AppChangeNumbers.Clear();
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
internal bool ShouldRefreshAppInfo(uint appID) => !AppChangeNumbers.ContainsKey(appID);
internal bool ShouldRefreshDepotKey(uint depotID) => !DepotKeys.ContainsKey(depotID);
internal async Task UpdateAppChangeNumbers(IReadOnlyCollection<KeyValuePair<uint, uint>> appChangeNumbers) {
internal void UpdateAppChangeNumbers(IReadOnlyCollection<KeyValuePair<uint, uint>> appChangeNumbers) {
if (appChangeNumbers == null) {
throw new ArgumentNullException(nameof(appChangeNumbers));
}
@@ -159,11 +171,11 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
if (save) {
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
}
internal async Task UpdateAppTokens(IReadOnlyCollection<KeyValuePair<uint, ulong>> appTokens, IReadOnlyCollection<uint> publicAppIDs) {
internal void UpdateAppTokens(IReadOnlyCollection<KeyValuePair<uint, ulong>> appTokens, IReadOnlyCollection<uint> publicAppIDs) {
if (appTokens == null) {
throw new ArgumentNullException(nameof(appTokens));
}
@@ -180,12 +192,6 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
AppTokens[appID] = appToken;
if (appToken == 0) {
// Backend is not interested in zero access tokens
SubmittedAppIDs.Add(appID);
}
save = true;
}
@@ -195,19 +201,15 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
AppTokens[appID] = 0;
// Backend is not interested in zero access tokens
SubmittedAppIDs.Add(appID);
save = true;
}
if (save) {
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
}
internal async Task UpdateDepotKeys(ICollection<SteamApps.DepotKeyCallback> depotKeyResults) {
internal void UpdateDepotKeys(ICollection<SteamApps.DepotKeyCallback> depotKeyResults) {
if (depotKeyResults == null) {
throw new ArgumentNullException(nameof(depotKeyResults));
}
@@ -215,32 +217,26 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
bool save = false;
foreach (SteamApps.DepotKeyCallback depotKeyResult in depotKeyResults) {
if (depotKeyResult?.Result != EResult.OK) {
if (depotKeyResult.Result != EResult.OK) {
continue;
}
string depotKey = BitConverter.ToString(depotKeyResult.DepotKey).Replace("-", "");
string depotKey = BitConverter.ToString(depotKeyResult.DepotKey).Replace("-", "", StringComparison.Ordinal);
if (DepotKeys.TryGetValue(depotKeyResult.DepotID, out string? previousDepotKey) && (previousDepotKey == depotKey)) {
continue;
}
DepotKeys[depotKeyResult.DepotID] = depotKey;
if (string.IsNullOrEmpty(depotKey)) {
// Backend is not interested in zero depot keys
SubmittedDepotIDs.Add(depotKeyResult.DepotID);
}
save = true;
}
if (save) {
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
}
internal async Task UpdatePackageTokens(IReadOnlyCollection<KeyValuePair<uint, ulong>> packageTokens) {
internal void UpdatePackageTokens(IReadOnlyCollection<KeyValuePair<uint, ulong>> packageTokens) {
if (packageTokens == null) {
throw new ArgumentNullException(nameof(packageTokens));
}
@@ -253,50 +249,40 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
PackageTokens[packageID] = packageToken;
if (packageToken == 0) {
// Backend is not interested in zero access tokens
SubmittedPackageIDs.Add(packageID);
}
save = true;
}
if (save) {
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
}
internal async Task UpdateSubmittedData(IReadOnlyCollection<uint> appIDs, IReadOnlyCollection<uint> packageIDs, IReadOnlyCollection<uint> depotIDs) {
if (appIDs == null) {
throw new ArgumentNullException(nameof(appIDs));
internal void UpdateSubmittedData(IReadOnlyDictionary<uint, ulong> apps, IReadOnlyDictionary<uint, ulong> packages, IReadOnlyDictionary<uint, string> depots) {
if (apps == null) {
throw new ArgumentNullException(nameof(apps));
}
if (packageIDs == null) {
throw new ArgumentNullException(nameof(packageIDs));
if (packages == null) {
throw new ArgumentNullException(nameof(packages));
}
if (depotIDs == null) {
throw new ArgumentNullException(nameof(depotIDs));
if (depots == null) {
throw new ArgumentNullException(nameof(depots));
}
bool save = false;
foreach (uint _ in appIDs.Where(appID => SubmittedAppIDs.Add(appID))) {
save = true;
foreach ((uint appID, ulong token) in apps) {
SubmittedApps[appID] = token;
}
foreach (uint _ in packageIDs.Where(packageID => SubmittedPackageIDs.Add(packageID))) {
save = true;
foreach ((uint packageID, ulong token) in packages) {
SubmittedPackages[packageID] = token;
}
foreach (uint _ in depotIDs.Where(depotID => SubmittedDepotIDs.Add(depotID))) {
save = true;
foreach ((uint depotID, string key) in depots) {
SubmittedDepots[depotID] = key;
}
if (save) {
await Save().ConfigureAwait(false);
}
Utilities.InBackground(Save);
}
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -23,7 +23,10 @@ using Newtonsoft.Json;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
public sealed class GlobalConfigExtension {
[JsonProperty]
[JsonProperty(Required = Required.DisallowNull)]
public SteamTokenDumperConfig? SteamTokenDumperPlugin { get; private set; }
[JsonProperty(Required = Required.DisallowNull)]
public bool SteamTokenDumperPluginEnabled { get; private set; }
[JsonConstructor]

View File

@@ -0,0 +1,3 @@
This directory contains ASF strings for display and localization purposes.
All strings used by ASF can be found in main `Strings.resx` file, and that's also the only `resx` file that should be modified - all other `resx` files are managed automatically and should not be touched. Please visit **[localization](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Localization)** section on the wiki if you want to improve translation of other files.

View File

@@ -0,0 +1,306 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper.Localization {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Strings {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Strings() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ArchiSteamFarm.OfficialPlugins.SteamTokenDumper.Localization.Strings", typeof(Strings).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Finished retrieving {0} app access tokens..
/// </summary>
internal static string BotFinishedRetrievingAppAccessTokens {
get {
return ResourceManager.GetString("BotFinishedRetrievingAppAccessTokens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Finished retrieving {0} app infos..
/// </summary>
internal static string BotFinishedRetrievingAppInfos {
get {
return ResourceManager.GetString("BotFinishedRetrievingAppInfos", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Finished retrieving {0} depot keys..
/// </summary>
internal static string BotFinishedRetrievingDepotKeys {
get {
return ResourceManager.GetString("BotFinishedRetrievingDepotKeys", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Finished retrieving a total of {0} app access tokens..
/// </summary>
internal static string BotFinishedRetrievingTotalAppAccessTokens {
get {
return ResourceManager.GetString("BotFinishedRetrievingTotalAppAccessTokens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Finished retrieving all depot keys for a total of {0} apps..
/// </summary>
internal static string BotFinishedRetrievingTotalDepots {
get {
return ResourceManager.GetString("BotFinishedRetrievingTotalDepots", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There are no apps that require a refresh on this bot instance..
/// </summary>
internal static string BotNoAppsToRefresh {
get {
return ResourceManager.GetString("BotNoAppsToRefresh", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Retrieving {0} app access tokens....
/// </summary>
internal static string BotRetrievingAppAccessTokens {
get {
return ResourceManager.GetString("BotRetrievingAppAccessTokens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Retrieving {0} app infos....
/// </summary>
internal static string BotRetrievingAppInfos {
get {
return ResourceManager.GetString("BotRetrievingAppInfos", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Retrieving {0} depot keys....
/// </summary>
internal static string BotRetrievingDepotKeys {
get {
return ResourceManager.GetString("BotRetrievingDepotKeys", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Retrieving a total of {0} app access tokens....
/// </summary>
internal static string BotRetrievingTotalAppAccessTokens {
get {
return ResourceManager.GetString("BotRetrievingTotalAppAccessTokens", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Retrieving all depots for a total of {0} apps....
/// </summary>
internal static string BotRetrievingTotalDepots {
get {
return ResourceManager.GetString("BotRetrievingTotalDepots", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} could not be loaded, a fresh instance will be initialized....
/// </summary>
internal static string FileCouldNotBeLoadedFreshInit {
get {
return ResourceManager.GetString("FileCouldNotBeLoadedFreshInit", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} is currently disabled according to your configuration. If you&apos;d like to help SteamDB in data submission, please check out our wiki..
/// </summary>
internal static string PluginDisabledInConfig {
get {
return ResourceManager.GetString("PluginDisabledInConfig", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} has been disabled due to a missing build token.
/// </summary>
internal static string PluginDisabledMissingBuildToken {
get {
return ResourceManager.GetString("PluginDisabledMissingBuildToken", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} has been initialized successfully, thank you in advance for your help. The first submission will happen in approximately {1} from now..
/// </summary>
internal static string PluginInitializedAndEnabled {
get {
return ResourceManager.GetString("PluginInitializedAndEnabled", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} initialized, the plugin will not resolve any of those: {1}..
/// </summary>
internal static string PluginSecretListInitialized {
get {
return ResourceManager.GetString("PluginSecretListInitialized", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The submission has failed due to too many requests sent, we&apos;ll try again in approximately {0} from now..
/// </summary>
internal static string SubmissionFailedTooManyRequests {
get {
return ResourceManager.GetString("SubmissionFailedTooManyRequests", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Submitting a total of registered apps/packages/depots: {0}/{1}/{2}....
/// </summary>
internal static string SubmissionInProgress {
get {
return ResourceManager.GetString("SubmissionInProgress", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Could not submit the data because there is no valid SteamID set that we could classify as a contributor. Consider setting up {0} property..
/// </summary>
internal static string SubmissionNoContributorSet {
get {
return ResourceManager.GetString("SubmissionNoContributorSet", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There is no new data to submit, everything is up-to-date..
/// </summary>
internal static string SubmissionNoNewData {
get {
return ResourceManager.GetString("SubmissionNoNewData", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The data has been successfully submitted. The server has registered a total of new apps/packages/depots: {0} ({1} verified)/{2} ({3} verified)/{4} ({5} verified)..
/// </summary>
internal static string SubmissionSuccessful {
get {
return ResourceManager.GetString("SubmissionSuccessful", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New apps: {0}.
/// </summary>
internal static string SubmissionSuccessfulNewApps {
get {
return ResourceManager.GetString("SubmissionSuccessfulNewApps", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New depots: {0}.
/// </summary>
internal static string SubmissionSuccessfulNewDepots {
get {
return ResourceManager.GetString("SubmissionSuccessfulNewDepots", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to New packages: {0}.
/// </summary>
internal static string SubmissionSuccessfulNewPackages {
get {
return ResourceManager.GetString("SubmissionSuccessfulNewPackages", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Verified apps: {0}.
/// </summary>
internal static string SubmissionSuccessfulVerifiedApps {
get {
return ResourceManager.GetString("SubmissionSuccessfulVerifiedApps", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Verified depots: {0}.
/// </summary>
internal static string SubmissionSuccessfulVerifiedDepots {
get {
return ResourceManager.GetString("SubmissionSuccessfulVerifiedDepots", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Verified packages: {0}.
/// </summary>
internal static string SubmissionSuccessfulVerifiedPackages {
get {
return ResourceManager.GetString("SubmissionSuccessfulVerifiedPackages", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} wurde aufgrund eines zur Kompilierzeit fehlenden Schlüssels deaktiviert</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} ist gemäß Ihrer Konfiguration derzeit deaktiviert. Wenn Sie SteamDB bei der Datenübermittlung helfen möchten, sehen Sie sich bitte unser Wiki an.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} wurde erfolgreich initialisiert, wir danken Ihnen im Voraus für Ihre Hilfe. Die erste Übermittlung wird in etwa {1} ab jetzt erfolgen.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} konnte nicht geladen werden. Eine frische Instanz wird initialisiert werden...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Es gibt auf dieser Bot-Instanz keine Applikationen, die einer Auffrischung bedürfen.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Rufe insgesamt {0} Applikationszugriffstoken ab...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Rufe {0} Applikationszugriffstoken ab...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Abruf von {0} Applikationszugrifsstoken fertiggestellt.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Abruf von insgesamt {0} Applikationszugriffstoken fertiggestellt.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Rufe alle Depots für insgesamt {0} Applikationen ab...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Rufe {0} Applikationsinfos ab...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Abruf von {0} Applikationsinfos fertiggestellt.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Rufe {0} Depotschlüssel ab...</value>
<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>Abruf von {0} Depotschlüsseln fertiggestellt.</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>Abruf aller Depotschlüssel für insgesamt {0} Applikationen fertiggestellt.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Es sind keine neuen Daten einzureichen. Alle Daten sind aktuell.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Konnte keine Daten einreichen, da keine SteamID identifiziert wurde, die als Einreichender valide ist. Bitte ziehe in Betracht {0} zu konfigurieren.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Reiche insgesamt folgende Applikationen/Pakete/Depots ein: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Das Einreichen schlug fehl, weil wir zu viele Einreichungen in zu kurzer Zeit versuchten. Wir versuchen es in ungefähr {0} wieder.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Die Daten wurden erfolgreich übermittelt. Der Server hat insgesamt folgende Anzahl an neuen Applikationen/Paketen/Depots registriert: {0} ({1} verifiziert)/{2} ({3} verifiziert)/{4} ({5} verifiziert).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Neue Applikationen: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Verifizierte Applikationen: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Neue Pakete: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Verifizierte Pakete: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Neue Depots: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Verifizierte Depots: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} wurde konfiguriert, das Plugin wird keinen der folgenden Werte auflösen: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} ha sido deshabilitado debido a que falta un token de compilación</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} está deshabilitado actualmente de acuerdo a tu configuración. Si quieres ayudar a SteamDB enviando datos, por favor, revisa nuestra wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} ha sido iniciado con éxito, gracias de antemano por tu ayuda. El primer envío tendrá lugar en aproximadamente {1} a partir de ahora.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} no se pudo cargar, se iniciará una nueva instancia...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>No hay aplicaciones que requieran actualizarse en esta instancia de bot.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Recuperando un total de {0} tokens de acceso a la aplicación...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Recuperando {0} tokens de acceso a la aplicación...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Se han recuperado {0} tokens de acceso a la aplicación.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Se ha recuperado un total de {0} tokens de acceso a la aplicación.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Recuperando todos los depósitos para un total de {0} aplicaciones...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Recuperando {0} datos de aplicación...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Se han recuperado {0} datos de aplicación.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Recuperando {0} claves de depósito...</value>
<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>Se han recuperado {0} claves de depósito.</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>Se han recuperado todas las claves de depósito para un total de {0} aplicaciones.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>No hay nuevos datos para enviar, todo está actualizado.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>No se pudieron enviar los datos debido a que no hay un SteamID válido establecido que podamos clasificar como colaborador. Considera configurar la propiedad {0}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Enviando un total de aplicaciones/paquetes/depósitos registrados: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>El envío ha fallado debido a demasiadas solicitudes enviadas, lo intentaremos de nuevo en aproximadamente {0} a partir de ahora.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>La información se ha enviado correctamente. El servidor ha registrado un total de aplicaciones/paquetes/depósitos nuevos: {0} ({1} verificados)/{2} ({3} verificados)/{4} ({5} verificados).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nuevas aplicaciones: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Aplicaciones verificadas: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Nuevos paquetes: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Paquetes verificados: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Nuevos depósitos: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Depósitos verificados: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} iniciado, el plugin no analizará ninguno de los siguientes: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} a été désactivé en raison d'un jeton de version manquant</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} est actuellement désactivé selon votre configuration. Si vous souhaitez aider SteamDB dans la soumission de données, veuillez consulter notre wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} a été initialisé avec succès, merci d'avance pour votre aide. La première soumission se fera dans environ {1} à partir de maintenant.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} n'a pas pu être chargé, une nouvelle instance va être initialisée...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Il n'y a aucune application qui nécessite une actualisation sur cette instance de bot.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Récupération d'un total de {0} jetons d'accès aux applications...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Récupération de {0} jetons d'accès aux applications...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Récupération de {0} jetons d'accès aux applications terminée.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Fin de la récupération d'un total de {0} jetons d'accès aux applications.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Récupération de tous les dépôts pour un total de {0} applications...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Récupération de {0} infos d'application...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Récupération de {0} infos d'application terminée.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Récupération de {0} clés de dépôts...</value>
<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>Récupération de {0} clés de dépôts terminée.</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>Fin de la récupération de toutes les clés de dépôts pour un total de {0} applications.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Il n'y a pas de nouvelles données à envoyer, tout est à jour.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Impossible de soumettre les données car il n'y a pas de SteamID valide que nous pourrions classer comme contributeur. Envisagez la configuration de la propriété {0}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Envoi d'un total d'apps/paquets/dépôts enregistrés : {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>La soumission a échoué en raison d'un trop grand nombre de demandes envoyées, nous allons essayer à nouveau dans environ {0} à partir de maintenant.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Les données ont été envoyées avec succès. Le serveur a enregistré un total de nouveaux apps/paquets/dépôts : {0} ({1} vérifiées)/{2} ({3} vérifiés)/{4} ({5} vérifiés).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nouvelles applications : {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Applications vérifiées : {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Nouveaux paquets : {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Paquets vérifiés : {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Nouveaux dépôts : {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Dépôts vérifiés : {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} initialisé, le plugin ne résoudra aucun de ceux-ci : {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} ki lett kapcsolva, mert hiányzik egy build token</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>A {0} jelenleg ki van kapcsolva a konfigurációid alapján. Ha szeretnéd segíteni a SteamDB-t adatok beküldésével, kérlek nézd meg a wikit.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>빌드 토큰이 누락되었기 때문에 {0} (이)가 비활성화 되었습니다.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>설정에 따라 {0} (이)가 현재 비활성화 되어 있습니다. SteamDB에 데이터 제공을 원하신다면, wiki를 참고하세요.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>{0} 개의 앱 정보를 불러오고 있습니다...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>{0} 개의 앱 정보를 불러왔습니다.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>새로 등록할 데이터가 없습니다.</value>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>서버에 새로 등록하는 앱/패키지/depot은 다음과 같습니다: {0}/{1}/{2}</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>요청이 많아 데이터를 등록하지 못했습니다. {0} 뒤에 다시 시도합니다.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>데이터가 성공적으로 등록되었습니다. 서버에 새로 등록된 앱/패키지/depot은 다음과 같습니다: {0}({1} 인증됨)/{2}({3} 인증됨)/{4}({5} 인증됨).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>새로운 앱: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>인증된 앱: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>새로운 패키지: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>인증된 패키지: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} został wyłączony z powodu brakującego tokena kompilacji</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} jest obecnie wyłączony zgodnie z Twoją konfiguracją. Jeśli chciałbyś pomóc SteamDB w gromadzeniu danych, sprawdź naszą wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} został pomyślnie zainicjowany, dziękujemy z góry za pomoc. Pierwsze zgłoszenie nastąpi za około {1} od teraz.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} nie może zostać załadowany, nowa instancja zostanie zainicjowana...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Brak aplikacji, które wymagają odświeżenia instancji tego bota.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Pobieranie łącznie {0} tokenów dostępu aplikacji...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Pobieranie {0} tokenów dostępu aplikacji...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Zakończono pobieranie {0} tokenów dostępu aplikacji.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Zakończono pobieranie łącznie {0} tokenów dostępu aplikacji.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Pobieranie wszystkich magazynów dla łącznie {0} aplikacji...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Pobieranie {0} informacji o aplikacji...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Zakończono pobieranie {0} informacji o aplikacji.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Pobieranie {0} kluczy magazynu...</value>
<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>Zakończono pobieranie {0} kluczy magazynu.</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>Zakończono pobieranie wszystkich kluczy magazynu dla {0} aplikacji.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Nie ma nowych danych do przesłania, wszystko jest aktualne.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Nie można przesłać danych, ponieważ nie ma poprawnego identyfikatora SteamID, który moglibyśmy zaklasyfikować jako współtwórcę. Rozważ ustawienie właściwości {0}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Przesyłanie wszystkich zarejestrowanych aplikacji/pakietów/magazynów: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Przesyłanie nie powiodło się z powodu zbyt wielu wysłanych żądań, spróbujemy ponownie za około {0} od teraz.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Dane zostały pomyślnie przesłane. Serwer zarejestrował nowe aplikacje/pakiety/magazyny w sumie: {0} ({1} zweryfikowane)/{2} ({3} zweryfikowane)/{4} ({5} zweryfikowane).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nowe aplikacje: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Zweryfikowane aplikacje: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Nowe pakiety: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Zweryfikowane pakiety: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Nowe magazyny: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Zweryfikowane magazyny: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} zainicjowano, wtyczka nie rozwiąże żadnego z tych: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} foi desativado devido à falta de um token de compilação</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} está desativado de acordo com sua configuração. Se você gostaria de ajudar o SteamDB no envio de dados, por favor, confira nosso wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} foi inicializado com sucesso, obrigado antecipadamente pela sua ajuda. O primeiro envio ocorrerá em aproximadamente {1} a partir de agora.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} não pôde ser carregado, uma instância nova será inicializada...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Não há aplicativos que necessitem de ser atualizados nesta instância de bot.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Recuperando um total de {0} tokens de acesso a aplicativos...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Recuperando {0} tokens de acesso a aplicativos...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Concluímos a recuperação de {0} tokens de acesso ao aplicativo.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Obtivemos um total de {0} tokens de acesso aos aplicativos.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Recuperando todos os depósitos por um total de {0} apps...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Recuperando {0} informações de aplicativos...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Concluímos a recuperação de {0} informações de aplicativo.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Recuperando {0} chaves de depósito...</value>
<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>Terminamos de recuperar {0} chaves de depósito.</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>Terminamos de recuperar todas as chaves de depósito para um total de {0} apps.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Não há novos dados para enviar, tudo está atualizado.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Não foi possível enviar os dados porque não há um conjunto SteamID válido que possamos classificar como colaborador. Considere configurar a propriedade {0}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Enviando um total de apps/pacotes/pacotes registrados: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>O envio falhou devido a muitas solicitações enviadas, tentaremos novamente em aproximadamente {0} a partir de agora.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Os dados foram enviados com sucesso. O servidor registrou um total de novos aplicativos/pacotes/depósitos: {0} ({1} verificado)/{2} ({3} verificado)/{4} ({5} verificado).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Novos aplicativos: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Aplicativos verificados: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Novos pacotes: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Pacotes verificados: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Novos depósitos: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Depósitos verificados: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} inicializado, o plugin não resolverá nenhum desses: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} HAZ BEEN DISABLD DUE 2 MISIN BUILD TOKEN</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} IZ CURRENTLY DISABLD ACCORDIN 2 UR CONFIGURASHUN. IF UD LIEK 2 HALP STEAMDB IN DATA SUBMISHUN, PLZ CHECK OUT R WIKI.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} HAS BEEN INITIALIZD SUCCESFULLY, THANK U IN ADVANCE 4 UR HALP. TEH FURST SUBMISHUN WILL HAPPEN IN APPROXIMATELY {1} FRUM NAO.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} CUD NOT BE LOADD, FRESH INSTANCE WILL BE INITIALIZD...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>THAR R NO APPS DAT REQUIRE REFRESH ON DIS BOT INSTANCE.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>RETRIEVIN TOTAL OV {0} APP ACCES TOKENS...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>RETRIEVIN {0} APP ACCES TOKENS...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>FINISHD RETRIEVIN {0} APP ACCES TOKENS.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>FINISHD RETRIEVIN TOTAL OV {0} APP ACCES TOKENS.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>RETRIEVIN ALL DEPOTS 4 TOTAL OV {0} APPS...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>RETRIEVIN {0} APP INFOS...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>FINISHD RETRIEVIN {0} APP INFOS.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>RETRIEVIN {0} DEPOT KEYS...</value>
<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>FINISHD RETRIEVIN {0} DEPOT KEYS.</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>FINISHD RETRIEVIN ALL DEPOT KEYS 4 TOTAL OV {0} APPS.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>THAR IZ NO NEW DATA 2 SUBMIT, EVRYTHIN IZ UP-2-DATE.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>CUD NOT SUBMIT TEH DATA CUZ THAR IZ NO VALID STEAMID SET DAT WE CUD CLASIFY AS CONTRIBUTOR. CONSIDR SETTIN UP {0} PROPERTY.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>SUBMITTIN TOTAL OV REGISTERD APPS/PACKAGEZ/DEPOTS: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>TEH SUBMISHUN HAS FAILD DUE 2 2 LOTZ DA REQUESTS SENT, WELL TRY AGAIN IN APPROXIMATELY {0} FRUM NAO.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>TEH DATA HAS BEEN SUCCESFULLY SUBMITTD. TEH SERVR HAS REGISTERD TOTAL OV NEW APPS/PACKAGEZ/DEPOTS: {0} ({1} VERIFID)/{2} ({3} VERIFID)/{4} ({5} VERIFID).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>NEW APPS: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>VERIFID APPS: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>NEW PACKAGEZ: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>VERIFID PACKAGEZ: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>NEW DEPOTS: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>VERIFID DEPOTS: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} INITIALIZD, TEH PLUGIN WILL NOT RESOLVE ANY OV DOSE: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root" xmlns="">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} has been disabled due to a missing build token</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} is currently disabled according to your configuration. If you'd like to help SteamDB in data submission, please check out our wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} has been initialized successfully, thank you in advance for your help. The first submission will happen in approximately {1} from now.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} could not be loaded, a fresh instance will be initialized...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>There are no apps that require a refresh on this bot instance.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Retrieving a total of {0} app access tokens...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Retrieving {0} app access tokens...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Finished retrieving {0} app access tokens.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Finished retrieving a total of {0} app access tokens.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Retrieving all depots for a total of {0} apps...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Retrieving {0} app infos...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Finished retrieving {0} app infos.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Retrieving {0} depot keys...</value>
<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>Finished retrieving {0} depot keys.</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>Finished retrieving all depot keys for a total of {0} apps.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>There is no new data to submit, everything is up-to-date.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Could not submit the data because there is no valid SteamID set that we could classify as a contributor. Consider setting up {0} property.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Submitting a total of registered apps/packages/depots: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>The submission has failed due to too many requests sent, we'll try again in approximately {0} from now.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>The data has been successfully submitted. The server has registered a total of new apps/packages/depots: {0} ({1} verified)/{2} ({3} verified)/{4} ({5} verified).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>New apps: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Verified apps: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>New packages: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Verified packages: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>New depots: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Verified depots: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} initialized, the plugin will not resolve any of those: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} был отключен из-за отсутствия токена сборки</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} сейчас выключен в соответствии с вашей конфигурацией. Если вы хотите помочь SteamDB в сборе данных, пожалуйста посетите нашу wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} был успешно инициализирован. Заранее благодарим за вашу помощь. Первый сбор будет примерно через {1}.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} не может быть загружен, свежая копия будет инициализирована...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Нет приложений, которые требуют обновления для этого бота.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Получение в общей сложности {0} маркеров доступа к приложениям...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Получение в общей сложности {0} маркеров доступа к приложениям...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Закончено получение {0} токенов доступа приложения.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Закончено получение суммарно {0} токенов доступа приложения.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Нет новых данных для отправки, всё актуально.</value>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Новые приложения: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Проверенные приложения: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Новые пакеты: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Проверенные пакеты: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Новые хранилища: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0}, eksik bir derleme jetonu nedeniyle devre dışı bırakıldı</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} yapılandırmanıza göre şu anda devre dışı. SteamDB'ye veri gönderimi için yardımcı olmak isterseniz viki sayfamızı ziyaret edin.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} başarılı bir şekilde kuruldu, yardımınız için şimdiden teşekkürler. İlk gönderim {1} içinde gerçekleşecektir.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} yüklenemedi, yeni bir örnek başlatılacak...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Bu bot örneğinde yenileme gerektiren uygulama yok.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Toplam {0} uygulama erişim jetonu alınıyor...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>{0} uygulama erişim jetonu alınıyor...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>{0} uygulama erişim jetonunun alınması tamamlandı.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Toplam {0} uygulama erişim jetonunun alınması tamamlandı.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Toplam {0} uygulama için tüm depolar alınıyor...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>{0} uygulama bilgisi alınıyor...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>{0} uygulama bilgisinin alınması tamamlandı.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>{0} depo anahtarı alınıyor...</value>
<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} depo anahtarının alınması tamamlandı.</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>Toplam {0} uygulama için tüm depo anahtarlarının alınması tamamlandı.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Gönderilecek yeni veri yok, her şey güncel.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Katkıda bulunan olarak sınıflandırabileceğimiz geçerli bir SteamID seti olmadığı için veriler gönderilemedi. {0} değerini ayarlayın.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Toplam kayıtlı uygulama/paket/depo gönderiliyor: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Teslim, çok fazla istek gönderildiği için başarısız oldu, yaklaşık {0} sonra tekrar deneyeceğiz.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Veriler başarıyla gönderildi. Sunucu, toplamda yeni uygulama/paket/depo kaydetti: {0} ({1} onaylanmış)/{2} ({3} onaylanmış)/{4} ({5} onaylanmış).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Yeni uygulamalar: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Doğrulanan uygulamalar: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Yeni paketler: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Doğrulanan paketler: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Yeni depolar: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Onaylanmış depolar: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} başlatıldı, eklenti şunlardan hiçbirini çözemedi: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} đã bị vô hiệu hóa do thiếu một mã cấu trúc</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} đang bị vô hiệu hóa theo như cấu hình của bạn. Nếu bạn muốn giúp SteamDB trong việc củng cố dữ liệu, hãy xem qua wiki của chúng tôi.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} đã được khởi tạo thành công, cảm ơn bạn rất nhiều vì sự giúp đỡ. Lần gửi đầu tiên sẽ xảy ra trong khoảng {1} kể từ bây giờ.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>Không thể tải {0}, một trạng thái mới sẽ được khởi tạo...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Không có ứng dụng nào yêu cầu làm mới cho trạng thái của bot này.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Đang thu nhận tổng số {0} mã truy cập ứng dụng...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Đang thu nhận {0} mã truy cập ứng dụng...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Đã hoàn tất thu nhận {0} mã truy cập ứng dụng.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Đã hoàn tất thu nhận tổng số {0} mã truy cập ứng dụng.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Đang thu nhận tất cả kho của tổng số {0} ứng dụng...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Đang thu nhận thông tin của {0} ứng dụng...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Đã hoàn tất thu nhận thông tin của {0} ứng dụng.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Đang thu nhận {0} khóa kho...</value>
<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>Đã hoàn tất thu nhận {0} khóa kho.</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>Đã hoàn tất thu nhận tất cả khóa kho của tổng số {0} ứng dụng.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Không có dữ liệu mới để gửi, mọi thứ đều đã được cập nhật.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Không thể gửi dữ liệu vì không có bộ SteamID hợp lệ mà chúng tôi có thể phân loại là người đóng góp. Hãy xem xét thiết lập thuộc tính {0}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Đang gửi tổng số các ứng dụng/gói/kho đã đăng ký: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Việc gửi đã thất bại do có quá nhiều yêu cầu được gửi, chúng tôi sẽ thử lại sau khoảng {0} kể từ bây giờ.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Dữ liệu đã được gửi thành công. Máy chủ đã đăng ký tổng số ứng dụng/gói/kho mới: {0} ({1} đã xác thực)/{2} ({3} đã xác thực)/{4} ({5} đã xác thực).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Ứng dụng mới: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Ứng dụng đã xác thực: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Gói mới: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Gói đã xác thực: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Kho mới: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Kho đã xác thực: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} đã được khởi tạo, plugin sẽ không can thiệp với những thứ sau: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>因为缺少构建令牌,{0} 已被禁用。</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>按照您的配置,{0} 当前被禁用。如果您愿意帮助 SteamDB 提交数据,请查看我们的 Wiki。</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} 加载成功,感谢您的帮助。首次提交将会在大约 {1}后开始。</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} 无法加载,将初始化新实例……</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>此机器人实例没有需要刷新的 App。</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>正在获取共计 {0} 个 App Token……</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>正在获取 {0} 个 App Token……</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>已完成获取 {0} 个 App Token。</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>已完成获取共计 {0} 个 App Token。</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>正在获取共计 {0} 个 App 的所有 Depot……</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>正在获取 {0} 个 App 的信息……</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>已完成获取 {0} 个 App 的信息。</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>正在获取 {0} 个 Depot Key……</value>
<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 key。</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} 个 App 的所有 Depot Key。</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>没有可提交的新数据,所有数据都已更新。</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>无法提交数据,因为尚未设置有效的 Steam ID 供我们识别贡献者。请考虑设置 {0} 属性。</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>正在提交已注册的 App/Package/Depot共计 {0}/{1}/{2} 个……</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>由于发送请求过多,提交失败,我们将会在大约 {0}后重试。</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>数据已成功提交。服务器已注册新 App/Package/Depot共计 {0}/{2}/{4} 个,其中 {1}/{3}/{5} 个已验证。</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>新 App{0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>已验证 App{0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>新 Package{0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>已验证 Package{0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>新 Depot{0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>已验证 Depot{0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} 已初始化,插件无法解析以下任何内容:{1}。</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,47 +22,35 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Globalization;
using ArchiSteamFarm.Core;
using Newtonsoft.Json;
using SteamKit2;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
internal sealed class RequestData {
#pragma warning disable IDE0052
[JsonProperty(PropertyName = "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)]
private static string Token => SharedInfo.Token;
[JsonProperty(PropertyName = "v", Required = Required.Always)]
private static byte Version => SharedInfo.ApiVersion;
[JsonProperty(PropertyName = "apps", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Apps;
#pragma warning restore IDE0052
#pragma warning disable IDE0052
[JsonProperty(PropertyName = "depots", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Depots;
#pragma warning restore IDE0052
#pragma warning disable IDE0052
[JsonProperty(PropertyName = "guid", Required = Required.Always)]
private readonly string Guid = ASF.GlobalDatabase?.Identifier.ToString("N") ?? throw new InvalidOperationException(nameof(ASF.GlobalDatabase.Identifier));
#pragma warning restore IDE0052
private readonly ulong SteamID;
#pragma warning disable IDE0052
[JsonProperty(PropertyName = "subs", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Subs;
#pragma warning restore IDE0052
#pragma warning disable IDE0051, 414
[JsonProperty(PropertyName = "token", Required = Required.Always)]
private readonly string Token = SharedInfo.Token;
#pragma warning restore IDE0051, 414
#pragma warning disable IDE0051, 414
[JsonProperty(PropertyName = "v", Required = Required.Always)]
private readonly byte Version = SharedInfo.ApiVersion;
#pragma warning restore IDE0051, 414
#pragma warning disable IDE0051
[JsonProperty(PropertyName = "steamid", Required = Required.Always)]
private string SteamIDText => new SteamID(SteamID).Render();
#pragma warning restore IDE0051
internal RequestData(ulong steamID, IReadOnlyCollection<KeyValuePair<uint, ulong>> apps, IReadOnlyCollection<KeyValuePair<uint, ulong>> accessTokens, IReadOnlyCollection<KeyValuePair<uint, string>> depots) {
if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) {
@@ -83,9 +71,9 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
SteamID = steamID;
Apps = apps.ToImmutableDictionary(app => app.Key.ToString(), app => app.Value.ToString());
Subs = accessTokens.ToImmutableDictionary(package => package.Key.ToString(), package => package.Value.ToString());
Depots = depots.ToImmutableDictionary(depot => depot.Key.ToString(), depot => depot.Value);
Apps = apps.ToImmutableDictionary(app => app.Key.ToString(CultureInfo.InvariantCulture), app => app.Value.ToString(CultureInfo.InvariantCulture));
Subs = accessTokens.ToImmutableDictionary(package => package.Key.ToString(CultureInfo.InvariantCulture), package => package.Value.ToString(CultureInfo.InvariantCulture));
Depots = depots.ToImmutableDictionary(depot => depot.Key.ToString(CultureInfo.InvariantCulture), depot => depot.Value);
}
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,43 +19,49 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using Newtonsoft.Json;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
#pragma warning disable CA1812 // False positive, the class is used during json deserialization
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ResponseData {
#pragma warning disable 649
[JsonProperty(PropertyName = "data", Required = Required.Always)]
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "data", Required = Required.DisallowNull)]
internal readonly InternalData? Data;
#pragma warning restore 649
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
#pragma warning disable 649
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "success", Required = Required.Always)]
internal readonly bool Success;
#pragma warning restore 649
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
[JsonConstructor]
private ResponseData() { }
internal sealed class InternalData {
#pragma warning disable 649
[JsonProperty(PropertyName = "new_apps", Required = Required.Always)]
internal readonly uint NewAppsCount;
#pragma warning restore 649
internal readonly ImmutableHashSet<uint> NewApps = ImmutableHashSet<uint>.Empty;
#pragma warning disable 649
[JsonProperty(PropertyName = "new_depots", Required = Required.Always)]
internal readonly uint NewDepotsCount;
#pragma warning restore 649
internal readonly ImmutableHashSet<uint> NewDepots = ImmutableHashSet<uint>.Empty;
#pragma warning disable 649
[JsonProperty(PropertyName = "new_subs", Required = Required.Always)]
internal readonly uint NewSubsCount;
#pragma warning restore 649
internal readonly ImmutableHashSet<uint> NewPackages = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_apps", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedApps = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_depots", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedDepots = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_subs", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedPackages = ImmutableHashSet<uint>.Empty;
[JsonConstructor]
private InternalData() { }
}
}
#pragma warning restore CA1812 // False positive, the class is used during json deserialization
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,14 +21,14 @@
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
internal static class SharedInfo {
internal const byte ApiVersion = 1;
internal const byte ApiVersion = 2;
internal const byte AppInfosPerSingleRequest = byte.MaxValue;
internal const byte MaximumHoursBetweenRefresh = 8; // Per single bot account, makes sense to be 2 or 3 times less than MinimumHoursBetweenUploads
internal const byte MaximumMinutesBeforeFirstUpload = 60; // Must be greater or equal to MinimumMinutesBeforeFirstUpload
internal const byte MinimumHoursBetweenUploads = 24;
internal const byte MinimumMinutesBeforeFirstUpload = 10; // Must be less or equal to MaximumMinutesBeforeFirstUpload
internal const string ServerURL = "https://asf-token-dumper.xpaw.me";
internal const string Token = "STEAM_TOKEN_DUMPER_TOKEN";
internal const string Token = "STEAM_TOKEN_DUMPER_TOKEN"; // This is filled automatically during our CI build with API key provided by xPaw for ASF project
internal static bool HasValidToken => Token.Length == 128;
}

View File

@@ -0,0 +1,51 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// |
// http://www.apache.org/licenses/LICENSE-2.0
// |
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using ArchiSteamFarm.IPC.Integration;
using Newtonsoft.Json;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
public sealed class SteamTokenDumperConfig {
[JsonProperty(Required = Required.DisallowNull)]
public bool Enabled { get; internal set; }
[JsonProperty(Required = Required.DisallowNull)]
[SwaggerItemsMinMax(MinimumUint = 1, MaximumUint = uint.MaxValue)]
public ImmutableHashSet<uint> SecretAppIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
[SwaggerItemsMinMax(MinimumUint = 1, MaximumUint = uint.MaxValue)]
public ImmutableHashSet<uint> SecretDepotIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
[SwaggerItemsMinMax(MinimumUint = 1, MaximumUint = uint.MaxValue)]
public ImmutableHashSet<uint> SecretPackageIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
public bool SkipAutoGrantPackages { get; private set; }
[JsonConstructor]
internal SteamTokenDumperConfig() { }
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,17 +19,26 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#if NETFRAMEWORK
using ArchiSteamFarm.Compatibility;
#endif
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using ArchiSteamFarm.Localization;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.OfficialPlugins.SteamTokenDumper.Localization;
using ArchiSteamFarm.Plugins;
using ArchiSteamFarm.Plugins.Interfaces;
using ArchiSteamFarm.Steam;
using ArchiSteamFarm.Web;
using ArchiSteamFarm.Web.Responses;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SteamKit2;
@@ -37,6 +46,9 @@ using SteamKit2;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
[Export(typeof(IPlugin))]
internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotSteamClient, ISteamPICSChanges {
[JsonProperty]
internal static SteamTokenDumperConfig? Config { get; private set; }
private static readonly ConcurrentDictionary<Bot, IDisposable> BotSubscriptions = new();
private static readonly ConcurrentDictionary<Bot, (SemaphoreSlim RefreshSemaphore, Timer RefreshTimer)> BotSynchronizations = new();
private static readonly SemaphoreSlim SubmissionSemaphore = new(1, 1);
@@ -44,57 +56,91 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
private static GlobalCache? GlobalCache;
[JsonProperty]
private static bool IsEnabled;
[JsonProperty]
public override string Name => nameof(SteamTokenDumperPlugin);
[JsonProperty]
public override Version Version => typeof(SteamTokenDumperPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
public Task<uint> GetPreferredChangeNumberToStartFrom() => Task.FromResult(IsEnabled ? GlobalCache?.LastChangeNumber ?? 0 : 0);
public Task<uint> GetPreferredChangeNumberToStartFrom() => Task.FromResult(Config?.Enabled == true ? GlobalCache?.LastChangeNumber ?? 0 : 0);
public void OnASFInit(IReadOnlyDictionary<string, JToken>? additionalConfigProperties = null) {
public async void OnASFInit(IReadOnlyDictionary<string, JToken>? additionalConfigProperties = null) {
if (!SharedInfo.HasValidToken) {
ASF.ArchiLogger.LogGenericError($"{Name} has been disabled due to missing build token.");
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.PluginDisabledMissingBuildToken, nameof(SteamTokenDumperPlugin)));
return;
}
bool enabled = false;
bool isEnabled = false;
SteamTokenDumperConfig? config = null;
if (additionalConfigProperties != null) {
foreach ((string configProperty, JToken configValue) in additionalConfigProperties) {
try {
if (configProperty == nameof(GlobalConfigExtension.SteamTokenDumperPluginEnabled)) {
enabled = configValue.Value<bool>();
switch (configProperty) {
case nameof(GlobalConfigExtension.SteamTokenDumperPlugin):
config = configValue.ToObject<SteamTokenDumperConfig>();
break;
case nameof(GlobalConfigExtension.SteamTokenDumperPluginEnabled):
isEnabled = configValue.Value<bool>();
break;
}
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
ASF.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.PluginDisabledInConfig, nameof(SteamTokenDumperPlugin)));
break;
return;
}
}
}
IsEnabled = enabled;
config ??= new SteamTokenDumperConfig();
if (!enabled) {
ASF.ArchiLogger.LogGenericInfo($"{Name} is currently disabled. If you'd like to help SteamDB in data submission, check out our wiki for {nameof(SteamTokenDumperPlugin)}.");
if (isEnabled) {
config.Enabled = true;
}
Config = config;
if (!config.Enabled) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginDisabledInConfig, nameof(SteamTokenDumperPlugin)));
return;
}
GlobalCache ??= GlobalCache.Load().Result;
if (!config.SecretAppIDs.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginSecretListInitialized, nameof(config.SecretAppIDs), string.Join(", ", config.SecretAppIDs)));
}
if (!config.SecretPackageIDs.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginSecretListInitialized, nameof(config.SecretPackageIDs), string.Join(", ", config.SecretPackageIDs)));
}
if (!config.SecretDepotIDs.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginSecretListInitialized, nameof(config.SecretDepotIDs), string.Join(", ", config.SecretDepotIDs)));
}
if (GlobalCache == null) {
GlobalCache? globalCache = await GlobalCache.Load().ConfigureAwait(false);
if (globalCache == null) {
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.FileCouldNotBeLoadedFreshInit, nameof(GlobalCache)));
GlobalCache = new GlobalCache();
} else {
GlobalCache = globalCache;
}
}
TimeSpan startIn = TimeSpan.FromMinutes(Utilities.RandomNext(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload));
lock (SubmissionTimer) {
lock (SubmissionSemaphore) {
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.MinimumHoursBetweenUploads));
}
ASF.ArchiLogger.LogGenericInfo($"{Name} has been initialized successfully, thank you for your help. The first submission will happen in approximately {startIn.ToHumanReadable()} from now.");
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginInitializedAndEnabled, nameof(SteamTokenDumperPlugin), startIn.ToHumanReadable()));
}
public async void OnBotDestroy(Bot bot) {
@@ -118,12 +164,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(bot));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
SemaphoreSlim refreshSemaphore = new(1, 1);
Timer refreshTimer = new(async _ => await Refresh(bot).ConfigureAwait(false));
Timer refreshTimer = new(OnBotRefreshTimer, bot, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
if (!BotSynchronizations.TryAdd(bot, (refreshSemaphore, refreshTimer))) {
refreshSemaphore.Dispose();
@@ -145,7 +191,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
subscription.Dispose();
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -160,7 +206,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
public override void OnLoaded() { }
public async void OnPICSChanges(uint currentChangeNumber, IReadOnlyDictionary<uint, SteamApps.PICSChangesCallback.PICSChangeData> appChanges, IReadOnlyDictionary<uint, SteamApps.PICSChangesCallback.PICSChangeData> packageChanges) {
public void OnPICSChanges(uint currentChangeNumber, IReadOnlyDictionary<uint, SteamApps.PICSChangesCallback.PICSChangeData> appChanges, IReadOnlyDictionary<uint, SteamApps.PICSChangesCallback.PICSChangeData> packageChanges) {
if (currentChangeNumber == 0) {
throw new ArgumentOutOfRangeException(nameof(currentChangeNumber));
}
@@ -173,7 +219,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(packageChanges));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -181,15 +227,15 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new InvalidOperationException(nameof(GlobalCache));
}
await GlobalCache.OnPICSChanges(currentChangeNumber, appChanges).ConfigureAwait(false);
GlobalCache.OnPICSChanges(currentChangeNumber, appChanges);
}
public async void OnPICSChangesRestart(uint currentChangeNumber) {
public void OnPICSChangesRestart(uint currentChangeNumber) {
if (currentChangeNumber == 0) {
throw new ArgumentOutOfRangeException(nameof(currentChangeNumber));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -197,7 +243,15 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new InvalidOperationException(nameof(GlobalCache));
}
await GlobalCache.OnPICSChangesRestart(currentChangeNumber).ConfigureAwait(false);
GlobalCache.OnPICSChangesRestart(currentChangeNumber);
}
private static async void OnBotRefreshTimer(object? state) {
if (state is not Bot bot) {
throw new InvalidOperationException(nameof(state));
}
await Refresh(bot).ConfigureAwait(false);
}
private static async void OnLicenseList(Bot bot, SteamApps.LicenseListCallback callback) {
@@ -209,7 +263,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(callback));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -217,9 +271,10 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new InvalidOperationException(nameof(GlobalCache));
}
Dictionary<uint, ulong> packageTokens = callback.LicenseList.GroupBy(license => license.PackageID).ToDictionary(group => group.Key, group => group.OrderByDescending(license => license.TimeCreated).First().AccessToken);
Dictionary<uint, ulong> packageTokens = callback.LicenseList.Where(license => !Config.SecretPackageIDs.Contains(license.PackageID) && ((license.PaymentMethod != EPaymentMethod.AutoGrant) || !Config.SkipAutoGrantPackages)).GroupBy(license => license.PackageID).ToDictionary(group => group.Key, group => group.OrderByDescending(license => license.TimeCreated).First().AccessToken);
GlobalCache.UpdatePackageTokens(packageTokens);
await GlobalCache.UpdatePackageTokens(packageTokens).ConfigureAwait(false);
await Refresh(bot, packageTokens.Keys).ConfigureAwait(false);
}
@@ -228,7 +283,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(bot));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -253,26 +308,26 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
packageIDs ??= bot.OwnedPackageIDsReadOnly;
packageIDs ??= bot.OwnedPackageIDs.Where(package => !Config.SecretPackageIDs.Contains(package.Key) && ((package.Value.PaymentMethod != EPaymentMethod.AutoGrant) || !Config.SkipAutoGrantPackages)).Select(package => package.Key).ToHashSet();
HashSet<uint> appIDsToRefresh = new();
foreach (uint packageID in packageIDs) {
if (!ASF.GlobalDatabase.PackagesDataReadOnly.TryGetValue(packageID, out (uint ChangeNumber, HashSet<uint>? AppIDs) packageData) || (packageData.AppIDs == null)) {
foreach (uint packageID in packageIDs.Where(packageID => !Config.SecretPackageIDs.Contains(packageID))) {
if (!ASF.GlobalDatabase.PackagesDataReadOnly.TryGetValue(packageID, out (uint ChangeNumber, ImmutableHashSet<uint>? AppIDs) packageData) || (packageData.AppIDs == null)) {
// ASF might not have the package info for us at the moment, we'll retry later
continue;
}
appIDsToRefresh.UnionWith(packageData.AppIDs.Where(appID => GlobalCache.ShouldRefreshAppInfo(appID)));
appIDsToRefresh.UnionWith(packageData.AppIDs.Where(appID => !Config.SecretAppIDs.Contains(appID) && GlobalCache.ShouldRefreshAppInfo(appID)));
}
if (appIDsToRefresh.Count == 0) {
bot.ArchiLogger.LogGenericDebug($"There are no apps to refresh for {bot.BotName}.");
bot.ArchiLogger.LogGenericDebug(Strings.BotNoAppsToRefresh);
return;
}
bot.ArchiLogger.LogGenericInfo($"Retrieving a total of {appIDsToRefresh.Count} app access tokens...");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRetrievingTotalAppAccessTokens, appIDsToRefresh.Count));
HashSet<uint> appIDsThisRound = new(Math.Min(appIDsToRefresh.Count, SharedInfo.AppInfosPerSingleRequest));
@@ -290,7 +345,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
bot.ArchiLogger.LogGenericInfo($"Retrieving {appIDsThisRound.Count} app access tokens...");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRetrievingAppAccessTokens, appIDsThisRound.Count));
SteamApps.PICSTokensCallback response;
@@ -302,24 +357,16 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
if (response == null) {
bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(response)));
return;
}
bot.ArchiLogger.LogGenericInfo($"Finished retrieving {appIDsThisRound.Count} app access tokens.");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotFinishedRetrievingAppAccessTokens, appIDsThisRound.Count));
appIDsThisRound.Clear();
await GlobalCache.UpdateAppTokens(response.AppTokens, response.AppTokensDenied).ConfigureAwait(false);
GlobalCache.UpdateAppTokens(response.AppTokens, response.AppTokensDenied);
}
}
bot.ArchiLogger.LogGenericInfo($"Finished retrieving a total of {appIDsToRefresh.Count} app access tokens.");
bot.ArchiLogger.LogGenericInfo($"Retrieving all depots for a total of {appIDsToRefresh.Count} apps...");
appIDsThisRound.Clear();
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotFinishedRetrievingTotalAppAccessTokens, appIDsToRefresh.Count));
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRetrievingTotalDepots, appIDsToRefresh.Count));
using (HashSet<uint>.Enumerator enumerator = appIDsToRefresh.GetEnumerator()) {
while (true) {
@@ -335,12 +382,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
bot.ArchiLogger.LogGenericInfo($"Retrieving {appIDsThisRound.Count} app infos...");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRetrievingAppInfos, appIDsThisRound.Count));
AsyncJobMultiple<SteamApps.PICSProductInfoCallback>.ResultSet response;
try {
response = await bot.SteamApps.PICSGetProductInfo(appIDsThisRound.Select(appID => new SteamApps.PICSRequest { ID = appID, AccessToken = GlobalCache.GetAppToken(appID), Public = false }), Enumerable.Empty<SteamApps.PICSRequest>()).ToLongRunningTask().ConfigureAwait(false);
response = await bot.SteamApps.PICSGetProductInfo(appIDsThisRound.Select(appID => new SteamApps.PICSRequest(appID, GlobalCache.GetAppToken(appID))), Enumerable.Empty<SteamApps.PICSRequest>()).ToLongRunningTask().ConfigureAwait(false);
} catch (Exception e) {
bot.ArchiLogger.LogGenericWarningException(e);
@@ -348,12 +395,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
if (response.Results == null) {
bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(response.Results)));
bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, ArchiSteamFarm.Localization.Strings.WarningFailedWithError, nameof(response.Results)));
return;
}
bot.ArchiLogger.LogGenericInfo($"Finished retrieving {appIDsThisRound.Count} app infos.");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotFinishedRetrievingAppInfos, appIDsThisRound.Count));
appIDsThisRound.Clear();
@@ -369,16 +416,16 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
foreach (KeyValue depot in app.KeyValues["depots"].Children) {
if (uint.TryParse(depot.Name, out uint depotID) && GlobalCache.ShouldRefreshDepotKey(depotID)) {
if (uint.TryParse(depot.Name, out uint depotID) && !Config.SecretDepotIDs.Contains(depotID) && GlobalCache.ShouldRefreshDepotKey(depotID)) {
depotTasks.Add(bot.SteamApps.GetDepotDecryptionKey(depotID, app.ID).ToLongRunningTask());
}
}
}
await GlobalCache.UpdateAppChangeNumbers(appChangeNumbers).ConfigureAwait(false);
GlobalCache.UpdateAppChangeNumbers(appChangeNumbers);
if (depotTasks.Count > 0) {
bot.ArchiLogger.LogGenericInfo($"Retrieving {depotTasks.Count} depot keys...");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotRetrievingDepotKeys, depotTasks.Count));
IList<SteamApps.DepotKeyCallback> results;
@@ -390,14 +437,14 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
bot.ArchiLogger.LogGenericInfo($"Finished retrieving {depotTasks.Count} depot keys.");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotFinishedRetrievingDepotKeys, depotTasks.Count));
await GlobalCache.UpdateDepotKeys(results).ConfigureAwait(false);
GlobalCache.UpdateDepotKeys(results);
}
}
}
bot.ArchiLogger.LogGenericInfo($"Finished retrieving all depot keys for a total of {appIDsToRefresh.Count} apps.");
bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.BotFinishedRetrievingTotalDepots, appIDsToRefresh.Count));
} finally {
TimeSpan timeSpan = TimeSpan.FromHours(SharedInfo.MaximumHoursBetweenRefresh);
@@ -411,9 +458,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new InvalidOperationException(nameof(Bot.Bots));
}
const string request = SharedInfo.ServerURL + "/submit";
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -430,8 +475,6 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
if (!await SubmissionSemaphore.WaitAsync(0).ConfigureAwait(false)) {
ASF.ArchiLogger.LogGenericDebug($"Skipped {nameof(SubmitData)} trigger because there is already one in progress.");
return;
}
@@ -441,48 +484,91 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
Dictionary<uint, string> depotKeys = GlobalCache.GetDepotKeysForSubmission();
if ((appTokens.Count == 0) && (packageTokens.Count == 0) && (depotKeys.Count == 0)) {
ASF.ArchiLogger.LogGenericInfo("There is no new data to submit, everything up-to-date.");
ASF.ArchiLogger.LogGenericInfo(Strings.SubmissionNoNewData);
return;
}
ulong contributorSteamID = (ASF.GlobalConfig.SteamOwnerID > 0) && new SteamID(ASF.GlobalConfig.SteamOwnerID).IsIndividualAccount ? ASF.GlobalConfig.SteamOwnerID : Bot.Bots.Values.Where(bot => bot.SteamID > 0).OrderByDescending(bot => bot.OwnedPackageIDsReadOnly.Count).FirstOrDefault()?.SteamID ?? 0;
ulong contributorSteamID = (ASF.GlobalConfig.SteamOwnerID > 0) && new SteamID(ASF.GlobalConfig.SteamOwnerID).IsIndividualAccount ? ASF.GlobalConfig.SteamOwnerID : Bot.Bots.Values.Where(bot => bot.SteamID > 0).OrderByDescending(bot => bot.OwnedPackageIDs.Count).FirstOrDefault()?.SteamID ?? 0;
if (contributorSteamID == 0) {
ASF.ArchiLogger.LogGenericError($"Skipped {nameof(SubmitData)} trigger because there is no valid steamID we could classify as a contributor. Consider setting up {nameof(ASF.GlobalConfig.SteamOwnerID)} property.");
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionNoContributorSet, nameof(ASF.GlobalConfig.SteamOwnerID)));
return;
}
Uri request = new(SharedInfo.ServerURL + "/submit");
RequestData requestData = new(contributorSteamID, appTokens, packageTokens, depotKeys);
ASF.ArchiLogger.LogGenericInfo($"Submitting registered apps/subs/depots: {appTokens.Count}/{packageTokens.Count}/{depotKeys.Count}...");
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionInProgress, appTokens.Count, packageTokens.Count, depotKeys.Count));
WebBrowser.ObjectResponse<ResponseData>? response = await ASF.WebBrowser.UrlPostToJsonObject<ResponseData, RequestData>(request, data: requestData, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors).ConfigureAwait(false);
ObjectResponse<ResponseData>? response = await ASF.WebBrowser.UrlPostToJsonObject<ResponseData, RequestData>(request, data: requestData, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors).ConfigureAwait(false);
if ((response?.Content?.Data == null) || response.StatusCode.IsClientErrorCode()) {
ASF.ArchiLogger.LogGenericWarning(Strings.WarningFailed);
if (response == null) {
ASF.ArchiLogger.LogGenericWarning(ArchiSteamFarm.Localization.Strings.WarningFailed);
return;
}
if (response.StatusCode.IsClientErrorCode()) {
ASF.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, ArchiSteamFarm.Localization.Strings.WarningFailedWithError, response.StatusCode));
#if NETFRAMEWORK
if (response?.StatusCode == (HttpStatusCode) 429) {
if (response.StatusCode == (HttpStatusCode) 429) {
#else
if (response?.StatusCode == HttpStatusCode.TooManyRequests) {
if (response.StatusCode == HttpStatusCode.TooManyRequests) {
#endif
TimeSpan startIn = TimeSpan.FromMinutes(Utilities.RandomNext(SharedInfo.MinimumMinutesBeforeFirstUpload, SharedInfo.MaximumMinutesBeforeFirstUpload));
lock (SubmissionTimer) {
lock (SubmissionSemaphore) {
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.MinimumHoursBetweenUploads));
}
ASF.ArchiLogger.LogGenericInfo($"The submission will happen in approximately {startIn.ToHumanReadable()} from now.");
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionFailedTooManyRequests, startIn.ToHumanReadable()));
}
return;
}
ASF.ArchiLogger.LogGenericInfo($"Data successfully submitted. Newly registered apps/subs/depots: {response.Content.Data.NewAppsCount}/{response.Content.Data.NewSubsCount}/{response.Content.Data.NewDepotsCount}.");
if (!response.Content.Success) {
ASF.ArchiLogger.LogGenericError(ArchiSteamFarm.Localization.Strings.WarningFailed);
await GlobalCache.UpdateSubmittedData(appTokens.Keys, packageTokens.Keys, depotKeys.Keys).ConfigureAwait(false);
return;
}
if (response.Content.Data == null) {
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, ArchiSteamFarm.Localization.Strings.ErrorIsInvalid), nameof(response.Content.Data));
return;
}
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessful, response.Content.Data.NewApps.Count, response.Content.Data.VerifiedApps.Count, response.Content.Data.NewPackages.Count, response.Content.Data.VerifiedPackages.Count, response.Content.Data.NewDepots.Count, response.Content.Data.VerifiedDepots.Count));
GlobalCache.UpdateSubmittedData(appTokens, packageTokens, depotKeys);
if (!response.Content.Data.NewApps.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulNewApps, string.Join(", ", response.Content.Data.NewApps)));
}
if (!response.Content.Data.VerifiedApps.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulVerifiedApps, string.Join(", ", response.Content.Data.VerifiedApps)));
}
if (!response.Content.Data.NewPackages.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulNewPackages, string.Join(", ", response.Content.Data.NewPackages)));
}
if (!response.Content.Data.VerifiedPackages.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulVerifiedPackages, string.Join(", ", response.Content.Data.VerifiedPackages)));
}
if (!response.Content.Data.NewDepots.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulNewDepots, string.Join(", ", response.Content.Data.NewDepots)));
}
if (!response.Content.Data.VerifiedDepots.IsEmpty) {
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionSuccessfulVerifiedDepots, string.Join(", ", response.Content.Data.VerifiedDepots)));
}
} finally {
SubmissionSemaphore.Release();
}

View File

@@ -1,18 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.1.2" />
<PackageReference Include="MSTest.TestFramework" Version="2.1.2" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="MSTest.TestAdapter" />
<PackageReference Include="MSTest.TestFramework" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
</ItemGroup>
</Project>

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,6 +19,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[assembly: CLSCompliant(false)]
[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)]

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,32 +19,77 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#if NETFRAMEWORK
using ArchiSteamFarm.Compatibility;
#endif
using System;
using System.Collections.Generic;
using System.Linq;
using ArchiSteamFarm.Json;
using ArchiSteamFarm.Steam.Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static ArchiSteamFarm.Steam.Bot;
namespace ArchiSteamFarm.Tests {
[TestClass]
public sealed class Bot {
[TestMethod]
public void MaxItemsBarelyEnoughForOneSet() {
const uint relevantAppID = 42;
Dictionary<uint, byte> itemsPerSet = new() {
{ relevantAppID, MinCardsPerBadge },
{ 43, MinCardsPerBadge + 1 }
};
HashSet<Asset> items = new();
foreach ((uint appID, byte cards) in itemsPerSet) {
for (byte i = 1; i <= cards; i++) {
items.Add(CreateCard(i, appID));
}
}
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, itemsPerSet, MinCardsPerBadge);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = items.Where(item => item.RealAppID == relevantAppID)
.GroupBy(item => (item.RealAppID, item.ContextID, item.ClassID))
.ToDictionary(grouping => grouping.Key, grouping => (uint) grouping.Sum(item => item.Amount));
AssertResultMatchesExpectation(expectedResult, itemsToSend);
}
[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void MaxItemsTooSmall() {
const uint appID = 42;
HashSet<Asset> items = new() {
CreateCard(1, appID),
CreateCard(2, appID)
};
GetItemsForFullBadge(items, 2, appID, MinCardsPerBadge - 1);
Assert.Fail();
}
[TestMethod]
public void MoreCardsThanNeeded() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID),
CreateCard(1, appID),
CreateCard(2, appID),
CreateCard(3, appID)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 3), 1 }
{ (appID, Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Asset.SteamCommunityContextID, 3), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -54,18 +99,18 @@ namespace ArchiSteamFarm.Tests {
public void MultipleSets() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID),
CreateCard(1, appID),
CreateCard(2, appID),
CreateCard(2, appID)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 2 }
{ (appID, Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Asset.SteamCommunityContextID, 2), 2 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -75,17 +120,17 @@ namespace ArchiSteamFarm.Tests {
public void MultipleSetsDifferentAmount() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID, 2),
CreateCard(2, appID),
CreateCard(2, appID)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 2 }
{ (appID, Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Asset.SteamCommunityContextID, 2), 2 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -95,38 +140,38 @@ namespace ArchiSteamFarm.Tests {
public void MutliRarityAndType() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, type: Steam.Asset.EType.TradingCard, rarity: Steam.Asset.ERarity.Common),
CreateCard(2, appID, type: Steam.Asset.EType.TradingCard, rarity: Steam.Asset.ERarity.Common),
HashSet<Asset> items = new() {
CreateCard(1, appID, type: Asset.EType.TradingCard, rarity: Asset.ERarity.Common),
CreateCard(2, appID, type: Asset.EType.TradingCard, rarity: Asset.ERarity.Common),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(2, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Uncommon),
CreateCard(2, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Uncommon),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Rare),
CreateCard(2, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Rare),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Rare),
CreateCard(2, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Rare),
// for better readability and easier verification when thinking about this test the items that shall be selected for sending are the ones below this comment
CreateCard(1, appID, type: Steam.Asset.EType.TradingCard, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(2, appID, type: Steam.Asset.EType.TradingCard, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(3, appID, type: Steam.Asset.EType.TradingCard, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(1, appID, type: Asset.EType.TradingCard, rarity: Asset.ERarity.Uncommon),
CreateCard(2, appID, type: Asset.EType.TradingCard, rarity: Asset.ERarity.Uncommon),
CreateCard(3, appID, type: Asset.EType.TradingCard, rarity: Asset.ERarity.Uncommon),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Common),
CreateCard(3, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Common),
CreateCard(7, appID, type: Steam.Asset.EType.FoilTradingCard, rarity: Steam.Asset.ERarity.Common),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Common),
CreateCard(3, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Common),
CreateCard(7, appID, type: Asset.EType.FoilTradingCard, rarity: Asset.ERarity.Common),
CreateCard(2, appID, type: Steam.Asset.EType.Unknown, rarity: Steam.Asset.ERarity.Rare),
CreateCard(3, appID, type: Steam.Asset.EType.Unknown, rarity: Steam.Asset.ERarity.Rare),
CreateCard(4, appID, type: Steam.Asset.EType.Unknown, rarity: Steam.Asset.ERarity.Rare)
CreateCard(2, appID, type: Asset.EType.Unknown, rarity: Asset.ERarity.Rare),
CreateCard(3, appID, type: Asset.EType.Unknown, rarity: Asset.ERarity.Rare),
CreateCard(4, appID, type: Asset.EType.Unknown, rarity: Asset.ERarity.Rare)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 2 },
{ (appID, Steam.Asset.SteamCommunityContextID, 3), 3 },
{ (appID, Steam.Asset.SteamCommunityContextID, 4), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 7), 1 }
{ (appID, Asset.SteamCommunityContextID, 1), 2 },
{ (appID, Asset.SteamCommunityContextID, 2), 2 },
{ (appID, Asset.SteamCommunityContextID, 3), 3 },
{ (appID, Asset.SteamCommunityContextID, 4), 1 },
{ (appID, Asset.SteamCommunityContextID, 7), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -136,12 +181,12 @@ namespace ArchiSteamFarm.Tests {
public void NotAllCardsPresent() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID),
CreateCard(2, appID)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new(0);
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -151,16 +196,16 @@ namespace ArchiSteamFarm.Tests {
public void OneSet() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID),
CreateCard(2, appID)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 1 }
{ (appID, Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Asset.SteamCommunityContextID, 2), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -171,12 +216,12 @@ namespace ArchiSteamFarm.Tests {
const uint appID0 = 42;
const uint appID1 = 43;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID0),
CreateCard(1, appID1)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(
HashSet<Asset> itemsToSend = GetItemsForFullBadge(
items, new Dictionary<uint, byte> {
{ appID0, 1 },
{ appID1, 1 }
@@ -184,8 +229,8 @@ namespace ArchiSteamFarm.Tests {
);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID0, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID1, Steam.Asset.SteamCommunityContextID, 1), 1 }
{ (appID0, Asset.SteamCommunityContextID, 1), 1 },
{ (appID1, Asset.SteamCommunityContextID, 1), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -196,12 +241,12 @@ namespace ArchiSteamFarm.Tests {
const uint appID0 = 42;
const uint appID1 = 43;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID0),
CreateCard(1, appID1)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(
HashSet<Asset> itemsToSend = GetItemsForFullBadge(
items, new Dictionary<uint, byte> {
{ appID0, 2 },
{ appID1, 2 }
@@ -219,7 +264,7 @@ namespace ArchiSteamFarm.Tests {
const uint appID1 = 43;
const uint appID2 = 44;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID0),
CreateCard(2, appID0),
@@ -228,7 +273,7 @@ namespace ArchiSteamFarm.Tests {
CreateCard(3, appID1)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(
HashSet<Asset> itemsToSend = GetItemsForFullBadge(
items, new Dictionary<uint, byte> {
{ appID0, 3 },
{ appID1, 3 },
@@ -237,9 +282,9 @@ namespace ArchiSteamFarm.Tests {
);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID1, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID1, Steam.Asset.SteamCommunityContextID, 2), 1 },
{ (appID1, Steam.Asset.SteamCommunityContextID, 3), 1 }
{ (appID1, Asset.SteamCommunityContextID, 1), 1 },
{ (appID1, Asset.SteamCommunityContextID, 2), 1 },
{ (appID1, Asset.SteamCommunityContextID, 3), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -249,15 +294,15 @@ namespace ArchiSteamFarm.Tests {
public void OtherRarityFullSets() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Common),
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Rare)
HashSet<Asset> items = new() {
CreateCard(1, appID, rarity: Asset.ERarity.Common),
CreateCard(1, appID, rarity: Asset.ERarity.Rare)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 1, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 1, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 2 }
{ (appID, Asset.SteamCommunityContextID, 1), 2 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -267,12 +312,12 @@ namespace ArchiSteamFarm.Tests {
public void OtherRarityNoSets() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Common),
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Rare)
HashSet<Asset> items = new() {
CreateCard(1, appID, rarity: Asset.ERarity.Common),
CreateCard(1, appID, rarity: Asset.ERarity.Rare)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new(0);
@@ -283,20 +328,20 @@ namespace ArchiSteamFarm.Tests {
public void OtherRarityOneSet() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Common),
CreateCard(2, appID, rarity: Steam.Asset.ERarity.Common),
CreateCard(1, appID, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(2, appID, rarity: Steam.Asset.ERarity.Uncommon),
CreateCard(3, appID, rarity: Steam.Asset.ERarity.Uncommon)
HashSet<Asset> items = new() {
CreateCard(1, appID, rarity: Asset.ERarity.Common),
CreateCard(2, appID, rarity: Asset.ERarity.Common),
CreateCard(1, appID, rarity: Asset.ERarity.Uncommon),
CreateCard(2, appID, rarity: Asset.ERarity.Uncommon),
CreateCard(3, appID, rarity: Asset.ERarity.Uncommon)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 3), 1 }
{ (appID, Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Asset.SteamCommunityContextID, 3), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -306,15 +351,15 @@ namespace ArchiSteamFarm.Tests {
public void OtherTypeFullSets() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, type: Steam.Asset.EType.TradingCard),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard)
HashSet<Asset> items = new() {
CreateCard(1, appID, type: Asset.EType.TradingCard),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 1, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 1, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 2 }
{ (appID, Asset.SteamCommunityContextID, 1), 2 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -324,12 +369,12 @@ namespace ArchiSteamFarm.Tests {
public void OtherTypeNoSets() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, type: Steam.Asset.EType.TradingCard),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard)
HashSet<Asset> items = new() {
CreateCard(1, appID, type: Asset.EType.TradingCard),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new(0);
@@ -340,20 +385,20 @@ namespace ArchiSteamFarm.Tests {
public void OtherTypeOneSet() {
const uint appID = 42;
HashSet<Steam.Asset> items = new() {
CreateCard(1, appID, type: Steam.Asset.EType.TradingCard),
CreateCard(2, appID, type: Steam.Asset.EType.TradingCard),
CreateCard(1, appID, type: Steam.Asset.EType.FoilTradingCard),
CreateCard(2, appID, type: Steam.Asset.EType.FoilTradingCard),
CreateCard(3, appID, type: Steam.Asset.EType.FoilTradingCard)
HashSet<Asset> items = new() {
CreateCard(1, appID, type: Asset.EType.TradingCard),
CreateCard(2, appID, type: Asset.EType.TradingCard),
CreateCard(1, appID, type: Asset.EType.FoilTradingCard),
CreateCard(2, appID, type: Asset.EType.FoilTradingCard),
CreateCard(3, appID, type: Asset.EType.FoilTradingCard)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 3, appID);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Steam.Asset.SteamCommunityContextID, 3), 1 }
{ (appID, Asset.SteamCommunityContextID, 1), 1 },
{ (appID, Asset.SteamCommunityContextID, 2), 1 },
{ (appID, Asset.SteamCommunityContextID, 3), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
@@ -363,21 +408,61 @@ namespace ArchiSteamFarm.Tests {
public void TooHighAmount() {
const uint appID0 = 42;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID0, 2),
CreateCard(2, appID0)
};
HashSet<Steam.Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID0);
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID0);
Dictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult = new() {
{ (appID0, Steam.Asset.SteamCommunityContextID, 1), 1 },
{ (appID0, Steam.Asset.SteamCommunityContextID, 2), 1 }
{ (appID0, Asset.SteamCommunityContextID, 1), 1 },
{ (appID0, Asset.SteamCommunityContextID, 2), 1 }
};
AssertResultMatchesExpectation(expectedResult, itemsToSend);
}
[TestMethod]
public void TooManyCardsForSingleTrade() {
const uint appID = 42;
HashSet<Asset> items = new();
for (byte i = 0; i < Steam.Exchange.Trading.MaxItemsPerTrade; i++) {
items.Add(CreateCard(1, appID));
items.Add(CreateCard(2, appID));
}
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, 2, appID);
Assert.IsTrue(itemsToSend.Count <= Steam.Exchange.Trading.MaxItemsPerTrade);
}
[TestMethod]
public void TooManyCardsForSingleTradeMultipleAppIDs() {
const uint appID0 = 42;
const uint appID1 = 43;
HashSet<Asset> items = new();
for (byte i = 0; i < 100; i++) {
items.Add(CreateCard(1, appID0));
items.Add(CreateCard(2, appID0));
items.Add(CreateCard(1, appID1));
items.Add(CreateCard(2, appID1));
}
Dictionary<uint, byte> itemsPerSet = new() {
{ appID0, 2 },
{ appID1, 2 }
};
HashSet<Asset> itemsToSend = GetItemsForFullBadge(items, itemsPerSet);
Assert.IsTrue(itemsToSend.Count <= Steam.Exchange.Trading.MaxItemsPerTrade);
}
[TestMethod]
[ExpectedException(typeof(InvalidOperationException))]
public void TooManyCardsPerSet() {
@@ -385,7 +470,7 @@ namespace ArchiSteamFarm.Tests {
const uint appID1 = 43;
const uint appID2 = 44;
HashSet<Steam.Asset> items = new() {
HashSet<Asset> items = new() {
CreateCard(1, appID0),
CreateCard(2, appID0),
CreateCard(3, appID0),
@@ -403,7 +488,7 @@ namespace ArchiSteamFarm.Tests {
Assert.Fail();
}
private static void AssertResultMatchesExpectation(IReadOnlyDictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult, IReadOnlyCollection<Steam.Asset> itemsToSend) {
private static void AssertResultMatchesExpectation(IReadOnlyDictionary<(uint RealAppID, ulong ContextID, ulong ClassID), uint> expectedResult, IReadOnlyCollection<Asset> itemsToSend) {
if (expectedResult == null) {
throw new ArgumentNullException(nameof(expectedResult));
}
@@ -417,14 +502,14 @@ namespace ArchiSteamFarm.Tests {
Assert.IsTrue(expectedResult.All(expectation => realResult.TryGetValue(expectation.Key, out long reality) && (expectation.Value == reality)));
}
private static Steam.Asset CreateCard(ulong classID, uint realAppID, uint amount = 1, Steam.Asset.EType type = Steam.Asset.EType.TradingCard, Steam.Asset.ERarity rarity = Steam.Asset.ERarity.Common) => new(Steam.Asset.SteamAppID, Steam.Asset.SteamCommunityContextID, classID, amount, realAppID: realAppID, type: type, rarity: rarity);
private static Asset CreateCard(ulong classID, uint realAppID, uint amount = 1, Asset.EType type = Asset.EType.TradingCard, Asset.ERarity rarity = Asset.ERarity.Common) => new(Asset.SteamAppID, Asset.SteamCommunityContextID, classID, amount, realAppID: realAppID, type: type, rarity: rarity);
private static HashSet<Steam.Asset> GetItemsForFullBadge(IReadOnlyCollection<Steam.Asset> inventory, byte cardsPerSet, uint appID) => GetItemsForFullBadge(inventory, new Dictionary<uint, byte> { { appID, cardsPerSet } });
private static HashSet<Asset> GetItemsForFullBadge(IReadOnlyCollection<Asset> inventory, byte cardsPerSet, uint appID, ushort maxItems = Steam.Exchange.Trading.MaxItemsPerTrade) => GetItemsForFullBadge(inventory, new Dictionary<uint, byte> { { appID, cardsPerSet } }, maxItems);
private static HashSet<Steam.Asset> GetItemsForFullBadge(IReadOnlyCollection<Steam.Asset> inventory, IDictionary<uint, byte> cardsPerSet) {
Dictionary<(uint RealAppID, Steam.Asset.EType Type, Steam.Asset.ERarity Rarity), List<uint>> inventorySets = ArchiSteamFarm.Trading.GetInventorySets(inventory);
private static HashSet<Asset> GetItemsForFullBadge(IReadOnlyCollection<Asset> inventory, IDictionary<uint, byte> cardsPerSet, ushort maxItems = Steam.Exchange.Trading.MaxItemsPerTrade) {
Dictionary<(uint RealAppID, Asset.EType Type, Asset.ERarity Rarity), List<uint>> inventorySets = Steam.Exchange.Trading.GetInventorySets(inventory);
return ArchiSteamFarm.Bot.GetItemsForFullSets(inventory, inventorySets.ToDictionary(kv => kv.Key, kv => (SetsToExtract: inventorySets[kv.Key][0], cardsPerSet[kv.Key.RealAppID]))).ToHashSet();
return GetItemsForFullSets(inventory, inventorySets.ToDictionary(kv => kv.Key, kv => (SetsToExtract: inventorySets[kv.Key][0], cardsPerSet[kv.Key.RealAppID])), maxItems).ToHashSet();
}
}
}

View File

@@ -0,0 +1,335 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2021 Ł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.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static ArchiSteamFarm.Steam.Integration.SteamChatMessage;
namespace ArchiSteamFarm.Tests {
[TestClass]
public sealed class SteamChatMessage {
[TestMethod]
public async Task CanSplitEvenWithStupidlyLongPrefix() {
string prefix = new('x', MaxMessagePrefixBytes);
const string emoji = "😎";
const string message = emoji + emoji + emoji + emoji;
List<string> output = await GetMessageParts(message, prefix, true).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(4, output.Count);
Assert.AreEqual(prefix + emoji + ContinuationCharacter, output[0]);
Assert.AreEqual(prefix + ContinuationCharacter + emoji + ContinuationCharacter, output[1]);
Assert.AreEqual(prefix + ContinuationCharacter + emoji + ContinuationCharacter, output[2]);
Assert.AreEqual(prefix + ContinuationCharacter + emoji, output[3]);
}
[TestMethod]
public void ContinuationCharacterSizeIsProperlyCalculated() => Assert.AreEqual(ContinuationCharacterBytes, Encoding.UTF8.GetByteCount(ContinuationCharacter.ToString()));
[TestMethod]
public async Task DoesntSkipEmptyNewlines() {
string message = "asdf" + Environment.NewLine + Environment.NewLine + "asdf";
List<string> output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(message, output.First());
}
[DataRow(false)]
[DataRow(true)]
[DataTestMethod]
public async Task DoesntSplitInTheMiddleOfMultiByteChar(bool isAccountLimited) {
int maxMessageBytes = isAccountLimited ? MaxMessageBytesForLimitedAccounts : MaxMessageBytesForUnlimitedAccounts;
int longLineLength = maxMessageBytes - ReservedContinuationMessageBytes;
const string emoji = "😎";
string longSequence = new('a', longLineLength - 1);
string message = longSequence + emoji;
List<string> output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(2, output.Count);
Assert.AreEqual(longSequence + ContinuationCharacter, output[0]);
Assert.AreEqual(ContinuationCharacter + emoji, output[1]);
}
[TestMethod]
public async Task DoesntSplitJustBecauseOfLastEscapableCharacter() {
const string message = "abcdef[";
const string escapedMessage = @"abcdef\[";
List<string> output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(escapedMessage, output.First());
}
[DataRow(false)]
[DataRow(true)]
[DataTestMethod]
public async Task DoesntSplitOnBackslashNotUsedForEscaping(bool isAccountLimited) {
int maxMessageBytes = isAccountLimited ? MaxMessageBytesForLimitedAccounts : MaxMessageBytesForUnlimitedAccounts;
int longLineLength = maxMessageBytes - ReservedContinuationMessageBytes;
string longLine = new('a', longLineLength - 2);
string message = longLine + @"\";
List<string> output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(message + @"\", output.First());
}
[DataRow(false)]
[DataRow(true)]
[DataTestMethod]
public async Task DoesntSplitOnEscapeCharacter(bool isAccountLimited) {
int maxMessageBytes = isAccountLimited ? MaxMessageBytesForLimitedAccounts : MaxMessageBytesForUnlimitedAccounts;
int longLineLength = maxMessageBytes - ReservedContinuationMessageBytes;
string longLine = new('a', longLineLength - 1);
string message = longLine + "[";
List<string> output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(2, output.Count);
Assert.AreEqual(longLine + ContinuationCharacter, output[0]);
Assert.AreEqual(ContinuationCharacter + @"\[", output[1]);
}
[TestMethod]
public async Task NoNeedForAnySplittingWithNewlines() {
string message = "abcdef" + Environment.NewLine + "ghijkl" + Environment.NewLine + "mnopqr";
List<string> output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(message, output.First());
}
[TestMethod]
public async Task NoNeedForAnySplittingWithoutNewlines() {
const string message = "abcdef";
List<string> output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(message, output.First());
}
[TestMethod]
public void ParagraphCharacterSizeIsLessOrEqualToContinuationCharacterSize() => Assert.IsTrue(ContinuationCharacterBytes >= Encoding.UTF8.GetByteCount(ParagraphCharacter.ToString()));
[TestMethod]
public async Task ProperlyEscapesCharacters() {
const string message = @"[b]bold[/b] \n";
const string escapedMessage = @"\[b]bold\[/b] \\n";
List<string> output = await GetMessageParts(message).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(escapedMessage, output.First());
}
[TestMethod]
public async Task ProperlyEscapesSteamMessagePrefix() {
const string prefix = "/pre []";
const string escapedPrefix = @"/pre \[]";
const string message = "asdf";
List<string> output = await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(1, output.Count);
Assert.AreEqual(escapedPrefix + message, output.First());
}
[DataRow(false)]
[DataRow(true)]
[DataTestMethod]
public async Task ProperlySplitsLongSingleLine(bool isAccountLimited) {
int maxMessageBytes = isAccountLimited ? MaxMessageBytesForLimitedAccounts : MaxMessageBytesForUnlimitedAccounts;
int longLineLength = maxMessageBytes - ReservedContinuationMessageBytes;
string longLine = new('a', longLineLength);
string message = longLine + longLine + longLine + longLine;
List<string> output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(4, output.Count);
Assert.AreEqual(longLine + ContinuationCharacter, output[0]);
Assert.AreEqual(ContinuationCharacter + longLine + ContinuationCharacter, output[1]);
Assert.AreEqual(ContinuationCharacter + longLine + ContinuationCharacter, output[2]);
Assert.AreEqual(ContinuationCharacter + longLine, output[3]);
}
[TestMethod]
public void ReservedSizeForEscapingIsProperlyCalculated() => Assert.AreEqual(ReservedEscapeMessageBytes, Encoding.UTF8.GetByteCount(@"\") + 4); // Maximum amount of bytes per single UTF-8 character is 4, not 6 as from Encoding.UTF8.GetMaxByteCount(1)
[TestMethod]
public async Task RyzhehvostInitialTestForSplitting() {
const string prefix = "/me ";
const string message = @"<XLimited5> Уже имеет: app/1493800 | Aircraft Carrier Survival: Prolouge
<XLimited5> Уже имеет: app/349520 | Armillo
<XLimited5> Уже имеет: app/346330 | BrainBread 2
<XLimited5> Уже имеет: app/1086690 | C-War 2
<XLimited5> Уже имеет: app/730 | Counter-Strike: Global Offensive
<XLimited5> Уже имеет: app/838380 | DEAD OR ALIVE 6
<XLimited5> Уже имеет: app/582890 | Estranged: The Departure
<XLimited5> Уже имеет: app/331470 | Everlasting Summer
<XLimited5> Уже имеет: app/1078000 | Gamecraft
<XLimited5> Уже имеет: app/266310 | GameGuru
<XLimited5> Уже имеет: app/275390 | Guacamelee! Super Turbo Championship Edition
<XLimited5> Уже имеет: app/627690 | Idle Champions of the Forgotten Realms
<XLimited5> Уже имеет: app/1048540 | Kao the Kangaroo: Round 2
<XLimited5> Уже имеет: app/370910 | Kathy Rain
<XLimited5> Уже имеет: app/343710 | KHOLAT
<XLimited5> Уже имеет: app/253900 | Knights and Merchants
<XLimited5> Уже имеет: app/224260 | No More Room in Hell
<XLimited5> Уже имеет: app/343360 | Particula
<XLimited5> Уже имеет: app/237870 | Planet Explorers
<XLimited5> Уже имеет: app/684680 | Polygoneer
<XLimited5> Уже имеет: app/1089130 | Quake II RTX
<XLimited5> Уже имеет: app/755790 | Ring of Elysium
<XLimited5> Уже имеет: app/1258080 | Shop Titans
<XLimited5> Уже имеет: app/759530 | Struckd - 3D Game Creator
<XLimited5> Уже имеет: app/269710 | Tumblestone
<XLimited5> Уже имеет: app/304930 | Unturned
<XLimited5> Уже имеет: app/1019250 | WWII TCG - World War 2: The Card Game
<ASF> 1/1 ботов уже имеют игру app/1493800 | Aircraft Carrier Survival: Prolouge.
<ASF> 1/1 ботов уже имеют игру app/349520 | Armillo.
<ASF> 1/1 ботов уже имеют игру app/346330 | BrainBread 2.
<ASF> 1/1 ботов уже имеют игру app/1086690 | C-War 2.
<ASF> 1/1 ботов уже имеют игру app/730 | Counter-Strike: Global Offensive.
<ASF> 1/1 ботов уже имеют игру app/838380 | DEAD OR ALIVE 6.
<ASF> 1/1 ботов уже имеют игру app/582890 | Estranged: The Departure.
<ASF> 1/1 ботов уже имеют игру app/331470 | Everlasting Summer.
<ASF> 1/1 ботов уже имеют игру app/1078000 | Gamecraft.
<ASF> 1/1 ботов уже имеют игру app/266310 | GameGuru.
<ASF> 1/1 ботов уже имеют игру app/275390 | Guacamelee! Super Turbo Championship Edition.
<ASF> 1/1 ботов уже имеют игру app/627690 | Idle Champions of the Forgotten Realms.
<ASF> 1/1 ботов уже имеют игру app/1048540 | Kao the Kangaroo: Round 2.
<ASF> 1/1 ботов уже имеют игру app/370910 | Kathy Rain.
<ASF> 1/1 ботов уже имеют игру app/343710 | KHOLAT.
<ASF> 1/1 ботов уже имеют игру app/253900 | Knights and Merchants.
<ASF> 1/1 ботов уже имеют игру app/224260 | No More Room in Hell.
<ASF> 1/1 ботов уже имеют игру app/343360 | Particula.
<ASF> 1/1 ботов уже имеют игру app/237870 | Planet Explorers.
<ASF> 1/1 ботов уже имеют игру app/684680 | Polygoneer.
<ASF> 1/1 ботов уже имеют игру app/1089130 | Quake II RTX.
<ASF> 1/1 ботов уже имеют игру app/755790 | Ring of Elysium.
<ASF> 1/1 ботов уже имеют игру app/1258080 | Shop Titans.
<ASF> 1/1 ботов уже имеют игру app/759530 | Struckd - 3D Game Creator.
<ASF> 1/1 ботов уже имеют игру app/269710 | Tumblestone.
<ASF> 1/1 ботов уже имеют игру app/304930 | Unturned.";
List<string> output = await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(2, output.Count);
foreach (string messagePart in output) {
if ((messagePart.Length <= prefix.Length) || !messagePart.StartsWith(prefix, StringComparison.Ordinal)) {
Assert.Fail();
return;
}
string[] lines = messagePart.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
int bytes = lines.Where(line => line.Length > 0).Sum(Encoding.UTF8.GetByteCount) + ((lines.Length - 1) * NewlineWeight);
if (bytes > MaxMessageBytesForUnlimitedAccounts) {
Assert.Fail();
return;
}
}
}
[DataRow(false)]
[DataRow(true)]
[DataTestMethod]
public async Task SplitsOnNewlinesWithParagraphCharacter(bool isAccountLimited) {
int maxMessageBytes = isAccountLimited ? MaxMessageBytesForLimitedAccounts : MaxMessageBytesForUnlimitedAccounts;
StringBuilder newlinePartBuilder = new();
for (ushort bytes = 0; bytes < maxMessageBytes - ReservedContinuationMessageBytes - NewlineWeight;) {
if (newlinePartBuilder.Length > 0) {
bytes += NewlineWeight;
newlinePartBuilder.Append(Environment.NewLine);
}
bytes++;
newlinePartBuilder.Append('a');
}
string newlinePart = newlinePartBuilder.ToString();
string message = newlinePart + Environment.NewLine + newlinePart + Environment.NewLine + newlinePart + Environment.NewLine + newlinePart;
List<string> output = await GetMessageParts(message, isAccountLimited: isAccountLimited).ToListAsync().ConfigureAwait(false);
Assert.AreEqual(4, output.Count);
Assert.AreEqual(newlinePart + ParagraphCharacter, output[0]);
Assert.AreEqual(newlinePart + ParagraphCharacter, output[1]);
Assert.AreEqual(newlinePart + ParagraphCharacter, output[2]);
Assert.AreEqual(newlinePart, output[3]);
}
[ExpectedException(typeof(ArgumentOutOfRangeException))]
[TestMethod]
public async Task ThrowsOnTooLongNewlinesPrefix() {
string prefix = new('\n', (MaxMessagePrefixBytes / NewlineWeight) + 1);
const string message = "asdf";
await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false);
Assert.Fail();
}
[ExpectedException(typeof(ArgumentOutOfRangeException))]
[TestMethod]
public async Task ThrowsOnTooLongPrefix() {
string prefix = new('x', MaxMessagePrefixBytes + 1);
const string message = "asdf";
await GetMessageParts(message, prefix).ToListAsync().ConfigureAwait(false);
Assert.Fail();
}
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,53 +20,53 @@
// limitations under the License.
using System.Collections.Generic;
using ArchiSteamFarm.Json;
using ArchiSteamFarm.Steam.Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static ArchiSteamFarm.Trading;
using static ArchiSteamFarm.Steam.Exchange.Trading;
namespace ArchiSteamFarm.Tests {
[TestClass]
public sealed class Trading {
[TestMethod]
public void MismatchRarityIsNotFair() {
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1, rarity: Steam.Asset.ERarity.Rare) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(1, rarity: Asset.ERarity.Rare) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsFalse(IsFairExchange(itemsToGive, itemsToReceive));
}
[TestMethod]
public void MismatchRealAppIDsIsNotFair() {
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1, realAppID: 570) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(1, realAppID: 570) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsFalse(IsFairExchange(itemsToGive, itemsToReceive));
}
[TestMethod]
public void MismatchTypesIsNotFair() {
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1, type: Steam.Asset.EType.Emoticon) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(1, type: Asset.EType.Emoticon) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsFalse(IsFairExchange(itemsToGive, itemsToReceive));
}
[TestMethod]
public void MultiGameMultiTypeBadReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 9),
CreateItem(3, 9, 730, Steam.Asset.EType.Emoticon),
CreateItem(4, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(3, 9, 730, Asset.EType.Emoticon),
CreateItem(4, realAppID: 730, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(4, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(4, realAppID: 730, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(3, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(3, realAppID: 730, type: Asset.EType.Emoticon)
};
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
@@ -75,19 +75,19 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void MultiGameMultiTypeNeutralAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 9),
CreateItem(3, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(3, realAppID: 730, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(3, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(3, realAppID: 730, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(4, realAppID: 730, type: Steam.Asset.EType.Emoticon)
CreateItem(4, realAppID: 730, type: Asset.EType.Emoticon)
};
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
@@ -96,18 +96,18 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void MultiGameSingleTypeBadReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 9),
CreateItem(3, realAppID: 730),
CreateItem(4, realAppID: 730)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(3, realAppID: 730)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(4, realAppID: 730)
};
@@ -118,17 +118,17 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void MultiGameSingleTypeNeutralAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 2),
CreateItem(3, realAppID: 730)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(3, realAppID: 730)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(4, realAppID: 730)
};
@@ -139,7 +139,7 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameAbrynosWasWrongNeutralAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2, 2),
CreateItem(3),
@@ -147,11 +147,11 @@ namespace ArchiSteamFarm.Tests {
CreateItem(5)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(2)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(3)
};
@@ -161,17 +161,17 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameDonationAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(3, type: Steam.Asset.EType.SteamGems)
CreateItem(3, type: Asset.EType.SteamGems)
};
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
@@ -180,20 +180,20 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameMultiTypeBadReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 9),
CreateItem(3, 9, type: Steam.Asset.EType.Emoticon),
CreateItem(4, type: Steam.Asset.EType.Emoticon)
CreateItem(3, 9, type: Asset.EType.Emoticon),
CreateItem(4, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(4, type: Steam.Asset.EType.Emoticon)
CreateItem(4, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(3, type: Steam.Asset.EType.Emoticon)
CreateItem(3, type: Asset.EType.Emoticon)
};
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
@@ -202,19 +202,19 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameMultiTypeNeutralAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 9),
CreateItem(3, type: Steam.Asset.EType.Emoticon)
CreateItem(3, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(3, type: Steam.Asset.EType.Emoticon)
CreateItem(3, type: Asset.EType.Emoticon)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(2),
CreateItem(4, type: Steam.Asset.EType.Emoticon)
CreateItem(4, type: Asset.EType.Emoticon)
};
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
@@ -223,19 +223,19 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameQuantityBadReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2),
CreateItem(3)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(2),
CreateItem(3)
};
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(4, 3) };
HashSet<Asset> itemsToReceive = new() { CreateItem(4, 3) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsFalse(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -243,17 +243,17 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameQuantityBadReject2() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2, 2)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(2, 2)
};
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(3, 3) };
HashSet<Asset> itemsToReceive = new() { CreateItem(3, 3) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsFalse(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -261,17 +261,17 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameQuantityNeutralAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 2),
CreateItem(2)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(1),
CreateItem(2)
};
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(3, 2) };
HashSet<Asset> itemsToReceive = new() { CreateItem(3, 2) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsTrue(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -279,13 +279,13 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeBadReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2)
};
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsFalse(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -293,15 +293,15 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeBadWithOverpayingReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 2),
CreateItem(2, 2),
CreateItem(3, 2)
};
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(1),
CreateItem(3)
};
@@ -312,14 +312,14 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeBigDifferenceAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2, 5),
CreateItem(3)
};
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(3) };
HashSet<Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Asset> itemsToReceive = new() { CreateItem(3) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsTrue(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -327,7 +327,7 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeBigDifferenceReject() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1),
CreateItem(2, 2),
CreateItem(3, 2),
@@ -335,12 +335,12 @@ namespace ArchiSteamFarm.Tests {
CreateItem(5, 10)
};
HashSet<Steam.Asset> itemsToGive = new() {
HashSet<Asset> itemsToGive = new() {
CreateItem(2),
CreateItem(5)
};
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(3),
CreateItem(4)
};
@@ -351,9 +351,9 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeGoodAccept() {
HashSet<Steam.Asset> inventory = new() { CreateItem(1, 2) };
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> inventory = new() { CreateItem(1, 2) };
HashSet<Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsTrue(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -361,9 +361,9 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeNeutralAccept() {
HashSet<Steam.Asset> inventory = new() { CreateItem(1) };
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Steam.Asset> itemsToReceive = new() { CreateItem(2) };
HashSet<Asset> inventory = new() { CreateItem(1) };
HashSet<Asset> itemsToGive = new() { CreateItem(1) };
HashSet<Asset> itemsToReceive = new() { CreateItem(2) };
Assert.IsTrue(IsFairExchange(itemsToGive, itemsToReceive));
Assert.IsTrue(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
@@ -371,14 +371,14 @@ namespace ArchiSteamFarm.Tests {
[TestMethod]
public void SingleGameSingleTypeNeutralWithOverpayingAccept() {
HashSet<Steam.Asset> inventory = new() {
HashSet<Asset> inventory = new() {
CreateItem(1, 2),
CreateItem(2, 2)
};
HashSet<Steam.Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Asset> itemsToGive = new() { CreateItem(2) };
HashSet<Steam.Asset> itemsToReceive = new() {
HashSet<Asset> itemsToReceive = new() {
CreateItem(1),
CreateItem(3)
};
@@ -387,6 +387,6 @@ namespace ArchiSteamFarm.Tests {
Assert.IsTrue(IsTradeNeutralOrBetter(inventory, itemsToGive, itemsToReceive));
}
private static Steam.Asset CreateItem(ulong classID, uint amount = 1, uint realAppID = Steam.Asset.SteamAppID, Steam.Asset.EType type = Steam.Asset.EType.TradingCard, Steam.Asset.ERarity rarity = Steam.Asset.ERarity.Common) => new(Steam.Asset.SteamAppID, Steam.Asset.SteamCommunityContextID, classID, amount, realAppID: realAppID, type: type, rarity: rarity);
private static Asset CreateItem(ulong classID, uint amount = 1, uint realAppID = Asset.SteamAppID, Asset.EType type = Asset.EType.TradingCard, Asset.ERarity rarity = Asset.ERarity.Common) => new(Asset.SteamAppID, Asset.SteamCommunityContextID, classID, amount, realAppID: realAppID, type: type, rarity: rarity);
}
}

View File

@@ -1,50 +1,46 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
VisualStudioVersion = 16.6.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm", "ArchiSteamFarm\ArchiSteamFarm.csproj", "{CF84911C-2C4C-4195-8AF3-ABBB6D3DE9AA}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm", "ArchiSteamFarm\ArchiSteamFarm.csproj", "{1501FF07-0114-473F-BDF2-7F8BA34C2948}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm.Tests", "ArchiSteamFarm.Tests\ArchiSteamFarm.Tests.csproj", "{91DC4C4F-3C23-4716-8CB2-BC7EAB65D759}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm.Tests", "ArchiSteamFarm.Tests\ArchiSteamFarm.Tests.csproj", "{D552661C-1356-4B82-A019-B83DC260ECF4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm.CustomPlugins.ExamplePlugin", "ArchiSteamFarm.CustomPlugins.ExamplePlugin\ArchiSteamFarm.CustomPlugins.ExamplePlugin.csproj", "{2E2C26B6-7C1D-4BAF-BCF9-79286DA08F82}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm.CustomPlugins.ExamplePlugin", "ArchiSteamFarm.CustomPlugins.ExamplePlugin\ArchiSteamFarm.CustomPlugins.ExamplePlugin.csproj", "{6AE042DA-1152-4F3F-A197-65FD7509E8C6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchiSteamFarm.CustomPlugins.PeriodicGC", "ArchiSteamFarm.CustomPlugins.PeriodicGC\ArchiSteamFarm.CustomPlugins.PeriodicGC.csproj", "{2C935C25-1B03-4C55-81C9-DF1D472D72F4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm.CustomPlugins.PeriodicGC", "ArchiSteamFarm.CustomPlugins.PeriodicGC\ArchiSteamFarm.CustomPlugins.PeriodicGC.csproj", "{0B8906EC-DF72-4CB8-9ECE-34961C056680}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm.OfficialPlugins.SteamTokenDumper", "ArchiSteamFarm.OfficialPlugins.SteamTokenDumper\ArchiSteamFarm.OfficialPlugins.SteamTokenDumper.csproj", "{A9299EE5-AF67-4FCB-8D03-263B41819504}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArchiSteamFarm.OfficialPlugins.SteamTokenDumper", "ArchiSteamFarm.OfficialPlugins.SteamTokenDumper\ArchiSteamFarm.OfficialPlugins.SteamTokenDumper.csproj", "{324E42B1-3C5D-421D-A600-1BEEE7AF401A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CF84911C-2C4C-4195-8AF3-ABBB6D3DE9AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF84911C-2C4C-4195-8AF3-ABBB6D3DE9AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF84911C-2C4C-4195-8AF3-ABBB6D3DE9AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF84911C-2C4C-4195-8AF3-ABBB6D3DE9AA}.Release|Any CPU.Build.0 = Release|Any CPU
{91DC4C4F-3C23-4716-8CB2-BC7EAB65D759}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91DC4C4F-3C23-4716-8CB2-BC7EAB65D759}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91DC4C4F-3C23-4716-8CB2-BC7EAB65D759}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91DC4C4F-3C23-4716-8CB2-BC7EAB65D759}.Release|Any CPU.Build.0 = Release|Any CPU
{2E2C26B6-7C1D-4BAF-BCF9-79286DA08F82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E2C26B6-7C1D-4BAF-BCF9-79286DA08F82}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E2C26B6-7C1D-4BAF-BCF9-79286DA08F82}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E2C26B6-7C1D-4BAF-BCF9-79286DA08F82}.Release|Any CPU.Build.0 = Release|Any CPU
{2C935C25-1B03-4C55-81C9-DF1D472D72F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C935C25-1B03-4C55-81C9-DF1D472D72F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C935C25-1B03-4C55-81C9-DF1D472D72F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C935C25-1B03-4C55-81C9-DF1D472D72F4}.Release|Any CPU.Build.0 = Release|Any CPU
{A9299EE5-AF67-4FCB-8D03-263B41819504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9299EE5-AF67-4FCB-8D03-263B41819504}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9299EE5-AF67-4FCB-8D03-263B41819504}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9299EE5-AF67-4FCB-8D03-263B41819504}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
RESX_ShowErrorsInErrorList = False
SolutionGuid = {D7D54143-C857-4B76-A219-0E98C5BC4895}
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1501FF07-0114-473F-BDF2-7F8BA34C2948}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1501FF07-0114-473F-BDF2-7F8BA34C2948}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1501FF07-0114-473F-BDF2-7F8BA34C2948}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1501FF07-0114-473F-BDF2-7F8BA34C2948}.Release|Any CPU.Build.0 = Release|Any CPU
{D552661C-1356-4B82-A019-B83DC260ECF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D552661C-1356-4B82-A019-B83DC260ECF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D552661C-1356-4B82-A019-B83DC260ECF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D552661C-1356-4B82-A019-B83DC260ECF4}.Release|Any CPU.Build.0 = Release|Any CPU
{6AE042DA-1152-4F3F-A197-65FD7509E8C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6AE042DA-1152-4F3F-A197-65FD7509E8C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AE042DA-1152-4F3F-A197-65FD7509E8C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6AE042DA-1152-4F3F-A197-65FD7509E8C6}.Release|Any CPU.Build.0 = Release|Any CPU
{0B8906EC-DF72-4CB8-9ECE-34961C056680}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0B8906EC-DF72-4CB8-9ECE-34961C056680}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0B8906EC-DF72-4CB8-9ECE-34961C056680}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0B8906EC-DF72-4CB8-9ECE-34961C056680}.Release|Any CPU.Build.0 = Release|Any CPU
{324E42B1-3C5D-421D-A600-1BEEE7AF401A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{324E42B1-3C5D-421D-A600-1BEEE7AF401A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{324E42B1-3C5D-421D-A600-1BEEE7AF401A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{324E42B1-3C5D-421D-A600-1BEEE7AF401A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

File diff suppressed because one or more lines are too long

View File

@@ -1,83 +1,87 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);config/**;debug/**;logs/**;overlay/**</DefaultItemExcludes>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<OpenApiGenerateDocuments>false</OpenApiGenerateDocuments>
<OutputType>Exe</OutputType>
</PropertyGroup>
<PropertyGroup>
<DefaultItemExcludes>$(DefaultItemExcludes);config/**;debug/**;logs/**;overlay/**</DefaultItemExcludes>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<OpenApiGenerateDocuments>false</OpenApiGenerateDocuments>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AngleSharp.XPath" Version="1.1.7" />
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="CryptSharpStandard" Version="1.0.0" />
<PackageReference Include="Humanizer" Version="2.8.26" />
<PackageReference Include="JetBrains.Annotations" Version="2020.1.0" />
<PackageReference Include="Markdig.Signed" Version="0.22.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Nito.AsyncEx.Coordination" Version="5.1.0" />
<PackageReference Include="NLog" Version="4.7.5" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.9.3" />
<PackageReference Include="SteamKit2" Version="2.3.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="5.6.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.6.3" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="5.6.3" />
<PackageReference Include="System.Composition" Version="5.0.0" />
<PackageReference Include="System.Linq.Async" Version="5.0.0" />
</ItemGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net48'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net48'">
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AngleSharp.XPath" />
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="CryptSharpStandard" />
<PackageReference Include="Humanizer" />
<PackageReference Include="JetBrains.Annotations" />
<PackageReference Include="Markdig.Signed" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="Nito.AsyncEx.Coordination" />
<PackageReference Include="NLog" />
<PackageReference Include="NLog.Web.AspNetCore" />
<PackageReference Include="SteamKit2" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" />
<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" />
<PackageReference Include="System.Composition" />
<PackageReference Include="System.Linq.Async" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net48'">
<PackageReference Include="IndexRange" Version="1.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.WebSockets" Version="2.2.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="5.0.0" />
<Reference Include="System.Net.Http">
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Net.Http.dll</HintPath>
</Reference>
<Reference Include="System.Security">
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Security.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net48'">
<PackageReference Include="System.IO.FileSystem.AccessControl" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" />
</ItemGroup>
<ItemGroup>
<TrimmerRootDescriptor Include="TrimmerRoots.xml" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net48'">
<PackageReference Include="IndexRange" />
<PackageReference Include="Microsoft.AspNetCore.Cors" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" />
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCaching" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" />
<PackageReference Include="Microsoft.AspNetCore.WebSockets" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" />
<Reference Include="System.Net.Http" HintPath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Net.Http.dll" />
<Reference Include="System.Security" HintPath="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Security.dll" />
</ItemGroup>
<ItemGroup>
<Compile Update="Localization\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Strings.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
<ItemGroup>
<TrimmerRootDescriptor Include="TrimmerRoots.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Localization\Strings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Localization\Strings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="overlay\all\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
<Content Include="..\ASF-ui\dist\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>www\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
</ItemGroup>
<ItemGroup>
<Compile Update="Localization\Strings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Strings.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="..\LICENSE-2.0.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
<Content Include="overlay\all\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
<Content Include="..\ASF-ui\dist\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>www\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
</ItemGroup>
</Project>

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -19,7 +19,9 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("ArchiSteamFarm.Tests")]
[assembly: InternalsVisibleTo("ArchiSteamFarm.OfficialPlugins.SteamTokenDumper")]
[assembly: CLSCompliant(false)]
[assembly: InternalsVisibleTo("ArchiSteamFarm.Tests, PublicKey=002400000480000014020000060200000024000052534131001000000100010099f0e5961ec7497fd7de1cba2b8c5eff3b18c1faf3d7a8d56e063359c7f928b54b14eae24d23d9d3c1a5db7ceca82edb6956d43e8ea2a0b7223e6e6836c0b809de43fde69bf33fba73cf669e71449284d477333d4b6e54fb69f7b6c4b4811b8fe26e88975e593cffc0e321490a50500865c01e50ab87c8a943b2a788af47dc20f2b860062b7b6df25477e471a744485a286b435cea2df3953cbb66febd8db73f3ccb4588886373141d200f749ba40bb11926b668cc15f328412dd0b0b835909229985336eb4a34f47925558dc6dc3910ea09c1aad5c744833f26ad9de727559d393526a7a29b3383de87802a034ead8ecc2d37340a5fa9b406774446256337d77e3c9e8486b5e732097e238312deaf5b4efcc04df8ecb986d90ee12b4a8a9a00319cc25cb91fd3e36a3cc39e501f83d14eb1e1a6fa6a1365483d99f4cefad1ea5dec204dad958e2a9a93add19781a8aa7bac71747b11d156711eafd1e873e19836eb573fa5cde284739df09b658ed40c56c7b5a7596840774a7065864e6c2af7b5a8bf7a2d238de83d77891d98ef5a4a58248c655a1c7c97c99e01d9928dc60c629eeb523356dc3686e3f9a1a30ffcd0268cd03718292f21d839fce741f4c1163001ab5b654c37d862998962a05e8028e061c611384772777ef6a49b00ebb4f228308e61b2afe408b33db2d82c4f385e26d7438ec0a183c64eeca4138cbc3dc2")]
[assembly: InternalsVisibleTo("ArchiSteamFarm.OfficialPlugins.SteamTokenDumper, PublicKey=002400000480000014020000060200000024000052534131001000000100010099f0e5961ec7497fd7de1cba2b8c5eff3b18c1faf3d7a8d56e063359c7f928b54b14eae24d23d9d3c1a5db7ceca82edb6956d43e8ea2a0b7223e6e6836c0b809de43fde69bf33fba73cf669e71449284d477333d4b6e54fb69f7b6c4b4811b8fe26e88975e593cffc0e321490a50500865c01e50ab87c8a943b2a788af47dc20f2b860062b7b6df25477e471a744485a286b435cea2df3953cbb66febd8db73f3ccb4588886373141d200f749ba40bb11926b668cc15f328412dd0b0b835909229985336eb4a34f47925558dc6dc3910ea09c1aad5c744833f26ad9de727559d393526a7a29b3383de87802a034ead8ecc2d37340a5fa9b406774446256337d77e3c9e8486b5e732097e238312deaf5b4efcc04df8ecb986d90ee12b4a8a9a00319cc25cb91fd3e36a3cc39e501f83d14eb1e1a6fa6a1365483d99f4cefad1ea5dec204dad958e2a9a93add19781a8aa7bac71747b11d156711eafd1e873e19836eb573fa5cde284739df09b658ed40c56c7b5a7596840774a7065864e6c2af7b5a8bf7a2d238de83d77891d98ef5a4a58248c655a1c7c97c99e01d9928dc60c629eeb523356dc3686e3f9a1a30ffcd0268cd03718292f21d839fce741f4c1163001ab5b654c37d862998962a05e8028e061c611384772777ef6a49b00ebb4f228308e61b2afe408b33db2d82c4f385e26d7438ec0a183c64eeca4138cbc3dc2")]

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,6 +28,8 @@ using JetBrains.Annotations;
namespace ArchiSteamFarm.Collections {
public sealed class ConcurrentHashSet<T> : IReadOnlyCollection<T>, ISet<T> where T : notnull {
public event EventHandler? OnModified;
public int Count => BackingCollection.Count;
public bool IsReadOnly => false;
@@ -43,14 +45,35 @@ namespace ArchiSteamFarm.Collections {
BackingCollection = new ConcurrentDictionary<T, bool>(comparer);
}
public bool Add(T item) => BackingCollection.TryAdd(item, true);
public void Clear() => BackingCollection.Clear();
public bool Add(T item) {
if (!BackingCollection.TryAdd(item, true)) {
return false;
}
OnModified?.Invoke(this, EventArgs.Empty);
return true;
}
public void Clear() {
if (BackingCollection.IsEmpty) {
return;
}
BackingCollection.Clear();
OnModified?.Invoke(this, EventArgs.Empty);
}
public bool Contains(T item) => BackingCollection.ContainsKey(item);
public void CopyTo(T[] array, int arrayIndex) => BackingCollection.Keys.CopyTo(array, arrayIndex);
public void ExceptWith(IEnumerable<T> other) {
if (other == null) {
throw new ArgumentNullException(nameof(other));
}
foreach (T item in other) {
Remove(item);
}
@@ -96,7 +119,15 @@ namespace ArchiSteamFarm.Collections {
return otherSet.Any(Contains);
}
public bool Remove(T item) => BackingCollection.TryRemove(item, out _);
public bool Remove(T item) {
if (!BackingCollection.TryRemove(item, out _)) {
return false;
}
OnModified?.Invoke(this, EventArgs.Empty);
return true;
}
public bool SetEquals(IEnumerable<T> other) {
ISet<T> otherSet = other as ISet<T> ?? other.ToHashSet();
@@ -119,6 +150,10 @@ namespace ArchiSteamFarm.Collections {
}
public void UnionWith(IEnumerable<T> other) {
if (other == null) {
throw new ArgumentNullException(nameof(other));
}
foreach (T otherElement in other) {
Add(otherElement);
}
@@ -163,11 +198,8 @@ namespace ArchiSteamFarm.Collections {
[PublicAPI]
public void ReplaceWith(IEnumerable<T> other) {
BackingCollection.Clear();
foreach (T item in other) {
BackingCollection[item] = true;
}
Clear();
UnionWith(other);
}
}
}

View File

@@ -4,7 +4,7 @@
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2020 Łukasz "JustArchi" Domeradzki
// Copyright 2015-2021 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");

Some files were not shown because too many files have changed in this diff Show More