mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2025-12-16 06:20:34 +00:00
Compare commits
926 Commits
6.1.0.0
...
d679bf9307
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d679bf9307 | ||
|
|
564d0bf9a4 | ||
|
|
2f848fe585 | ||
|
|
bf34d2e91e | ||
|
|
83e4c7f63a | ||
|
|
1e2e52943d | ||
|
|
4a9ecc52c1 | ||
|
|
10fc914ac1 | ||
|
|
7e9c49cc79 | ||
|
|
ab58886d29 | ||
|
|
a5740a43db | ||
|
|
223f2b98cb | ||
|
|
69b150c8a0 | ||
|
|
f4ea1d44ac | ||
|
|
d02504b914 | ||
|
|
c363af8c3a | ||
|
|
c06a22ec93 | ||
|
|
ed19d7e3bf | ||
|
|
4eee2e2ac7 | ||
|
|
90fe1a9448 | ||
|
|
8c26dcb7c2 | ||
|
|
ba8150b27a | ||
|
|
612b3dd3ef | ||
|
|
a551568f2b | ||
|
|
31615ef64d | ||
|
|
0f0f1bfcd3 | ||
|
|
702e27c466 | ||
|
|
921263674d | ||
|
|
5110d6d9f9 | ||
|
|
5f622128e4 | ||
|
|
6eee3fb4d9 | ||
|
|
0aa777734a | ||
|
|
be789d706b | ||
|
|
03bfc169bb | ||
|
|
12d26bfd60 | ||
|
|
cb31836c34 | ||
|
|
f091707b0d | ||
|
|
f4467fcd38 | ||
|
|
f00b6bfdf1 | ||
|
|
bbfe0e40c5 | ||
|
|
e1e928c4ca | ||
|
|
29cb094430 | ||
|
|
dfd2bd9ac4 | ||
|
|
c65ffa44d9 | ||
|
|
cf84c19a1a | ||
|
|
252e498d8b | ||
|
|
1e3a5a5176 | ||
|
|
c21ca7dbb3 | ||
|
|
f7b5699172 | ||
|
|
2793775f26 | ||
|
|
ab54040d3b | ||
|
|
36225c5b93 | ||
|
|
647dcb5834 | ||
|
|
12e59a649a | ||
|
|
f85c36e8ee | ||
|
|
7e4878a3f1 | ||
|
|
35aeee1b63 | ||
|
|
6f1dffbc01 | ||
|
|
f6ae839a2f | ||
|
|
4d97862ec8 | ||
|
|
84a0b59aba | ||
|
|
1c9a3dbf36 | ||
|
|
4540b4a2da | ||
|
|
1e814a63cc | ||
|
|
f4f70ec802 | ||
|
|
41656011a6 | ||
|
|
f061be0798 | ||
|
|
c0a253213d | ||
|
|
67757178c1 | ||
|
|
03350ce879 | ||
|
|
55bc802d59 | ||
|
|
a436c053a3 | ||
|
|
8547097e78 | ||
|
|
a8d9844b01 | ||
|
|
867b7270ec | ||
|
|
970998fb4b | ||
|
|
1ac4dfd6c8 | ||
|
|
ea2bec2f3e | ||
|
|
ee0eef3761 | ||
|
|
fc7ac69fb1 | ||
|
|
a32e7639ed | ||
|
|
c8e8cd27b8 | ||
|
|
245daec72e | ||
|
|
02d18aecf4 | ||
|
|
469dee4595 | ||
|
|
2e0df5c82b | ||
|
|
677a5503e2 | ||
|
|
566195129f | ||
|
|
b872340c5d | ||
|
|
1c4fba6b2e | ||
|
|
2adb552618 | ||
|
|
59e27bc41d | ||
|
|
5d1234e2d6 | ||
|
|
1f74f9c721 | ||
|
|
fb2dcb04ae | ||
|
|
abdaa38389 | ||
|
|
0830678526 | ||
|
|
cb827c7ab5 | ||
|
|
e7ae287f38 | ||
|
|
ffb5322ecb | ||
|
|
1ec78cf6a2 | ||
|
|
681bd7abcf | ||
|
|
1a906aac74 | ||
|
|
57553fbbb3 | ||
|
|
738d949f1f | ||
|
|
b362408704 | ||
|
|
32238ba07c | ||
|
|
2172f8b9eb | ||
|
|
609b4914bd | ||
|
|
e23e507a68 | ||
|
|
f69ee6364d | ||
|
|
a468f9301d | ||
|
|
efa541d68d | ||
|
|
068ad1b06a | ||
|
|
f3bec05e1f | ||
|
|
a84dc1b01e | ||
|
|
ca4a3ee972 | ||
|
|
1c817426b8 | ||
|
|
5ec9bc14a9 | ||
|
|
67f451069a | ||
|
|
4eb73af250 | ||
|
|
ef60e23a53 | ||
|
|
2b57d0a9e6 | ||
|
|
ae183ae3ad | ||
|
|
725a3a5106 | ||
|
|
289f573b00 | ||
|
|
a8a6e658e2 | ||
|
|
797bb6fc98 | ||
|
|
41f61503fb | ||
|
|
764c979560 | ||
|
|
a0531ff1f3 | ||
|
|
30d5a4cdc2 | ||
|
|
750ff1a09a | ||
|
|
c5cc247e2d | ||
|
|
813bac5e52 | ||
|
|
267cf1597e | ||
|
|
4716312c3f | ||
|
|
31b735c3d3 | ||
|
|
e9baae4d03 | ||
|
|
f97142200f | ||
|
|
34bc25b023 | ||
|
|
ede24b9fd5 | ||
|
|
c656b61ce2 | ||
|
|
3fb804fbd1 | ||
|
|
eb5f126c76 | ||
|
|
815d0732c3 | ||
|
|
a517cf216d | ||
|
|
e5a6eede24 | ||
|
|
7a3c28f3f6 | ||
|
|
49381cea84 | ||
|
|
9afa92a22d | ||
|
|
6719903012 | ||
|
|
2f0047e6c0 | ||
|
|
71a708b515 | ||
|
|
50b9011323 | ||
|
|
e4bd4e2371 | ||
|
|
f662dc29ed | ||
|
|
e4ffd5c6ab | ||
|
|
588bc9e691 | ||
|
|
3e98887954 | ||
|
|
78319f65eb | ||
|
|
c467fd39c1 | ||
|
|
896bd82f97 | ||
|
|
3a87d7536b | ||
|
|
1b245a568f | ||
|
|
95eb6b2c63 | ||
|
|
616d5d2cdb | ||
|
|
9e1edc58ab | ||
|
|
7df227b584 | ||
|
|
be0f2ab537 | ||
|
|
885c679033 | ||
|
|
0575e714ae | ||
|
|
d1f3074c90 | ||
|
|
3f3a3b161b | ||
|
|
c5af29ddde | ||
|
|
40dd6100ab | ||
|
|
42cd1a85d9 | ||
|
|
c196b46337 | ||
|
|
e5e133475b | ||
|
|
67d191bbf3 | ||
|
|
c9502f8462 | ||
|
|
3dbc3b1c5a | ||
|
|
c54928bb64 | ||
|
|
d40d7f0566 | ||
|
|
b73ddab2e2 | ||
|
|
069523adcd | ||
|
|
fc310ee24c | ||
|
|
b53d9a0f6f | ||
|
|
035ff7dfe7 | ||
|
|
2bbf197108 | ||
|
|
5d2665207a | ||
|
|
8618b01800 | ||
|
|
d59d51ae33 | ||
|
|
a313a19cec | ||
|
|
c5f7565ac0 | ||
|
|
f52486528b | ||
|
|
d17399d98b | ||
|
|
1eadaad9bd | ||
|
|
22e424a78c | ||
|
|
712b57e46b | ||
|
|
bc914f0a09 | ||
|
|
1da2ccbb1c | ||
|
|
c58d802c30 | ||
|
|
8cdd5c69e6 | ||
|
|
2b61e80336 | ||
|
|
d831c47fcd | ||
|
|
53955cb9d2 | ||
|
|
2d9c68c10a | ||
|
|
c987db7941 | ||
|
|
b1d4eb5c8c | ||
|
|
c929efbf24 | ||
|
|
0c3f379fb3 | ||
|
|
2d79ae9e7a | ||
|
|
d0ac9b3a94 | ||
|
|
719824b518 | ||
|
|
f6f290878a | ||
|
|
4ee9bfc450 | ||
|
|
d3f45fc33d | ||
|
|
ee4cefc813 | ||
|
|
4b7f570ba5 | ||
|
|
6981018003 | ||
|
|
380f27a0bc | ||
|
|
d489bebb85 | ||
|
|
2df1c439c4 | ||
|
|
83ac485f19 | ||
|
|
1c6bf2e828 | ||
|
|
bfdab76d71 | ||
|
|
90dba00c07 | ||
|
|
1d38521819 | ||
|
|
bc8b56018d | ||
|
|
073b22de40 | ||
|
|
8bc8efe6c0 | ||
|
|
fe80d3029b | ||
|
|
86410d4407 | ||
|
|
aba19cf986 | ||
|
|
0a2ca64bf7 | ||
|
|
4761393e88 | ||
|
|
298026491a | ||
|
|
2fe2c47289 | ||
|
|
2d968c6c14 | ||
|
|
0708a4a1e2 | ||
|
|
d2c234db1f | ||
|
|
d2b7ffba3b | ||
|
|
ff2a2a728d | ||
|
|
2b43cec8fe | ||
|
|
6359014017 | ||
|
|
d305c3d6e5 | ||
|
|
9b5c5f39a4 | ||
|
|
627f88508a | ||
|
|
6e6f2c5675 | ||
|
|
7d5aaed8fb | ||
|
|
eac98c4846 | ||
|
|
f048513338 | ||
|
|
4780031b87 | ||
|
|
f54d30ff42 | ||
|
|
17e97afb97 | ||
|
|
d79db74385 | ||
|
|
c412a47139 | ||
|
|
2387f2462e | ||
|
|
6bd2e088fc | ||
|
|
b4874a05c6 | ||
|
|
a77586ec95 | ||
|
|
ed9efe8d72 | ||
|
|
f7431b0b10 | ||
|
|
a340de9da8 | ||
|
|
bf11cf8a7b | ||
|
|
b4dc8b493a | ||
|
|
ce1cf6f4b1 | ||
|
|
8d6422e8b4 | ||
|
|
b3c28266cb | ||
|
|
074f2e343f | ||
|
|
8f6f7334a0 | ||
|
|
b467c22baa | ||
|
|
15d3dd8c74 | ||
|
|
2010f3e455 | ||
|
|
cc95917d53 | ||
|
|
f918fbb504 | ||
|
|
6d4d644900 | ||
|
|
a046af7b8d | ||
|
|
bde00df3ad | ||
|
|
d1080bbb42 | ||
|
|
875d9be7e5 | ||
|
|
e683b3b9ad | ||
|
|
199e098704 | ||
|
|
b4cdfa3011 | ||
|
|
92bfeb96e2 | ||
|
|
f4c9c9de1a | ||
|
|
e60293a0ce | ||
|
|
5659818313 | ||
|
|
1de5bfd809 | ||
|
|
0fa3b25f12 | ||
|
|
02f505d962 | ||
|
|
abdb303069 | ||
|
|
c1e5cd5d59 | ||
|
|
7ea0dda562 | ||
|
|
947e63fc61 | ||
|
|
882e561416 | ||
|
|
1e531a7259 | ||
|
|
2967ae167b | ||
|
|
089840438d | ||
|
|
bcd9ae047e | ||
|
|
20de66a3be | ||
|
|
7587f5f07a | ||
|
|
4ad450f0ba | ||
|
|
2883f42a19 | ||
|
|
d788efbaf6 | ||
|
|
ca0bd87357 | ||
|
|
e246d0dfa0 | ||
|
|
f93c319427 | ||
|
|
eb591e3b4a | ||
|
|
37d7f14148 | ||
|
|
86b1814698 | ||
|
|
d15fae3674 | ||
|
|
6d3a6168d2 | ||
|
|
0467dc1da3 | ||
|
|
d81e8d2de0 | ||
|
|
ec59e2e556 | ||
|
|
cfdb8c06f3 | ||
|
|
32bf5cd0a7 | ||
|
|
a0401a3962 | ||
|
|
4def44ed1e | ||
|
|
bd472b68a1 | ||
|
|
142bac7275 | ||
|
|
80d4ab1dea | ||
|
|
481c995481 | ||
|
|
76e3059b34 | ||
|
|
9c6157563e | ||
|
|
c362900290 | ||
|
|
1573707d39 | ||
|
|
acce592f02 | ||
|
|
24cc03e4ed | ||
|
|
aec1f45023 | ||
|
|
e208a3cce0 | ||
|
|
2f275e19bd | ||
|
|
ac8f12f438 | ||
|
|
c14580965f | ||
|
|
436a5ab3f9 | ||
|
|
3e1fde4515 | ||
|
|
9beec69e85 | ||
|
|
a1116a87df | ||
|
|
cd4bc01d66 | ||
|
|
7e30601246 | ||
|
|
708b3792c9 | ||
|
|
3c52408579 | ||
|
|
ea5f729d58 | ||
|
|
4d3f7f0b5a | ||
|
|
078f6eabdd | ||
|
|
6d6da98e8c | ||
|
|
49f1910425 | ||
|
|
4ba034f988 | ||
|
|
e93ea74def | ||
|
|
5dadbe9090 | ||
|
|
e3c1a8c5fb | ||
|
|
8e50e9553a | ||
|
|
ed47c8268b | ||
|
|
e0cdeaf09e | ||
|
|
fc198d6eae | ||
|
|
977816baa9 | ||
|
|
758c0a0385 | ||
|
|
e4d7e9dda7 | ||
|
|
baadfee9e0 | ||
|
|
25620603b5 | ||
|
|
a5e306ccae | ||
|
|
e09801442e | ||
|
|
08fb3ccb76 | ||
|
|
e9887cf89e | ||
|
|
de33bd057f | ||
|
|
e04d37a694 | ||
|
|
6e7a1ea09b | ||
|
|
08b2c3186d | ||
|
|
6ca3989635 | ||
|
|
c3019bed16 | ||
|
|
7f5615d109 | ||
|
|
43c76dc1af | ||
|
|
89deff7e06 | ||
|
|
d536f7f56c | ||
|
|
8f43575a19 | ||
|
|
53adc67be1 | ||
|
|
e4addcadc8 | ||
|
|
c48c1e6acd | ||
|
|
cd2baa25c8 | ||
|
|
93e19d0f82 | ||
|
|
a8527dee70 | ||
|
|
b209be1618 | ||
|
|
fa55d9f402 | ||
|
|
c1aeb0b0a1 | ||
|
|
6e2bd99600 | ||
|
|
a99c1f93e1 | ||
|
|
abc2e2be69 | ||
|
|
7aff1f857b | ||
|
|
e47a94aeaa | ||
|
|
12730e6cb5 | ||
|
|
9909a211a4 | ||
|
|
32591514de | ||
|
|
05f65e0d9d | ||
|
|
353b032efd | ||
|
|
fb16a9e50c | ||
|
|
32165af41d | ||
|
|
3860d8d2fc | ||
|
|
dd6a8cdb80 | ||
|
|
27562e52ef | ||
|
|
693c9d67dc | ||
|
|
71cd68d38f | ||
|
|
624283cee7 | ||
|
|
0bf9d2f040 | ||
|
|
c01d893b6b | ||
|
|
3b9d5c7ab6 | ||
|
|
05d5d90e3e | ||
|
|
53b84a9271 | ||
|
|
44688a4ce8 | ||
|
|
908f7f5ccb | ||
|
|
79c3ce14e8 | ||
|
|
d8d0b1deb8 | ||
|
|
22b9f92663 | ||
|
|
0900480e62 | ||
|
|
6b41f91543 | ||
|
|
708de736e0 | ||
|
|
816b23e277 | ||
|
|
b1e472879f | ||
|
|
714f734e58 | ||
|
|
4f279f1068 | ||
|
|
e2194894ce | ||
|
|
6bfc7d5c7f | ||
|
|
0018da8f8e | ||
|
|
a4ddac5039 | ||
|
|
839bc06f88 | ||
|
|
2a1228c949 | ||
|
|
921d56a13d | ||
|
|
9fa1549e09 | ||
|
|
e0d19e256f | ||
|
|
18e8bf56e6 | ||
|
|
83500b7af5 | ||
|
|
548e8af27b | ||
|
|
54afced00a | ||
|
|
b89967ecac | ||
|
|
130a25deaa | ||
|
|
bc52dad3f5 | ||
|
|
4ce75e3ab0 | ||
|
|
a681b31630 | ||
|
|
9777e87b0f | ||
|
|
8647201b1e | ||
|
|
543d3f2f85 | ||
|
|
0cd02d8de8 | ||
|
|
e93a486a85 | ||
|
|
2225903719 | ||
|
|
a854ba3ddf | ||
|
|
bededf4bec | ||
|
|
2fcb35e46c | ||
|
|
120509a02e | ||
|
|
6aca3ea0cc | ||
|
|
93ab09f6c5 | ||
|
|
c9fe2eb1d5 | ||
|
|
5d4666d538 | ||
|
|
44549e2b2a | ||
|
|
b20f8adb5f | ||
|
|
0983ef309f | ||
|
|
8a24c037ed | ||
|
|
dad1d7fda9 | ||
|
|
cce7c1c7c8 | ||
|
|
ac209cfefb | ||
|
|
62e9058966 | ||
|
|
21a202e47d | ||
|
|
274c63c166 | ||
|
|
207d10c2be | ||
|
|
9dc220e0d5 | ||
|
|
73f0cf23f8 | ||
|
|
0b24380b2e | ||
|
|
ff485845bf | ||
|
|
198e408ba4 | ||
|
|
2f5f4661c2 | ||
|
|
430dad82db | ||
|
|
9fce02c2ef | ||
|
|
9d2d7e33e3 | ||
|
|
fc390e0b4c | ||
|
|
2d3fbf3080 | ||
|
|
b7152bfb0a | ||
|
|
b3f216d25d | ||
|
|
1caa12c7e8 | ||
|
|
94e3a9a5f8 | ||
|
|
9cf20708e6 | ||
|
|
c60b7b0252 | ||
|
|
3477bcefc3 | ||
|
|
549a76ee7e | ||
|
|
6c32cebe83 | ||
|
|
d30d4d202a | ||
|
|
d545622d0c | ||
|
|
f33016d523 | ||
|
|
8a531262e7 | ||
|
|
cf0dd510c2 | ||
|
|
d735d1bda8 | ||
|
|
e4dc83fc86 | ||
|
|
13263a8d1e | ||
|
|
3e06b5f8c8 | ||
|
|
857fc6a3c6 | ||
|
|
ad461e5b8c | ||
|
|
5464ef4353 | ||
|
|
e8f4737e81 | ||
|
|
1dcaf98774 | ||
|
|
e081267a9b | ||
|
|
6ec7f4609a | ||
|
|
0bef5ccfa9 | ||
|
|
512545b657 | ||
|
|
390d9ac57c | ||
|
|
10abfb847f | ||
|
|
a19611c3ae | ||
|
|
44840aa0ff | ||
|
|
f0945efd3a | ||
|
|
cba29bb2c5 | ||
|
|
08c9636cd9 | ||
|
|
d940c4ac82 | ||
|
|
208e844c97 | ||
|
|
9f808a42a3 | ||
|
|
cf9a578815 | ||
|
|
449f3556a7 | ||
|
|
a3736d6cd6 | ||
|
|
f975af721e | ||
|
|
e23dfe7846 | ||
|
|
255a72e2ae | ||
|
|
de3aa36b1f | ||
|
|
ea844f6501 | ||
|
|
9bbdc5f8d9 | ||
|
|
0644e634e7 | ||
|
|
66774631e7 | ||
|
|
735982ce4e | ||
|
|
0c207b4e2f | ||
|
|
cf5d7fd192 | ||
|
|
a19aadd826 | ||
|
|
f62da0e273 | ||
|
|
af6f9466a8 | ||
|
|
2ee53d8318 | ||
|
|
b6a5989770 | ||
|
|
193811cb9b | ||
|
|
0c23177455 | ||
|
|
c525ca5642 | ||
|
|
e4a726672d | ||
|
|
a897615d0e | ||
|
|
3e5ffe10b7 | ||
|
|
13131c769c | ||
|
|
449050b6df | ||
|
|
01b5251a39 | ||
|
|
6b6c976061 | ||
|
|
eeed61a9f6 | ||
|
|
4afe7654af | ||
|
|
acdd504a7c | ||
|
|
65c9477bb9 | ||
|
|
eaa11c76ab | ||
|
|
2ba0eb77ad | ||
|
|
3761e07c6d | ||
|
|
c787c8ece7 | ||
|
|
f8e8e2c8a4 | ||
|
|
3960ec16b4 | ||
|
|
ddb04b97a8 | ||
|
|
868d593c5c | ||
|
|
e6a5524cbc | ||
|
|
cf179878ae | ||
|
|
394f10f384 | ||
|
|
df814b1acb | ||
|
|
b7439693fc | ||
|
|
c009fc8dc8 | ||
|
|
cf62c0802f | ||
|
|
5f19372429 | ||
|
|
adf2eccc9c | ||
|
|
ce463bf780 | ||
|
|
31fe442476 | ||
|
|
45daa46cf9 | ||
|
|
83c12f5636 | ||
|
|
1683729772 | ||
|
|
21cd3d8dbb | ||
|
|
4b34905358 | ||
|
|
c0214f16fc | ||
|
|
458cb95422 | ||
|
|
ef844c168c | ||
|
|
96e5924c0c | ||
|
|
d20fa79897 | ||
|
|
f1a49cdff0 | ||
|
|
baa1339573 | ||
|
|
53802829b6 | ||
|
|
ee7866590f | ||
|
|
94cb4e4e0a | ||
|
|
78e5ab2cbb | ||
|
|
a52bf7774c | ||
|
|
4aed278f9c | ||
|
|
1631e1687b | ||
|
|
4738171fd3 | ||
|
|
001eabe25d | ||
|
|
3d535c4c72 | ||
|
|
f59a3ca233 | ||
|
|
d3134afc5a | ||
|
|
39bf821f78 | ||
|
|
5324dad0c6 | ||
|
|
ab92bbf3d3 | ||
|
|
63a481629e | ||
|
|
d44d075b20 | ||
|
|
030d71c52a | ||
|
|
2fe0a2635e | ||
|
|
ae45f474e3 | ||
|
|
33e98a995e | ||
|
|
92b0e4bfb6 | ||
|
|
2403ac17dc | ||
|
|
ca74047828 | ||
|
|
21e951092d | ||
|
|
3ba97b49ba | ||
|
|
5e739e483e | ||
|
|
992a4563c2 | ||
|
|
3e9e1cb6ed | ||
|
|
61f876480a | ||
|
|
c2b1d1356c | ||
|
|
d5ac569a6a | ||
|
|
0b1ddd39d5 | ||
|
|
cbe0502154 | ||
|
|
816914dd10 | ||
|
|
bcb4320f5d | ||
|
|
bc4d5d37ff | ||
|
|
1996763751 | ||
|
|
99a0a5cc48 | ||
|
|
63c91d2d19 | ||
|
|
d6be6cf435 | ||
|
|
8f7f9a27ee | ||
|
|
b776d4d882 | ||
|
|
63c81c2403 | ||
|
|
ad9a77ff19 | ||
|
|
2e17a15d60 | ||
|
|
3fae20673b | ||
|
|
5b36c1c286 | ||
|
|
4fc4d011f2 | ||
|
|
91aa9754bb | ||
|
|
a6ba407ebf | ||
|
|
1cdb128c6b | ||
|
|
38ca6b7642 | ||
|
|
65c7a60c92 | ||
|
|
77c802ee5f | ||
|
|
a8f23159f4 | ||
|
|
ee8a7a6f61 | ||
|
|
4a612b9436 | ||
|
|
4d89995016 | ||
|
|
368c453504 | ||
|
|
1694851395 | ||
|
|
1ed4f3f456 | ||
|
|
588d49eeb9 | ||
|
|
22d4f22da6 | ||
|
|
ced640f024 | ||
|
|
7b8804b53c | ||
|
|
5d25742faf | ||
|
|
4460b18c5e | ||
|
|
cb5eb499d9 | ||
|
|
9382c6d390 | ||
|
|
7cd091cfa2 | ||
|
|
961dc4cf5d | ||
|
|
f77193dc48 | ||
|
|
a4b31d2cdc | ||
|
|
83b3edae86 | ||
|
|
ebc4601ed4 | ||
|
|
a478c02967 | ||
|
|
aac1f81704 | ||
|
|
100b85abe0 | ||
|
|
bb52122db1 | ||
|
|
397b36c557 | ||
|
|
77b041ea67 | ||
|
|
b1d896ae70 | ||
|
|
8f5157d8dd | ||
|
|
c5cf5f70c8 | ||
|
|
88f7856c9b | ||
|
|
d843d1d5b1 | ||
|
|
921b416374 | ||
|
|
c2eac39145 | ||
|
|
467dbf723d | ||
|
|
9460b476dd | ||
|
|
16fb5a7d98 | ||
|
|
c17da5951d | ||
|
|
66a959d21c | ||
|
|
480037b84b | ||
|
|
fa7867ab18 | ||
|
|
0c5cdfae0a | ||
|
|
7e5f82d65b | ||
|
|
9753b36769 | ||
|
|
fd2c1e8c24 | ||
|
|
e5c9defac8 | ||
|
|
33c8c0f0d6 | ||
|
|
197b41d96f | ||
|
|
52a8bcbbfe | ||
|
|
e102b6c565 | ||
|
|
f899508253 | ||
|
|
ab20d5fccf | ||
|
|
3c9827b1e1 | ||
|
|
9636fa1da1 | ||
|
|
b5ad577821 | ||
|
|
ca483a91f3 | ||
|
|
49e904c25a | ||
|
|
9a0c0bfff5 | ||
|
|
2ed1214d37 | ||
|
|
adf417e2f1 | ||
|
|
ab333dc0b3 | ||
|
|
3f079a8fea | ||
|
|
90db25e4de | ||
|
|
ec793e22a1 | ||
|
|
c76f6caa2b | ||
|
|
60245d5399 | ||
|
|
8fb2ec61b4 | ||
|
|
4a939ad607 | ||
|
|
ba1be3df10 | ||
|
|
93333f0ece | ||
|
|
dcde5d9d54 | ||
|
|
52af5c85f0 | ||
|
|
d47f17c7ad | ||
|
|
8533659b74 | ||
|
|
2f658a3d4e | ||
|
|
2c31b5f11f | ||
|
|
c66bd6259c | ||
|
|
145c64389d | ||
|
|
23263e634e | ||
|
|
2074865a7c | ||
|
|
4cb9f54204 | ||
|
|
78b1d7de0f | ||
|
|
c296790226 | ||
|
|
d7fec15597 | ||
|
|
f33fda8313 | ||
|
|
62ce58e148 | ||
|
|
db70633721 | ||
|
|
8c62b01d19 | ||
|
|
5f3b2c9a0d | ||
|
|
1afac53318 | ||
|
|
78d2ff1645 | ||
|
|
31082e0184 | ||
|
|
7e942d6481 | ||
|
|
af0659595e | ||
|
|
89962bd393 | ||
|
|
c71fe556a3 | ||
|
|
4c88e098c6 | ||
|
|
8069c19eef | ||
|
|
91fd6a1014 | ||
|
|
18be38352f | ||
|
|
e5029c983c | ||
|
|
e8bbaabc01 | ||
|
|
e62e3be68a | ||
|
|
3c48bc1756 | ||
|
|
00a02f2be4 | ||
|
|
2c09757086 | ||
|
|
73a4e8acd3 | ||
|
|
7b98fea247 | ||
|
|
3cf25f6385 | ||
|
|
69d666b24d | ||
|
|
0a234166f6 | ||
|
|
68d63853f4 | ||
|
|
f3551594c3 | ||
|
|
6effcc0d4f | ||
|
|
1e3f535330 | ||
|
|
0a2ce30c82 | ||
|
|
dd37914703 | ||
|
|
67c2e9c6d3 | ||
|
|
ec151c383b | ||
|
|
05079eb941 | ||
|
|
38ebfc9345 | ||
|
|
fc4f4092f2 | ||
|
|
59f00714d6 | ||
|
|
7d84599d0a | ||
|
|
da1e49ffde | ||
|
|
30498df864 | ||
|
|
9ad08bd028 | ||
|
|
70d190488f | ||
|
|
274136e3e1 | ||
|
|
9b81c390bf | ||
|
|
c649edf051 | ||
|
|
7bb1528e78 | ||
|
|
b8fb66c7fe | ||
|
|
075a234e14 | ||
|
|
7e6a79dac2 | ||
|
|
ff6473dbe6 | ||
|
|
ac01cca55e | ||
|
|
2a66fce878 | ||
|
|
9d5d6b792d | ||
|
|
7927ff859f | ||
|
|
f2992fa6dd | ||
|
|
af27952ced | ||
|
|
2f92a80bd6 | ||
|
|
786dc16bbd | ||
|
|
947ed6234e | ||
|
|
6e8ee64918 | ||
|
|
ce0d423497 | ||
|
|
851c8bdbf8 | ||
|
|
9ed6586b93 | ||
|
|
fcb965e492 | ||
|
|
32cde62815 | ||
|
|
d83e4fceca | ||
|
|
af1d017123 | ||
|
|
3759e906cc | ||
|
|
764ec31559 | ||
|
|
b3754fc32c | ||
|
|
4780aa7601 | ||
|
|
7c67a7409f | ||
|
|
db9969558f | ||
|
|
78fd2ae333 | ||
|
|
6f4337c91e | ||
|
|
a92430b4f0 | ||
|
|
f18a1d584d | ||
|
|
1302fd8984 | ||
|
|
289010ba88 | ||
|
|
99f994b4b5 | ||
|
|
cd63f14f97 | ||
|
|
b38748de18 | ||
|
|
730814f4f6 | ||
|
|
ccec47c8bd | ||
|
|
90ae809bbe | ||
|
|
30a48b08fe | ||
|
|
9e207025c5 | ||
|
|
3f98337459 | ||
|
|
8c9cf69353 | ||
|
|
d9b4bd5aca | ||
|
|
96407018fb | ||
|
|
1f78dbb553 | ||
|
|
3ef582ef84 | ||
|
|
5be6e8ccda | ||
|
|
12cea2303c | ||
|
|
ab11e10c5c | ||
|
|
a97d761f46 | ||
|
|
7bf2dab4d0 | ||
|
|
13567d4aaa | ||
|
|
c4ef7e6872 | ||
|
|
bf83b4807d | ||
|
|
69b3e460ef | ||
|
|
6aa32cdd32 | ||
|
|
626f3c6a0a | ||
|
|
5f34a16dd7 | ||
|
|
4beff6fc22 | ||
|
|
cb08e05d62 | ||
|
|
fca28d30cd | ||
|
|
7df37649b7 | ||
|
|
ba68d1010f | ||
|
|
711cda2d90 | ||
|
|
b5039d6308 | ||
|
|
89bea12f9b | ||
|
|
53d7876d47 | ||
|
|
a0a8018527 | ||
|
|
475daf5183 | ||
|
|
b6597ce468 | ||
|
|
61fdbcfa9f | ||
|
|
f7f7dbdab8 | ||
|
|
267384ad59 | ||
|
|
7dc3d16666 | ||
|
|
b251598ca4 | ||
|
|
96279a96bb | ||
|
|
328a3748f5 | ||
|
|
5b30a29e09 | ||
|
|
c97fbe4256 | ||
|
|
713971ced6 | ||
|
|
b28c3e368e | ||
|
|
d5045ce737 | ||
|
|
4acb6eda07 | ||
|
|
74aeb89afa | ||
|
|
545d15c4c6 | ||
|
|
054a317777 | ||
|
|
dd7ae5801d | ||
|
|
d3d003b00e | ||
|
|
c3b431d573 | ||
|
|
865668f6b1 | ||
|
|
2f15569ddc | ||
|
|
6c2fd10b2f | ||
|
|
7dee5b9998 | ||
|
|
1f1dcbe39c | ||
|
|
acd081775d | ||
|
|
0db414d608 | ||
|
|
09d715c03d | ||
|
|
b776aa48cd | ||
|
|
d4eef759fb | ||
|
|
c1005134b0 | ||
|
|
fc525c5619 | ||
|
|
1f27cb37f2 | ||
|
|
58f2b8e45c | ||
|
|
57c8533303 | ||
|
|
aa1302c058 | ||
|
|
ac31004074 | ||
|
|
755ab226c3 | ||
|
|
78195e6913 | ||
|
|
0f48b92b47 | ||
|
|
3de504192b | ||
|
|
eea71a9ecf | ||
|
|
b9b93caf50 | ||
|
|
d06e69055a | ||
|
|
6f528990c3 | ||
|
|
46c720ae23 | ||
|
|
a8982581b7 | ||
|
|
d21912dcd9 | ||
|
|
f74e6bff39 | ||
|
|
9bad87c576 | ||
|
|
af6354c62a | ||
|
|
9621339ac4 | ||
|
|
ecf00aded6 | ||
|
|
3b04524dbc | ||
|
|
5f86d7fca0 | ||
|
|
d85945e664 | ||
|
|
82f1ded4a1 | ||
|
|
00393279ed | ||
|
|
4fc72bf56e | ||
|
|
d373cfb9ae | ||
|
|
90ead36184 | ||
|
|
a4e46d9451 | ||
|
|
ea53975acf | ||
|
|
29709abc62 | ||
|
|
26b09f3f8a | ||
|
|
c98a177909 | ||
|
|
57ceba2134 | ||
|
|
1801f8d62a | ||
|
|
840cf03441 | ||
|
|
8de27db858 | ||
|
|
ba3b49cfbd | ||
|
|
df94dee4cd | ||
|
|
9dbd835600 | ||
|
|
c714dcdd69 | ||
|
|
d291b9479d | ||
|
|
ddf6bb29bf | ||
|
|
4f38b8174d | ||
|
|
4abb2cf526 | ||
|
|
837ca6a805 | ||
|
|
08eebdf24f | ||
|
|
2d4ee1c9f8 | ||
|
|
448cdda23d | ||
|
|
ccbb830538 | ||
|
|
bdb94b8f0b | ||
|
|
0f4626557e | ||
|
|
0c091ea5a5 | ||
|
|
cdaa1a6374 | ||
|
|
857c81e0bc | ||
|
|
6ab1e40826 | ||
|
|
8aa017050e | ||
|
|
b1b04b3ebe | ||
|
|
4fc277221e | ||
|
|
082beb5763 |
@@ -122,9 +122,6 @@ dotnet_code_quality.ca3012.excluded_symbol_names = BotController|CommandControll
|
||||
|
||||
dotnet_code_quality_unused_parameters = all:warning
|
||||
|
||||
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
|
||||
|
||||
2
.github/RELEASE_TEMPLATE.md
vendored
2
.github/RELEASE_TEMPLATE.md
vendored
@@ -16,4 +16,4 @@ ASF is available for free, this release was made possible thanks to the people t
|
||||
|
||||
[](https://github.com/sponsors/JustArchi) [](https://paypal.me/JustArchi) [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4) [](https://pay.revolut.com/justarchi) [](https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_)
|
||||
|
||||
[](https://www.blockchain.com/explorer/addresses/btc/3HwcgZbtoF5vSxJkNUvThVSJipKi7r5EqU) [](https://www.blockchain.com/explorer/addresses/eth/0xA1F7Ba62C5a3A8b93Fe6656936192432F328a366) [](https://live.blockcypher.com/ltc/address/MJCeBEZUsNgDhRhqbLFfPiDcf7CSrdvmZ3) [](https://etherscan.io/address/0xCf42D9F53F974CBd7c304eF0243CAe8e029885A8) [](https://etherscan.io/address/0x985FDdD3AD00838A2049B07A33b783104d60f776)
|
||||
[](https://www.blockchain.com/explorer/addresses/btc/3HwcgZbtoF5vSxJkNUvThVSJipKi7r5EqU) [](https://www.blockchain.com/explorer/addresses/eth/0xA1F7Ba62C5a3A8b93Fe6656936192432F328a366) [](https://live.blockcypher.com/ltc/address/MJCeBEZUsNgDhRhqbLFfPiDcf7CSrdvmZ3) [](https://etherscan.io/address/0xCf42D9F53F974CBd7c304eF0243CAe8e029885A8)
|
||||
|
||||
3
.github/qodana.yaml
vendored
3
.github/qodana.yaml
vendored
@@ -10,6 +10,9 @@ exclude:
|
||||
- ArchiSteamFarm.OfficialPlugins.MobileAuthenticator/Localization
|
||||
- ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization
|
||||
- name: AsyncVoidMethod
|
||||
- name: CA1515
|
||||
paths:
|
||||
- ArchiSteamFarm
|
||||
- name: InternalOrPrivateMemberNotDocumented
|
||||
- name: InvertIf
|
||||
- name: NullableWarningSuppressionIsUsed
|
||||
|
||||
15
.github/renovate.json5
vendored
15
.github/renovate.json5
vendored
@@ -1,7 +1,8 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
|
||||
"extends": [
|
||||
"config:base",
|
||||
"config:best-practices",
|
||||
":assignee(JustArchi)",
|
||||
":automergeBranch",
|
||||
":automergeDigest",
|
||||
@@ -10,7 +11,17 @@
|
||||
":disableRateLimiting",
|
||||
":label(🤖 Automatic)"
|
||||
],
|
||||
|
||||
"git-submodules": {
|
||||
"enabled": true
|
||||
}
|
||||
},
|
||||
|
||||
"packageRules": [
|
||||
{
|
||||
// TODO: Allow updates of selected packages with no stable release (yet) to latest versions
|
||||
"matchManagers": [ "nuget" ],
|
||||
"matchPackageNames": [ "Microsoft.CodeAnalysis.ResxSourceGenerator", "OpenTelemetry.Exporter.Prometheus.AspNetCore" ],
|
||||
"ignoreUnstable": false
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
||||
env:
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||
DOTNET_NOLOGO: true
|
||||
DOTNET_SDK_VERSION: 9.0
|
||||
DOTNET_SDK_VERSION: 10.0
|
||||
|
||||
permissions: {}
|
||||
|
||||
@@ -15,19 +15,19 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
configuration: [Debug, Release]
|
||||
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||
os: [macos-latest, macos-15-intel, ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET Core
|
||||
uses: actions/setup-dotnet@v4.1.0
|
||||
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
||||
|
||||
@@ -38,4 +38,4 @@ jobs:
|
||||
run: dotnet build -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
|
||||
|
||||
- name: Run ${{ matrix.configuration }} ArchiSteamFarm.Tests
|
||||
run: dotnet test ArchiSteamFarm.Tests -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
|
||||
run: dotnet test ArchiSteamFarm.Tests -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --filter TestCategory!=Manual --nologo
|
||||
|
||||
39
.github/workflows/code-quality.yml
vendored
39
.github/workflows/code-quality.yml
vendored
@@ -1,39 +0,0 @@
|
||||
name: ASF-code-quality
|
||||
|
||||
on:
|
||||
- push
|
||||
|
||||
env:
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||
DOTNET_NOLOGO: true
|
||||
|
||||
permissions:
|
||||
checks: write
|
||||
contents: write
|
||||
pull-requests: write
|
||||
security-events: write
|
||||
|
||||
jobs:
|
||||
main:
|
||||
environment: qa-qodana
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Run Qodana scan
|
||||
uses: JetBrains/qodana-action@v2024.2.6
|
||||
with:
|
||||
args: --config,.github/qodana.yaml,--property=idea.headless.enable.statistics=false
|
||||
pr-mode: false
|
||||
upload-result: true
|
||||
env:
|
||||
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
|
||||
|
||||
- name: Report Qodana results to GitHub
|
||||
uses: github/codeql-action/upload-sarif@v3.27.4
|
||||
with:
|
||||
sarif_file: ${{ runner.temp }}/qodana/results/qodana.sarif.json
|
||||
4
.github/workflows/crowdin-ci.yml
vendored
4
.github/workflows/crowdin-ci.yml
vendored
@@ -14,13 +14,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Upload latest strings for translation on Crowdin
|
||||
uses: crowdin/github-action@v2.3.0
|
||||
uses: crowdin/github-action@60debf382ee245b21794321190ad0501db89d8c1 # v2.13.0
|
||||
with:
|
||||
crowdin_branch_name: main
|
||||
config: '.github/crowdin.yml'
|
||||
|
||||
6
.github/workflows/docker-ci.yml
vendored
6
.github/workflows/docker-ci.yml
vendored
@@ -19,16 +19,16 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Build ${{ matrix.configuration }} Docker image from ${{ matrix.file }}
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
build-args: CONFIGURATION=${{ matrix.configuration }}
|
||||
context: .
|
||||
|
||||
10
.github/workflows/docker-publish-latest.yml
vendored
10
.github/workflows/docker-publish-latest.yml
vendored
@@ -18,23 +18,23 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Login to ghcr.io
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Build and publish Docker image from Dockerfile.Service
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
file: Dockerfile.Service
|
||||
|
||||
12
.github/workflows/docker-publish-main.yml
vendored
12
.github/workflows/docker-publish-main.yml
vendored
@@ -19,23 +19,23 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Login to ghcr.io
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
@@ -50,7 +50,7 @@ jobs:
|
||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Build and publish Docker image from Dockerfile
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
@@ -69,7 +69,7 @@ jobs:
|
||||
push: true
|
||||
|
||||
- name: Update DockerHub repository description
|
||||
uses: peter-evans/dockerhub-description@v4.0.0
|
||||
uses: peter-evans/dockerhub-description@1b9a80c056b620d92cedb9d9b5a223409c68ddfa # v5.0.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
10
.github/workflows/docker-publish-released.yml
vendored
10
.github/workflows/docker-publish-released.yml
vendored
@@ -19,23 +19,23 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- name: Login to ghcr.io
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3.3.0
|
||||
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Build and publish Docker image from Dockerfile
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||
with:
|
||||
context: .
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
|
||||
2
.github/workflows/lock-threads.yml
vendored
2
.github/workflows/lock-threads.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Lock inactive threads
|
||||
uses: dessant/lock-threads@v5.0.1
|
||||
uses: dessant/lock-threads@7266a7ce5c1df01b1c6db85bf8cd86c737dadbe7 # v6.0.0
|
||||
with:
|
||||
discussion-inactive-days: 90
|
||||
issue-inactive-days: 60
|
||||
|
||||
61
.github/workflows/publish.yml
vendored
61
.github/workflows/publish.yml
vendored
@@ -6,7 +6,7 @@ env:
|
||||
CONFIGURATION: Release
|
||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||
DOTNET_NOLOGO: true
|
||||
DOTNET_SDK_VERSION: 9.0
|
||||
DOTNET_SDK_VERSION: 10.0
|
||||
NODE_JS_VERSION: 'lts/*'
|
||||
PLUGINS_BUNDLED: ArchiSteamFarm.OfficialPlugins.ItemsMatcher ArchiSteamFarm.OfficialPlugins.MobileAuthenticator ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
|
||||
PLUGINS_INCLUDED: ArchiSteamFarm.OfficialPlugins.Monitoring # Apart from declaring them here, there is certain amount of hardcoding needed below for uploading
|
||||
@@ -19,13 +19,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Node.js with npm
|
||||
uses: actions/setup-node@v4.1.0
|
||||
uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0
|
||||
with:
|
||||
check-latest: true
|
||||
node-version: ${{ env.NODE_JS_VERSION }}
|
||||
@@ -43,8 +43,9 @@ jobs:
|
||||
run: npm run-script deploy --no-progress --prefix ASF-ui
|
||||
|
||||
- name: Upload ASF-ui
|
||||
uses: actions/upload-artifact@v4.4.3
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
compression-level: 1
|
||||
if-no-files-found: error
|
||||
name: ASF-ui
|
||||
path: ASF-ui/dist
|
||||
@@ -73,7 +74,6 @@ jobs:
|
||||
- os: windows-latest
|
||||
variant: win-x64
|
||||
|
||||
environment: build
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
permissions:
|
||||
@@ -82,12 +82,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup .NET Core
|
||||
uses: actions/setup-dotnet@v4.1.0
|
||||
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||
with:
|
||||
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
||||
|
||||
@@ -95,7 +95,7 @@ jobs:
|
||||
run: dotnet --info
|
||||
|
||||
- name: Download previously built ASF-ui
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ASF-ui
|
||||
path: ASF-ui/dist
|
||||
@@ -362,13 +362,14 @@ jobs:
|
||||
|
||||
- name: Generate artifact attestation for ASF-${{ matrix.variant }}.zip
|
||||
if: ${{ github.event_name == 'push' }}
|
||||
uses: actions/attest-build-provenance@v1.4.4
|
||||
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||
with:
|
||||
subject-path: out/ASF-${{ matrix.variant }}.zip
|
||||
|
||||
- name: Upload ASF-${{ matrix.variant }}
|
||||
uses: actions/upload-artifact@v4.4.3
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
compression-level: 1
|
||||
if-no-files-found: error
|
||||
name: ${{ matrix.os }}_ASF-${{ matrix.variant }}
|
||||
path: out/ASF-${{ matrix.variant }}.zip
|
||||
@@ -409,14 +410,15 @@ jobs:
|
||||
|
||||
- name: Generate artifact attestation for ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||
if: ${{ github.event_name == 'push' && matrix.os == 'ubuntu-latest' && matrix.variant == 'generic' }}
|
||||
uses: actions/attest-build-provenance@v1.4.4
|
||||
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||
with:
|
||||
subject-path: out/ArchiSteamFarm.OfficialPlugins.Monitoring.zip
|
||||
|
||||
- name: Upload ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||
if: ${{ matrix.os == 'ubuntu-latest' && matrix.variant == 'generic' }}
|
||||
uses: actions/upload-artifact@v4.4.3
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
compression-level: 1
|
||||
if-no-files-found: error
|
||||
name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||
path: out/ArchiSteamFarm.OfficialPlugins.Monitoring.zip
|
||||
@@ -434,66 +436,66 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Download ASF-generic artifact from ubuntu-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ubuntu-latest_ASF-generic
|
||||
path: out
|
||||
|
||||
- name: Download ASF-linux-arm artifact from ubuntu-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ubuntu-latest_ASF-linux-arm
|
||||
path: out
|
||||
|
||||
- name: Download ASF-linux-arm64 artifact from ubuntu-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ubuntu-latest_ASF-linux-arm64
|
||||
path: out
|
||||
|
||||
- name: Download ASF-linux-x64 artifact from ubuntu-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ubuntu-latest_ASF-linux-x64
|
||||
path: out
|
||||
|
||||
- name: Download ASF-osx-arm64 artifact from macos-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: macos-latest_ASF-osx-arm64
|
||||
path: out
|
||||
|
||||
- name: Download ASF-osx-x64 artifact from macos-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: macos-latest_ASF-osx-x64
|
||||
path: out
|
||||
|
||||
- name: Download ASF-win-arm64 artifact from windows-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: windows-latest_ASF-win-arm64
|
||||
path: out
|
||||
|
||||
- name: Download ASF-win-x64 artifact from windows-latest
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: windows-latest_ASF-win-x64
|
||||
path: out
|
||||
|
||||
- name: Download ArchiSteamFarm.OfficialPlugins.Monitoring artifact
|
||||
uses: actions/download-artifact@v4.1.8
|
||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
|
||||
with:
|
||||
name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||
path: out
|
||||
|
||||
- name: Import GPG key for signing
|
||||
uses: crazy-max/ghaction-import-gpg@v6.2.0
|
||||
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
||||
|
||||
@@ -507,36 +509,39 @@ jobs:
|
||||
gpg -a -b -o SHA512SUMS.sign SHA512SUMS
|
||||
|
||||
- name: Generate artifact attestation for SHA512SUMS
|
||||
uses: actions/attest-build-provenance@v1.4.4
|
||||
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||
with:
|
||||
subject-path: out/SHA512SUMS
|
||||
|
||||
- name: Upload SHA512SUMS
|
||||
uses: actions/upload-artifact@v4.4.3
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
compression-level: 1
|
||||
if-no-files-found: error
|
||||
name: SHA512SUMS
|
||||
path: out/SHA512SUMS
|
||||
|
||||
- name: Generate artifact attestation for SHA512SUMS.sign
|
||||
uses: actions/attest-build-provenance@v1.4.4
|
||||
uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
|
||||
with:
|
||||
subject-path: out/SHA512SUMS.sign
|
||||
|
||||
- name: Upload SHA512SUMS.sign
|
||||
uses: actions/upload-artifact@v4.4.3
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
compression-level: 1
|
||||
if-no-files-found: error
|
||||
name: SHA512SUMS.sign
|
||||
path: out/SHA512SUMS.sign
|
||||
|
||||
- name: Create ArchiSteamFarm GitHub release
|
||||
uses: ncipollo/release-action@v1.14.0
|
||||
uses: ncipollo/release-action@b7eabc95ff50cbeeedec83973935c8f306dfcd0b # v1.20.0
|
||||
with:
|
||||
allowUpdates: true
|
||||
artifactErrorsFailBuild: true
|
||||
artifacts: "out/*"
|
||||
bodyFile: .github/RELEASE_TEMPLATE.md
|
||||
immutableCreate: true
|
||||
makeLatest: false
|
||||
name: ArchiSteamFarm V${{ github.ref_name }}
|
||||
prerelease: true
|
||||
|
||||
8
.github/workflows/translations.yml
vendored
8
.github/workflows/translations.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4.2.2
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
show-progress: false
|
||||
submodules: recursive
|
||||
@@ -27,11 +27,11 @@ jobs:
|
||||
run: |
|
||||
set -eu
|
||||
|
||||
git fetch --depth=1 origin master
|
||||
git fetch origin master
|
||||
git reset --hard origin/master
|
||||
|
||||
- name: Download latest translations from Crowdin
|
||||
uses: crowdin/github-action@v2.3.0
|
||||
uses: crowdin/github-action@60debf382ee245b21794321190ad0501db89d8c1 # v2.13.0
|
||||
with:
|
||||
upload_sources: false
|
||||
download_translations: true
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
|
||||
|
||||
- name: Import GPG key for signing
|
||||
uses: crazy-max/ghaction-import-gpg@v6.2.0
|
||||
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
||||
git_config_global: true
|
||||
|
||||
2
ASF-ui
2
ASF-ui
Submodule ASF-ui updated: 1f0b1914a4...cd1f819f04
@@ -4,7 +4,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -50,17 +50,16 @@ internal sealed class ExamplePlugin : IASF, IBot, IBotCommand2, IBotConnection,
|
||||
// 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
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public string Name => nameof(ExamplePlugin);
|
||||
|
||||
// This will be displayed to the user and written in the log file, typically you should point it to the version of your library, but alternatively you can do some more advanced logic if you'd like to
|
||||
// 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
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
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)
|
||||
// Plugins can expose custom properties for our GET /Api/Plugins API call, simply annotate them with [JsonInclude] (or keep public)
|
||||
[JsonInclude]
|
||||
[JsonRequired]
|
||||
[Required]
|
||||
public bool CustomIsEnabledField { get; private init; } = true;
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -22,7 +22,6 @@
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Composition;
|
||||
using System.Runtime;
|
||||
using System.Text.Json.Serialization;
|
||||
@@ -39,15 +38,13 @@ 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 Lock Lock = new();
|
||||
private static readonly Timer PeriodicGCTimer = new(PerformGC);
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public string Name => nameof(PeriodicGCPlugin);
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public Version Version => typeof(PeriodicGCPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||
|
||||
public Task OnLoaded() {
|
||||
@@ -55,7 +52,7 @@ internal sealed class PeriodicGCPlugin : IPlugin {
|
||||
|
||||
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 (LockObject) {
|
||||
lock (Lock) {
|
||||
PeriodicGCTimer.Change(timeSpan, timeSpan);
|
||||
}
|
||||
|
||||
@@ -65,7 +62,7 @@ internal sealed class PeriodicGCPlugin : IPlugin {
|
||||
private static void PerformGC(object? state = null) {
|
||||
ASF.ArchiLogger.LogGenericWarning($"Performing GC, current memory: {GC.GetTotalMemory(false) / 1024} KB.");
|
||||
|
||||
lock (LockObject) {
|
||||
lock (Lock) {
|
||||
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
|
||||
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
|
||||
}
|
||||
|
||||
@@ -4,8 +4,9 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AngleSharp.XPath" IncludeAssets="compile" />
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="AngleSharp" IncludeAssets="compile" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -66,7 +66,7 @@ public sealed class SignInWithSteamController : ArchiController {
|
||||
return StatusCode((int) HttpStatusCode.ServiceUnavailable, new GenericResponse(false, Strings.FormatErrorRequestFailedTooManyTimes(WebBrowser.MaxTries)));
|
||||
}
|
||||
|
||||
IAttr? paramsNode = challengeResponse.Content.SelectSingleNode<IAttr>("//input[@name='openidparams']/@value");
|
||||
IElement? paramsNode = challengeResponse.Content.QuerySelector("input[name='openidparams'][value]");
|
||||
|
||||
if (paramsNode == null) {
|
||||
ASF.ArchiLogger.LogNullError(paramsNode);
|
||||
@@ -74,7 +74,7 @@ public sealed class SignInWithSteamController : ArchiController {
|
||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, Strings.FormatErrorObjectIsNull(nameof(paramsNode))));
|
||||
}
|
||||
|
||||
string paramsValue = paramsNode.Value;
|
||||
string? paramsValue = paramsNode.GetAttribute("value");
|
||||
|
||||
if (string.IsNullOrEmpty(paramsValue)) {
|
||||
ASF.ArchiLogger.LogNullError(paramsValue);
|
||||
@@ -82,7 +82,7 @@ public sealed class SignInWithSteamController : ArchiController {
|
||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, Strings.FormatErrorObjectIsNull(nameof(paramsValue))));
|
||||
}
|
||||
|
||||
IAttr? nonceNode = challengeResponse.Content.SelectSingleNode<IAttr>("//input[@name='nonce']/@value");
|
||||
IElement? nonceNode = challengeResponse.Content.QuerySelector("input[name='nonce'][value]");
|
||||
|
||||
if (nonceNode == null) {
|
||||
ASF.ArchiLogger.LogNullError(nonceNode);
|
||||
@@ -90,7 +90,7 @@ public sealed class SignInWithSteamController : ArchiController {
|
||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, Strings.FormatErrorObjectIsNull(nameof(nonceNode))));
|
||||
}
|
||||
|
||||
string nonceValue = nonceNode.Value;
|
||||
string? nonceValue = nonceNode.GetAttribute("value");
|
||||
|
||||
if (string.IsNullOrEmpty(nonceValue)) {
|
||||
ASF.ArchiLogger.LogNullError(nonceValue);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -22,7 +22,6 @@
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Composition;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
@@ -36,11 +35,9 @@ namespace ArchiSteamFarm.CustomPlugins.SignInWithSteam;
|
||||
[UsedImplicitly]
|
||||
internal sealed class SignInWithSteamPlugin : IPlugin {
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public string Name => nameof(SignInWithSteamPlugin);
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public Version Version => typeof(SignInWithSteamPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||
|
||||
public Task OnLoaded() {
|
||||
|
||||
@@ -4,12 +4,11 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.ResxSourceGenerator" PrivateAssets="all" />
|
||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Linq.Async" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -19,4 +18,8 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Localization\Strings.resx" EmitFormatMethods="true" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||
<Copy SourceFolders="$(TargetDir)" DestinationFolder="..\ArchiSteamFarm\bin\$(Configuration)\$(TargetFramework)\plugins\$(AssemblyName)\" SkipUnchangedFiles="true" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -38,56 +38,54 @@ namespace ArchiSteamFarm.OfficialPlugins.ItemsMatcher;
|
||||
internal sealed class BotCache : SerializableFile {
|
||||
[JsonDisallowNull]
|
||||
[JsonInclude]
|
||||
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
|
||||
internal ConcurrentList<AssetForListing> LastAnnouncedAssetsForListing { get; private init; } = [];
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("BackingLastAnnouncedTradeToken")]
|
||||
internal string? LastAnnouncedTradeToken {
|
||||
get => BackingLastAnnouncedTradeToken;
|
||||
get;
|
||||
|
||||
set {
|
||||
if (BackingLastAnnouncedTradeToken == value) {
|
||||
if (field == value) {
|
||||
return;
|
||||
}
|
||||
|
||||
BackingLastAnnouncedTradeToken = value;
|
||||
field = value;
|
||||
Utilities.InBackground(Save);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("BackingLastInventoryChecksumBeforeDeduplication")]
|
||||
internal string? LastInventoryChecksumBeforeDeduplication {
|
||||
get => BackingLastInventoryChecksumBeforeDeduplication;
|
||||
get;
|
||||
|
||||
set {
|
||||
if (BackingLastInventoryChecksumBeforeDeduplication == value) {
|
||||
if (field == value) {
|
||||
return;
|
||||
}
|
||||
|
||||
BackingLastInventoryChecksumBeforeDeduplication = value;
|
||||
field = value;
|
||||
Utilities.InBackground(Save);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonInclude]
|
||||
[JsonPropertyName("BackingLastRequestAt")]
|
||||
internal DateTime? LastRequestAt {
|
||||
get => BackingLastRequestAt;
|
||||
get;
|
||||
|
||||
set {
|
||||
if (BackingLastRequestAt == value) {
|
||||
if (field == value) {
|
||||
return;
|
||||
}
|
||||
|
||||
BackingLastRequestAt = value;
|
||||
field = value;
|
||||
Utilities.InBackground(Save);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonInclude]
|
||||
private string? BackingLastAnnouncedTradeToken { get; set; }
|
||||
|
||||
[JsonInclude]
|
||||
private string? BackingLastInventoryChecksumBeforeDeduplication { get; set; }
|
||||
|
||||
[JsonInclude]
|
||||
private DateTime? BackingLastRequestAt { get; set; }
|
||||
|
||||
private BotCache(string filePath) : this() {
|
||||
ArgumentException.ThrowIfNullOrEmpty(filePath);
|
||||
|
||||
@@ -97,18 +95,18 @@ internal sealed class BotCache : SerializableFile {
|
||||
[JsonConstructor]
|
||||
private BotCache() => LastAnnouncedAssetsForListing.OnModified += OnObjectModified;
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeBackingLastAnnouncedTradeToken() => !string.IsNullOrEmpty(BackingLastAnnouncedTradeToken);
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeBackingLastInventoryChecksumBeforeDeduplication() => !string.IsNullOrEmpty(BackingLastInventoryChecksumBeforeDeduplication);
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeBackingLastRequestAt() => BackingLastRequestAt.HasValue;
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeLastAnnouncedAssetsForListing() => LastAnnouncedAssetsForListing.Count > 0;
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeLastAnnouncedTradeToken() => !string.IsNullOrEmpty(LastAnnouncedTradeToken);
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeLastInventoryChecksumBeforeDeduplication() => !string.IsNullOrEmpty(LastInventoryChecksumBeforeDeduplication);
|
||||
|
||||
[UsedImplicitly]
|
||||
public bool ShouldSerializeLastRequestAt() => LastRequestAt.HasValue;
|
||||
|
||||
protected override void Dispose(bool disposing) {
|
||||
if (disposing) {
|
||||
// Events we registered
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -121,7 +121,7 @@ internal static class Commands {
|
||||
|
||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => Task.Run(() => ResponseMatch(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot)))).ConfigureAwait(false);
|
||||
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result))!];
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result)).Select(static result => result!)];
|
||||
|
||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -25,7 +25,6 @@ using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Composition;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
@@ -47,11 +46,9 @@ internal sealed class ItemsMatcherPlugin : OfficialPlugin, IBot, IBotCommand2, I
|
||||
internal static readonly ConcurrentDictionary<Bot, RemoteCommunication> RemoteCommunications = new();
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override string Name => nameof(ItemsMatcherPlugin);
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override Version Version => typeof(ItemsMatcherPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||
|
||||
public async Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
|
||||
|
||||
@@ -64,4 +64,20 @@
|
||||
<value>Matched totalt {0} sæt denne runde.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Annoncerer {0} ({1}) med inventar lavet af {2} varer i alt på listen...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>Matchede i alt {0} varer med bot {1} ({2}), sender handelstilbud...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
<value>Mislykkedes at sende et handelstilbud til bot {0} ({1}), går videre...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>Nogle bekræftelser mislykkedes, ca. {0} ud af {1} handler blev sendt med succes.</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -64,4 +64,16 @@
|
||||
<value>Ο τελικός αριθμός συνόλων που έχουν ταιριάξει είναι {0}, αυτόν τον γύρο.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Ανακοίνωση {0} ({1}) με απογραφή από στοιχεία {2} συνολικά στην καταχώρηση...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>Ταίριαξε ένα σύνολο αντικειμένων {0} με bot {1} ({2}), στέλνοντας προσφορά συναλλαγής...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
<value>Αποτυχία αποστολής μιας προσφοράς συναλλαγής στο bot {0} ({1}), με κίνηση...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -60,4 +60,24 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||
</value>
|
||||
</resheader>
|
||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||
<value>Berhasil mencocokkan total {0} set pada putaran ini.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Mengumumkan {0} ({1}) dengan inventaris yang terdiri dari {2} item di total pada daftar...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>Berhasil mencocokkan total {0} item dengan bot {1} ({2}), mengirimkan penawaran perdagangan...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
<value>Gagal mengirimkan penawaran perdagangan ke bot {0} ({1}), melanjutkan...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>Beberapa konfirmasi gagal, sekitar {0} dari {1} penawaran perdagangan berhasil dikirim.</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -64,6 +64,10 @@
|
||||
<value>Abbinati un totale di {0} set questo round.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Annuncio {0} ({1}) con inventario fatto di elementi {2} in totale sulla lista...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>Abbinato un totale di {0} elementi tramite bot {1} ({2}), inviando un'offerta commerciale...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
@@ -73,7 +77,7 @@
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>Alcune conferme sono fallite, circa {0} su {1} sono state inviate con successo.</value>
|
||||
<value>Alcune conferme non sono riuscite, circa {0} su {1} sono state inviate con successo.</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -64,4 +64,20 @@
|
||||
<value>すべてのうち、{0} セットにマッチしたためこのラウンドを終了します。</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>{0}({1})をリスト上でアナウンス中です。インベントリには合計 {2} 個のアイテムが含まれています…</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>ボット {1}({2})と合計 {0} 個のアイテムが一致しました。トレードオファーを送信しています…</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
<value>ボット {0} ({1})にトレードオファーを送信できませんでした。次に進みます…</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>いくつかの確認に失敗しました。 {0} の取引から約 {1} が正常に送信されました。</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -61,15 +61,15 @@
|
||||
</value>
|
||||
</resheader>
|
||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||
<value>{0} conjunto(s) foi(foram) associado(s) nessa rodada.</value>
|
||||
<value>Total de {0} conjunto(s) correspondido(s) nesta rodada.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Anunciando {0} ({1}) com um inventário composto pelo total de {2} itens listados...</value>
|
||||
<value>Anunciando {0} ({1}) com um inventário de {2} itens no total na listagem...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>{0} item(ns) correspondidos(s) com o bot {1} ({2}), enviando oferta de troca...</value>
|
||||
<value>{0} item(ns) correspondido(s) com o bot {1} ({2}), enviando proposta de troca...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
@@ -77,7 +77,7 @@
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>Algumas confirmações falharam, cerca de {0} de {1} operações foram enviadas com sucesso.</value>
|
||||
<value>Algumas confirmações falharam, aproximadamente {0} de {1} trocas foram enviadas com sucesso.</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -60,4 +60,24 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||
</value>
|
||||
</resheader>
|
||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||
<value>Matchade totalt {0} sets denna runda.</value>
|
||||
<comment>{0} will be replaced by number of sets traded</comment>
|
||||
</data>
|
||||
<data name="ListingAnnouncing" xml:space="preserve">
|
||||
<value>Meddela {0} ({1}) med lager gjorda av {2} objekt totalt på listan...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname, {2} will be replaced with number of items in the inventory</comment>
|
||||
</data>
|
||||
<data name="MatchingFound" xml:space="preserve">
|
||||
<value>Matchade totalt {0} objekt med bot {1} ({2}), skickar handels-erbjudande...</value>
|
||||
<comment>{0} will be replaced by number of items matched, {1} will be replaced by steam ID (number), {2} will be replaced by user's nickname</comment>
|
||||
</data>
|
||||
<data name="TradeOfferFailed" xml:space="preserve">
|
||||
<value>Det gick inte att skicka ett byteserbjudande till bot {0} ({1}), går vidare...</value>
|
||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||
</data>
|
||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||
<value>Vissa bekräftelser har misslyckats, cirka {0} av {1} skickades framgångsrikt.</value>
|
||||
<comment>{0} will be replaced by amount of the trade offers that succeeded (number), {1} will be replaced by amount of the trade offers that were supposed to be sent in total (number)</comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -60,14 +60,14 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
private const byte MinHeartBeatTTL = 10; // Minimum amount of minutes we must wait before sending next HeartBeat
|
||||
private const byte MinimumPasswordResetCooldownDays = 5; // As imposed by Steam limits
|
||||
private const byte MinimumSteamGuardEnabledDays = 15; // As imposed by Steam limits
|
||||
private const byte MinPersonaStateTTL = 5; // Minimum amount of minutes we must wait before requesting persona state update
|
||||
private const byte MinPersonaStateTTL = MinAnnouncementTTL; // Minimum amount of minutes we must wait before requesting persona state update
|
||||
|
||||
private static readonly FrozenSet<EAssetType> AcceptedMatchableTypes = new HashSet<EAssetType>(4) {
|
||||
private static readonly FrozenSet<EAssetType> AcceptedMatchableTypes = [
|
||||
EAssetType.Emoticon,
|
||||
EAssetType.FoilTradingCard,
|
||||
EAssetType.ProfileBackground,
|
||||
EAssetType.TradingCard
|
||||
}.ToFrozenSet();
|
||||
];
|
||||
|
||||
private readonly Bot Bot;
|
||||
private readonly Timer? HeartBeatTimer;
|
||||
@@ -187,7 +187,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) && ShouldSendHeartBeats) {
|
||||
if (DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
await RequestsSemaphore.WaitAsync().ConfigureAwait(false);
|
||||
|
||||
try {
|
||||
if ((DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) && ShouldSendHeartBeats) {
|
||||
if (DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -233,6 +233,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
HashSet<EAssetType> acceptedMatchableTypes = Bot.BotConfig.MatchableTypes.Where(AcceptedMatchableTypes.Contains).ToHashSet();
|
||||
|
||||
if (acceptedMatchableTypes.Count == 0) {
|
||||
// Should never happen, since IsEligibleForListing() check above ensured we have at least one matchable type
|
||||
throw new InvalidOperationException(nameof(acceptedMatchableTypes));
|
||||
}
|
||||
|
||||
@@ -905,9 +906,8 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
HashSet<EAssetType> acceptedMatchableTypes = Bot.BotConfig.MatchableTypes.Where(AcceptedMatchableTypes.Contains).ToHashSet();
|
||||
|
||||
if (acceptedMatchableTypes.Count == 0) {
|
||||
Bot.ArchiLogger.LogNullError(acceptedMatchableTypes);
|
||||
|
||||
return;
|
||||
// Should never happen, since IsEligibleForMatching() check above ensured we have at least one matchable type
|
||||
throw new InvalidOperationException(nameof(acceptedMatchableTypes));
|
||||
}
|
||||
|
||||
if (!await MatchActivelySemaphore.WaitAsync(0).ConfigureAwait(false)) {
|
||||
@@ -1276,20 +1276,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
|
||||
Bot.ArchiLogger.LogGenericTrace($"{listedUser.SteamID}...");
|
||||
|
||||
byte? tradeHoldDuration = await Bot.ArchiWebHandler.GetCombinedTradeHoldDurationAgainstUser(listedUser.SteamID, listedUser.TradeToken).ConfigureAwait(false);
|
||||
|
||||
switch (tradeHoldDuration) {
|
||||
case null:
|
||||
Bot.ArchiLogger.LogGenericTrace(Strings.FormatErrorIsEmpty(nameof(tradeHoldDuration)));
|
||||
|
||||
continue;
|
||||
case > 0 when (tradeHoldDuration.Value > maxTradeHoldDuration) || (tradeHoldDuration.Value > listedUser.MaxTradeHoldDuration):
|
||||
Bot.ArchiLogger.LogGenericTrace($"{tradeHoldDuration.Value} > {maxTradeHoldDuration} || {listedUser.MaxTradeHoldDuration}");
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
HashSet<Asset> theirInventory = listedUser.Assets.Where(item => (!listedUser.MatchEverything || item.Tradable) && wantedSets.Contains((item.RealAppID, item.Type, item.Rarity)) && ((tradeHoldDuration.Value == 0) || !(item.Type is EAssetType.FoilTradingCard or EAssetType.TradingCard && CardsFarmer.SalesBlacklist.Contains(item.RealAppID)))).Select(static asset => asset.ToAsset()).ToHashSet();
|
||||
HashSet<Asset> theirInventory = listedUser.Assets.Where(item => (!listedUser.MatchEverything || item.Tradable) && wantedSets.Contains((item.RealAppID, item.Type, item.Rarity))).Select(static asset => asset.ToAsset()).ToHashSet();
|
||||
|
||||
if (theirInventory.Count == 0) {
|
||||
continue;
|
||||
@@ -1297,6 +1284,8 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
|
||||
skippedSetsThisUser.Clear();
|
||||
|
||||
byte? tradeHoldDuration = null;
|
||||
|
||||
Dictionary<(uint RealAppID, EAssetType Type, EAssetRarity Rarity), Dictionary<ulong, uint>> theirTradableState = MatchingUtilities.GetTradableInventoryState(theirInventory);
|
||||
|
||||
for (byte i = 0; i < Trading.MaxTradesPerAccount; i++) {
|
||||
@@ -1335,6 +1324,10 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
match = false;
|
||||
|
||||
foreach ((ulong ourItem, uint ourFullAmount) in ourFullSet.Where(static item => item.Value > 1).OrderByDescending(static item => item.Value)) {
|
||||
if ((tradeHoldDuration > maxTradeHoldDuration) || (tradeHoldDuration > listedUser.MaxTradeHoldDuration)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ourTradableSet.TryGetValue(ourItem, out uint ourTradableAmount) || (ourTradableAmount == 0)) {
|
||||
continue;
|
||||
}
|
||||
@@ -1378,6 +1371,29 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
||||
}
|
||||
}
|
||||
|
||||
// Now that we have a match, check trade hold to ensure user is valid to match against
|
||||
// Since it involves remote call, we didn't do it previously, to skip checking against users with no matches for us
|
||||
if (tradeHoldDuration == null) {
|
||||
tradeHoldDuration = await Bot.ArchiWebHandler.GetCombinedTradeHoldDurationAgainstUser(listedUser.SteamID, listedUser.TradeToken).ConfigureAwait(false);
|
||||
|
||||
if (tradeHoldDuration == null) {
|
||||
Bot.ArchiLogger.LogGenericTrace(Strings.FormatErrorIsEmpty(nameof(tradeHoldDuration)));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if ((tradeHoldDuration.Value > maxTradeHoldDuration) || (tradeHoldDuration.Value > listedUser.MaxTradeHoldDuration)) {
|
||||
Bot.ArchiLogger.LogGenericTrace($"{tradeHoldDuration.Value} > {maxTradeHoldDuration} || {listedUser.MaxTradeHoldDuration}");
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((tradeHoldDuration.Value > 0) && set.Type is EAssetType.FoilTradingCard or EAssetType.TradingCard && CardsFarmer.SalesBlacklist.Contains(set.RealAppID)) {
|
||||
// We're not considering this set for matching due to trade hold
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip this set from the remaining of this round
|
||||
skippedSetsThisTrade.Add(set);
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.ResxSourceGenerator" PrivateAssets="all" />
|
||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
@@ -15,6 +16,10 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Localization\Strings.resx" />
|
||||
<EmbeddedResource Update="Localization\Strings.resx" EmitFormatMethods="true" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||
<Copy SourceFolders="$(TargetDir)" DestinationFolder="..\ArchiSteamFarm\bin\$(Configuration)\$(TargetFramework)\plugins\$(AssemblyName)\" SkipUnchangedFiles="true" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -135,12 +135,6 @@ internal static class Commands {
|
||||
|
||||
mobileAuthenticator.Init(bot);
|
||||
|
||||
MobileAuthenticatorHandler? mobileAuthenticatorHandler = bot.GetHandler<MobileAuthenticatorHandler>();
|
||||
|
||||
if (mobileAuthenticatorHandler == null) {
|
||||
throw new InvalidOperationException(nameof(mobileAuthenticatorHandler));
|
||||
}
|
||||
|
||||
ulong steamTime = await mobileAuthenticator.GetSteamTime().ConfigureAwait(false);
|
||||
|
||||
string? code = mobileAuthenticator.GenerateTokenForTime(steamTime);
|
||||
@@ -149,10 +143,10 @@ internal static class Commands {
|
||||
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(mobileAuthenticator.GenerateTokenForTime)));
|
||||
}
|
||||
|
||||
CTwoFactor_FinalizeAddAuthenticator_Response? response = await mobileAuthenticatorHandler.FinalizeAuthenticator(bot.SteamID, activationCode, code, steamTime).ConfigureAwait(false);
|
||||
CTwoFactor_FinalizeAddAuthenticator_Response? response = await MobileAuthenticatorWebHandler.FinalizeAuthenticator(bot, activationCode, code, steamTime).ConfigureAwait(false);
|
||||
|
||||
if (response == null) {
|
||||
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(mobileAuthenticatorHandler.FinalizeAuthenticator)));
|
||||
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(MobileAuthenticatorWebHandler.FinalizeAuthenticator)));
|
||||
}
|
||||
|
||||
if (!response.success) {
|
||||
@@ -198,7 +192,7 @@ internal static class Commands {
|
||||
|
||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorFinalize(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot, activationCode))).ConfigureAwait(false);
|
||||
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result))!];
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result)).Select(static result => result!)];
|
||||
|
||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||
}
|
||||
@@ -295,7 +289,7 @@ internal static class Commands {
|
||||
|
||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorFinalized(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot, activationCode))).ConfigureAwait(false);
|
||||
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result))!];
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result)).Select(static result => result!)];
|
||||
|
||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||
}
|
||||
@@ -319,18 +313,12 @@ internal static class Commands {
|
||||
return bot.Commands.FormatBotResponse(Strings.BotNotConnected);
|
||||
}
|
||||
|
||||
MobileAuthenticatorHandler? mobileAuthenticatorHandler = bot.GetHandler<MobileAuthenticatorHandler>();
|
||||
|
||||
if (mobileAuthenticatorHandler == null) {
|
||||
throw new InvalidOperationException(nameof(mobileAuthenticatorHandler));
|
||||
}
|
||||
|
||||
string deviceID = $"android:{Guid.NewGuid()}";
|
||||
|
||||
CTwoFactor_AddAuthenticator_Response? response = await mobileAuthenticatorHandler.AddAuthenticator(bot.SteamID, deviceID).ConfigureAwait(false);
|
||||
CTwoFactor_AddAuthenticator_Response? response = await MobileAuthenticatorWebHandler.AddAuthenticator(bot, deviceID).ConfigureAwait(false);
|
||||
|
||||
if (response == null) {
|
||||
return bot.Commands.FormatBotResponse(Strings.WarningFailed);
|
||||
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(MobileAuthenticatorWebHandler.AddAuthenticator)));
|
||||
}
|
||||
|
||||
EResult result = (EResult) response.status;
|
||||
@@ -374,7 +362,7 @@ internal static class Commands {
|
||||
|
||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorInit(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot))).ConfigureAwait(false);
|
||||
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result))!];
|
||||
List<string> responses = [..results.Where(static result => !string.IsNullOrEmpty(result)).Select(static result => result!)];
|
||||
|
||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// _ _ _ ____ _ _____
|
||||
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
|
||||
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
|
||||
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// |
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// |
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using ArchiSteamFarm.Core;
|
||||
using ArchiSteamFarm.NLog;
|
||||
using SteamKit2;
|
||||
using SteamKit2.Internal;
|
||||
|
||||
namespace ArchiSteamFarm.OfficialPlugins.MobileAuthenticator;
|
||||
|
||||
internal sealed class MobileAuthenticatorHandler : ClientMsgHandler {
|
||||
private readonly ArchiLogger ArchiLogger;
|
||||
private readonly TwoFactor UnifiedTwoFactorService;
|
||||
|
||||
internal MobileAuthenticatorHandler(ArchiLogger archiLogger, SteamUnifiedMessages steamUnifiedMessages) {
|
||||
ArgumentNullException.ThrowIfNull(archiLogger);
|
||||
ArgumentNullException.ThrowIfNull(steamUnifiedMessages);
|
||||
|
||||
ArchiLogger = archiLogger;
|
||||
UnifiedTwoFactorService = steamUnifiedMessages.CreateService<TwoFactor>();
|
||||
}
|
||||
|
||||
public override void HandleMsg(IPacketMsg packetMsg) => ArgumentNullException.ThrowIfNull(packetMsg);
|
||||
|
||||
internal async Task<CTwoFactor_AddAuthenticator_Response?> AddAuthenticator(ulong steamID, string deviceID) {
|
||||
if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) {
|
||||
throw new ArgumentOutOfRangeException(nameof(steamID));
|
||||
}
|
||||
|
||||
ArgumentException.ThrowIfNullOrEmpty(deviceID);
|
||||
|
||||
if (Client == null) {
|
||||
throw new InvalidOperationException(nameof(Client));
|
||||
}
|
||||
|
||||
if (!Client.IsConnected) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CTwoFactor_AddAuthenticator_Request request = new() {
|
||||
authenticator_type = 1,
|
||||
authenticator_time = Utilities.GetUnixTime(),
|
||||
device_identifier = deviceID,
|
||||
steamid = steamID
|
||||
};
|
||||
|
||||
SteamUnifiedMessages.ServiceMethodResponse<CTwoFactor_AddAuthenticator_Response> response;
|
||||
|
||||
try {
|
||||
response = await UnifiedTwoFactorService.AddAuthenticator(request).ToLongRunningTask().ConfigureAwait(false);
|
||||
} catch (Exception e) {
|
||||
ArchiLogger.LogGenericWarningException(e);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return response.Result == EResult.OK ? response.Body : null;
|
||||
}
|
||||
|
||||
internal async Task<CTwoFactor_FinalizeAddAuthenticator_Response?> FinalizeAuthenticator(ulong steamID, string activationCode, string authenticatorCode, ulong authenticatorTime) {
|
||||
if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) {
|
||||
throw new ArgumentOutOfRangeException(nameof(steamID));
|
||||
}
|
||||
|
||||
ArgumentException.ThrowIfNullOrEmpty(activationCode);
|
||||
ArgumentException.ThrowIfNullOrEmpty(authenticatorCode);
|
||||
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(authenticatorTime);
|
||||
|
||||
if (Client == null) {
|
||||
throw new InvalidOperationException(nameof(Client));
|
||||
}
|
||||
|
||||
if (!Client.IsConnected) {
|
||||
return null;
|
||||
}
|
||||
|
||||
CTwoFactor_FinalizeAddAuthenticator_Request request = new() {
|
||||
activation_code = activationCode,
|
||||
authenticator_code = authenticatorCode,
|
||||
authenticator_time = authenticatorTime,
|
||||
steamid = steamID
|
||||
};
|
||||
|
||||
SteamUnifiedMessages.ServiceMethodResponse<CTwoFactor_FinalizeAddAuthenticator_Response> response;
|
||||
|
||||
try {
|
||||
response = await UnifiedTwoFactorService.FinalizeAddAuthenticator(request).ToLongRunningTask().ConfigureAwait(false);
|
||||
} catch (Exception e) {
|
||||
ArchiLogger.LogGenericWarningException(e);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return response.Result == EResult.OK ? response.Body : null;
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -22,9 +22,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Composition;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Text.Json.Serialization;
|
||||
@@ -40,13 +38,11 @@ namespace ArchiSteamFarm.OfficialPlugins.MobileAuthenticator;
|
||||
|
||||
[Export(typeof(IPlugin))]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeFileLocal")]
|
||||
internal sealed class MobileAuthenticatorPlugin : OfficialPlugin, IBotCommand2, IBotSteamClient {
|
||||
internal sealed class MobileAuthenticatorPlugin : OfficialPlugin, IBotCommand2 {
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override string Name => nameof(MobileAuthenticatorPlugin);
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override Version Version => typeof(MobileAuthenticatorPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||
|
||||
public async Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
|
||||
@@ -69,25 +65,6 @@ internal sealed class MobileAuthenticatorPlugin : OfficialPlugin, IBotCommand2,
|
||||
return await Commands.OnBotCommand(bot, access, message, args, steamID).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public Task OnBotSteamCallbacksInit(Bot bot, CallbackManager callbackManager) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
ArgumentNullException.ThrowIfNull(callbackManager);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task<IReadOnlyCollection<ClientMsgHandler>?> OnBotSteamHandlersInit(Bot bot) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
|
||||
SteamUnifiedMessages? steamUnifiedMessages = bot.GetHandler<SteamUnifiedMessages>();
|
||||
|
||||
if (steamUnifiedMessages == null) {
|
||||
throw new InvalidOperationException(nameof(steamUnifiedMessages));
|
||||
}
|
||||
|
||||
return Task.FromResult<IReadOnlyCollection<ClientMsgHandler>?>(new HashSet<ClientMsgHandler>(1) { new MobileAuthenticatorHandler(bot.ArchiLogger, steamUnifiedMessages) });
|
||||
}
|
||||
|
||||
public override Task OnLoaded() {
|
||||
Utilities.WarnAboutIncompleteTranslation(Strings.ResourceManager);
|
||||
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// _ _ _ ____ _ _____
|
||||
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
|
||||
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
|
||||
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
// |
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
// |
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using ArchiSteamFarm.Core;
|
||||
using ArchiSteamFarm.Localization;
|
||||
using ArchiSteamFarm.Steam;
|
||||
using ArchiSteamFarm.Steam.Integration;
|
||||
using ArchiSteamFarm.Web;
|
||||
using SteamKit2;
|
||||
using SteamKit2.Internal;
|
||||
|
||||
namespace ArchiSteamFarm.OfficialPlugins.MobileAuthenticator;
|
||||
|
||||
internal static class MobileAuthenticatorWebHandler {
|
||||
private const string TwoFactorService = "ITwoFactorService";
|
||||
|
||||
internal static async Task<CTwoFactor_AddAuthenticator_Response?> AddAuthenticator(Bot bot, string deviceID) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
ArgumentException.ThrowIfNullOrEmpty(deviceID);
|
||||
|
||||
if (!bot.IsConnectedAndLoggedOn) {
|
||||
return null;
|
||||
}
|
||||
|
||||
string? accessToken = bot.AccessToken;
|
||||
|
||||
if (string.IsNullOrEmpty(accessToken)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const string endpoint = "AddAuthenticator";
|
||||
HttpMethod method = HttpMethod.Post;
|
||||
|
||||
CTwoFactor_AddAuthenticator_Request request = new() {
|
||||
authenticator_time = Utilities.GetUnixTime(),
|
||||
authenticator_type = 1,
|
||||
device_identifier = deviceID,
|
||||
steamid = bot.SteamID
|
||||
};
|
||||
|
||||
Dictionary<string, object?> arguments = new(1, StringComparer.Ordinal) {
|
||||
{ "access_token", accessToken }
|
||||
};
|
||||
|
||||
using WebAPI.AsyncInterface twoFactorService = bot.SteamConfiguration.GetAsyncWebAPIInterface(TwoFactorService);
|
||||
|
||||
twoFactorService.Timeout = bot.ArchiWebHandler.WebBrowser.Timeout;
|
||||
|
||||
WebAPI.WebAPIResponse<CTwoFactor_AddAuthenticator_Response>? response = null;
|
||||
|
||||
for (byte i = 0; (i < WebBrowser.MaxTries) && (response == null); i++) {
|
||||
if ((i > 0) && (ArchiWebHandler.WebLimiterDelay > 0)) {
|
||||
await Task.Delay(ArchiWebHandler.WebLimiterDelay).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (Debugging.IsUserDebugging) {
|
||||
bot.ArchiLogger.LogGenericDebug($"{method} {bot.SteamConfiguration.WebAPIBaseAddress}{TwoFactorService}/{endpoint}");
|
||||
}
|
||||
|
||||
try {
|
||||
response = await ArchiWebHandler.WebLimitRequest(
|
||||
bot.SteamConfiguration.WebAPIBaseAddress,
|
||||
|
||||
// ReSharper disable once AccessToDisposedClosure
|
||||
async () => await twoFactorService.CallProtobufAsync<CTwoFactor_AddAuthenticator_Response, CTwoFactor_AddAuthenticator_Request>(method, endpoint, request, extraArgs: arguments).ConfigureAwait(false)
|
||||
).ConfigureAwait(false);
|
||||
} catch (TaskCanceledException e) {
|
||||
bot.ArchiLogger.LogGenericDebuggingException(e);
|
||||
} catch (Exception e) {
|
||||
bot.ArchiLogger.LogGenericWarningException(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (response == null) {
|
||||
bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorRequestFailedTooManyTimes(WebBrowser.MaxTries));
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return response.Body;
|
||||
}
|
||||
|
||||
internal static async Task<CTwoFactor_FinalizeAddAuthenticator_Response?> FinalizeAuthenticator(Bot bot, string activationCode, string authenticatorCode, ulong authenticatorTime) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
ArgumentException.ThrowIfNullOrEmpty(activationCode);
|
||||
ArgumentException.ThrowIfNullOrEmpty(authenticatorCode);
|
||||
ArgumentOutOfRangeException.ThrowIfZero(authenticatorTime);
|
||||
|
||||
if (!bot.IsConnectedAndLoggedOn) {
|
||||
return null;
|
||||
}
|
||||
|
||||
string? accessToken = bot.AccessToken;
|
||||
|
||||
if (string.IsNullOrEmpty(accessToken)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const string endpoint = "FinalizeAddAuthenticator";
|
||||
HttpMethod method = HttpMethod.Post;
|
||||
|
||||
CTwoFactor_FinalizeAddAuthenticator_Request request = new() {
|
||||
activation_code = activationCode,
|
||||
authenticator_code = authenticatorCode,
|
||||
authenticator_time = authenticatorTime,
|
||||
steamid = bot.SteamID
|
||||
};
|
||||
|
||||
Dictionary<string, object?> arguments = new(1, StringComparer.Ordinal) {
|
||||
{ "access_token", accessToken }
|
||||
};
|
||||
|
||||
using WebAPI.AsyncInterface twoFactorService = bot.SteamConfiguration.GetAsyncWebAPIInterface(TwoFactorService);
|
||||
|
||||
twoFactorService.Timeout = bot.ArchiWebHandler.WebBrowser.Timeout;
|
||||
|
||||
WebAPI.WebAPIResponse<CTwoFactor_FinalizeAddAuthenticator_Response>? response = null;
|
||||
|
||||
for (byte i = 0; (i < WebBrowser.MaxTries) && (response == null); i++) {
|
||||
if ((i > 0) && (ArchiWebHandler.WebLimiterDelay > 0)) {
|
||||
await Task.Delay(ArchiWebHandler.WebLimiterDelay).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
if (Debugging.IsUserDebugging) {
|
||||
bot.ArchiLogger.LogGenericDebug($"{method} {bot.SteamConfiguration.WebAPIBaseAddress}{TwoFactorService}/{endpoint}");
|
||||
}
|
||||
|
||||
try {
|
||||
response = await ArchiWebHandler.WebLimitRequest(
|
||||
bot.SteamConfiguration.WebAPIBaseAddress,
|
||||
|
||||
// ReSharper disable once AccessToDisposedClosure
|
||||
async () => await twoFactorService.CallProtobufAsync<CTwoFactor_FinalizeAddAuthenticator_Response, CTwoFactor_FinalizeAddAuthenticator_Request>(method, endpoint, request, extraArgs: arguments).ConfigureAwait(false)
|
||||
).ConfigureAwait(false);
|
||||
} catch (TaskCanceledException e) {
|
||||
bot.ArchiLogger.LogGenericDebuggingException(e);
|
||||
} catch (Exception e) {
|
||||
bot.ArchiLogger.LogGenericWarningException(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (response == null) {
|
||||
bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorRequestFailedTooManyTimes(WebBrowser.MaxTries));
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return response.Body;
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" />
|
||||
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
|
||||
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -25,7 +25,6 @@ using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Frozen;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Composition;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Diagnostics.Metrics;
|
||||
@@ -48,11 +47,9 @@ namespace ArchiSteamFarm.OfficialPlugins.Monitoring;
|
||||
|
||||
[Export(typeof(IPlugin))]
|
||||
[SuppressMessage("ReSharper", "MemberCanBeFileLocal")]
|
||||
internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialGitHubPluginUpdates, IWebInterface, IWebServiceProvider, IBotTradeOfferResults {
|
||||
internal sealed class MonitoringPlugin : OfficialPlugin, IBot, IBotTradeOfferResults, IDisposable, IOfficialGitHubPluginUpdates, IWebInterface, IWebServiceProvider {
|
||||
private const string MeterName = SharedInfo.AssemblyName;
|
||||
|
||||
private const string MetricNamePrefix = "asf";
|
||||
|
||||
private const string UnknownLabelValueFallback = "unknown";
|
||||
|
||||
private static readonly Measurement<byte> BuildInfo = new(
|
||||
@@ -73,13 +70,11 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG
|
||||
private static FrozenSet<Measurement<int>>? PluginMeasurements;
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override string Name => nameof(MonitoringPlugin);
|
||||
|
||||
public string RepositoryName => SharedInfo.GithubRepo;
|
||||
|
||||
[JsonInclude]
|
||||
[Required]
|
||||
public override Version Version => typeof(MonitoringPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||
|
||||
private readonly ConcurrentDictionary<Bot, TradeStatistics> TradeStatistics = new();
|
||||
@@ -88,6 +83,20 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG
|
||||
|
||||
public void Dispose() => Meter?.Dispose();
|
||||
|
||||
public Task OnBotDestroy(Bot bot) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
|
||||
TradeStatistics.TryRemove(bot, out _);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task OnBotInit(Bot bot) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task OnBotTradeOfferResults(Bot bot, IReadOnlyCollection<ParseTradeResult> tradeResults) {
|
||||
ArgumentNullException.ThrowIfNull(bot);
|
||||
ArgumentNullException.ThrowIfNull(tradeResults);
|
||||
@@ -120,8 +129,11 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG
|
||||
|
||||
InitializeMeter();
|
||||
|
||||
services.AddOpenTelemetry().WithMetrics(
|
||||
builder => {
|
||||
if (Meter == null) {
|
||||
throw new InvalidOperationException(nameof(Meter));
|
||||
}
|
||||
|
||||
services.AddOpenTelemetry().WithMetrics(builder => {
|
||||
builder.AddPrometheusExporter(static config => config.ScrapeEndpointPath = "/Api/metrics");
|
||||
builder.AddRuntimeInstrumentation();
|
||||
builder.AddAspNetCoreInstrumentation();
|
||||
@@ -133,17 +145,18 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG
|
||||
|
||||
public override Task OnLoaded() => Task.CompletedTask;
|
||||
|
||||
[MemberNotNull(nameof(Meter))]
|
||||
private void InitializeMeter() {
|
||||
if (Meter != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
PluginMeasurements = new HashSet<Measurement<int>>(3) {
|
||||
new(PluginsCore.ActivePlugins.Count),
|
||||
new(PluginsCore.ActivePlugins.Count(static plugin => plugin is OfficialPlugin), new KeyValuePair<string, object?>(TagNames.PluginType, "official")),
|
||||
new(PluginsCore.ActivePlugins.Count(static plugin => plugin is not OfficialPlugin), new KeyValuePair<string, object?>(TagNames.PluginType, "custom"))
|
||||
}.ToFrozenSet();
|
||||
int officialPluginCount = PluginsCore.ActivePlugins.Count(static plugin => plugin is OfficialPlugin);
|
||||
|
||||
PluginMeasurements = [
|
||||
new Measurement<int>(PluginsCore.ActivePlugins.Count),
|
||||
new Measurement<int>(officialPluginCount, new KeyValuePair<string, object?>(TagNames.PluginType, "official")),
|
||||
new Measurement<int>(PluginsCore.ActivePlugins.Count - officialPluginCount, new KeyValuePair<string, object?>(TagNames.PluginType, "custom"))
|
||||
];
|
||||
|
||||
Meter = new Meter(MeterName, Version.ToString());
|
||||
|
||||
@@ -258,8 +271,7 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG
|
||||
);
|
||||
|
||||
Meter.CreateObservableCounter(
|
||||
$"{MetricNamePrefix}_bot_trades", () => TradeStatistics.SelectMany<KeyValuePair<Bot, TradeStatistics>, Measurement<int>>(
|
||||
static kv => [
|
||||
$"{MetricNamePrefix}_bot_trades", () => TradeStatistics.SelectMany<KeyValuePair<Bot, TradeStatistics>, Measurement<int>>(static kv => [
|
||||
new Measurement<int>(
|
||||
kv.Value.AcceptedOffers,
|
||||
new KeyValuePair<string, object?>(TagNames.BotName, kv.Key.BotName),
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@@ -22,12 +22,13 @@
|
||||
// limitations under the License.
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using ArchiSteamFarm.Steam.Exchange;
|
||||
|
||||
namespace ArchiSteamFarm.OfficialPlugins.Monitoring;
|
||||
|
||||
internal sealed class TradeStatistics {
|
||||
private readonly object Lock = new();
|
||||
private readonly Lock Lock = new();
|
||||
|
||||
internal int AcceptedOffers { get; private set; }
|
||||
internal int BlacklistedOffers { get; private set; }
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -4,10 +4,10 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||
<PackageReference Include="JetBrains.Annotations.Sources" PrivateAssets="all" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" IncludeAssets="compile" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.ResxSourceGenerator" PrivateAssets="all" />
|
||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" IncludeAssets="compile" />
|
||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -18,4 +18,8 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Localization\Strings.resx" EmitFormatMethods="true" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||
<Copy SourceFolders="$(TargetDir)" DestinationFolder="..\ArchiSteamFarm\bin\$(Configuration)\$(TargetFramework)\plugins\$(AssemblyName)\" SkipUnchangedFiles="true" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
// ----------------------------------------------------------------------------------------------
|
||||
// |
|
||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
||||
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||
// Contact: JustArchi@JustArchi.net
|
||||
// |
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
|
||||
@@ -104,10 +104,7 @@
|
||||
<value>Приключи събирането на {0} информация за играта или приложението.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Успешно извлечени {0} от {1} депо ключове.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Приключи събирането на всички ключове за депа за общо {0} игри или проложения.</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Úspěšně načteno {0} z {1} depot klíčů.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Dokončeno {0} z {1} požadavků na sklad</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Načítání všech tokenbů úložišť, celkem z {0} aplikací bylo dokončeno.</value>
|
||||
|
||||
@@ -60,33 +60,115 @@
|
||||
<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} er blevet deaktiveret på grund af en manglende 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} er i øjeblikket deaktiveret i henhold til din konfiguration. Hvis du vil hjælpe SteamDB i dataindsendelse, så tjek vores 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} er blevet initialiseret med succes, tak på forhånd for din hjælp. Den første indsendelse vil ske i cirka {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} kunne ikke indlæses, en ny instans vil blive initialiseret...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
</data>
|
||||
<data name="BotNoAppsToRefresh" xml:space="preserve">
|
||||
<value>Der er ingen apps, der kræver en opdatering i denne bot instans.</value>
|
||||
</data>
|
||||
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
|
||||
<value>Henter i alt {0} app-adgangstokens...</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>Henter {0} app-adgangstokens...</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>Færdig med at hente {0} app-adgangstegn.</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>Færdig med at hente i alt {0} app-adgangstokiner.</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>Henter alle depoter for i alt {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>Færdig med at hente {0} app-info.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Færdig {0} ud af {1} depot nøgleanmodninger.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Færdig med at hente alle depot nøgler for i alt {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>Der er ingen nye data at indsende, alt er opdateret.</value>
|
||||
</data>
|
||||
<data name="SubmissionNoContributorSet" xml:space="preserve">
|
||||
<value>Kunne ikke indsende data, da der ikke er noget gyldigt SteamID sæt, som vi kunne klassificere som bidragsyder. Overvej opsætning af {0} egenskab.</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>Indsender i alt registrerede apps/pakker/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>Indsendelsen er mislykkedes på grund af for mange anmodninger, vi vil prøve igen om cirka {0} fra nu.</value>
|
||||
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
|
||||
</data>
|
||||
<data name="SubmissionSuccessful" xml:space="preserve">
|
||||
<value>Dataene er blevet indsendt. Serveren har registreret i alt nye apps/packages/depots: {0} ({1} verificeret)/{2} ({3} verificeret)/{4} ({5} verificeret).</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>Nye 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>Verificerede 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>Nye pakker: {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>Verificerede pakker: {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>Nye depoter: {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>Verificerede 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} initialiseret, plugin vil ikke løse nogen af dem: {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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>Indlæser STD global cache...</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>Validerer STD global cache integritet...</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>Mislykkedes at verificere STD global cache integritet. Dette tyder på en potentiel fil / hukommelse korruption, en ny instans vil blive initialiseret i stedet.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Erfolgreich {0} von {1} Depot-Schlüsseln abgerufen.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>{0} von {1} Depot-Schlüsselanfragen beendet.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Abruf aller Depotschlüssel für insgesamt {0} Apps abgeschlossen.</value>
|
||||
|
||||
@@ -68,7 +68,10 @@
|
||||
<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>
|
||||
@@ -104,7 +107,10 @@
|
||||
<value>Ολοκληρώθηκε η ανάκτηση {0} πληροφοριών εφαρμογών.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Ολοκληρώθηκε το {0} από τα αιτήματα κλειδιού depot {1}.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Ολοκληρώθηκε η ανάκτηση όλων των κλειδιών αποθηκών για συνολικά {0} εφαρμογές.</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Se recuperaron exitosamente {0} de {1} claves de depósito.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Se completaron {0} de {1} solicitudes de clave de depósito.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</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>
|
||||
|
||||
@@ -107,10 +107,7 @@
|
||||
<value>دریافت اطلاعات {0} برنامه با موفقیت انجام شد.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>تعداد {0} از {1} کلید های depot با موفقیت دریافت شد.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>دریافت تمامی کلید های depot برای تعداد {0} برنامه انجام شد.</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
|
||||
|
||||
@@ -68,7 +68,10 @@
|
||||
<value>{0} on tällä hetkellä poistettu käytöstä asetuksistasi. Jos haluat auttaa SteamDB:tä tietojen lähettämisessä, ole hyvä ja tutustu wikimme.</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} on alustettu onnistuneesti, kiitos etukäteen avustasi. Ensimmäiseen lähetykseen on noin {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} ei voitu ladata. Uusi instanssi alustetaan...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
@@ -105,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Onnistuneesti haettu {0}/{1} depot-avaimesta.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Suoritettiin {0}/{1} depot-avaimien pyynnöistä.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Saatiin haettua kaikki depot-avaimet yhteensä {0} sovellukselle.</value>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Récupération réussie de {0} sur {1} clés de dépôts.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Récupération de {0} sur {1} demandes de clés de dépôt terminée.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</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>
|
||||
|
||||
@@ -60,33 +60,115 @@
|
||||
<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} telah dinonaktifkan karena token build yang hilang</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} saat ini dinonaktifkan sesuai konfigurasi Anda. Jika Anda ingin membantu SteamDB dalam pengiriman data, silakan lihat wiki kami.</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} telah berhasil diinisialisasi, terima kasih sebelumnya atas bantuan Anda. Pengiriman pertama akan terjadi dalam sekitar {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} tidak dapat dimuat, instansi baru akan diinisialisasi...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
</data>
|
||||
<data name="BotNoAppsToRefresh" xml:space="preserve">
|
||||
<value>Tidak ada aplikasi yang memerlukan penyegaran pada instansi bot ini.</value>
|
||||
</data>
|
||||
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
|
||||
<value>Memuat total {0} token akses aplikasi...</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>Memuat {0} token akses aplikasi...</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>Selesai memuat {0} token akses aplikasi.</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>Selesai memuat total {0} token akses aplikasi.</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>Memuat semua depot untuk total {0} aplikasi...</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
|
||||
</data>
|
||||
<data name="BotRetrievingAppInfos" xml:space="preserve">
|
||||
<value>Memuat {0} informasi aplikasi...</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>Selesai memuat {0} informasi aplikasi.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Selesai {0} dari {1} depot key yang di minta.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Selesai memuat semua kunci depot untuk total {0} aplikasi.</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
|
||||
</data>
|
||||
<data name="SubmissionNoNewData" xml:space="preserve">
|
||||
<value>Tidak ada data baru untuk dikirim, semuanya sudah terbarui.</value>
|
||||
</data>
|
||||
<data name="SubmissionNoContributorSet" xml:space="preserve">
|
||||
<value>Gagal mengirim data karena tidak ada SteamID yang valid yang dapat kami klasifikasikan sebagai kontributor. Pertimbangkan untuk mengatur properti {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>Mengirim total aplikasi/paket/depot yang terdaftar: {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>Pengiriman gagal karena terlalu banyak permintaan yang dikirim, kami akan mencoba lagi dalam sekitar {0} dari sekarang.</value>
|
||||
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
|
||||
</data>
|
||||
<data name="SubmissionSuccessful" xml:space="preserve">
|
||||
<value>Data telah berhasil dikirim. Server telah mendaftarkan total aplikasi/paket/depot baru: {0} ({1} terverifikasi)/{2} ({3} terverifikasi)/{4} ({5} terverifikasi).</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>Aplikasi baru: {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>Aplikasi yang terverifikasi: {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>Paket baru: {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>Paket yang terverifikasi: {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 baru: {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 yang terverifikasi: {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} diinisialisasi, plugin ini tidak akan memecahkan salah satu dari ini: {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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>Memuat cache global STD...</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>Memvalidasi integritas cache global STD...</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>Gagal memverifikasi integritas cache global STD. Ini menunjukkan potensi kerusakan file/memori, instansi baru akan diinisialisasi sebagai gantinya.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -68,9 +68,12 @@
|
||||
<value>{0} è attualmente disabilitato in base alla tua configurazione. Se desideri aiutare SteamDB nell'invio dei dati, controlla la nostra 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} è stato inizializzato con successo, grazie in anticipo per il tuo aiuto. Il primo invio avverrà tra circa {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} non può essere caricato, una nuova richiesta verrà iniziata...</value>
|
||||
<value>{0} non può essere caricato, verrà inizializzata una nuova istanza...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
</data>
|
||||
<data name="BotNoAppsToRefresh" xml:space="preserve">
|
||||
@@ -105,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Recuperate {0} chiavi depot su {1} con successo.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Hai completato le richieste di chiave del deposito {0} su {1}.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Finito il recupero di tutte le chiavi del deposito per un totale di {0} applicazioni.</value>
|
||||
@@ -116,7 +119,7 @@
|
||||
<value>Non ci sono nuovi dati da inviare, tutto è aggiornato.</value>
|
||||
</data>
|
||||
<data name="SubmissionNoContributorSet" xml:space="preserve">
|
||||
<value>Impossibile inviare i dati perché non c'è uno SteamID impostato valido che potremmo classificare come contributore. Considera di impostare delle proprietà {0}.</value>
|
||||
<value>Impossibile inviare i dati perché non è impostato un SteamID valido che possa essere classificato come contributore. Considera di configurare la proprietà {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">
|
||||
|
||||
@@ -60,25 +60,80 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||
</value>
|
||||
</resheader>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
|
||||
<value>ビルドトークンが見つからないため、{0} は無効化されました</value>
|
||||
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
|
||||
</data>
|
||||
<data name="PluginDisabledInConfig" xml:space="preserve">
|
||||
<value>{0} は現在の設定により無効化されています。SteamDB へのデータ提供に協力いただける場合は、当プロジェクトの Wiki をご覧ください。</value>
|
||||
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
|
||||
</data>
|
||||
<data name="PluginInitializedAndEnabled" xml:space="preserve">
|
||||
<value>{0} は正常に初期化されました。ご協力ありがとうございます。最初の送信はおおよそ {1} 後に行われます。</value>
|
||||
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
|
||||
</data>
|
||||
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
|
||||
<value>{0} を読み込むことができませんでした。新しいインスタンスを初期化します…</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
</data>
|
||||
<data name="BotNoAppsToRefresh" xml:space="preserve">
|
||||
<value>このボットでは更新が必要なアプリはありません。</value>
|
||||
</data>
|
||||
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
|
||||
<value>合計 {0} 個のアプリアクセストークンを取得中…</value>
|
||||
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
|
||||
</data>
|
||||
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
|
||||
<value>{0} 個のアプリアクセストークンを取得中…</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
|
||||
<value>{0} 個のアプリアクセストークンの取得が完了しました。</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
|
||||
<value>合計 {0} 個のアプリアクセストークンの取得が完了しました。</value>
|
||||
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
|
||||
</data>
|
||||
<data name="BotRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>合計 {0} 個のアプリに対する全デポを取得中…</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} 個のアプリ情報を取得中…</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="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>{1} 件中 {0} 件のデポキーリクエストが完了しました。</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>合計 {0} 個のアプリに対するすべてのデポキー取得が完了しました。</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>登録されたアプリ/パッケージ/デポを合計 {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>データは正常に送信されました。サーバーは新規アプリ/パッケージ/デポを合計 {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>
|
||||
@@ -95,10 +150,25 @@
|
||||
<value>認証済みパッケージ: {0}</value>
|
||||
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
|
||||
<value>新しいデポ: {0}</value>
|
||||
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
|
||||
<value>検証済みのデポ: {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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>STD のグローバルキャッシュを読み込み中…</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>STD のグローバルキャッシュの整合性を検証中…</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>STD のグローバルキャッシュの整合性を検証できませんでした。ファイルまたはメモリの破損が疑われます。新しいインスタンスを初期化します。</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -121,7 +121,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>STD 글로벌 캐시 로드 중...</value>
|
||||
</data>
|
||||
|
||||
|
||||
</root>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Veiksmīgi izgūtas {0} no {1} depot atslēgām.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Pabeigts {0} no {1} noliktavas atslēgu pieprasījumiem.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Pabeigta visu depot atslēgu izgūšana, kopā {0} lietotnēm.</value>
|
||||
|
||||
@@ -68,7 +68,10 @@
|
||||
<value>{0} is momenteel uitgeschakeld volgens uw configuratie. Als je SteamDB wilt helpen bij het indienen van gegevens, bekijk dan onze 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} is met succes geïnitialiseerd. Alvast bedankt voor uw hulp. De eerste uitwerking zal gebeuren in ongeveer {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} kon niet worden geladen, een nieuwe instantie zal worden geïnitialiseerd...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
@@ -105,15 +108,32 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Succesvol {0} van de {1} depotsleutels opgehaald.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Klaar {0} van {1} depot sleutelverzoeken.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Ophalen van alle depot keys voltooid voor een totaal van {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>Er zijn geen nieuwe gegevens om in te dienen, alles is up-to-date.</value>
|
||||
</data>
|
||||
<data name="SubmissionNoContributorSet" xml:space="preserve">
|
||||
<value>Kon de gegevens niet indienen omdat er geen geldige SteamID is die we als bijdrager kunnen classificeren. Overweeg het instellen van {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>Verzenden van een totaal van geregistreerde apps/packages/depos: {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>De indiening is mislukt door te veel verzonden, we zullen het vanaf nu opnieuw proberen in ongeveer {0}.</value>
|
||||
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
|
||||
</data>
|
||||
<data name="SubmissionSuccessful" xml:space="preserve">
|
||||
<value>De gegevens zijn succesvol ingediend. De server heeft een totaal van nieuwe apps/pakketten/depots: {0} ({1} geverifieerd)/{2} ({3} geverifieerd)/{4} ({5} geverifieerd).</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>Nieuwe apps: {0}</value>
|
||||
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
|
||||
@@ -130,10 +150,25 @@
|
||||
<value>Geverifieerde pakketten: {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>Nieuwe depoten: {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>Geverifieerde 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} geïnitialiseerd, de plugin zal geen van deze oplossen: {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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>STD global cache laden...</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>Valideren van STD globale cache integriteit...</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>Kon de wereldwijde STD cache integriteit niet verifiëren. Dit suggereert een potentiële bestands/geheugencorruptie, een nieuw exemplaar zal in plaats daarvan worden geïnitialiseerd.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -60,33 +60,111 @@
|
||||
<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} har blitt deaktivert på grunn av et manglende byggetoken</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} er for øyeblikket deaktivert i henhold til din konfigurasjon. Hvis du vil hjelpe SteamDB med datainnsending, vennligst sjekk ut vå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} har blitt igangsatt vellykket, takk for din hjelp. Den første innsending vil skje i omtrent {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} kunne ikke lastes inn, en frisk forekomst vil bli initialisert...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
</data>
|
||||
<data name="BotNoAppsToRefresh" xml:space="preserve">
|
||||
<value>Det er ingen programmer som krever en oppdatering på denne botthendelsen.</value>
|
||||
</data>
|
||||
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
|
||||
<value>Henter de totale {0} app-tilgangstegener...</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>Henter {0} app-tilgangstokene...</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>Ferdig med å hente {0} app-tilgangsnøkkler.</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>Ferdig med å hente totalt {0} app-tilgangsnøkkler.</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>Henter alle depoter for en total {0} apper...</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>Ferdig med å hente {0} app infos.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Ferdig med {0} av {1} lagerets viktigste forespørsler.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Fullførte henting av alle depot-nøkler for totalt {0} apper.</value>
|
||||
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
|
||||
</data>
|
||||
<data name="SubmissionNoNewData" xml:space="preserve">
|
||||
<value>Det finnes ingen nye data, alt er oppdatert.</value>
|
||||
</data>
|
||||
<data name="SubmissionNoContributorSet" xml:space="preserve">
|
||||
<value>Kunne ikke sende inn data fordi det ikke er gyldig SteamID satt som vi kan klassifisere som bidragsyter. Vurder å sette opp {0} egenskapen.</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="SubmissionFailedTooManyRequests" xml:space="preserve">
|
||||
<value>Innsendingen mislyktes på grunn av for mange forespørsler sendt, vi prøver igjen om lag {0} nå.</value>
|
||||
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
|
||||
</data>
|
||||
<data name="SubmissionSuccessful" xml:space="preserve">
|
||||
<value>Dataene har blitt sendt inn. Serveren har registrert totalt nye applikasjoner/pakker/depoter: {0} ({1} verifisert)/{2} ({3} bekreftet)/{4} ({5} verifisert).</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>Nye apper: {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>Verifiserte apper: {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>Nye pakker: {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>Verifiserte pakker: {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>Nye depoter: {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>Verifiserte depoter: {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} initialisert, utvidelsen vil ikke løse noen av disse: {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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>Laster STD global cache...</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>Validerer STD global cache integritet...</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>Kan ikke verifisere STD globale cachens integritet. Dette foreslår en potensiell fil-/minnesorpsjon, et frisk eksempel vil bli initialisert i stedet.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Pomyślnie pobrano {0} z {1} kluczy magazynu.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Zakończono {0} z {1} żądań klucza magazynu.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Zakończono pobieranie wszystkich kluczy magazynu dla {0} aplikacji.</value>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>{0} de {1} chaves de depots recuperadas com sucesso.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Concluído {0} de {1} solicitações de chave do depot.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Recuperamos códigos de acesso para {0} aplicativos.</value>
|
||||
|
||||
@@ -68,7 +68,10 @@
|
||||
<value>{0} está atualmente desativado de acordo com a sua configuração. Se quiser ajudar o SteamDB na submissão de dados, por favor confira o 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 por sua ajuda. O primeiro envio ocorrerá em aproximadamente {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} 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>
|
||||
@@ -92,24 +95,80 @@
|
||||
<value>Terminado o recolhimento de um total de {0} tokens de acesso a aplicações.</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 para um total de apps {0}...</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>Informações do aplicativo {0} finalizadas.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>{0} terminou de pedidos chave de depósito {1}.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Terminou de recuperar todas as chaves de depósito para um total de aplicativos {0}.</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>Enviar 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>Apps 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>
|
||||
<data name="LoadingGlobalCache" xml:space="preserve">
|
||||
<value>Carregando cache global STD...</value>
|
||||
</data>
|
||||
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
|
||||
<value>Validando integridade de cache global STD...</value>
|
||||
</data>
|
||||
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
|
||||
<value>Falha ao verificar a integridade do cache global STD. Isso sugere uma potencial corrupção de arquivo/memória, uma instância nova será inicializada em vez disso.</value>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>SUCCESFULLY RETRIEVD {0} OUT OV {1} DEPOT KEYS.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>FINISHD {0} OUT OV {1} DEPOT KEY REQUESTS.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>FINISHD RETRIEVIN ALL DEPOT KEYS 4 TOTAL OV {0} APPS.</value>
|
||||
|
||||
@@ -108,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>Successfully retrieved {0} out of {1} depot keys.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Finished {0} out of {1} depot key requests.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>Finished retrieving all depot keys for a total of {0} apps.</value>
|
||||
|
||||
@@ -68,7 +68,10 @@
|
||||
<value>{0} este momentan dezactivat în funcție de configurația ta. Dacă doriți să ajutați SteamDB în transmiterea de date, vă rugăm să consultați wiki-ul.</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 fost inițializat cu succes, îți mulțumim anticipat pentru ajutorul tău. Prima trimitere va avea loc în aproximativ {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} nu a putut fi încărcat, o nouă instanță va fi inițializată...</value>
|
||||
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
|
||||
@@ -105,8 +108,8 @@
|
||||
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
|
||||
<value>{0} din {1} chei de depozit au fost recuperate cu succes.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot keys that were successfully retrieved, {1} will be replaced by the number (count this batch) of depot keys that were supposed to be retrieved</comment>
|
||||
<value>Am terminat {0} din {1} cereri de chei de depozit.</value>
|
||||
<comment>{0} will be replaced by the number (count this batch) of depot key requests that were successfully answered, {1} will be replaced by the number (count this batch) of depot key requests that were supposed to be sent</comment>
|
||||
</data>
|
||||
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
|
||||
<value>S-a terminat preluarea tuturor depot keys pentru un total de {0} aplicații.</value>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user