Compare commits

...

760 Commits

Author SHA1 Message Date
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
300 changed files with 16547 additions and 15748 deletions

View File

@@ -29,7 +29,6 @@ ArchiSteamFarm/logs
ArchiSteamFarm.CustomPlugins.*
ASF-ui/dist
tools
wiki
# _ _

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

@@ -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 - 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%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,5 +1,7 @@
<!--
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 fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
ASF GITHUB ISSUES IS NOT A PROPER PLACE FOR ANY TECHNICAL SUPPORT RELATED TO USING THE PROGRAM.
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.

View File

@@ -1,14 +1,16 @@
---
name: Bug report
name: 🐛 Bug report
about: Unexpected program behaviour that needs code correction
title: ''
labels: Bug, Evaluation
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 fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
ASF GITHUB ISSUES IS NOT A PROPER PLACE FOR ANY TECHNICAL SUPPORT RELATED TO USING THE PROGRAM.
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.

View File

@@ -1,25 +1,27 @@
---
name: Feature request
name: ✨ Enhancement idea
about: General idea for improving the project
title: ''
labels: Enhancement, Evaluation
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 fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
ASF GITHUB ISSUES IS NOT A PROPER PLACE FOR ANY TECHNICAL SUPPORT RELATED TO USING THE PROGRAM.
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
## Enhancement
### 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. -->
<!-- Purpose of the enhancement - 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 enhancement makes sense, and what is the context of it. -->
### Solution

View File

@@ -1,14 +1,16 @@
---
name: Wiki correction
name: 📕 Wiki correction
about: All issues related to our wiki documentation, mainly corrections and ideas
title: ''
labels: Wiki, Evaluation
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 fully read and understood contributing guidelines of ASF available under https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/CONTRIBUTING.md and I believe that my issue is valid - it requires a response from ASF development team, and not ASF support.
ASF GITHUB ISSUES IS NOT A PROPER PLACE FOR ANY TECHNICAL SUPPORT RELATED TO USING THE PROGRAM.
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.

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_)

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](https://github.com/JustArchiNET/ArchiSteamFarm/issues)** page is 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"
}
}

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

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

@@ -0,0 +1,20 @@
{
"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" ]
}
]
}

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]
@@ -35,356 +31,18 @@ jobs:
- 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.1.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
- 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

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

@@ -0,0 +1,34 @@
name: ASF-docker-ci
on: [push, pull_request]
env:
PLATFORMS: linux/amd64,linux/arm,linux/arm64
jobs:
main:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Build Docker image from Dockerfile
uses: docker/build-push-action@v2
with:
context: .
platforms: ${{ env.PLATFORMS }}
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
- name: Build Docker image from Dockerfile.Service
uses: docker/build-push-action@v2
with:
context: .
file: Dockerfile.Service
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
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to ghcr.io
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1
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
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
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to ghcr.io
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1
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
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
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
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to ghcr.io
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1
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
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

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: 14 # Periodically bumped to follow latest LTS | https://github.com/actions/setup-node/issues/26
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
with:
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
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
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
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

View File

@@ -2,15 +2,11 @@ name: ASF-translations
on:
schedule:
- cron: '0 2 * * *'
- cron: '10 2 * * *'
jobs:
update:
strategy:
matrix:
os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
steps:
- name: Checkout code
@@ -29,17 +25,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.1.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
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 +51,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
@@ -60,19 +60,24 @@ jobs:
- name: Push changes to wiki
uses: ad-m/github-push-action@master
with:
directory: wiki
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: master
directory: wiki
repository: ${{ github.repository }}.wiki
- name: Import GPG key for ASF
uses: crazy-max/ghaction-import-gpg@v3
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"
@@ -82,3 +87,4 @@ jobs:
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}

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: xcode12.2

2
ASF-ui

Submodule ASF-ui updated: 1f52d6a635...33e8d49ca8

View File

@@ -4,12 +4,17 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<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 Condition="'$(TargetFramework)' == 'net48'">
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
<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;
}
@@ -51,15 +53,15 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin {
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

@@ -4,12 +4,11 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
<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

@@ -4,12 +4,33 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ConfigureAwaitChecker.Analyzer" Version="4.0.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<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 Condition="'$(TargetFramework)' == 'net48'">
<PackageReference Include="System.Collections.Immutable" IncludeAssets="compile" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArchiSteamFarm\ArchiSteamFarm.csproj" />
<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,13 +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.Core;
using ArchiSteamFarm.Helpers;
using ArchiSteamFarm.Localization;
using Newtonsoft.Json;
using SteamKit2;
@@ -61,37 +70,47 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
internal ulong GetAppToken(uint appID) => AppTokens[appID];
internal Dictionary<uint, ulong> GetAppTokensForSubmission() => AppTokens.Where(appToken => (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 => !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 => (packageToken.Value > 0) && (!SubmittedPackages.TryGetValue(packageToken.Key, out ulong token) || (packageToken.Value != token))).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));
}
@@ -104,8 +123,6 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
return;
}
ASF.ArchiLogger.LogGenericTrace($"{LastChangeNumber} => {currentChangeNumber}");
LastChangeNumber = currentChangeNumber;
foreach ((uint appID, SteamApps.PICSChangesCallback.PICSChangeData appData) in appChanges) {
@@ -114,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));
}
@@ -129,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));
}
@@ -158,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));
}
@@ -192,11 +205,11 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
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));
}
@@ -204,11 +217,11 @@ 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;
@@ -219,11 +232,11 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
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));
}
@@ -240,11 +253,11 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
}
if (save) {
await Save().ConfigureAwait(false);
Utilities.InBackground(Save);
}
}
internal async Task UpdateSubmittedData(IReadOnlyDictionary<uint, ulong> apps, IReadOnlyDictionary<uint, ulong> packages, IReadOnlyDictionary<uint, string> depots) {
internal void UpdateSubmittedData(IReadOnlyDictionary<uint, ulong> apps, IReadOnlyDictionary<uint, ulong> packages, IReadOnlyDictionary<uint, string> depots) {
if (apps == null) {
throw new ArgumentNullException(nameof(apps));
}
@@ -269,7 +282,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
SubmittedDepots[depotID] = key;
}
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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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 resolverá 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,182 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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 zestawu SteamID, który moglibyśmy sklasyfikować jako współtwórca. 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,226 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,147 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" 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,7 +21,7 @@
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

View File

@@ -0,0 +1,47 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// 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 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)]
public ImmutableHashSet<uint> SecretAppIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
public ImmutableHashSet<uint> SecretDepotIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
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,88 @@ 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.Value<SteamTokenDumperConfig>();
break;
case nameof(GlobalConfigExtension.SteamTokenDumperPluginEnabled):
isEnabled = configValue.Value<bool>();
break;
}
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
break;
}
}
}
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,7 +161,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(bot));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -145,7 +188,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
subscription.Dispose();
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -160,7 +203,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 +216,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(packageChanges));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -181,15 +224,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 +240,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new InvalidOperationException(nameof(GlobalCache));
}
await GlobalCache.OnPICSChangesRestart(currentChangeNumber).ConfigureAwait(false);
GlobalCache.OnPICSChangesRestart(currentChangeNumber);
}
private static async void OnLicenseList(Bot bot, SteamApps.LicenseListCallback callback) {
@@ -209,7 +252,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(callback));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -217,9 +260,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 +272,7 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper {
throw new ArgumentNullException(nameof(bot));
}
if (!IsEnabled) {
if (Config is not { Enabled: true }) {
return;
}
@@ -253,26 +297,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 +334,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 +346,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,7 +371,7 @@ 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;
@@ -348,12 +384,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 +405,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 +426,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 +447,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 +464,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 +473,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, packageTokens, depotKeys).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

@@ -4,12 +4,10 @@
</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" />
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="MSTest.TestAdapter" />
<PackageReference Include="MSTest.TestFramework" />
</ItemGroup>
<ItemGroup>

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,76 @@
// 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;
namespace ArchiSteamFarm.Tests {
[TestClass]
public sealed class Bot {
[TestMethod]
public void MaxItemsBarelyEnoughForOneSet() {
const uint relevantAppID = 42;
Dictionary<uint, byte> itemsPerSet = new() {
{ relevantAppID, Steam.Bot.MinCardsPerBadge },
{ 43, Steam.Bot.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, Steam.Bot.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, Steam.Bot.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 +98,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 +119,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 +139,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 +180,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 +195,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 +215,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 +228,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 +240,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 +263,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 +272,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 +281,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 +293,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 +311,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 +327,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 +350,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 +368,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 +384,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 +407,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 +469,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 +487,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 +501,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 Steam.Bot.GetItemsForFullSets(inventory, inventorySets.ToDictionary(kv => kv.Key, kv => (SetsToExtract: inventorySets[kv.Key][0], cardsPerSet[kv.Key.RealAppID])), maxItems).ToHashSet();
}
}
}

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

@@ -6,54 +6,59 @@
<OutputType>Exe</OutputType>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net48'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</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" />
<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="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="5.0.0" />
<PackageReference Include="System.IO.FileSystem.AccessControl" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" />
</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>
<PackageReference Include="IndexRange" />
<PackageReference Include="Microsoft.AspNetCore.Cors" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" />
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" />
<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>
<TrimmerRootDescriptor Include="TrimmerRoots.xml" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Localization\Strings.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Update="Localization\Strings.Designer.cs">
<AutoGen>True</AutoGen>
@@ -62,13 +67,6 @@
</Compile>
</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>

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: CLSCompliant(false)]
[assembly: InternalsVisibleTo("ArchiSteamFarm.Tests")]
[assembly: InternalsVisibleTo("ArchiSteamFarm.OfficialPlugins.SteamTokenDumper")]

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");

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,6 +23,7 @@ using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using ArchiSteamFarm.Core;
namespace ArchiSteamFarm.Collections {
internal sealed class FixedSizeConcurrentQueue<T> : IEnumerable<T> {

View File

@@ -0,0 +1,74 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// 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.Threading.Tasks;
using JetBrains.Annotations;
namespace ArchiSteamFarm.Compatibility {
[PublicAPI]
public static class File {
public static Task AppendAllTextAsync(string path, string contents) {
#if NETFRAMEWORK
System.IO.File.AppendAllText(path, contents);
return Task.CompletedTask;
#else
return System.IO.File.AppendAllTextAsync(path, contents);
#endif
}
public static void Move(string sourceFileName, string destFileName, bool overwrite) {
#if NETFRAMEWORK
if (overwrite && System.IO.File.Exists(destFileName)) {
System.IO.File.Delete(destFileName);
}
System.IO.File.Move(sourceFileName, destFileName);
#else
System.IO.File.Move(sourceFileName, destFileName, overwrite);
#endif
}
public static Task<byte[]> ReadAllBytesAsync(string path) =>
#if NETFRAMEWORK
Task.FromResult(System.IO.File.ReadAllBytes(path));
#else
System.IO.File.ReadAllBytesAsync(path);
#endif
public static Task<string> ReadAllTextAsync(string path) =>
#if NETFRAMEWORK
Task.FromResult(System.IO.File.ReadAllText(path));
#else
System.IO.File.ReadAllTextAsync(path);
#endif
public static Task WriteAllTextAsync(string path, string contents) {
#if NETFRAMEWORK
System.IO.File.WriteAllText(path, contents);
return Task.CompletedTask;
#else
return System.IO.File.WriteAllTextAsync(path, contents);
#endif
}
}
}

View File

@@ -0,0 +1,34 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// 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 JetBrains.Annotations;
namespace ArchiSteamFarm.Compatibility {
[PublicAPI]
public static class HashCode {
public static int Combine<T1, T2, T3>(T1 value1, T2 value2, T3 value3) =>
#if NETFRAMEWORK
(value1, value2, value3).GetHashCode();
#else
System.HashCode.Combine(value1, value2, value3);
#endif
}
}

View File

@@ -0,0 +1,129 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// 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.
#if NETFRAMEWORK
using System;
using System.Text;
#endif
using JetBrains.Annotations;
namespace ArchiSteamFarm.Compatibility {
[PublicAPI]
public static class Path {
public static string GetRelativePath(string relativeTo, string path) {
#if NETFRAMEWORK
if (string.IsNullOrEmpty(relativeTo)) {
throw new ArgumentNullException(nameof(relativeTo));
}
if (string.IsNullOrEmpty(path)) {
throw new ArgumentNullException(nameof(path));
}
StringComparison comparisonType = PathInternalNetCore.StringComparison;
relativeTo = System.IO.Path.GetFullPath(relativeTo);
path = System.IO.Path.GetFullPath(path);
// Need to check if the roots are different- if they are we need to return the "to" path.
if (!PathInternalNetCore.AreRootsEqual(relativeTo, path, comparisonType)) {
return path;
}
int commonLength = PathInternalNetCore.GetCommonPathLength(
relativeTo, path,
comparisonType == StringComparison.OrdinalIgnoreCase
);
// If there is nothing in common they can't share the same root, return the "to" path as is.
if (commonLength == 0) {
return path;
}
// Trailing separators aren't significant for comparison
int relativeToLength = relativeTo.Length;
if (PathInternalNetCore.EndsInDirectorySeparator(relativeTo)) {
relativeToLength--;
}
bool pathEndsInSeparator = PathInternalNetCore.EndsInDirectorySeparator(path);
int pathLength = path.Length;
if (pathEndsInSeparator) {
pathLength--;
}
// If we have effectively the same path, return "."
if ((relativeToLength == pathLength) && (commonLength >= relativeToLength)) {
return ".";
}
// We have the same root, we need to calculate the difference now using the
// common Length and Segment count past the length.
//
// Some examples:
//
// C:\Foo C:\Bar L3, S1 -> ..\Bar
// C:\Foo C:\Foo\Bar L6, S0 -> Bar
// C:\Foo\Bar C:\Bar\Bar L3, S2 -> ..\..\Bar\Bar
// C:\Foo\Foo C:\Foo\Bar L7, S1 -> ..\Bar
StringBuilder sb = new(); //StringBuilderCache.Acquire(Math.Max(relativeTo.Length, path.Length));
// Add parent segments for segments past the common on the "from" path
if (commonLength < relativeToLength) {
sb.Append("..");
for (int i = commonLength + 1; i < relativeToLength; i++) {
if (PathInternalNetCore.IsDirectorySeparator(relativeTo[i])) {
sb.Append(System.IO.Path.DirectorySeparatorChar);
sb.Append("..");
}
}
} else if (PathInternalNetCore.IsDirectorySeparator(path[commonLength])) {
// No parent segments and we need to eat the initial separator
// (C:\Foo C:\Foo\Bar case)
commonLength++;
}
// Now add the rest of the "to" path, adding back the trailing separator
int differenceLength = pathLength - commonLength;
if (pathEndsInSeparator) {
differenceLength++;
}
if (differenceLength > 0) {
if (sb.Length > 0) {
sb.Append(System.IO.Path.DirectorySeparatorChar);
}
sb.Append(path, commonLength, differenceLength);
}
return sb.ToString(); //StringBuilderCache.GetStringAndRelease(sb);
#else
return System.IO.Path.GetRelativePath(relativeTo, path);
#endif
}
}
}

View File

@@ -0,0 +1,173 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// 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.
#if NETFRAMEWORK
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace ArchiSteamFarm.Compatibility {
internal static class PathInternalNetCore {
private const string ExtendedDevicePathPrefix = @"\\?\";
private const string UncExtendedPathPrefix = @"\\?\UNC\";
internal static StringComparison StringComparison => RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
/// <summary>
/// Returns true if the two paths have the same root
/// </summary>
internal static bool AreRootsEqual(string first, string second, StringComparison comparisonType) {
int firstRootLength = GetRootLength(first);
int secondRootLength = GetRootLength(second);
return (firstRootLength == secondRootLength)
&& (string.Compare(
first,
0,
second,
0,
firstRootLength,
comparisonType
) == 0);
}
/// <summary>
/// Returns true if the path ends in a directory separator.
/// </summary>
internal static bool EndsInDirectorySeparator(string path) => (path.Length > 0) && IsDirectorySeparator(path[^1]);
/// <summary>
/// Get the common path length from the start of the string.
/// </summary>
internal static int GetCommonPathLength(string first, string second, bool ignoreCase) {
int commonChars = EqualStartingCharacterCount(first, second, ignoreCase);
// If nothing matches
if (commonChars == 0) {
return commonChars;
}
// Or we're a full string and equal length or match to a separator
if ((commonChars == first.Length)
&& ((commonChars == second.Length) || IsDirectorySeparator(second[commonChars]))) {
return commonChars;
}
if ((commonChars == second.Length) && IsDirectorySeparator(first[commonChars])) {
return commonChars;
}
// It's possible we matched somewhere in the middle of a segment e.g. C:\Foodie and C:\Foobar.
while ((commonChars > 0) && !IsDirectorySeparator(first[commonChars - 1])) {
commonChars--;
}
return commonChars;
}
/// <summary>
/// True if the given character is a directory separator.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static bool IsDirectorySeparator(char c) => (c == System.IO.Path.DirectorySeparatorChar) || (c == System.IO.Path.AltDirectorySeparatorChar);
/// <summary>
/// Gets the count of common characters from the left optionally ignoring case
/// </summary>
private static unsafe int EqualStartingCharacterCount(string first, string second, bool ignoreCase) {
if (string.IsNullOrEmpty(first) || string.IsNullOrEmpty(second)) {
return 0;
}
int commonChars = 0;
fixed (char* f = first)
fixed (char* s = second) {
char* l = f;
char* r = s;
char* leftEnd = l + first.Length;
char* rightEnd = r + second.Length;
while ((l != leftEnd) && (r != rightEnd)
&& ((*l == *r) || (ignoreCase &&
(char.ToUpperInvariant(*l) == char.ToUpperInvariant(*r))))) {
commonChars++;
l++;
r++;
}
}
return commonChars;
}
/// <summary>
/// Gets the length of the root of the path (drive, share, etc.).
/// </summary>
private static int GetRootLength(string path) {
int i = 0;
int volumeSeparatorLength = 2; // Length to the colon "C:"
int uncRootLength = 2; // Length to the start of the server name "\\"
bool extendedSyntax = path.StartsWith(ExtendedDevicePathPrefix, StringComparison.Ordinal);
bool extendedUncSyntax = path.StartsWith(UncExtendedPathPrefix, StringComparison.Ordinal);
if (extendedSyntax) {
// Shift the position we look for the root from to account for the extended prefix
if (extendedUncSyntax) {
// "\\" -> "\\?\UNC\"
uncRootLength = UncExtendedPathPrefix.Length;
} else {
// "C:" -> "\\?\C:"
volumeSeparatorLength += ExtendedDevicePathPrefix.Length;
}
}
if ((!extendedSyntax || extendedUncSyntax) && (path.Length > 0) && IsDirectorySeparator(path[0])) {
// UNC or simple rooted path (e.g. "\foo", NOT "\\?\C:\foo")
i = 1; // Drive rooted (\foo) is one character
if (extendedUncSyntax || ((path.Length > 1) && IsDirectorySeparator(path[1]))) {
// UNC (\\?\UNC\ or \\), scan past the next two directory separators at most
// (e.g. to \\?\UNC\Server\Share or \\Server\Share\)
i = uncRootLength;
int n = 2; // Maximum separators to skip
while ((i < path.Length) && (!IsDirectorySeparator(path[i]) || (--n > 0))) {
i++;
}
}
} else if ((path.Length >= volumeSeparatorLength) &&
(path[volumeSeparatorLength - 1] == System.IO.Path.VolumeSeparatorChar)) {
// Path is at least longer than where we expect a colon, and has a colon (\\?\A:, A:)
// If the colon is followed by a directory separator, move past it
i = volumeSeparatorLength;
if ((path.Length >= volumeSeparatorLength + 1) && IsDirectorySeparator(path[volumeSeparatorLength])) {
i++;
}
}
return i;
}
}
}
#endif

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,23 +19,24 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using JetBrains.Annotations;
#if NETFRAMEWORK
using Microsoft.AspNetCore.Hosting;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Net.WebSockets;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using ArchiSteamFarm.Localization;
using Microsoft.AspNetCore.Hosting;
#endif
using System;
using System.Diagnostics;
using JetBrains.Annotations;
namespace ArchiSteamFarm {
namespace ArchiSteamFarm.Compatibility {
[PublicAPI]
public static class RuntimeCompatibility {
public static class StaticHelpers {
#if NETFRAMEWORK
private static readonly DateTime SavedProcessStartTime = DateTime.UtcNow;
#endif
@@ -60,92 +61,32 @@ namespace ArchiSteamFarm {
}
}
#pragma warning disable 1998
[PublicAPI]
public static class File {
public static async Task AppendAllTextAsync(string path, string contents) =>
#if NETFRAMEWORK
System.IO.File.AppendAllText(path, contents);
#else
await System.IO.File.AppendAllTextAsync(path, contents).ConfigureAwait(false);
#endif
#pragma warning disable IDE0022
public static void Move(string sourceFileName, string destFileName, bool overwrite) {
#if NETFRAMEWORK
if (overwrite && System.IO.File.Exists(destFileName)) {
System.IO.File.Delete(destFileName);
}
System.IO.File.Move(sourceFileName, destFileName);
#else
System.IO.File.Move(sourceFileName, destFileName, overwrite);
#endif
public static Task<byte[]> ComputeHashAsync(this HashAlgorithm hashAlgorithm, Stream inputStream) {
if (hashAlgorithm == null) {
throw new ArgumentNullException(nameof(hashAlgorithm));
}
#pragma warning restore IDE0022
public static async Task<byte[]> ReadAllBytesAsync(string path) =>
#if NETFRAMEWORK
System.IO.File.ReadAllBytes(path);
#else
await System.IO.File.ReadAllBytesAsync(path).ConfigureAwait(false);
#endif
public static async Task<string> ReadAllTextAsync(string path) =>
#if NETFRAMEWORK
System.IO.File.ReadAllText(path);
#else
await System.IO.File.ReadAllTextAsync(path).ConfigureAwait(false);
#endif
public static async Task WriteAllTextAsync(string path, string contents) =>
#if NETFRAMEWORK
System.IO.File.WriteAllText(path, contents);
#else
await System.IO.File.WriteAllTextAsync(path, contents).ConfigureAwait(false);
#endif
return Task.FromResult(hashAlgorithm.ComputeHash(inputStream));
}
#pragma warning restore 1998
[PublicAPI]
public static class HashCode {
public static int Combine<T1, T2, T3>(T1 value1, T2 value2, T3 value3) =>
#if NETFRAMEWORK
(value1, value2, value3).GetHashCode();
#else
System.HashCode.Combine(value1, value2, value3);
#endif
}
[PublicAPI]
public static class Path {
public static string GetRelativePath(string relativeTo, string path) {
#if NETFRAMEWORK
if (!path.StartsWith(relativeTo, StringComparison.Ordinal)) {
throw new NotImplementedException();
}
string result = path.Substring(relativeTo.Length);
return (result[0] == System.IO.Path.DirectorySeparatorChar) || (result[0] == System.IO.Path.AltDirectorySeparatorChar) ? result.Substring(1) : result;
#else
#pragma warning disable IDE0022
return System.IO.Path.GetRelativePath(relativeTo, path);
#pragma warning restore IDE0022
#endif
}
}
#if NETFRAMEWORK
public static Task<byte[]> ComputeHashAsync(this HashAlgorithm hashAlgorithm, Stream inputStream) => Task.FromResult(hashAlgorithm.ComputeHash(inputStream));
public static IWebHostBuilder ConfigureWebHostDefaults(this IWebHostBuilder builder, Action<IWebHostBuilder> configure) {
if (configure == null) {
throw new ArgumentNullException(nameof(configure));
}
configure(builder);
return builder;
}
public static bool Contains(this string input, string value, StringComparison comparisonType) => input.IndexOf(value, comparisonType) >= 0;
public static bool Contains(this string input, string value, StringComparison comparisonType) {
if (input == null) {
throw new ArgumentNullException(nameof(input));
}
return input.IndexOf(value, comparisonType) >= 0;
}
// ReSharper disable once UseDeconstructionOnParameter - we actually implement deconstruction here
public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> kv, out TKey key, out TValue value) {
@@ -154,15 +95,83 @@ namespace ArchiSteamFarm {
}
public static ValueTask DisposeAsync(this IDisposable disposable) {
if (disposable == null) {
throw new ArgumentNullException(nameof(disposable));
}
disposable.Dispose();
return default(ValueTask);
}
public static async Task<WebSocketReceiveResult> ReceiveAsync(this WebSocket webSocket, byte[] buffer, CancellationToken cancellationToken) => await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken).ConfigureAwait(false);
public static async Task SendAsync(this WebSocket webSocket, byte[] buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) => await webSocket.SendAsync(new ArraySegment<byte>(buffer), messageType, endOfMessage, cancellationToken).ConfigureAwait(false);
public static int IndexOf(this string source, char value, StringComparison comparisonType) {
if (source == null) {
throw new ArgumentNullException(nameof(source));
}
public static string[] Split(this string text, char separator, StringSplitOptions options = StringSplitOptions.None) => text.Split(new[] { separator }, options);
return source.IndexOf(value.ToString(), comparisonType);
}
public static async Task<WebSocketReceiveResult> ReceiveAsync(this WebSocket webSocket, byte[] buffer, CancellationToken cancellationToken) {
if (webSocket == null) {
throw new ArgumentNullException(nameof(webSocket));
}
return await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken).ConfigureAwait(false);
}
public static string Replace(this string source, string oldValue, string? newValue, StringComparison comparisonType) {
if (source == null) {
throw new ArgumentNullException(nameof(source));
}
if (oldValue == null) {
throw new ArgumentNullException(nameof(oldValue));
}
if (oldValue.Length == 0) {
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(oldValue)), nameof(oldValue));
}
int startIndex = 0;
while (true) {
if (source.Length == 0) {
return source;
}
int index = source.IndexOf(oldValue, startIndex, comparisonType);
if (index < 0) {
return source;
}
startIndex = index;
source = source.Remove(index, oldValue.Length);
if (!string.IsNullOrEmpty(newValue)) {
source = source.Insert(index, newValue!);
startIndex += newValue!.Length;
}
}
}
public static async Task SendAsync(this WebSocket webSocket, byte[] buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) {
if (webSocket == null) {
throw new ArgumentNullException(nameof(webSocket));
}
await webSocket.SendAsync(new ArraySegment<byte>(buffer), messageType, endOfMessage, cancellationToken).ConfigureAwait(false);
}
public static string[] Split(this string text, char separator, StringSplitOptions options = StringSplitOptions.None) {
if (text == null) {
throw new ArgumentNullException(nameof(text));
}
return text.Split(new[] { separator }, options);
}
public static void TrimExcess<TKey, TValue>(this Dictionary<TKey, TValue> _) { } // no-op
#endif

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,11 @@
// 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;
#endif
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -39,11 +44,16 @@ using ArchiSteamFarm.IPC;
using ArchiSteamFarm.Localization;
using ArchiSteamFarm.NLog;
using ArchiSteamFarm.Plugins;
using ArchiSteamFarm.Steam;
using ArchiSteamFarm.Steam.Integration;
using ArchiSteamFarm.Storage;
using ArchiSteamFarm.Web;
using ArchiSteamFarm.Web.Responses;
using JetBrains.Annotations;
using SteamKit2;
using SteamKit2.Discovery;
namespace ArchiSteamFarm {
namespace ArchiSteamFarm.Core {
public static class ASF {
// This is based on internal Valve guidelines, we're not using it as a hard limit
private const byte MaximumRecommendedBotsCount = 10;
@@ -68,7 +78,8 @@ namespace ArchiSteamFarm {
internal static ICrossProcessSemaphore? InventorySemaphore { get; private set; }
internal static ICrossProcessSemaphore? LoginRateLimitingSemaphore { get; private set; }
internal static ICrossProcessSemaphore? LoginSemaphore { get; private set; }
internal static ImmutableDictionary<string, (ICrossProcessSemaphore RateLimitingSemaphore, SemaphoreSlim OpenConnectionsSemaphore)>? WebLimitingSemaphores { get; private set; }
internal static ICrossProcessSemaphore? RateLimitingSemaphore { get; private set; }
internal static ImmutableDictionary<Uri, (ICrossProcessSemaphore RateLimitingSemaphore, SemaphoreSlim? OpenConnectionsSemaphore)>? WebLimitingSemaphores { get; private set; }
private static readonly SemaphoreSlim UpdateSemaphore = new(1, 1);
@@ -130,10 +141,12 @@ namespace ArchiSteamFarm {
await RegisterBots().ConfigureAwait(false);
InitEvents();
if (Program.ConfigWatch) {
InitConfigWatchEvents();
}
}
internal static void InitGlobalConfig(GlobalConfig globalConfig) {
internal static async Task InitGlobalConfig(GlobalConfig globalConfig) {
if (globalConfig == null) {
throw new ArgumentNullException(nameof(globalConfig));
}
@@ -152,26 +165,26 @@ namespace ArchiSteamFarm {
if (!string.IsNullOrEmpty(Program.NetworkGroup)) {
using SHA256CryptoServiceProvider hashingAlgorithm = new();
networkGroupText = "-" + BitConverter.ToString(hashingAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(Program.NetworkGroup!))).Replace("-", "");
networkGroupText = "-" + BitConverter.ToString(hashingAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(Program.NetworkGroup!))).Replace("-", "", StringComparison.Ordinal);
} else if (!string.IsNullOrEmpty(globalConfig.WebProxyText)) {
using SHA256CryptoServiceProvider hashingAlgorithm = new();
networkGroupText = "-" + BitConverter.ToString(hashingAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(globalConfig.WebProxyText!))).Replace("-", "");
networkGroupText = "-" + BitConverter.ToString(hashingAlgorithm.ComputeHash(Encoding.UTF8.GetBytes(globalConfig.WebProxyText!))).Replace("-", "", StringComparison.Ordinal);
}
ConfirmationsSemaphore ??= OS.CreateCrossProcessSemaphore(nameof(ConfirmationsSemaphore) + networkGroupText);
GiftsSemaphore ??= OS.CreateCrossProcessSemaphore(nameof(GiftsSemaphore) + networkGroupText);
InventorySemaphore ??= OS.CreateCrossProcessSemaphore(nameof(InventorySemaphore) + networkGroupText);
LoginRateLimitingSemaphore ??= OS.CreateCrossProcessSemaphore(nameof(LoginRateLimitingSemaphore) + networkGroupText);
LoginSemaphore ??= OS.CreateCrossProcessSemaphore(nameof(LoginSemaphore) + networkGroupText);
ConfirmationsSemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(ConfirmationsSemaphore) + networkGroupText).ConfigureAwait(false);
GiftsSemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(GiftsSemaphore) + networkGroupText).ConfigureAwait(false);
InventorySemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(InventorySemaphore) + networkGroupText).ConfigureAwait(false);
LoginRateLimitingSemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(LoginRateLimitingSemaphore) + networkGroupText).ConfigureAwait(false);
LoginSemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(LoginSemaphore) + networkGroupText).ConfigureAwait(false);
RateLimitingSemaphore ??= await PluginsCore.GetCrossProcessSemaphore(nameof(RateLimitingSemaphore) + networkGroupText).ConfigureAwait(false);
WebLimitingSemaphores ??= new Dictionary<string, (ICrossProcessSemaphore RateLimitingSemaphore, SemaphoreSlim OpenConnectionsSemaphore)>(4, StringComparer.OrdinalIgnoreCase) {
{ nameof(ArchiWebHandler), (OS.CreateCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ ArchiWebHandler.SteamCommunityURL, (OS.CreateCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamCommunityURL)), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ ArchiWebHandler.SteamHelpURL, (OS.CreateCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamHelpURL)), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ ArchiWebHandler.SteamStoreURL, (OS.CreateCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamStoreURL)), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ WebAPI.DefaultBaseAddress.Host, (OS.CreateCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(WebAPI)), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) }
}.ToImmutableDictionary(StringComparer.OrdinalIgnoreCase);
WebLimitingSemaphores ??= new Dictionary<Uri, (ICrossProcessSemaphore RateLimitingSemaphore, SemaphoreSlim? OpenConnectionsSemaphore)>(4) {
{ ArchiWebHandler.SteamCommunityURL, (await PluginsCore.GetCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamCommunityURL)).ConfigureAwait(false), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ ArchiWebHandler.SteamHelpURL, (await PluginsCore.GetCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamHelpURL)).ConfigureAwait(false), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ ArchiWebHandler.SteamStoreURL, (await PluginsCore.GetCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(ArchiWebHandler.SteamStoreURL)).ConfigureAwait(false), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) },
{ WebAPI.DefaultBaseAddress, (await PluginsCore.GetCrossProcessSemaphore(nameof(ArchiWebHandler) + networkGroupText + "-" + nameof(WebAPI)).ConfigureAwait(false), new SemaphoreSlim(WebBrowser.MaxConnections, WebBrowser.MaxConnections)) }
}.ToImmutableDictionary();
}
internal static void InitGlobalDatabase(GlobalDatabase globalDatabase) {
@@ -195,7 +208,11 @@ namespace ArchiSteamFarm {
return false;
}
return !botName.Equals(SharedInfo.ASF, StringComparison.OrdinalIgnoreCase);
if (botName.Equals(SharedInfo.ASF, StringComparison.OrdinalIgnoreCase)) {
return false;
}
return Compatibility.Path.GetRelativePath(".", botName) == botName;
}
internal static async Task RestartOrExit() {
@@ -287,7 +304,7 @@ namespace ArchiSteamFarm {
}
// Auto update logic starts here
if (releaseResponse.Assets == null) {
if (releaseResponse.Assets.IsEmpty) {
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateNoAssets);
return null;
@@ -302,7 +319,7 @@ namespace ArchiSteamFarm {
return null;
}
if (string.IsNullOrEmpty(binaryAsset.DownloadURL)) {
if (binaryAsset.DownloadURL == null) {
ArchiLogger.LogNullError(nameof(binaryAsset.DownloadURL));
return null;
@@ -318,7 +335,7 @@ namespace ArchiSteamFarm {
progressReporter.ProgressChanged += OnProgressChanged;
WebBrowser.BinaryResponse? response;
BinaryResponse? response;
try {
response = await WebBrowser.UrlGetToBinary(binaryAsset.DownloadURL!, progressReporter: progressReporter).ConfigureAwait(false);
@@ -326,7 +343,7 @@ namespace ArchiSteamFarm {
progressReporter.ProgressChanged -= OnProgressChanged;
}
if (response?.Content == null) {
if (response == null) {
return null;
}
@@ -338,17 +355,21 @@ namespace ArchiSteamFarm {
ArchiLogger.LogGenericWarningException(e);
}
MemoryStream ms = new(response.Content as byte[] ?? response.Content.ToArray());
try {
#if NETFRAMEWORK
using MemoryStream memoryStream = new(response.Content);
#pragma warning disable CA1508 // False positive, ms is not null here indeed, but using clause is needed for dispose
using (ms) {
#pragma warning restore CA1508 // False positive, ms is not null here indeed, but using clause is needed for dispose
#else
await using MemoryStream memoryStream = new(response.Content);
await using (ms.ConfigureAwait(false)) {
#endif
using ZipArchive zipArchive = new(ms);
using ZipArchive zipArchive = new(memoryStream);
if (!UpdateFromArchive(zipArchive, SharedInfo.HomeDirectory)) {
ArchiLogger.LogGenericError(Strings.WarningFailed);
if (!UpdateFromArchive(zipArchive, SharedInfo.HomeDirectory)) {
ArchiLogger.LogGenericError(Strings.WarningFailed);
}
}
} catch (Exception e) {
ArchiLogger.LogGenericException(e);
@@ -404,8 +425,8 @@ namespace ArchiSteamFarm {
Bot.Init(botsComparer);
}
private static void InitEvents() {
if ((FileSystemWatcher != null) || (LastWriteEvents != null) || !Directory.Exists(SharedInfo.ConfigDirectory)) {
private static void InitConfigWatchEvents() {
if ((FileSystemWatcher != null) || (LastWriteEvents != null)) {
return;
}
@@ -831,7 +852,7 @@ namespace ArchiSteamFarm {
// Ensure that we ask for a list of servers if we don't have any saved servers available
IEnumerable<ServerRecord> servers = await GlobalDatabase.ServerListProvider.FetchServerListAsync().ConfigureAwait(false);
if (servers?.Any() != true) {
if (!servers.Any()) {
ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.Initializing, nameof(SteamDirectory)));
SteamConfiguration steamConfiguration = SteamConfiguration.Create(builder => builder.WithProtocolTypes(GlobalConfig.SteamProtocols).WithCellID(GlobalDatabase.CellID).WithServerListProvider(GlobalDatabase.ServerListProvider).WithHttpClientFactory(() => WebBrowser.GenerateDisposableHttpClient()));
@@ -850,7 +871,7 @@ namespace ArchiSteamFarm {
HashSet<string> botNames;
try {
botNames = Directory.Exists(SharedInfo.ConfigDirectory) ? Directory.EnumerateFiles(SharedInfo.ConfigDirectory, "*" + SharedInfo.JsonConfigExtension).Select(Path.GetFileNameWithoutExtension).Where(botName => !string.IsNullOrEmpty(botName) && IsValidBotName(botName)).ToHashSet(Bot.BotsComparer)! : new HashSet<string>(0);
botNames = Directory.EnumerateFiles(SharedInfo.ConfigDirectory, "*" + SharedInfo.JsonConfigExtension).Select(Path.GetFileNameWithoutExtension).Where(botName => !string.IsNullOrEmpty(botName) && IsValidBotName(botName)).ToHashSet(Bot.BotsComparer)!;
} catch (Exception e) {
ArchiLogger.LogGenericException(e);
@@ -930,7 +951,7 @@ namespace ArchiSteamFarm {
return false;
}
string relativeFilePath = RuntimeCompatibility.Path.GetRelativePath(targetDirectory, file);
string relativeFilePath = Compatibility.Path.GetRelativePath(targetDirectory, file);
if (string.IsNullOrEmpty(relativeFilePath)) {
ArchiLogger.LogNullError(nameof(relativeFilePath));
@@ -975,7 +996,7 @@ namespace ArchiSteamFarm {
Directory.CreateDirectory(targetBackupDirectory);
string targetBackupFile = Path.Combine(targetBackupDirectory, fileName);
RuntimeCompatibility.File.Move(file, targetBackupFile, true);
Compatibility.File.Move(file, targetBackupFile, true);
}
// We can now get rid of directories that are empty
@@ -987,12 +1008,16 @@ namespace ArchiSteamFarm {
// Now enumerate over files in the zip archive, skip directory entries that we're not interested in (we can create them ourselves if needed)
foreach (ZipArchiveEntry zipFile in archive.Entries.Where(zipFile => !string.IsNullOrEmpty(zipFile.Name))) {
string file = Path.Combine(targetDirectory, zipFile.FullName);
string file = Path.GetFullPath(Path.Combine(targetDirectory, zipFile.FullName));
if (!file.StartsWith(targetDirectory, StringComparison.Ordinal)) {
throw new InvalidOperationException(nameof(file));
}
if (File.Exists(file)) {
// This is possible only with files that we decided to leave in place during our backup function
string targetBackupFile = file + ".bak";
RuntimeCompatibility.File.Move(file, targetBackupFile, true);
Compatibility.File.Move(file, targetBackupFile, true);
}
// Check if this file requires its own folder

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,7 +22,7 @@
using System;
using SteamKit2;
namespace ArchiSteamFarm {
namespace ArchiSteamFarm.Core {
internal static class Debugging {
#if DEBUG
internal static bool IsDebugBuild => true;
@@ -30,7 +30,7 @@ namespace ArchiSteamFarm {
internal static bool IsDebugBuild => false;
#endif
internal static bool IsDebugConfigured => ASF.GlobalConfig?.Debug ?? throw new ArgumentNullException(nameof(ASF.GlobalConfig));
internal static bool IsDebugConfigured => ASF.GlobalConfig?.Debug ?? throw new InvalidOperationException(nameof(ASF.GlobalConfig));
internal static bool IsUserDebugging => IsDebugBuild || IsDebugConfigured;

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