mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2025-12-21 00:38:37 +00:00
Compare commits
1246 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
607b380ddd | ||
|
|
1ec9118af2 | ||
|
|
c911ad45bf | ||
|
|
0dee3e311a | ||
|
|
17ef5e3aee | ||
|
|
1505e2dbd4 | ||
|
|
1ea5913f3d | ||
|
|
7f548a1982 | ||
|
|
d1b7133db3 | ||
|
|
c5bee672d1 | ||
|
|
50b054890a | ||
|
|
ef9d269660 | ||
|
|
f01b0d6641 | ||
|
|
f9519141b1 | ||
|
|
1b626caa53 | ||
|
|
4167b6be54 | ||
|
|
8305ba92c3 | ||
|
|
8efe6d7f70 | ||
|
|
8cd9587ab7 | ||
|
|
ed0da062df | ||
|
|
83daa09c80 | ||
|
|
5599bf179b | ||
|
|
44cf96ce70 | ||
|
|
540408a3d0 | ||
|
|
9058898f3b | ||
|
|
4643529e7f | ||
|
|
b0f9268996 | ||
|
|
b863a7e523 | ||
|
|
4a77c987ed | ||
|
|
7d7c4ba3a5 | ||
|
|
f2e8fd0ec4 | ||
|
|
a8f1cef5b8 | ||
|
|
7c481de811 | ||
|
|
b66d883c1c | ||
|
|
48a742add5 | ||
|
|
adddc1b5ba | ||
|
|
d63ef5e58c | ||
|
|
765651d94d | ||
|
|
8c9462d387 | ||
|
|
04bfe96e16 | ||
|
|
2f8ef39ead | ||
|
|
35cdfbf169 | ||
|
|
fd69303a0e | ||
|
|
271311eeaf | ||
|
|
00b2b24e54 | ||
|
|
c8e6b9efa5 | ||
|
|
b22f2f6420 | ||
|
|
fa5c65f927 | ||
|
|
98f29b485b | ||
|
|
712a38c70f | ||
|
|
c4dc037b3b | ||
|
|
6dddaa5992 | ||
|
|
8879ed71c5 | ||
|
|
b4c4f73e5e | ||
|
|
17e64803c6 | ||
|
|
9c3b354fa2 | ||
|
|
040caa1f40 | ||
|
|
4cd8a7cb46 | ||
|
|
782b54ac33 | ||
|
|
6437575763 | ||
|
|
df8856454a | ||
|
|
132f47d86f | ||
|
|
07f8dc543f | ||
|
|
9a2fd8c91d | ||
|
|
6867f69909 | ||
|
|
2c80f35388 | ||
|
|
4e855011bc | ||
|
|
a46dd753ba | ||
|
|
d7f3a0bf7e | ||
|
|
411c49addd | ||
|
|
6bc29e8c3f | ||
|
|
4b3224a748 | ||
|
|
1b95433cb6 | ||
|
|
64db3f4c09 | ||
|
|
22509fed14 | ||
|
|
819b5f3dbf | ||
|
|
2c1975d203 | ||
|
|
46d6aa44d1 | ||
|
|
17130b7215 | ||
|
|
3b0d0e033f | ||
|
|
def6b6751b | ||
|
|
90756bde27 | ||
|
|
a28c431dcd | ||
|
|
50fc619d92 | ||
|
|
2475c040b9 | ||
|
|
d166e198de | ||
|
|
5a9750a4b6 | ||
|
|
fc64511268 | ||
|
|
f2b8897ed1 | ||
|
|
dae03afc2d | ||
|
|
5d383dcae6 | ||
|
|
3e4c7ac9f8 | ||
|
|
f48caa08e9 | ||
|
|
f32fafdf15 | ||
|
|
f427b89617 | ||
|
|
b0e36948c5 | ||
|
|
b0254aea2d | ||
|
|
a84b9ca395 | ||
|
|
1a9f2a23c4 | ||
|
|
e6cb7ceb7b | ||
|
|
ec28ae562b | ||
|
|
74b832ea4e | ||
|
|
32c107ae53 | ||
|
|
87d28aea81 | ||
|
|
79b81ac5d1 | ||
|
|
57489bc9cb | ||
|
|
e45b09b675 | ||
|
|
c3d579a835 | ||
|
|
9d2f4fd795 | ||
|
|
a173c84ffb | ||
|
|
94ed85914a | ||
|
|
90c2986277 | ||
|
|
3cff63193d | ||
|
|
53066b1f14 | ||
|
|
c7524af07a | ||
|
|
500a148632 | ||
|
|
33c9aeda21 | ||
|
|
9b40ab3b52 | ||
|
|
5a115f1822 | ||
|
|
de9900ad14 | ||
|
|
731fbca87c | ||
|
|
8ed27013a4 | ||
|
|
9590afa752 | ||
|
|
f534997e0e | ||
|
|
d609a68dc4 | ||
|
|
92456aa838 | ||
|
|
d074f47659 | ||
|
|
4cc16897cf | ||
|
|
8cabec1aff | ||
|
|
e7650ab10e | ||
|
|
97ecba07bb | ||
|
|
061413303a | ||
|
|
6bb3d4b48a | ||
|
|
90a27b2a4d | ||
|
|
61aa656611 | ||
|
|
c6ae45f6ab | ||
|
|
d72eb0b06d | ||
|
|
5c728127f1 | ||
|
|
a64472188c | ||
|
|
39f7f0a1c6 | ||
|
|
1e3461918e | ||
|
|
ae0704e2bb | ||
|
|
42e07c2445 | ||
|
|
641cf5a350 | ||
|
|
f984a9122e | ||
|
|
889795a326 | ||
|
|
d5df9e0af9 | ||
|
|
b7a6cc5158 | ||
|
|
55d49f87ff | ||
|
|
c2abbf0fc0 | ||
|
|
ba11952945 | ||
|
|
a7f2556b48 | ||
|
|
b66dd2c01b | ||
|
|
c6261af03c | ||
|
|
e44d1ac62e | ||
|
|
37afe1959a | ||
|
|
da04f6b100 | ||
|
|
168dc5cb35 | ||
|
|
9f4d5df8d2 | ||
|
|
0c21c223be | ||
|
|
1fc4ac8e07 | ||
|
|
088161e9ba | ||
|
|
246429f7a1 | ||
|
|
2478dd6c10 | ||
|
|
ee234001f1 | ||
|
|
9325959358 | ||
|
|
aed6784f55 | ||
|
|
b5f916dbac | ||
|
|
2555623064 | ||
|
|
83aa57a764 | ||
|
|
44ed1b1547 | ||
|
|
1b91674f9b | ||
|
|
cc363c2f51 | ||
|
|
0982943799 | ||
|
|
c79faf6c0e | ||
|
|
ea110d5da9 | ||
|
|
40dc70e8c7 | ||
|
|
5cc684f4b6 | ||
|
|
3f605d59d4 | ||
|
|
d79af97dfc | ||
|
|
a701e14a62 | ||
|
|
8e30183d7c | ||
|
|
7d21795c2f | ||
|
|
26765f31f7 | ||
|
|
708c523b57 | ||
|
|
d05c6b996c | ||
|
|
f2f83b0a60 | ||
|
|
2c0e14fb55 | ||
|
|
dca2e6f060 | ||
|
|
440e43935a | ||
|
|
1dff9a48a8 | ||
|
|
85e90bb8d5 | ||
|
|
b62b2382fd | ||
|
|
07f64a0107 | ||
|
|
dcdb2cb175 | ||
|
|
33e7ae83dc | ||
|
|
ac0a1da140 | ||
|
|
1ad03ac61c | ||
|
|
b28736cb84 | ||
|
|
602c01e2d9 | ||
|
|
7b65c1aeb7 | ||
|
|
a27973800c | ||
|
|
cb4580c0d9 | ||
|
|
1a74d83eae | ||
|
|
319ee49c67 | ||
|
|
cefa3e1e1e | ||
|
|
061e61b740 | ||
|
|
73d756f211 | ||
|
|
3bb83610b8 | ||
|
|
8e85b87764 | ||
|
|
4d0f5a56ed | ||
|
|
a8359e3e00 | ||
|
|
3812331901 | ||
|
|
1714bd26f9 | ||
|
|
d8ad42f760 | ||
|
|
c477bd2bae | ||
|
|
aa1cd98646 | ||
|
|
5f545a9bbc | ||
|
|
0d3bc2cf47 | ||
|
|
8e65142d4c | ||
|
|
c26a758825 | ||
|
|
a02d8cee86 | ||
|
|
2c4d2981cd | ||
|
|
6c5e0a20f1 | ||
|
|
db920da4b8 | ||
|
|
efdc3eb7bb | ||
|
|
c0da86e4ca | ||
|
|
720a24e9ad | ||
|
|
7dc6096e07 | ||
|
|
7910205674 | ||
|
|
1fbc51d02b | ||
|
|
a3d968c6af | ||
|
|
63c61f8e47 | ||
|
|
1ae59f4229 | ||
|
|
4a95a6928b | ||
|
|
54a092a822 | ||
|
|
9898d47db4 | ||
|
|
b46e55c57b | ||
|
|
cb6f9f3e00 | ||
|
|
d750ba5f99 | ||
|
|
c84db87532 | ||
|
|
3da662ef61 | ||
|
|
2f42c75df7 | ||
|
|
14388487fd | ||
|
|
a155748f88 | ||
|
|
c7fa69a25b | ||
|
|
5194cb103a | ||
|
|
77ec0d1c78 | ||
|
|
d85c9a3c0a | ||
|
|
97a8e6f5c2 | ||
|
|
3d73b42c15 | ||
|
|
4156dfcd4e | ||
|
|
9fb19bffc1 | ||
|
|
fe1cdce59d | ||
|
|
c07caf6be8 | ||
|
|
cab8c60fcb | ||
|
|
023c7da52b | ||
|
|
6b2bcbee6e | ||
|
|
ebac577ede | ||
|
|
0846291779 | ||
|
|
fab9d95096 | ||
|
|
2dc853ebfc | ||
|
|
5867a351a8 | ||
|
|
5605e9a666 | ||
|
|
337b720d31 | ||
|
|
06185d5f7d | ||
|
|
90cfdd140b | ||
|
|
5a41d559a3 | ||
|
|
b6805a94a3 | ||
|
|
6a678cd5a9 | ||
|
|
ecaf61252a | ||
|
|
85c4e4ac37 | ||
|
|
16394182b2 | ||
|
|
a0cc53cbb7 | ||
|
|
f331ee2c24 | ||
|
|
cb0767f28e | ||
|
|
91aaf3be19 | ||
|
|
9540e564fc | ||
|
|
2100d6287c | ||
|
|
8ad8183d4f | ||
|
|
90f2d93768 | ||
|
|
bae8dc330c | ||
|
|
599ca4d2c9 | ||
|
|
ff7a1e7c0e | ||
|
|
216cd51c4a | ||
|
|
568e9935ac | ||
|
|
28e9247c9a | ||
|
|
df3f16d424 | ||
|
|
41d03a15ac | ||
|
|
3f0e67075f | ||
|
|
67329ec668 | ||
|
|
f28d783272 | ||
|
|
2c9d015f38 | ||
|
|
5ad8a93d48 | ||
|
|
ac9c1504e9 | ||
|
|
4cde913453 | ||
|
|
f05d041e6d | ||
|
|
ce4b41ee73 | ||
|
|
0c3c4c08ea | ||
|
|
67d9486495 | ||
|
|
bd00911f85 | ||
|
|
4cb3123ff6 | ||
|
|
4ff1411c38 | ||
|
|
f983a2eab2 | ||
|
|
fd7c86c2da | ||
|
|
d90aa1798b | ||
|
|
afa602f940 | ||
|
|
773698a0d4 | ||
|
|
08907e8953 | ||
|
|
332e9a53d7 | ||
|
|
7a8e2091a6 | ||
|
|
3ed05b8e26 | ||
|
|
d3dbfc5e9e | ||
|
|
30c84efb57 | ||
|
|
3ba8602156 | ||
|
|
9d2aacab58 | ||
|
|
c7b9751e0e | ||
|
|
9cfbc35ac4 | ||
|
|
ba618dc2b6 | ||
|
|
f3c870b8c7 | ||
|
|
46ec3e51b0 | ||
|
|
4ca93c3c45 | ||
|
|
7ab499e2c0 | ||
|
|
102f3de120 | ||
|
|
01fd6f3ad6 | ||
|
|
cca465d30d | ||
|
|
dc7f2acc50 | ||
|
|
79a15ad781 | ||
|
|
4e6905d562 | ||
|
|
03a5853a91 | ||
|
|
f3fae74bde | ||
|
|
8bbff388d2 | ||
|
|
40d5fe75e7 | ||
|
|
cdbabc0a0b | ||
|
|
97ecfc03c8 | ||
|
|
70d35bfeb8 | ||
|
|
a11866c544 | ||
|
|
5aaf5476e0 | ||
|
|
7e78922056 | ||
|
|
e7dad02c63 | ||
|
|
da5fb391a4 | ||
|
|
3b48b79997 | ||
|
|
30e887a85b | ||
|
|
c737c792f6 | ||
|
|
64f4853b13 | ||
|
|
0c890e590c | ||
|
|
b664b85495 | ||
|
|
3894a6a2d1 | ||
|
|
ae8224b734 | ||
|
|
bd5739d7a0 | ||
|
|
3a8a8efbd1 | ||
|
|
4fc1f4c60e | ||
|
|
079bbc8e78 | ||
|
|
70bfbd7d8e | ||
|
|
f0c7222055 | ||
|
|
7b1b3d4d8e | ||
|
|
7d6b4b7a23 | ||
|
|
a4d0b7d1cb | ||
|
|
62e786b9b8 | ||
|
|
38ae309285 | ||
|
|
f87b63d6ee | ||
|
|
3b3f1caf84 | ||
|
|
724be4c1cf | ||
|
|
b4ab287994 | ||
|
|
19d17940c0 | ||
|
|
aa46079ed4 | ||
|
|
5e81e3a6a6 | ||
|
|
e2f2b6aa5d | ||
|
|
a7c67b04ca | ||
|
|
465207034d | ||
|
|
93b9cf4b76 | ||
|
|
dc57860f0d | ||
|
|
f71b0bc945 | ||
|
|
1c9132627b | ||
|
|
b14d5de641 | ||
|
|
530743cf97 | ||
|
|
d1ab859621 | ||
|
|
fe76ada8d0 | ||
|
|
e096f4f081 | ||
|
|
0d8f7b854d | ||
|
|
b9beb6ec16 | ||
|
|
7afcf82c32 | ||
|
|
b27dd345af | ||
|
|
9fdf8c6a75 | ||
|
|
1010f270a0 | ||
|
|
0db051a251 | ||
|
|
890a431e24 | ||
|
|
173e0ea157 | ||
|
|
4c99ce4ab2 | ||
|
|
6f98228c41 | ||
|
|
95d15aa107 | ||
|
|
2f09e74f1a | ||
|
|
f30fcb3941 | ||
|
|
06254a9afc | ||
|
|
fd95c6cac7 | ||
|
|
2196bccda5 | ||
|
|
b0ac2b4147 | ||
|
|
5322321944 | ||
|
|
2f951e0ef6 | ||
|
|
1e6dcc88d2 | ||
|
|
8bbcfc40dc | ||
|
|
811ea46523 | ||
|
|
c37e54cf9b | ||
|
|
4c095e8eb5 | ||
|
|
c580ec7b92 | ||
|
|
0c45d3c5ba | ||
|
|
2bc8a4cefd | ||
|
|
92d28adb07 | ||
|
|
cc2b1dbbaa | ||
|
|
bd98cadab3 | ||
|
|
c417f88e3b | ||
|
|
b26a9af49b | ||
|
|
e4b00b35f2 | ||
|
|
11bab46b8b | ||
|
|
7eb24d7bd6 | ||
|
|
9a26366ff8 | ||
|
|
0058bc6fa5 | ||
|
|
ca3f3e0cab | ||
|
|
cf51ca454d | ||
|
|
35c3c2a2b3 | ||
|
|
12bb61c23d | ||
|
|
2e5a2a1393 | ||
|
|
4259bb088e | ||
|
|
0768765f21 | ||
|
|
dc7ee7fadc | ||
|
|
7665a1c339 | ||
|
|
6015cd5cb7 | ||
|
|
08aa8f2136 | ||
|
|
c27e447f57 | ||
|
|
9f1a3a0304 | ||
|
|
7714478fdc | ||
|
|
91bca33a54 | ||
|
|
c67b967817 | ||
|
|
150ed2c733 | ||
|
|
1c23e4b5b3 | ||
|
|
77c4dee6a8 | ||
|
|
d6fe8eec38 | ||
|
|
c12d83bbf0 | ||
|
|
0e6b75aa5c | ||
|
|
dd1dfdcf34 | ||
|
|
792d8dab34 | ||
|
|
4f23434f81 | ||
|
|
7797c4e0b0 | ||
|
|
6463a2be2d | ||
|
|
972a46ac2e | ||
|
|
db3091b21b | ||
|
|
476733ca19 | ||
|
|
d0c302c1f1 | ||
|
|
164deb1096 | ||
|
|
b39ea679e7 | ||
|
|
062a5f470c | ||
|
|
48fb388da2 | ||
|
|
a23cdc9605 | ||
|
|
1c7eb0f5a1 | ||
|
|
58050c9ec3 | ||
|
|
5908cc40a8 | ||
|
|
bffb5e53bf | ||
|
|
4a0b79f1a1 | ||
|
|
3ddb77e9f8 | ||
|
|
16f7bccb11 | ||
|
|
ecec5cdde2 | ||
|
|
cf4fca9836 | ||
|
|
e5d61b2796 | ||
|
|
fc493ea510 | ||
|
|
7983dc01f1 | ||
|
|
09f914cecd | ||
|
|
9968b0ac36 | ||
|
|
969a5f711c | ||
|
|
ccb4601c85 | ||
|
|
25aabe7553 | ||
|
|
13755d4d06 | ||
|
|
1d6e87d103 | ||
|
|
8673ef8420 | ||
|
|
ab1fb70f4c | ||
|
|
31fe6923ff | ||
|
|
0b07b7c4a7 | ||
|
|
0abe05b7bd | ||
|
|
45ff19f9ae | ||
|
|
d25883ff1b | ||
|
|
d2f43e4e50 | ||
|
|
792167a71c | ||
|
|
f2586d7cb0 | ||
|
|
c37846b4cd | ||
|
|
17c4ec6790 | ||
|
|
7023040882 | ||
|
|
8c38de1b26 | ||
|
|
1917c9da95 | ||
|
|
668bf5009b | ||
|
|
e9ca1e3537 | ||
|
|
ebdb412adf | ||
|
|
e73c72d148 | ||
|
|
d1d843c583 | ||
|
|
464e375529 | ||
|
|
2b12f8a294 | ||
|
|
b305e98519 | ||
|
|
5431e49c2a | ||
|
|
6098cdc31d | ||
|
|
308d7c2c1c | ||
|
|
454f40ffb9 | ||
|
|
dd3b3dec33 | ||
|
|
bc2831c066 | ||
|
|
905d2acdbd | ||
|
|
54c2b6b6d5 | ||
|
|
b6a4ccac7f | ||
|
|
3fce1cc934 | ||
|
|
375a888a37 | ||
|
|
0d62034f32 | ||
|
|
f7d722aaf0 | ||
|
|
56759bc710 | ||
|
|
d27b5c28ef | ||
|
|
a0d1cada54 | ||
|
|
ca7e1da585 | ||
|
|
5f097c4002 | ||
|
|
203dc6daf6 | ||
|
|
e895850f17 | ||
|
|
f776e7947c | ||
|
|
416ec920cb | ||
|
|
b5da72eb40 | ||
|
|
3dde77608e | ||
|
|
a0407553ec | ||
|
|
8d594fe0b6 | ||
|
|
e68e87d388 | ||
|
|
4cabd42c0b | ||
|
|
df33f7d0fc | ||
|
|
d6b5e3981c | ||
|
|
6aa0300c85 | ||
|
|
264ca84513 | ||
|
|
816306872d | ||
|
|
13aced705a | ||
|
|
95d0f879ca | ||
|
|
f37d2297bb | ||
|
|
0d90a53b8e | ||
|
|
f91dfe7efa | ||
|
|
ec757e3ef8 | ||
|
|
3b2ca10b05 | ||
|
|
b438e38268 | ||
|
|
bb405f2824 | ||
|
|
1d640fbec0 | ||
|
|
ecc820333e | ||
|
|
9cc227aa61 | ||
|
|
93420eebc0 | ||
|
|
6014b3bdc6 | ||
|
|
81789c717f | ||
|
|
dfa6330821 | ||
|
|
1d5d9c12a7 | ||
|
|
2cbbbe7359 | ||
|
|
4706cedbf9 | ||
|
|
a11b955a9d | ||
|
|
e1366f6267 | ||
|
|
6bff839821 | ||
|
|
0b37acf16e | ||
|
|
70c39eef0a | ||
|
|
1988b18053 | ||
|
|
67f87396e8 | ||
|
|
3734721c58 | ||
|
|
0f6a3f2ec8 | ||
|
|
ab9ca4b9c3 | ||
|
|
c05cffbd88 | ||
|
|
0e3f3d1143 | ||
|
|
ff02a4a8d4 | ||
|
|
c8c35b5bf7 | ||
|
|
18daa6a8c7 | ||
|
|
c95b58852c | ||
|
|
80ccceb9b0 | ||
|
|
eaa308d3ce | ||
|
|
d05ac7e10d | ||
|
|
a80aef16a0 | ||
|
|
338560fedb | ||
|
|
632830278f | ||
|
|
8b614bd3c4 | ||
|
|
657354c2e8 | ||
|
|
7a0d9f2325 | ||
|
|
ae45c0c7ae | ||
|
|
c3b0e31a0a | ||
|
|
f7207c1326 | ||
|
|
9a9817c6b3 | ||
|
|
1b4ac9da8b | ||
|
|
d98310fc0e | ||
|
|
3240fca63e | ||
|
|
f1631b7f06 | ||
|
|
30e5c5f91b | ||
|
|
257026144d | ||
|
|
9f786dce97 | ||
|
|
c2f582164c | ||
|
|
464ed3b614 | ||
|
|
5bb9494ecc | ||
|
|
0fb583a094 | ||
|
|
358b1a7dbe | ||
|
|
bd91f439c8 | ||
|
|
4181ada887 | ||
|
|
32d116d106 | ||
|
|
30c27f9faf | ||
|
|
b332d576ab | ||
|
|
9def43cef0 | ||
|
|
0820b39a35 | ||
|
|
2a0be85d14 | ||
|
|
efb7262113 | ||
|
|
1a732bbb93 | ||
|
|
b8fe380b61 | ||
|
|
8670cea7a3 | ||
|
|
e2a5ec3616 | ||
|
|
d013366c9a | ||
|
|
e9093cda6d | ||
|
|
0f30a0ef3d | ||
|
|
b1a64e346c | ||
|
|
c524a89c5e | ||
|
|
e73d90e697 | ||
|
|
ee470d9ce9 | ||
|
|
aab5b3aaab | ||
|
|
86281b5fdb | ||
|
|
ddabf7db49 | ||
|
|
1c7523e98e | ||
|
|
120d084b12 | ||
|
|
1e69ec4634 | ||
|
|
31a680ce1c | ||
|
|
3bad19530e | ||
|
|
10986289e6 | ||
|
|
656c1b8d5d | ||
|
|
ef0037aa25 | ||
|
|
af02ccbd6f | ||
|
|
978f3f63bd | ||
|
|
e550cc0f43 | ||
|
|
5894226e93 | ||
|
|
d50fa8eeb7 | ||
|
|
6efd333684 | ||
|
|
05701b60c1 | ||
|
|
f8e7e55a00 | ||
|
|
20663f0226 | ||
|
|
ad175ba2ac | ||
|
|
bdf90a5e51 | ||
|
|
49618534ce | ||
|
|
f2bb2a6bee | ||
|
|
ba4f3aea7b | ||
|
|
b30068103b | ||
|
|
7062928c32 | ||
|
|
7f0764b7b1 | ||
|
|
8b21f4f869 | ||
|
|
8d634b9b1b | ||
|
|
698e567c63 | ||
|
|
6d697c3dda | ||
|
|
746e28c3a2 | ||
|
|
df0f087505 | ||
|
|
0ccec4c8c1 | ||
|
|
e18e1533e3 | ||
|
|
c077381e45 | ||
|
|
a0ecb78086 | ||
|
|
e47bd9faa4 | ||
|
|
e2bf6117dd | ||
|
|
14b0b332c5 | ||
|
|
76f74dabbe | ||
|
|
42dec2de39 | ||
|
|
b965971c79 | ||
|
|
3a7ab02f88 | ||
|
|
b931e935b5 | ||
|
|
521a1b7d34 | ||
|
|
fffcef2d30 | ||
|
|
cf1216a667 | ||
|
|
68ee647ed2 | ||
|
|
2eda952cd0 | ||
|
|
7fac4ac298 | ||
|
|
9016a5109d | ||
|
|
8e055fe587 | ||
|
|
3b2bb0590f | ||
|
|
134d3e2d0d | ||
|
|
b735f8e567 | ||
|
|
3992ea6656 | ||
|
|
03840990be |
@@ -122,10 +122,6 @@ dotnet_code_quality.ca3012.excluded_symbol_names = BotController|CommandControll
|
|||||||
|
|
||||||
dotnet_code_quality_unused_parameters = all:warning
|
dotnet_code_quality_unused_parameters = all:warning
|
||||||
|
|
||||||
dotnet_diagnostic.ca1028.severity = silent
|
|
||||||
dotnet_diagnostic.ca1031.severity = silent
|
|
||||||
dotnet_diagnostic.ca1863.severity = silent
|
|
||||||
|
|
||||||
# Rule - almost everything
|
# Rule - almost everything
|
||||||
dotnet_naming_rule.almost_everything_must_be_pascal_case.severity = warning
|
dotnet_naming_rule.almost_everything_must_be_pascal_case.severity = warning
|
||||||
dotnet_naming_rule.almost_everything_must_be_pascal_case.style = pascal_case
|
dotnet_naming_rule.almost_everything_must_be_pascal_case.style = pascal_case
|
||||||
@@ -226,6 +222,10 @@ dotnet_style_qualification_for_property = false:warning
|
|||||||
dotnet_style_readonly_field = true:warning
|
dotnet_style_readonly_field = true:warning
|
||||||
dotnet_style_require_accessibility_modifiers = always:warning
|
dotnet_style_require_accessibility_modifiers = always:warning
|
||||||
|
|
||||||
|
[ArchiSteamFarm/**.cs]
|
||||||
|
# ASF project includes plugin system, therefore CA1515 typically doesn't make sense there
|
||||||
|
dotnet_diagnostic.CA1515.severity = silent
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
# JetBrains, IntelliJ/Rider #
|
# JetBrains, IntelliJ/Rider #
|
||||||
###############################
|
###############################
|
||||||
|
|||||||
6
.gitattributes
vendored
6
.gitattributes
vendored
@@ -1,7 +1,11 @@
|
|||||||
# Auto detect text files and perform LF normalization
|
# Auto detect text files and perform LF normalization
|
||||||
* text=auto
|
* text=auto
|
||||||
|
|
||||||
|
# Unix files that are always LF
|
||||||
*.sh text eol=lf
|
*.sh text eol=lf
|
||||||
|
|
||||||
# Custom for Visual Studio
|
# Windows files that are always CRLF
|
||||||
|
[Dd]esktop.ini text eol=crlf
|
||||||
|
|
||||||
|
# Diff settings
|
||||||
*.cs diff=csharp
|
*.cs diff=csharp
|
||||||
|
|||||||
4
.github/FUNDING.yml
vendored
4
.github/FUNDING.yml
vendored
@@ -1,4 +1,2 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
github: JustArchi
|
github: JustArchi
|
||||||
custom: ["https://paypal.me/JustArchi", "https://pay.revolut.com/justarchi", "https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e", "https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_"]
|
custom: ["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_"]
|
||||||
|
|||||||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -7,8 +7,8 @@ contact_links:
|
|||||||
url: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Localization
|
url: https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Localization
|
||||||
about: Please use our crowdin platform
|
about: Please use our crowdin platform
|
||||||
- name: ❓ Support question or technical issue
|
- name: ❓ Support question or technical issue
|
||||||
url: https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/.github/SUPPORT.md
|
url: https://github.com/JustArchiNET/ArchiSteamFarm/discussions/categories/support-english
|
||||||
about: Please review our support guidelines
|
about: Please use GitHub discussions or other support channels
|
||||||
- name: 🗯️ Negative feedback, complaints and demands
|
- name: 🗯️ Negative feedback, complaints and demands
|
||||||
url: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
url: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
||||||
about: We're taking those very seriously
|
about: We're taking those very seriously
|
||||||
|
|||||||
6
.github/RELEASE_TEMPLATE.md
vendored
6
.github/RELEASE_TEMPLATE.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
### Notice
|
### Notice
|
||||||
|
|
||||||
**Pre-releases are experimental versions that often contain unpatched bugs, work-in-progress features and rewritten implementations. If you don't consider yourself advanced user, please download **[latest stable release](https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest)** instead. Pre-release versions are dedicated to users who know how to report bugs, deal with issues and give feedback - no technical support will be given. Check out ASF **[release cycle](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Release-cycle)** if you'd like to learn more.**
|
**Pre-releases are test versions that often contain unpatched bugs, work-in-progress features and rewritten implementations. If you don't consider yourself advanced user, please download **[latest stable release](https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest)** instead. Pre-release versions are dedicated to users who know how to report bugs, deal with issues and give feedback - no technical support will be given. Check out ASF **[release cycle](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Release-cycle)** if you'd like to learn more.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -14,4 +14,6 @@ This is automated GitHub deployment, human-readable changelog should be availabl
|
|||||||
|
|
||||||
ASF is available for free, this release was made possible thanks to the people that decided to support the project. If you're grateful for what we're doing, please consider a donation. Developing ASF requires massive amount of time and knowledge, especially when it comes to Steam (and its problems). Even $1 is highly appreciated and shows that you care. Thank you!
|
ASF is available for free, this release was made possible thanks to the people that decided to support the project. If you're grateful for what we're doing, please consider a donation. Developing ASF requires massive amount of time and knowledge, especially when it comes to Steam (and its problems). Even $1 is highly appreciated and shows that you care. Thank you!
|
||||||
|
|
||||||
[](https://github.com/sponsors/JustArchi) [](https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e) [](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://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)
|
||||||
|
|||||||
3
qodana.yaml → .github/qodana.yaml
vendored
3
qodana.yaml → .github/qodana.yaml
vendored
@@ -10,6 +10,9 @@ exclude:
|
|||||||
- ArchiSteamFarm.OfficialPlugins.MobileAuthenticator/Localization
|
- ArchiSteamFarm.OfficialPlugins.MobileAuthenticator/Localization
|
||||||
- ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization
|
- ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization
|
||||||
- name: AsyncVoidMethod
|
- name: AsyncVoidMethod
|
||||||
|
- name: CA1515
|
||||||
|
paths:
|
||||||
|
- ArchiSteamFarm
|
||||||
- name: InternalOrPrivateMemberNotDocumented
|
- name: InternalOrPrivateMemberNotDocumented
|
||||||
- name: InvertIf
|
- name: InvertIf
|
||||||
- name: NullableWarningSuppressionIsUsed
|
- name: NullableWarningSuppressionIsUsed
|
||||||
14
.github/renovate.json5
vendored
14
.github/renovate.json5
vendored
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
|
||||||
"extends": [
|
"extends": [
|
||||||
"config:base",
|
"config:best-practices",
|
||||||
":assignee(JustArchi)",
|
":assignee(JustArchi)",
|
||||||
":automergeBranch",
|
":automergeBranch",
|
||||||
":automergeDigest",
|
":automergeDigest",
|
||||||
@@ -10,15 +11,8 @@
|
|||||||
":disableRateLimiting",
|
":disableRateLimiting",
|
||||||
":label(🤖 Automatic)"
|
":label(🤖 Automatic)"
|
||||||
],
|
],
|
||||||
|
|
||||||
"git-submodules": {
|
"git-submodules": {
|
||||||
"enabled": true
|
"enabled": true
|
||||||
},
|
}
|
||||||
"packageRules": [
|
|
||||||
{
|
|
||||||
// TODO: <= 3.1 for Mono support, last failed version 6.12, https://steamcommunity.com/groups/archiasf/discussions/1/2997673517556002529
|
|
||||||
"allowedVersions": "<= 3.1",
|
|
||||||
"matchManagers": [ "nuget" ],
|
|
||||||
"matchPackageNames": [ "Microsoft.Extensions.Configuration.Json", "Microsoft.Extensions.Logging.Configuration" ]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
17
.github/workflows/ci.yml
vendored
17
.github/workflows/ci.yml
vendored
@@ -5,7 +5,7 @@ on: [push, pull_request]
|
|||||||
env:
|
env:
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_SDK_VERSION: 8.0
|
DOTNET_SDK_VERSION: 9.0
|
||||||
|
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
@@ -21,13 +21,13 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup .NET Core
|
- name: Setup .NET Core
|
||||||
uses: actions/setup-dotnet@v4.0.0
|
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
||||||
|
|
||||||
@@ -38,13 +38,4 @@ jobs:
|
|||||||
run: dotnet build -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
|
run: dotnet build -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
|
||||||
|
|
||||||
- name: Run ${{ matrix.configuration }} ArchiSteamFarm.Tests
|
- 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
|
||||||
|
|
||||||
- name: Upload latest strings for translation on Crowdin
|
|
||||||
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.configuration == 'Release' && startsWith(matrix.os, 'ubuntu-') }}
|
|
||||||
uses: crowdin/github-action@v1.20.2
|
|
||||||
with:
|
|
||||||
crowdin_branch_name: main
|
|
||||||
config: '.github/crowdin.yml'
|
|
||||||
project_id: ${{ secrets.ASF_CROWDIN_PROJECT_ID }}
|
|
||||||
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
|
|
||||||
|
|||||||
45
.github/workflows/code-quality.yml
vendored
45
.github/workflows/code-quality.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: ASF-code-quality
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
env:
|
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
|
||||||
DOTNET_NOLOGO: true
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
checks: write
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
security-events: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
main:
|
|
||||||
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: actions/checkout@v4.1.1
|
|
||||||
with:
|
|
||||||
show-progress: false
|
|
||||||
|
|
||||||
- name: Checkout code (for PR)
|
|
||||||
if: github.event_name == 'pull_request'
|
|
||||||
uses: actions/checkout@v4.1.1
|
|
||||||
with:
|
|
||||||
fetch-depth: 100 # History is required for pull request analysis
|
|
||||||
ref: ${{ github.event.pull_request.head.sha }} # To check out the actual pull request commit, not the merge commit
|
|
||||||
show-progress: false
|
|
||||||
|
|
||||||
- name: Run Qodana scan
|
|
||||||
uses: JetBrains/qodana-action@v2023.3.2
|
|
||||||
with:
|
|
||||||
args: --property=idea.headless.enable.statistics=false
|
|
||||||
env:
|
|
||||||
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
|
|
||||||
|
|
||||||
- name: Report Qodana results to GitHub
|
|
||||||
uses: github/codeql-action/upload-sarif@v3.24.9
|
|
||||||
with:
|
|
||||||
sarif_file: ${{ runner.temp }}/qodana/results/qodana.sarif.json
|
|
||||||
28
.github/workflows/crowdin-ci.yml
vendored
Normal file
28
.github/workflows/crowdin-ci.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
name: ASF-crowdin-ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
environment: dev-crowdin
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
with:
|
||||||
|
show-progress: false
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: Upload latest strings for translation on Crowdin
|
||||||
|
uses: crowdin/github-action@297234bae049541aa48ed268e5de00dee4efa4b4 # v2.8.0
|
||||||
|
with:
|
||||||
|
crowdin_branch_name: main
|
||||||
|
config: '.github/crowdin.yml'
|
||||||
|
project_id: ${{ secrets.ASF_CROWDIN_PROJECT_ID }}
|
||||||
|
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
|
||||||
12
.github/workflows/docker-ci.yml
vendored
12
.github/workflows/docker-ci.yml
vendored
@@ -19,20 +19,20 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3.2.0
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Build ${{ matrix.configuration }} Docker image from ${{ matrix.file }}
|
- name: Build ${{ matrix.configuration }} Docker image from ${{ matrix.file }}
|
||||||
uses: docker/build-push-action@v5.3.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
with:
|
with:
|
||||||
|
build-args: CONFIGURATION=${{ matrix.configuration }}
|
||||||
context: .
|
context: .
|
||||||
file: ${{ matrix.file }}
|
file: ${{ matrix.file }}
|
||||||
platforms: ${{ env.PLATFORMS }}
|
platforms: ${{ env.PLATFORMS }}
|
||||||
build-args: |
|
provenance: true
|
||||||
CONFIGURATION=${{ matrix.configuration }}
|
sbom: true
|
||||||
STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
|
||||||
|
|||||||
27
.github/workflows/docker-publish-latest.yml
vendored
27
.github/workflows/docker-publish-latest.yml
vendored
@@ -5,7 +5,6 @@ on:
|
|||||||
types: [released]
|
types: [released]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
ASF_PRIVATE_SNK: ${{ secrets.ASF_PRIVATE_SNK }}
|
|
||||||
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
||||||
TAG: latest
|
TAG: latest
|
||||||
|
|
||||||
@@ -14,40 +13,32 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
|
environment: release-docker
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3.2.0
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Login to ghcr.io
|
- name: Login to ghcr.io
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Prepare private key for signing
|
|
||||||
shell: sh
|
|
||||||
run: |
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
if [ -n "${ASF_PRIVATE_SNK-}" ]; then
|
|
||||||
echo "$ASF_PRIVATE_SNK" | base64 -d > "resources/ArchiSteamFarm.snk"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Prepare environment outputs
|
- name: Prepare environment outputs
|
||||||
shell: sh
|
shell: sh
|
||||||
run: |
|
run: |
|
||||||
@@ -59,12 +50,16 @@ jobs:
|
|||||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Build and publish Docker image from Dockerfile.Service
|
- name: Build and publish Docker image from Dockerfile.Service
|
||||||
uses: docker/build-push-action@v5.3.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: Dockerfile.Service
|
file: Dockerfile.Service
|
||||||
platforms: ${{ env.PLATFORMS }}
|
platforms: ${{ env.PLATFORMS }}
|
||||||
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
provenance: true
|
||||||
|
sbom: true
|
||||||
|
secrets: |
|
||||||
|
ASF_PRIVATE_SNK=${{ secrets.ASF_PRIVATE_SNK }}
|
||||||
|
STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
||||||
org.opencontainers.image.version=${{ env.FIXED_TAG }}
|
org.opencontainers.image.version=${{ env.FIXED_TAG }}
|
||||||
|
|||||||
31
.github/workflows/docker-publish-main.yml
vendored
31
.github/workflows/docker-publish-main.yml
vendored
@@ -6,7 +6,6 @@ on:
|
|||||||
- main
|
- main
|
||||||
|
|
||||||
env:
|
env:
|
||||||
ASF_PRIVATE_SNK: ${{ secrets.ASF_PRIVATE_SNK }}
|
|
||||||
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
||||||
TAG: main
|
TAG: main
|
||||||
|
|
||||||
@@ -15,40 +14,32 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
|
environment: release-docker
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3.2.0
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Login to ghcr.io
|
- name: Login to ghcr.io
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Prepare private key for signing
|
|
||||||
shell: sh
|
|
||||||
run: |
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
if [ -n "${ASF_PRIVATE_SNK-}" ]; then
|
|
||||||
echo "$ASF_PRIVATE_SNK" | base64 -d > "resources/ArchiSteamFarm.snk"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Prepare environment outputs
|
- name: Prepare environment outputs
|
||||||
shell: sh
|
shell: sh
|
||||||
run: |
|
run: |
|
||||||
@@ -59,11 +50,15 @@ jobs:
|
|||||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Build and publish Docker image from Dockerfile
|
- name: Build and publish Docker image from Dockerfile
|
||||||
uses: docker/build-push-action@v5.3.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: ${{ env.PLATFORMS }}
|
platforms: ${{ env.PLATFORMS }}
|
||||||
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
provenance: true
|
||||||
|
sbom: true
|
||||||
|
secrets: |
|
||||||
|
ASF_PRIVATE_SNK=${{ secrets.ASF_PRIVATE_SNK }}
|
||||||
|
STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
||||||
org.opencontainers.image.version=${{ github.sha }}
|
org.opencontainers.image.version=${{ github.sha }}
|
||||||
@@ -74,9 +69,9 @@ jobs:
|
|||||||
push: true
|
push: true
|
||||||
|
|
||||||
- name: Update DockerHub repository description
|
- name: Update DockerHub repository description
|
||||||
uses: peter-evans/dockerhub-description@v4.0.0
|
uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_PASSWORD }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
repository: ${{ env.DH_REPOSITORY }}
|
repository: ${{ env.DH_REPOSITORY }}
|
||||||
short-description: ${{ github.event.repository.description }}
|
short-description: ${{ github.event.repository.description }}
|
||||||
|
|||||||
27
.github/workflows/docker-publish-released.yml
vendored
27
.github/workflows/docker-publish-released.yml
vendored
@@ -6,7 +6,6 @@ on:
|
|||||||
- '*'
|
- '*'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
ASF_PRIVATE_SNK: ${{ secrets.ASF_PRIVATE_SNK }}
|
|
||||||
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
PLATFORMS: linux/amd64,linux/arm,linux/arm64
|
||||||
TAG: released
|
TAG: released
|
||||||
|
|
||||||
@@ -15,40 +14,32 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
main:
|
||||||
|
environment: release-docker
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3.2.0
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Login to ghcr.io
|
- name: Login to ghcr.io
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login to DockerHub
|
- name: Login to DockerHub
|
||||||
uses: docker/login-action@v3.1.0
|
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Prepare private key for signing
|
|
||||||
shell: sh
|
|
||||||
run: |
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
if [ -n "${ASF_PRIVATE_SNK-}" ]; then
|
|
||||||
echo "$ASF_PRIVATE_SNK" | base64 -d > "resources/ArchiSteamFarm.snk"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Prepare environment outputs
|
- name: Prepare environment outputs
|
||||||
shell: sh
|
shell: sh
|
||||||
run: |
|
run: |
|
||||||
@@ -60,11 +51,15 @@ jobs:
|
|||||||
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Build and publish Docker image from Dockerfile
|
- name: Build and publish Docker image from Dockerfile
|
||||||
uses: docker/build-push-action@v5.3.0
|
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
platforms: ${{ env.PLATFORMS }}
|
platforms: ${{ env.PLATFORMS }}
|
||||||
build-args: STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
provenance: true
|
||||||
|
sbom: true
|
||||||
|
secrets: |
|
||||||
|
ASF_PRIVATE_SNK=${{ secrets.ASF_PRIVATE_SNK }}
|
||||||
|
STEAM_TOKEN_DUMPER_TOKEN=${{ secrets.STEAM_TOKEN_DUMPER_TOKEN }}
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
org.opencontainers.image.created=${{ env.DATE_ISO8601 }}
|
||||||
org.opencontainers.image.version=${{ env.FIXED_TAG }}
|
org.opencontainers.image.version=${{ env.FIXED_TAG }}
|
||||||
|
|||||||
2
.github/workflows/lock-threads.yml
vendored
2
.github/workflows/lock-threads.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Lock inactive threads
|
- name: Lock inactive threads
|
||||||
uses: dessant/lock-threads@v5.0.1
|
uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1
|
||||||
with:
|
with:
|
||||||
discussion-inactive-days: 90
|
discussion-inactive-days: 90
|
||||||
issue-inactive-days: 60
|
issue-inactive-days: 60
|
||||||
|
|||||||
91
.github/workflows/publish.yml
vendored
91
.github/workflows/publish.yml
vendored
@@ -6,7 +6,7 @@ env:
|
|||||||
CONFIGURATION: Release
|
CONFIGURATION: Release
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
DOTNET_CLI_TELEMETRY_OPTOUT: true
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_SDK_VERSION: 8.0
|
DOTNET_SDK_VERSION: 9.0
|
||||||
NODE_JS_VERSION: 'lts/*'
|
NODE_JS_VERSION: 'lts/*'
|
||||||
PLUGINS_BUNDLED: ArchiSteamFarm.OfficialPlugins.ItemsMatcher ArchiSteamFarm.OfficialPlugins.MobileAuthenticator ArchiSteamFarm.OfficialPlugins.SteamTokenDumper
|
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
|
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:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|
||||||
- name: Setup Node.js with npm
|
- name: Setup Node.js with npm
|
||||||
uses: actions/setup-node@v4.0.2
|
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
|
||||||
with:
|
with:
|
||||||
check-latest: true
|
check-latest: true
|
||||||
node-version: ${{ env.NODE_JS_VERSION }}
|
node-version: ${{ env.NODE_JS_VERSION }}
|
||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
run: npm run-script deploy --no-progress --prefix ASF-ui
|
run: npm run-script deploy --no-progress --prefix ASF-ui
|
||||||
|
|
||||||
- name: Upload ASF-ui
|
- name: Upload ASF-ui
|
||||||
uses: actions/upload-artifact@v4.3.1
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: ASF-ui
|
name: ASF-ui
|
||||||
@@ -75,14 +75,18 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
|
|
||||||
- name: Setup .NET Core
|
- name: Setup .NET Core
|
||||||
uses: actions/setup-dotnet@v4.0.0
|
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
|
||||||
|
|
||||||
@@ -90,7 +94,7 @@ jobs:
|
|||||||
run: dotnet --info
|
run: dotnet --info
|
||||||
|
|
||||||
- name: Download previously built ASF-ui
|
- name: Download previously built ASF-ui
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ASF-ui
|
name: ASF-ui
|
||||||
path: ASF-ui/dist
|
path: ASF-ui/dist
|
||||||
@@ -355,8 +359,14 @@ jobs:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- name: Generate artifact attestation for ASF-${{ matrix.variant }}.zip
|
||||||
|
if: ${{ github.event_name == 'push' }}
|
||||||
|
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0
|
||||||
|
with:
|
||||||
|
subject-path: out/ASF-${{ matrix.variant }}.zip
|
||||||
|
|
||||||
- name: Upload ASF-${{ matrix.variant }}
|
- name: Upload ASF-${{ matrix.variant }}
|
||||||
uses: actions/upload-artifact@v4.3.1
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: ${{ matrix.os }}_ASF-${{ matrix.variant }}
|
name: ${{ matrix.os }}_ASF-${{ matrix.variant }}
|
||||||
@@ -396,9 +406,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
- 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@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0
|
||||||
|
with:
|
||||||
|
subject-path: out/ArchiSteamFarm.OfficialPlugins.Monitoring.zip
|
||||||
|
|
||||||
- name: Upload ArchiSteamFarm.OfficialPlugins.Monitoring
|
- name: Upload ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' && matrix.variant == 'generic' }}
|
if: ${{ matrix.os == 'ubuntu-latest' && matrix.variant == 'generic' }}
|
||||||
uses: actions/upload-artifact@v4.3.1
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||||
@@ -407,105 +423,114 @@ jobs:
|
|||||||
release:
|
release:
|
||||||
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
|
if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') }}
|
||||||
needs: publish-asf
|
needs: publish-asf
|
||||||
|
environment: release-github
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
attestations: write
|
||||||
contents: write
|
contents: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
|
|
||||||
- name: Download ASF-generic artifact from ubuntu-latest
|
- name: Download ASF-generic artifact from ubuntu-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ubuntu-latest_ASF-generic
|
name: ubuntu-latest_ASF-generic
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-linux-arm artifact from ubuntu-latest
|
- name: Download ASF-linux-arm artifact from ubuntu-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ubuntu-latest_ASF-linux-arm
|
name: ubuntu-latest_ASF-linux-arm
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-linux-arm64 artifact from ubuntu-latest
|
- name: Download ASF-linux-arm64 artifact from ubuntu-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ubuntu-latest_ASF-linux-arm64
|
name: ubuntu-latest_ASF-linux-arm64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-linux-x64 artifact from ubuntu-latest
|
- name: Download ASF-linux-x64 artifact from ubuntu-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: ubuntu-latest_ASF-linux-x64
|
name: ubuntu-latest_ASF-linux-x64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-osx-arm64 artifact from macos-latest
|
- name: Download ASF-osx-arm64 artifact from macos-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: macos-latest_ASF-osx-arm64
|
name: macos-latest_ASF-osx-arm64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-osx-x64 artifact from macos-latest
|
- name: Download ASF-osx-x64 artifact from macos-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: macos-latest_ASF-osx-x64
|
name: macos-latest_ASF-osx-x64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-win-arm64 artifact from windows-latest
|
- name: Download ASF-win-arm64 artifact from windows-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: windows-latest_ASF-win-arm64
|
name: windows-latest_ASF-win-arm64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
- name: Download ASF-win-x64 artifact from windows-latest
|
- name: Download ASF-win-x64 artifact from windows-latest
|
||||||
uses: actions/download-artifact@v4.1.4
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
with:
|
with:
|
||||||
name: windows-latest_ASF-win-x64
|
name: windows-latest_ASF-win-x64
|
||||||
path: out
|
path: out
|
||||||
|
|
||||||
# TODO: Enable me when documentation is ready and plugin is stable for usage
|
- name: Download ArchiSteamFarm.OfficialPlugins.Monitoring artifact
|
||||||
# - name: Download ArchiSteamFarm.OfficialPlugins.Monitoring artifact
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
||||||
# uses: actions/download-artifact@v4.1.4
|
with:
|
||||||
# with:
|
name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
||||||
# name: ArchiSteamFarm.OfficialPlugins.Monitoring
|
path: out
|
||||||
# path: out
|
|
||||||
|
|
||||||
- name: Import GPG key for signing
|
- name: Import GPG key for signing
|
||||||
uses: crazy-max/ghaction-import-gpg@v6.1.0
|
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
|
||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
||||||
|
|
||||||
- name: Generate SHA-512 checksums and signature
|
- name: Generate SHA-512 checksums and signature
|
||||||
shell: sh
|
shell: sh
|
||||||
|
working-directory: out
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
(
|
sha512sum *.zip > SHA512SUMS
|
||||||
cd "out"
|
gpg -a -b -o SHA512SUMS.sign SHA512SUMS
|
||||||
|
|
||||||
sha512sum *.zip > SHA512SUMS
|
- name: Generate artifact attestation for SHA512SUMS
|
||||||
gpg -a -b -o SHA512SUMS.sign SHA512SUMS
|
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0
|
||||||
)
|
with:
|
||||||
|
subject-path: out/SHA512SUMS
|
||||||
|
|
||||||
- name: Upload SHA512SUMS
|
- name: Upload SHA512SUMS
|
||||||
uses: actions/upload-artifact@v4.3.1
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: SHA512SUMS
|
name: SHA512SUMS
|
||||||
path: out/SHA512SUMS
|
path: out/SHA512SUMS
|
||||||
|
|
||||||
|
- name: Generate artifact attestation for SHA512SUMS.sign
|
||||||
|
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0
|
||||||
|
with:
|
||||||
|
subject-path: out/SHA512SUMS.sign
|
||||||
|
|
||||||
- name: Upload SHA512SUMS.sign
|
- name: Upload SHA512SUMS.sign
|
||||||
uses: actions/upload-artifact@v4.3.1
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: SHA512SUMS.sign
|
name: SHA512SUMS.sign
|
||||||
path: out/SHA512SUMS.sign
|
path: out/SHA512SUMS.sign
|
||||||
|
|
||||||
- name: Create ArchiSteamFarm GitHub release
|
- name: Create ArchiSteamFarm GitHub release
|
||||||
uses: ncipollo/release-action@v1.14.0
|
uses: ncipollo/release-action@bcfe5470707e8832e12347755757cec0eb3c22af # v1.18.0
|
||||||
with:
|
with:
|
||||||
allowUpdates: true
|
allowUpdates: true
|
||||||
artifactErrorsFailBuild: true
|
artifactErrorsFailBuild: true
|
||||||
|
|||||||
37
.github/workflows/translations.yml
vendored
37
.github/workflows/translations.yml
vendored
@@ -10,11 +10,12 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update:
|
update:
|
||||||
|
environment: dev-crowdin
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
@@ -22,16 +23,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Reset wiki to follow origin
|
- name: Reset wiki to follow origin
|
||||||
shell: sh
|
shell: sh
|
||||||
|
working-directory: wiki
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
cd wiki
|
git fetch origin master
|
||||||
|
|
||||||
git fetch --depth=1 origin master
|
|
||||||
git reset --hard origin/master
|
git reset --hard origin/master
|
||||||
|
|
||||||
- name: Download latest translations from Crowdin
|
- name: Download latest translations from Crowdin
|
||||||
uses: crowdin/github-action@v1.20.2
|
uses: crowdin/github-action@297234bae049541aa48ed268e5de00dee4efa4b4 # v2.8.0
|
||||||
with:
|
with:
|
||||||
upload_sources: false
|
upload_sources: false
|
||||||
download_translations: true
|
download_translations: true
|
||||||
@@ -43,35 +43,28 @@ jobs:
|
|||||||
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
|
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
|
||||||
|
|
||||||
- name: Import GPG key for signing
|
- name: Import GPG key for signing
|
||||||
uses: crazy-max/ghaction-import-gpg@v6.1.0
|
uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
|
||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
|
||||||
git_config_global: true
|
git_config_global: true
|
||||||
git_user_signingkey: true
|
git_user_signingkey: true
|
||||||
git_commit_gpgsign: true
|
git_commit_gpgsign: true
|
||||||
|
|
||||||
- name: Commit the changes to wiki
|
- name: Commit and push the changes to wiki
|
||||||
shell: sh
|
shell: sh
|
||||||
|
working-directory: wiki
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
cd wiki
|
|
||||||
|
|
||||||
git add -A "locale"
|
git add -A "locale"
|
||||||
|
|
||||||
if ! git diff --cached --quiet; then
|
if ! git diff --cached --quiet; then
|
||||||
git commit -m "Automatic translations update"
|
git commit -m "Automatic translations update"
|
||||||
|
|
||||||
|
git push origin HEAD:master
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Push changes to wiki
|
- name: Commit and push the changes to ASF
|
||||||
uses: ad-m/github-push-action@v0.8.0
|
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
|
|
||||||
branch: master
|
|
||||||
directory: wiki
|
|
||||||
repository: ${{ github.repository }}.wiki
|
|
||||||
|
|
||||||
- name: Commit the changes to ASF
|
|
||||||
shell: sh
|
shell: sh
|
||||||
run: |
|
run: |
|
||||||
set -eu
|
set -eu
|
||||||
@@ -80,10 +73,6 @@ jobs:
|
|||||||
|
|
||||||
if ! git diff --cached --quiet; then
|
if ! git diff --cached --quiet; then
|
||||||
git commit -m "Automatic translations update"
|
git commit -m "Automatic translations update"
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Push changes to ASF
|
git push
|
||||||
uses: ad-m/github-push-action@v0.8.0
|
fi
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
|
|
||||||
branch: ${{ github.ref }}
|
|
||||||
|
|||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -543,3 +543,12 @@ $RECYCLE.BIN/
|
|||||||
|
|
||||||
# Windows shortcuts
|
# Windows shortcuts
|
||||||
*.lnk
|
*.lnk
|
||||||
|
|
||||||
|
# _ ____ _____
|
||||||
|
# / \ / ___| | ___|
|
||||||
|
# / _ \ \___ \ | |_
|
||||||
|
# / ___ \ ___) || _|
|
||||||
|
# /_/ \_\|____/ |_|
|
||||||
|
|
||||||
|
# Files that could be ignored by above rules, that we want to ship
|
||||||
|
!ArchiSteamFarm/overlay/**
|
||||||
|
|||||||
2
ASF-ui
2
ASF-ui
Submodule ASF-ui updated: c74b93b78d...545f9e1b74
@@ -4,7 +4,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -34,6 +34,7 @@ using ArchiSteamFarm.Core;
|
|||||||
using ArchiSteamFarm.Plugins.Interfaces;
|
using ArchiSteamFarm.Plugins.Interfaces;
|
||||||
using ArchiSteamFarm.Steam;
|
using ArchiSteamFarm.Steam;
|
||||||
using ArchiSteamFarm.Steam.Data;
|
using ArchiSteamFarm.Steam.Data;
|
||||||
|
using ArchiSteamFarm.Steam.Exchange;
|
||||||
using SteamKit2;
|
using SteamKit2;
|
||||||
|
|
||||||
namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin;
|
namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin;
|
||||||
@@ -45,21 +46,20 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin;
|
|||||||
// If you do not want to handle a particular action (e.g. OnBotMessage that is offered in IBotMessage), it's the best idea to not inherit it at all
|
// If you do not want to handle a particular action (e.g. OnBotMessage that is offered in IBotMessage), it's the best idea to not inherit it at all
|
||||||
// This will keep your code compact, efficient and less dependent. You can always add additional interfaces when you'll need them, this example project will inherit quite a bit of them to show you potential usage
|
// This will keep your code compact, efficient and less dependent. You can always add additional interfaces when you'll need them, this example project will inherit quite a bit of them to show you potential usage
|
||||||
[SuppressMessage("ReSharper", "MemberCanBeFileLocal")]
|
[SuppressMessage("ReSharper", "MemberCanBeFileLocal")]
|
||||||
internal sealed class ExamplePlugin : IASF, IBot, IBotCommand2, IBotConnection, IBotFriendRequest, IBotMessage, IBotModules, IBotTradeOffer {
|
internal sealed class ExamplePlugin : IASF, IBot, IBotCommand2, IBotConnection, IBotFriendRequest, IBotMessage, IBotModules, IBotTradeOffer2 {
|
||||||
// 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
|
// 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
|
// 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]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public string Name => nameof(ExamplePlugin);
|
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
|
// 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
|
// 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]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public Version Version => typeof(ExamplePlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
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]
|
[JsonInclude]
|
||||||
|
[JsonRequired]
|
||||||
[Required]
|
[Required]
|
||||||
public bool CustomIsEnabledField { get; private init; } = true;
|
public bool CustomIsEnabledField { get; private init; } = true;
|
||||||
|
|
||||||
@@ -173,14 +173,14 @@ internal sealed class ExamplePlugin : IASF, IBot, IBotCommand2, IBotConnection,
|
|||||||
// If this message doesn't come from one of our bots, we can reply to the user in some pre-defined way
|
// If this message doesn't come from one of our bots, we can reply to the user in some pre-defined way
|
||||||
bot.ArchiLogger.LogGenericTrace("Hey boss, we got some unknown message here!");
|
bot.ArchiLogger.LogGenericTrace("Hey boss, we got some unknown message here!");
|
||||||
|
|
||||||
return Task.FromResult((string?) "I didn't get that, did you mean to use a command?");
|
return Task.FromResult<string?>("I didn't get that, did you mean to use a command?");
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method is called when bot receives a trade offer that ASF isn't willing to accept (ignored and rejected trades)
|
// This method is called when bot receives a trade offer that ASF isn't willing to accept (ignored and rejected trades)
|
||||||
// It allows you not only to analyze such trades, but generate a response whether ASF should accept it (true), or proceed like usual (false)
|
// It allows you not only to analyze such trades, but generate a response whether ASF should accept it (true), or proceed like usual (false)
|
||||||
// Thanks to that, you can implement custom rules for all trades that aren't handled by ASF, for example cross-set trading on your own custom rules
|
// Thanks to that, you can implement custom rules for all trades that aren't handled by ASF, for example cross-set trading on your own custom rules
|
||||||
// You'd implement your own logic here, as an example we'll allow all trades to be accepted if the bot's name starts from "TrashBot"
|
// You'd implement your own logic here, as an example we'll allow all trades to be accepted if the bot's name starts from "TrashBot"
|
||||||
public Task<bool> OnBotTradeOffer(Bot bot, TradeOffer tradeOffer) => Task.FromResult(bot.BotName.StartsWith("TrashBot", StringComparison.OrdinalIgnoreCase));
|
public Task<bool> OnBotTradeOffer(Bot bot, TradeOffer tradeOffer, ParseTradeResult.EResult asfResult) => Task.FromResult(bot.BotName.StartsWith("TrashBot", StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
// This is the earliest method that will be called, right after loading the plugin, long before any bot initialization takes place
|
// This is the earliest method that will be called, right after loading the plugin, long before any bot initialization takes place
|
||||||
// It's a good place to initialize all potential (non-bot-specific) structures that you will need across lifetime of your plugin, such as global timers, concurrent dictionaries and alike
|
// It's a good place to initialize all potential (non-bot-specific) structures that you will need across lifetime of your plugin, such as global timers, concurrent dictionaries and alike
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Composition;
|
using System.Composition;
|
||||||
using System.Runtime;
|
using System.Runtime;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
@@ -39,15 +38,13 @@ namespace ArchiSteamFarm.CustomPlugins.PeriodicGC;
|
|||||||
internal sealed class PeriodicGCPlugin : IPlugin {
|
internal sealed class PeriodicGCPlugin : IPlugin {
|
||||||
private const byte GCPeriod = 60; // In seconds
|
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);
|
private static readonly Timer PeriodicGCTimer = new(PerformGC);
|
||||||
|
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public string Name => nameof(PeriodicGCPlugin);
|
public string Name => nameof(PeriodicGCPlugin);
|
||||||
|
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public Version Version => typeof(PeriodicGCPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
public Version Version => typeof(PeriodicGCPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||||
|
|
||||||
public Task OnLoaded() {
|
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.");
|
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);
|
PeriodicGCTimer.Change(timeSpan, timeSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +62,7 @@ internal sealed class PeriodicGCPlugin : IPlugin {
|
|||||||
private static void PerformGC(object? state = null) {
|
private static void PerformGC(object? state = null) {
|
||||||
ASF.ArchiLogger.LogGenericWarning($"Performing GC, current memory: {GC.GetTotalMemory(false) / 1024} KB.");
|
ASF.ArchiLogger.LogGenericWarning($"Performing GC, current memory: {GC.GetTotalMemory(false) / 1024} KB.");
|
||||||
|
|
||||||
lock (LockObject) {
|
lock (Lock) {
|
||||||
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
|
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
|
||||||
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
|
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AngleSharp.XPath" IncludeAssets="compile" />
|
<PackageReference Include="AngleSharp" IncludeAssets="compile" />
|
||||||
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -53,7 +52,7 @@ public sealed class SignInWithSteamController : ArchiController {
|
|||||||
Bot? bot = Bot.GetBot(botName);
|
Bot? bot = Bot.GetBot(botName);
|
||||||
|
|
||||||
if (bot == null) {
|
if (bot == null) {
|
||||||
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.BotNotFound, botName)));
|
return BadRequest(new GenericResponse(false, Strings.FormatBotNotFound(botName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot.IsConnectedAndLoggedOn) {
|
if (!bot.IsConnectedAndLoggedOn) {
|
||||||
@@ -64,39 +63,39 @@ public sealed class SignInWithSteamController : ArchiController {
|
|||||||
using HtmlDocumentResponse? challengeResponse = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession(request.RedirectURL).ConfigureAwait(false);
|
using HtmlDocumentResponse? challengeResponse = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession(request.RedirectURL).ConfigureAwait(false);
|
||||||
|
|
||||||
if (challengeResponse?.Content == null) {
|
if (challengeResponse?.Content == null) {
|
||||||
return StatusCode((int) HttpStatusCode.ServiceUnavailable, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorRequestFailedTooManyTimes, WebBrowser.MaxTries)));
|
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) {
|
if (paramsNode == null) {
|
||||||
ASF.ArchiLogger.LogNullError(paramsNode);
|
ASF.ArchiLogger.LogNullError(paramsNode);
|
||||||
|
|
||||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(paramsNode))));
|
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)) {
|
if (string.IsNullOrEmpty(paramsValue)) {
|
||||||
ASF.ArchiLogger.LogNullError(paramsValue);
|
ASF.ArchiLogger.LogNullError(paramsValue);
|
||||||
|
|
||||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(paramsValue))));
|
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) {
|
if (nonceNode == null) {
|
||||||
ASF.ArchiLogger.LogNullError(nonceNode);
|
ASF.ArchiLogger.LogNullError(nonceNode);
|
||||||
|
|
||||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(nonceNode))));
|
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)) {
|
if (string.IsNullOrEmpty(nonceValue)) {
|
||||||
ASF.ArchiLogger.LogNullError(nonceValue);
|
ASF.ArchiLogger.LogNullError(nonceValue);
|
||||||
|
|
||||||
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(nonceValue))));
|
return StatusCode((int) HttpStatusCode.InternalServerError, new GenericResponse(false, Strings.FormatErrorObjectIsNull(nameof(nonceValue))));
|
||||||
}
|
}
|
||||||
|
|
||||||
Uri loginRequest = new(ArchiWebHandler.SteamCommunityURL, "/openid/login");
|
Uri loginRequest = new(ArchiWebHandler.SteamCommunityURL, "/openid/login");
|
||||||
@@ -116,6 +115,6 @@ public sealed class SignInWithSteamController : ArchiController {
|
|||||||
// Accept OpenID request presented and follow redirection back to the data we initially expected
|
// Accept OpenID request presented and follow redirection back to the data we initially expected
|
||||||
BasicResponse? loginResponse = await bot.ArchiWebHandler.WebBrowser.UrlPost(loginRequest, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections).ConfigureAwait(false);
|
BasicResponse? loginResponse = await bot.ArchiWebHandler.WebBrowser.UrlPost(loginRequest, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections).ConfigureAwait(false);
|
||||||
|
|
||||||
return loginResponse != null ? Ok(new GenericResponse<SignInWithSteamResponse>(new SignInWithSteamResponse(loginResponse.FinalUri))) : StatusCode((int) HttpStatusCode.ServiceUnavailable, new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorRequestFailedTooManyTimes, WebBrowser.MaxTries)));
|
return loginResponse != null ? Ok(new GenericResponse<SignInWithSteamResponse>(new SignInWithSteamResponse(loginResponse.FinalUri))) : StatusCode((int) HttpStatusCode.ServiceUnavailable, new GenericResponse(false, Strings.FormatErrorRequestFailedTooManyTimes(WebBrowser.MaxTries)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Composition;
|
using System.Composition;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -36,11 +35,9 @@ namespace ArchiSteamFarm.CustomPlugins.SignInWithSteam;
|
|||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
internal sealed class SignInWithSteamPlugin : IPlugin {
|
internal sealed class SignInWithSteamPlugin : IPlugin {
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public string Name => nameof(SignInWithSteamPlugin);
|
public string Name => nameof(SignInWithSteamPlugin);
|
||||||
|
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public Version Version => typeof(SignInWithSteamPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
public Version Version => typeof(SignInWithSteamPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
||||||
|
|
||||||
public Task OnLoaded() {
|
public Task OnLoaded() {
|
||||||
|
|||||||
@@ -4,10 +4,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||||
|
<PackageReference Include="Microsoft.CodeAnalysis.ResxSourceGenerator" PrivateAssets="all" />
|
||||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" IncludeAssets="compile" />
|
|
||||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||||
<PackageReference Include="System.Linq.Async" IncludeAssets="compile" />
|
<PackageReference Include="System.Linq.Async" IncludeAssets="compile" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -17,17 +16,10 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Update="Localization\Strings.resx">
|
<EmbeddedResource Update="Localization\Strings.resx" EmitFormatMethods="true" />
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
<Compile Update="Localization\Strings.Designer.cs">
|
<Copy SourceFolders="$(TargetDir)" DestinationFolder="..\ArchiSteamFarm\bin\$(Configuration)\$(TargetFramework)\plugins\$(AssemblyName)\" SkipUnchangedFiles="true" />
|
||||||
<AutoGen>True</AutoGen>
|
</Target>
|
||||||
<DependentUpon>Strings.resx</DependentUpon>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -203,7 +203,7 @@ internal static class Backend {
|
|||||||
|
|
||||||
ArgumentOutOfRangeException.ThrowIfEqual(requestID, Guid.Empty);
|
ArgumentOutOfRangeException.ThrowIfEqual(requestID, Guid.Empty);
|
||||||
|
|
||||||
if (SharedInfo.BuildInfo.IsCustomBuild) {
|
if (BuildInfo.IsCustomBuild) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -22,7 +22,6 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -39,6 +38,7 @@ namespace ArchiSteamFarm.OfficialPlugins.ItemsMatcher;
|
|||||||
internal sealed class BotCache : SerializableFile {
|
internal sealed class BotCache : SerializableFile {
|
||||||
[JsonDisallowNull]
|
[JsonDisallowNull]
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
|
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
|
||||||
internal ConcurrentList<AssetForListing> LastAnnouncedAssetsForListing { get; private init; } = [];
|
internal ConcurrentList<AssetForListing> LastAnnouncedAssetsForListing { get; private init; } = [];
|
||||||
|
|
||||||
internal string? LastAnnouncedTradeToken {
|
internal string? LastAnnouncedTradeToken {
|
||||||
@@ -135,7 +135,7 @@ internal sealed class BotCache : SerializableFile {
|
|||||||
string json = await File.ReadAllTextAsync(filePath).ConfigureAwait(false);
|
string json = await File.ReadAllTextAsync(filePath).ConfigureAwait(false);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(json)) {
|
if (string.IsNullOrEmpty(json)) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatErrorIsEmpty(nameof(json)));
|
||||||
|
|
||||||
return new BotCache(filePath);
|
return new BotCache(filePath);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ArchiSteamFarm.Core;
|
using ArchiSteamFarm.Core;
|
||||||
@@ -87,15 +86,15 @@ internal static class Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.MatchEverything)) {
|
if (bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.MatchEverything)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(BotConfig.ETradingPreferences.MatchEverything)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(BotConfig.ETradingPreferences.MatchEverything)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ASF.GlobalConfig?.LicenseID == null) || (ASF.GlobalConfig.LicenseID == Guid.Empty)) {
|
if ((ASF.GlobalConfig?.LicenseID == null) || (ASF.GlobalConfig.LicenseID == Guid.Empty)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(ASF.GlobalConfig.LicenseID)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(ASF.GlobalConfig.LicenseID)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ItemsMatcherPlugin.RemoteCommunications.TryGetValue(bot, out RemoteCommunication? remoteCommunication)) {
|
if (!ItemsMatcherPlugin.RemoteCommunications.TryGetValue(bot, out RemoteCommunication? remoteCommunication)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(remoteCommunication)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(remoteCommunication)));
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteCommunication.TriggerMatchActivelyEarlier();
|
remoteCommunication.TriggerMatchActivelyEarlier();
|
||||||
@@ -117,12 +116,12 @@ internal static class Commands {
|
|||||||
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
||||||
|
|
||||||
if ((bots == null) || (bots.Count == 0)) {
|
if ((bots == null) || (bots.Count == 0)) {
|
||||||
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(string.Format(CultureInfo.CurrentCulture, Strings.BotNotFound, botNames)) : null;
|
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(Strings.FormatBotNotFound(botNames)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => Task.Run(() => ResponseMatch(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot)))).ConfigureAwait(false);
|
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))!];
|
||||||
|
|
||||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -25,7 +25,6 @@ using System;
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.ComponentModel.DataAnnotations;
|
|
||||||
using System.Composition;
|
using System.Composition;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
@@ -47,11 +46,9 @@ internal sealed class ItemsMatcherPlugin : OfficialPlugin, IBot, IBotCommand2, I
|
|||||||
internal static readonly ConcurrentDictionary<Bot, RemoteCommunication> RemoteCommunications = new();
|
internal static readonly ConcurrentDictionary<Bot, RemoteCommunication> RemoteCommunications = new();
|
||||||
|
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public override string Name => nameof(ItemsMatcherPlugin);
|
public override string Name => nameof(ItemsMatcherPlugin);
|
||||||
|
|
||||||
[JsonInclude]
|
[JsonInclude]
|
||||||
[Required]
|
|
||||||
public override Version Version => typeof(ItemsMatcherPlugin).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version));
|
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) {
|
public async Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace ArchiSteamFarm.OfficialPlugins.ItemsMatcher.Localization {
|
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Strings {
|
|
||||||
|
|
||||||
private static System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Strings() {
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static System.Resources.ResourceManager ResourceManager {
|
|
||||||
get {
|
|
||||||
if (object.Equals(null, resourceMan)) {
|
|
||||||
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ArchiSteamFarm.OfficialPlugins.ItemsMatcher.Localization.Strings", typeof(Strings).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static System.Globalization.CultureInfo Culture {
|
|
||||||
get {
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string ActivelyMatchingItemsRound {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ActivelyMatchingItemsRound", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string ListingAnnouncing {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ListingAnnouncing", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string MatchingFound {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("MatchingFound", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string TradeOfferFailed {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("TradeOfferFailed", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static string ActivelyMatchingSomeConfirmationsFailed {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("ActivelyMatchingSomeConfirmationsFailed", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="name" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
|
</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
|
</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,17 +53,27 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
<value>Matched totalt {0} sæt denne runde.</value>
|
<value>Matched totalt {0} sæt denne runde.</value>
|
||||||
<comment>{0} will be replaced by number of sets traded</comment>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</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>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,19 +53,21 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
<value>در این دور جمعاً {0} ست مطابقت داده شد.</value>
|
<value>در این دور جمعاً {0} ست مطابقت داده شد.</value>
|
||||||
<comment>{0} will be replaced by number of sets traded</comment>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</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">
|
<data name="MatchingFound" xml:space="preserve">
|
||||||
<value>در مجموع {0} مورد با ربات {1} ({2}) مطابقت داده شد، درحال ارسال ترید...</value>
|
<value>در مجموع {0} مورد با ربات {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>
|
<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>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,19 +53,29 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
<value>{0} sets ont été matché pendant ce round.</value>
|
<value>{0} sets ont été matché pendant ce round.</value>
|
||||||
<comment>{0} will be replaced by number of sets traded</comment>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ListingAnnouncing" xml:space="preserve">
|
||||||
|
<value>Annonce de {0} ({1}) avec l'inventaire réalisé à partir de {2} au total sur la liste...</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>Correspondance totale de {0} éléments avec le bot {1} ({2}), envoi de l'offre d'échange...</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>Impossible d'envoyer une offre d'échange au bot {0} ({1}), en cours ...</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">
|
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
||||||
<value>Certaines confirmations ont échoué, environ {0} sur les transactions {1} ont été envoyées avec succès.</value>
|
<value>Certaines confirmations ont échoué, environ {0} sur les transactions {1} ont été envoyées avec succès.</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>
|
<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>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string"/>
|
||||||
|
<xsd:attribute name="name" type="xsd:string"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
|
||||||
|
<xsd:attribute ref="xml:space"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
|
</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
|
</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,31 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</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>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
@@ -75,7 +73,7 @@
|
|||||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
<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>
|
<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>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -53,17 +53,31 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
<value>すべてのうち、{0} セットにマッチしたためこのラウンドを終了します。</value>
|
<value>すべてのうち、{0} セットにマッチしたためこのラウンドを終了します。</value>
|
||||||
<comment>{0} will be replaced by number of sets traded</comment>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</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>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,25 +53,23 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<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>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ListingAnnouncing" xml:space="preserve">
|
<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>
|
<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>
|
||||||
<data name="MatchingFound" xml:space="preserve">
|
<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>
|
<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>
|
||||||
<data name="TradeOfferFailed" xml:space="preserve">
|
<data name="TradeOfferFailed" xml:space="preserve">
|
||||||
@@ -79,7 +77,7 @@
|
|||||||
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
<comment>{0} will be replaced by steam ID (number), {1} will be replaced by user's nickname'</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ActivelyMatchingSomeConfirmationsFailed" xml:space="preserve">
|
<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>
|
<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>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,17 +53,31 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
<value>Potivim un total de {0} in această rundă.</value>
|
<value>Potivim un total de {0} in această rundă.</value>
|
||||||
<comment>{0} will be replaced by number of sets traded</comment>
|
<comment>{0} will be replaced by number of sets traded</comment>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="ListingAnnouncing" xml:space="preserve">
|
||||||
|
<value>Anunțând {0} ({1}) cu inventarul făcut din {2} articole în total pe listă...</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>Se potrivește cu un total de {0} elemente cu botul {1} ({2}), se trimite oferta de schimb...</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>Nu s-a putut trimite o cerere de schimb bot-ului {0} ({1}), trecem peste...</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>Unele confirmări au eșuat, aproximativ {0} din {1} de schimburi au fost trimise cu 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>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,31 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</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>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
<data name="ActivelyMatchingItemsRound" xml:space="preserve">
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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 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 MinimumPasswordResetCooldownDays = 5; // As imposed by Steam limits
|
||||||
private const byte MinimumSteamGuardEnabledDays = 15; // 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.Emoticon,
|
||||||
EAssetType.FoilTradingCard,
|
EAssetType.FoilTradingCard,
|
||||||
EAssetType.ProfileBackground,
|
EAssetType.ProfileBackground,
|
||||||
EAssetType.TradingCard
|
EAssetType.TradingCard
|
||||||
}.ToFrozenSet();
|
];
|
||||||
|
|
||||||
private readonly Bot Bot;
|
private readonly Bot Bot;
|
||||||
private readonly Timer? HeartBeatTimer;
|
private readonly Timer? HeartBeatTimer;
|
||||||
@@ -111,7 +111,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
TimeSpan.FromHours(6)
|
TimeSpan.FromHours(6)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
bot.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningNoLicense, nameof(BotConfig.ETradingPreferences.MatchActively)));
|
bot.ArchiLogger.LogGenericError(Strings.FormatWarningNoLicense(nameof(BotConfig.ETradingPreferences.MatchActively)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -187,7 +187,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) && ShouldSendHeartBeats) {
|
if (DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +199,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
await RequestsSemaphore.WaitAsync().ConfigureAwait(false);
|
await RequestsSemaphore.WaitAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ((DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) && ShouldSendHeartBeats) {
|
if (DateTime.UtcNow < LastAnnouncement.AddMinutes(ShouldSendAnnouncementEarlier ? MinAnnouncementTTL : MaxAnnouncementTTL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,7 +215,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// This is actually network failure, so we'll stop sending heartbeats but not record it as valid check
|
// This is actually network failure, so we'll stop sending heartbeats but not record it as valid check
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(IsEligibleForListing)}: {eligible?.ToString() ?? "null"}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(IsEligibleForListing)}: {eligible?.ToString() ?? "null"}"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -225,7 +225,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
LastAnnouncement = DateTime.UtcNow;
|
LastAnnouncement = DateTime.UtcNow;
|
||||||
ShouldSendAnnouncementEarlier = ShouldSendHeartBeats = false;
|
ShouldSendAnnouncementEarlier = ShouldSendHeartBeats = false;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(IsEligibleForListing)}: {eligible.Value}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(IsEligibleForListing)}: {eligible.Value}"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -242,7 +242,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(tradeToken)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(tradeToken)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -395,17 +395,17 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (setPartsResponse == null) {
|
if (setPartsResponse == null) {
|
||||||
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(setPartsResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorObjectIsNull(nameof(setPartsResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setPartsResponse.StatusCode.IsRedirectionCode()) {
|
if (setPartsResponse.StatusCode.IsRedirectionCode()) {
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, setPartsResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(setPartsResponse.StatusCode));
|
||||||
|
|
||||||
if (setPartsResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
if (setPartsResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(setPartsResponse.FinalUri), setPartsResponse.FinalUri));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(setPartsResponse.FinalUri), setPartsResponse.FinalUri));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -419,7 +419,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (!setPartsResponse.StatusCode.IsSuccessCode()) {
|
if (!setPartsResponse.StatusCode.IsSuccessCode()) {
|
||||||
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, setPartsResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(setPartsResponse.StatusCode));
|
||||||
|
|
||||||
switch (setPartsResponse.StatusCode) {
|
switch (setPartsResponse.StatusCode) {
|
||||||
case HttpStatusCode.Forbidden:
|
case HttpStatusCode.Forbidden:
|
||||||
@@ -442,7 +442,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (setPartsResponse.Content?.Result == null) {
|
if (setPartsResponse.Content?.Result == null) {
|
||||||
// This should never happen if we got the correct response
|
// This should never happen if we got the correct response
|
||||||
Bot.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(setPartsResponse), setPartsResponse.Content?.Result));
|
Bot.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(setPartsResponse), setPartsResponse.Content?.Result));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -531,7 +531,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// There is a possibility that our inventory has changed even if our announced assets did not, record that
|
// There is a possibility that our inventory has changed even if our announced assets did not, record that
|
||||||
BotCache.LastInventoryChecksumBeforeDeduplication = inventoryChecksumBeforeDeduplication;
|
BotCache.LastInventoryChecksumBeforeDeduplication = inventoryChecksumBeforeDeduplication;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(assetsForListing)} > {MaxItemsCount}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(assetsForListing)} > {MaxItemsCount}"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -562,7 +562,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
HashSet<AssetForListing> inventoryAddedChanged = assetsForListing.Where(asset => !previousInventoryState.Remove(asset.AssetID, out AssetForListing? previousAsset) || (asset.BackendHashCode != previousAsset.BackendHashCode)).ToHashSet();
|
HashSet<AssetForListing> inventoryAddedChanged = assetsForListing.Where(asset => !previousInventoryState.Remove(asset.AssetID, out AssetForListing? previousAsset) || (asset.BackendHashCode != previousAsset.BackendHashCode)).ToHashSet();
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Localization.Strings.ListingAnnouncing, Bot.SteamID, nickname ?? Bot.SteamID.ToString(CultureInfo.InvariantCulture), assetsForListing.Count));
|
Bot.ArchiLogger.LogGenericInfo(Localization.Strings.FormatListingAnnouncing(Bot.SteamID, nickname ?? Bot.SteamID.ToString(CultureInfo.InvariantCulture), assetsForListing.Count));
|
||||||
|
|
||||||
ObjectResponse<GenericResponse<BackgroundTaskResponse>>? diffResponse = null;
|
ObjectResponse<GenericResponse<BackgroundTaskResponse>>? diffResponse = null;
|
||||||
Guid diffRequestID = Guid.Empty;
|
Guid diffRequestID = Guid.Empty;
|
||||||
@@ -577,17 +577,17 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (diffResponse == null) {
|
if (diffResponse == null) {
|
||||||
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(diffResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorObjectIsNull(nameof(diffResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diffResponse.StatusCode.IsRedirectionCode()) {
|
if (diffResponse.StatusCode.IsRedirectionCode()) {
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, diffResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(diffResponse.StatusCode));
|
||||||
|
|
||||||
if (diffResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
if (diffResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(diffResponse.FinalUri), diffResponse.FinalUri));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(diffResponse.FinalUri), diffResponse.FinalUri));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -601,7 +601,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (!diffResponse.StatusCode.IsSuccessCode()) {
|
if (!diffResponse.StatusCode.IsSuccessCode()) {
|
||||||
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, diffResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(diffResponse.StatusCode));
|
||||||
|
|
||||||
switch (diffResponse.StatusCode) {
|
switch (diffResponse.StatusCode) {
|
||||||
case HttpStatusCode.Conflict:
|
case HttpStatusCode.Conflict:
|
||||||
@@ -630,7 +630,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// Great, do we need to wait?
|
// Great, do we need to wait?
|
||||||
if (diffResponse.Content?.Result == null) {
|
if (diffResponse.Content?.Result == null) {
|
||||||
// This should never happen if we got the correct response
|
// This should never happen if we got the correct response
|
||||||
Bot.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(diffResponse), diffResponse.Content?.Result));
|
Bot.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(diffResponse), diffResponse.Content?.Result));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -645,7 +645,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (diffResponse == null) {
|
if (diffResponse == null) {
|
||||||
// We've waited long enough, something is definitely wrong with us or the backend
|
// We've waited long enough, something is definitely wrong with us or the backend
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(diffResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(diffResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -667,7 +667,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Localization.Strings.ListingAnnouncing, Bot.SteamID, nickname ?? Bot.SteamID.ToString(CultureInfo.InvariantCulture), assetsForListing.Count));
|
Bot.ArchiLogger.LogGenericInfo(Localization.Strings.FormatListingAnnouncing(Bot.SteamID, nickname ?? Bot.SteamID.ToString(CultureInfo.InvariantCulture), assetsForListing.Count));
|
||||||
|
|
||||||
ObjectResponse<GenericResponse<BackgroundTaskResponse>>? announceResponse = null;
|
ObjectResponse<GenericResponse<BackgroundTaskResponse>>? announceResponse = null;
|
||||||
Guid announceRequestID = Guid.Empty;
|
Guid announceRequestID = Guid.Empty;
|
||||||
@@ -682,17 +682,17 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (announceResponse == null) {
|
if (announceResponse == null) {
|
||||||
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
// This is actually a network failure, so we'll stop sending heartbeats but not record it as valid check
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(announceResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorObjectIsNull(nameof(announceResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (announceResponse.StatusCode.IsRedirectionCode()) {
|
if (announceResponse.StatusCode.IsRedirectionCode()) {
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, announceResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(announceResponse.StatusCode));
|
||||||
|
|
||||||
if (announceResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
if (announceResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(announceResponse.FinalUri), announceResponse.FinalUri));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(announceResponse.FinalUri), announceResponse.FinalUri));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -706,7 +706,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (!announceResponse.StatusCode.IsSuccessCode()) {
|
if (!announceResponse.StatusCode.IsSuccessCode()) {
|
||||||
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
// ArchiNet told us that we've sent a bad request, so the process should restart from the beginning at later time
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, announceResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(announceResponse.StatusCode));
|
||||||
|
|
||||||
switch (announceResponse.StatusCode) {
|
switch (announceResponse.StatusCode) {
|
||||||
case HttpStatusCode.Conflict:
|
case HttpStatusCode.Conflict:
|
||||||
@@ -735,7 +735,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// Great, do we need to wait?
|
// Great, do we need to wait?
|
||||||
if (announceResponse.Content?.Result == null) {
|
if (announceResponse.Content?.Result == null) {
|
||||||
// This should never happen if we got the correct response
|
// This should never happen if we got the correct response
|
||||||
Bot.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(announceResponse), announceResponse.Content?.Result));
|
Bot.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(announceResponse), announceResponse.Content?.Result));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -750,7 +750,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (announceResponse == null) {
|
if (announceResponse == null) {
|
||||||
// We've waited long enough, something is definitely wrong with us or the backend
|
// We've waited long enough, something is definitely wrong with us or the backend
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(announceResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(announceResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -801,7 +801,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
bool? hasPublicInventory = await Bot.HasPublicInventory().ConfigureAwait(false);
|
bool? hasPublicInventory = await Bot.HasPublicInventory().ConfigureAwait(false);
|
||||||
|
|
||||||
if (hasPublicInventory != true) {
|
if (hasPublicInventory != true) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.HasPublicInventory)}: {hasPublicInventory?.ToString() ?? "null"}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(Bot.HasPublicInventory)}: {hasPublicInventory?.ToString() ?? "null"}"));
|
||||||
|
|
||||||
return hasPublicInventory;
|
return hasPublicInventory;
|
||||||
}
|
}
|
||||||
@@ -812,28 +812,28 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
private async Task<bool?> IsEligibleForMatching() {
|
private async Task<bool?> IsEligibleForMatching() {
|
||||||
// Bot can't be limited
|
// Bot can't be limited
|
||||||
if (Bot.IsAccountLimited) {
|
if (Bot.IsAccountLimited) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.IsAccountLimited)}: {Bot.IsAccountLimited}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(Bot.IsAccountLimited)}: {Bot.IsAccountLimited}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot can't be on lockdown
|
// Bot can't be on lockdown
|
||||||
if (Bot.IsAccountLocked) {
|
if (Bot.IsAccountLocked) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.IsAccountLocked)}: {Bot.IsAccountLocked}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(Bot.IsAccountLocked)}: {Bot.IsAccountLocked}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot must have ASF 2FA
|
// Bot must have ASF 2FA
|
||||||
if (!Bot.HasMobileAuthenticator) {
|
if (!Bot.HasMobileAuthenticator) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.HasMobileAuthenticator)}: {Bot.HasMobileAuthenticator}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(Bot.HasMobileAuthenticator)}: {Bot.HasMobileAuthenticator}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot must have at least one accepted matchable type set
|
// Bot must have at least one accepted matchable type set
|
||||||
if ((Bot.BotConfig.MatchableTypes.Count == 0) || Bot.BotConfig.MatchableTypes.All(static type => !AcceptedMatchableTypes.Contains(type))) {
|
if ((Bot.BotConfig.MatchableTypes.Count == 0) || Bot.BotConfig.MatchableTypes.All(static type => !AcceptedMatchableTypes.Contains(type))) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.BotConfig.MatchableTypes)}: {string.Join(", ", Bot.BotConfig.MatchableTypes)}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(Bot.BotConfig.MatchableTypes)}: {string.Join(", ", Bot.BotConfig.MatchableTypes)}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -842,21 +842,21 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
CCredentials_GetSteamGuardDetails_Response? steamGuardStatus = await Bot.ArchiHandler.GetSteamGuardStatus().ConfigureAwait(false);
|
CCredentials_GetSteamGuardDetails_Response? steamGuardStatus = await Bot.ArchiHandler.GetSteamGuardStatus().ConfigureAwait(false);
|
||||||
|
|
||||||
if (steamGuardStatus == null) {
|
if (steamGuardStatus == null) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(steamGuardStatus)}: null"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(steamGuardStatus)}: null"));
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot must have SteamGuard active for at least 15 days
|
// Bot must have SteamGuard active for at least 15 days
|
||||||
if (!steamGuardStatus.is_steamguard_enabled || ((steamGuardStatus.timestamp_steamguard_enabled > 0) && ((DateTimeOffset.UtcNow - DateTimeOffset.FromUnixTimeSeconds(steamGuardStatus.timestamp_steamguard_enabled)).TotalDays < MinimumSteamGuardEnabledDays))) {
|
if (!steamGuardStatus.is_steamguard_enabled || ((steamGuardStatus.timestamp_steamguard_enabled > 0) && ((DateTimeOffset.UtcNow - DateTimeOffset.FromUnixTimeSeconds(steamGuardStatus.timestamp_steamguard_enabled)).TotalDays < MinimumSteamGuardEnabledDays))) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(steamGuardStatus.is_steamguard_enabled)}/{nameof(steamGuardStatus.timestamp_steamguard_enabled)}: {steamGuardStatus.is_steamguard_enabled}/{steamGuardStatus.timestamp_steamguard_enabled}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(steamGuardStatus.is_steamguard_enabled)}/{nameof(steamGuardStatus.timestamp_steamguard_enabled)}: {steamGuardStatus.is_steamguard_enabled}/{steamGuardStatus.timestamp_steamguard_enabled}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot must have 2FA enabled for matching to work
|
// Bot must have 2FA enabled for matching to work
|
||||||
if (!steamGuardStatus.is_twofactor_enabled) {
|
if (!steamGuardStatus.is_twofactor_enabled) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(steamGuardStatus.is_twofactor_enabled)}: false"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(steamGuardStatus.is_twofactor_enabled)}: false"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -864,14 +864,14 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
CCredentials_LastCredentialChangeTime_Response? credentialChangeTimeDetails = await Bot.ArchiHandler.GetCredentialChangeTimeDetails().ConfigureAwait(false);
|
CCredentials_LastCredentialChangeTime_Response? credentialChangeTimeDetails = await Bot.ArchiHandler.GetCredentialChangeTimeDetails().ConfigureAwait(false);
|
||||||
|
|
||||||
if (credentialChangeTimeDetails == null) {
|
if (credentialChangeTimeDetails == null) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(credentialChangeTimeDetails)}: null"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(credentialChangeTimeDetails)}: null"));
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bot didn't change password in last 5 days
|
// Bot didn't change password in last 5 days
|
||||||
if ((credentialChangeTimeDetails.timestamp_last_password_reset > 0) && ((DateTimeOffset.UtcNow - DateTimeOffset.FromUnixTimeSeconds(credentialChangeTimeDetails.timestamp_last_password_reset)).TotalDays < MinimumPasswordResetCooldownDays)) {
|
if ((credentialChangeTimeDetails.timestamp_last_password_reset > 0) && ((DateTimeOffset.UtcNow - DateTimeOffset.FromUnixTimeSeconds(credentialChangeTimeDetails.timestamp_last_password_reset)).TotalDays < MinimumPasswordResetCooldownDays)) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(credentialChangeTimeDetails.timestamp_last_password_reset)}: {credentialChangeTimeDetails.timestamp_last_password_reset}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatWarningFailedWithError($"{nameof(credentialChangeTimeDetails.timestamp_last_password_reset)}: {credentialChangeTimeDetails.timestamp_last_password_reset}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -897,7 +897,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
bool? eligible = await IsEligibleForMatching().ConfigureAwait(false);
|
bool? eligible = await IsEligibleForMatching().ConfigureAwait(false);
|
||||||
|
|
||||||
if (eligible != true) {
|
if (eligible != true) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(IsEligibleForMatching)}: {eligible?.ToString() ?? "null"}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(IsEligibleForMatching)}: {eligible?.ToString() ?? "null"}"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -924,13 +924,13 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
HttpStatusCode? licenseStatus = await Backend.GetLicenseStatus(ASF.GlobalConfig.LicenseID.Value, WebBrowser).ConfigureAwait(false);
|
HttpStatusCode? licenseStatus = await Backend.GetLicenseStatus(ASF.GlobalConfig.LicenseID.Value, WebBrowser).ConfigureAwait(false);
|
||||||
|
|
||||||
if (licenseStatus == null) {
|
if (licenseStatus == null) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(licenseStatus)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(licenseStatus)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!licenseStatus.Value.IsSuccessCode()) {
|
if (!licenseStatus.Value.IsSuccessCode()) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, licenseStatus.Value));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(licenseStatus.Value));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -941,18 +941,18 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
assetsForMatching = await Bot.ArchiHandler.GetMyInventoryAsync().Where(item => item is { AssetID: > 0, Amount: > 0, ClassID: > 0, RealAppID: > 0, Type: > EAssetType.Unknown, Rarity: > EAssetRarity.Unknown, IsSteamPointsShopItem: false } && acceptedMatchableTypes.Contains(item.Type) && !Bot.BotDatabase.MatchActivelyBlacklistAppIDs.Contains(item.RealAppID)).ToHashSetAsync().ConfigureAwait(false);
|
assetsForMatching = await Bot.ArchiHandler.GetMyInventoryAsync().Where(item => item is { AssetID: > 0, Amount: > 0, ClassID: > 0, RealAppID: > 0, Type: > EAssetType.Unknown, Rarity: > EAssetRarity.Unknown, IsSteamPointsShopItem: false } && acceptedMatchableTypes.Contains(item.Type) && !Bot.BotDatabase.MatchActivelyBlacklistAppIDs.Contains(item.RealAppID)).ToHashSetAsync().ConfigureAwait(false);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException e) {
|
||||||
Bot.ArchiLogger.LogGenericWarningException(e);
|
Bot.ArchiLogger.LogGenericWarningException(e);
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(assetsForMatching)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(assetsForMatching)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Bot.ArchiLogger.LogGenericException(e);
|
Bot.ArchiLogger.LogGenericException(e);
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(assetsForMatching)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(assetsForMatching)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assetsForMatching.Count == 0) {
|
if (assetsForMatching.Count == 0) {
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(assetsForMatching)));
|
Bot.ArchiLogger.LogGenericInfo(Strings.FormatErrorIsEmpty(nameof(assetsForMatching)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -962,7 +962,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (assetsForMatching.RemoveWhere(item => !setsToKeep.Contains((item.RealAppID, item.Type, item.Rarity))) > 0) {
|
if (assetsForMatching.RemoveWhere(item => !setsToKeep.Contains((item.RealAppID, item.Type, item.Rarity))) > 0) {
|
||||||
if (assetsForMatching.Count == 0) {
|
if (assetsForMatching.Count == 0) {
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(assetsForMatching)));
|
Bot.ArchiLogger.LogGenericInfo(Strings.FormatErrorIsEmpty(nameof(assetsForMatching)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -999,16 +999,16 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (setPartsResponse == null) {
|
if (setPartsResponse == null) {
|
||||||
// This is actually a network failure
|
// This is actually a network failure
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(setPartsResponse)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatErrorObjectIsNull(nameof(setPartsResponse)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setPartsResponse.StatusCode.IsRedirectionCode()) {
|
if (setPartsResponse.StatusCode.IsRedirectionCode()) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, setPartsResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(setPartsResponse.StatusCode));
|
||||||
|
|
||||||
if (setPartsResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
if (setPartsResponse.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(setPartsResponse.FinalUri), setPartsResponse.FinalUri));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(setPartsResponse.FinalUri), setPartsResponse.FinalUri));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1020,14 +1020,14 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!setPartsResponse.StatusCode.IsSuccessCode()) {
|
if (!setPartsResponse.StatusCode.IsSuccessCode()) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, setPartsResponse.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(setPartsResponse.StatusCode));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setPartsResponse.Content?.Result == null) {
|
if (setPartsResponse.Content?.Result == null) {
|
||||||
// This should never happen if we got the correct response
|
// This should never happen if we got the correct response
|
||||||
Bot.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(setPartsResponse), setPartsResponse.Content?.Result));
|
Bot.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(setPartsResponse), setPartsResponse.Content?.Result));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1118,13 +1118,13 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
assetsForMatching = assetsForMatchingFiltered;
|
assetsForMatching = assetsForMatchingFiltered;
|
||||||
|
|
||||||
if (assetsForMatching.Count == 0) {
|
if (assetsForMatching.Count == 0) {
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(assetsForMatching)));
|
Bot.ArchiLogger.LogGenericInfo(Strings.FormatErrorIsEmpty(nameof(assetsForMatching)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (assetsForMatching.Count > MaxItemsCount) {
|
if (assetsForMatching.Count > MaxItemsCount) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(assetsForMatching)} > {MaxItemsCount}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(assetsForMatching)} > {MaxItemsCount}"));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1132,19 +1132,19 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
(HttpStatusCode StatusCode, ImmutableHashSet<ListedUser> Users)? response = await Backend.GetListedUsersForMatching(ASF.GlobalConfig.LicenseID.Value, Bot, WebBrowser, assetsForMatching, acceptedMatchableTypes).ConfigureAwait(false);
|
(HttpStatusCode StatusCode, ImmutableHashSet<ListedUser> Users)? response = await Backend.GetListedUsersForMatching(ASF.GlobalConfig.LicenseID.Value, Bot, WebBrowser, assetsForMatching, acceptedMatchableTypes).ConfigureAwait(false);
|
||||||
|
|
||||||
if (response == null) {
|
if (response == null) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(response)));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(nameof(response)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!response.Value.StatusCode.IsSuccessCode()) {
|
if (!response.Value.StatusCode.IsSuccessCode()) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Value.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(response.Value.StatusCode));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.Value.Users.IsEmpty) {
|
if (response.Value.Users.IsEmpty) {
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(response.Value.Users)));
|
Bot.ArchiLogger.LogGenericInfo(Strings.FormatErrorIsEmpty(nameof(response.Value.Users)));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1164,7 +1164,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<bool> MatchActively(IReadOnlyCollection<ListedUser> listedUsers, IReadOnlyCollection<Asset> ourAssets, IReadOnlyCollection<EAssetType> acceptedMatchableTypes) {
|
private async Task<bool> MatchActively(ImmutableHashSet<ListedUser> listedUsers, HashSet<Asset> ourAssets, HashSet<EAssetType> acceptedMatchableTypes) {
|
||||||
if ((listedUsers == null) || (listedUsers.Count == 0)) {
|
if ((listedUsers == null) || (listedUsers.Count == 0)) {
|
||||||
throw new ArgumentNullException(nameof(listedUsers));
|
throw new ArgumentNullException(nameof(listedUsers));
|
||||||
}
|
}
|
||||||
@@ -1181,7 +1181,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
if (MatchingUtilities.IsEmptyForMatching(ourFullState, ourTradableState)) {
|
if (MatchingUtilities.IsEmptyForMatching(ourFullState, ourTradableState)) {
|
||||||
// User doesn't have any more dupes in the inventory
|
// User doesn't have any more dupes in the inventory
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, $"{nameof(ourFullState)} || {nameof(ourTradableState)}"));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatErrorIsEmpty($"{nameof(ourFullState)} || {nameof(ourTradableState)}"));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1255,9 +1255,9 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
Dictionary<ulong, uint> fairClassIDsToGive = new();
|
Dictionary<ulong, uint> fairClassIDsToGive = new();
|
||||||
Dictionary<ulong, uint> fairClassIDsToReceive = new();
|
Dictionary<ulong, uint> fairClassIDsToReceive = new();
|
||||||
|
|
||||||
foreach (ListedUser listedUser in listedUsers.Where(listedUser => (listedUser.SteamID != Bot.SteamID) && acceptedMatchableTypes.Any(listedUser.MatchableTypes.Contains) && !Bot.IsBlacklistedFromTrades(listedUser.SteamID)).OrderByDescending(listedUser => !deprioritizedSteamIDs.Contains(listedUser.SteamID)).ThenByDescending(static listedUser => listedUser.TotalGamesCount > 1).ThenByDescending(static listedUser => listedUser.MatchEverything).ThenBy(static listedUser => listedUser.TotalInventoryCount)) {
|
foreach (ListedUser listedUser in listedUsers.Where(listedUser => (listedUser.SteamID != Bot.SteamID) && acceptedMatchableTypes.Overlaps(listedUser.MatchableTypes) && !Bot.IsBlacklistedFromTrades(listedUser.SteamID)).OrderByDescending(listedUser => !deprioritizedSteamIDs.Contains(listedUser.SteamID)).ThenByDescending(static listedUser => listedUser.TotalGamesCount > 1).ThenByDescending(static listedUser => listedUser.MatchEverything).ThenBy(static listedUser => listedUser.TotalInventoryCount)) {
|
||||||
if (failuresInRow >= WebBrowser.MaxTries) {
|
if (failuresInRow >= WebBrowser.MaxTries) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(failuresInRow)} >= {WebBrowser.MaxTries}"));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError($"{nameof(failuresInRow)} >= {WebBrowser.MaxTries}"));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1280,7 +1280,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
switch (tradeHoldDuration) {
|
switch (tradeHoldDuration) {
|
||||||
case null:
|
case null:
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(tradeHoldDuration)));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatErrorIsEmpty(nameof(tradeHoldDuration)));
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
case > 0 when (tradeHoldDuration.Value > maxTradeHoldDuration) || (tradeHoldDuration.Value > listedUser.MaxTradeHoldDuration):
|
case > 0 when (tradeHoldDuration.Value > maxTradeHoldDuration) || (tradeHoldDuration.Value > listedUser.MaxTradeHoldDuration):
|
||||||
@@ -1421,7 +1421,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (skippedSetsThisTrade.Count == 0) {
|
if (skippedSetsThisTrade.Count == 0) {
|
||||||
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(skippedSetsThisTrade)));
|
Bot.ArchiLogger.LogGenericTrace(Strings.FormatErrorIsEmpty(nameof(skippedSetsThisTrade)));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1435,11 +1435,11 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
throw new InvalidOperationException($"{nameof(itemsToGive)} && {nameof(itemsToReceive)}");
|
throw new InvalidOperationException($"{nameof(itemsToGive)} && {nameof(itemsToReceive)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Localization.Strings.MatchingFound, itemsToReceive.Count, listedUser.SteamID, listedUser.Nickname));
|
Bot.ArchiLogger.LogGenericInfo(Localization.Strings.FormatMatchingFound(itemsToReceive.Count, listedUser.SteamID, listedUser.Nickname));
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericTrace($"{Bot.SteamID} <- {string.Join(", ", itemsToReceive.Select(static item => $"{item.RealAppID}/{item.Type}/{item.Rarity}/{item.ClassID} #{item.Amount}"))} | {string.Join(", ", itemsToGive.Select(static item => $"{item.RealAppID}/{item.Type}/{item.Rarity}/{item.ClassID} #{item.Amount}"))} -> {listedUser.SteamID}");
|
Bot.ArchiLogger.LogGenericTrace($"{Bot.SteamID} <- {string.Join(", ", itemsToReceive.Select(static item => $"{item.RealAppID}/{item.Type}/{item.Rarity}/{item.ClassID} #{item.Amount}"))} | {string.Join(", ", itemsToGive.Select(static item => $"{item.RealAppID}/{item.Type}/{item.Rarity}/{item.ClassID} #{item.Amount}"))} -> {listedUser.SteamID}");
|
||||||
|
|
||||||
(bool success, HashSet<ulong>? tradeOfferIDs, HashSet<ulong>? mobileTradeOfferIDs) = await Bot.ArchiWebHandler.SendTradeOffer(listedUser.SteamID, itemsToGive, itemsToReceive, listedUser.TradeToken, true).ConfigureAwait(false);
|
(bool success, HashSet<ulong>? tradeOfferIDs, HashSet<ulong>? mobileTradeOfferIDs) = await Bot.ArchiWebHandler.SendTradeOffer(listedUser.SteamID, itemsToGive, itemsToReceive, listedUser.TradeToken, nameof(MatchActively), true).ConfigureAwait(false);
|
||||||
|
|
||||||
if (tradeOfferIDs?.Count > 0) {
|
if (tradeOfferIDs?.Count > 0) {
|
||||||
matchActivelyTradeOfferIDs.UnionWith(tradeOfferIDs);
|
matchActivelyTradeOfferIDs.UnionWith(tradeOfferIDs);
|
||||||
@@ -1454,7 +1454,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
(bool twoFactorSuccess, IReadOnlyCollection<Confirmation>? handledConfirmations, _) = await Bot.Actions.HandleTwoFactorAuthenticationConfirmations(true, Confirmation.EConfirmationType.Trade, pendingMobileTradeOfferIDs, true).ConfigureAwait(false);
|
(bool twoFactorSuccess, IReadOnlyCollection<Confirmation>? handledConfirmations, _) = await Bot.Actions.HandleTwoFactorAuthenticationConfirmations(true, Confirmation.EConfirmationType.Trade, pendingMobileTradeOfferIDs, true).ConfigureAwait(false);
|
||||||
|
|
||||||
if (!twoFactorSuccess) {
|
if (!twoFactorSuccess) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Localization.Strings.ActivelyMatchingSomeConfirmationsFailed, handledConfirmations?.Count ?? 0, pendingMobileTradeOfferIDs.Count));
|
Bot.ArchiLogger.LogGenericWarning(Localization.Strings.FormatActivelyMatchingSomeConfirmationsFailed(handledConfirmations?.Count ?? 0, pendingMobileTradeOfferIDs.Count));
|
||||||
}
|
}
|
||||||
|
|
||||||
pendingMobileTradeOfferIDs.Clear();
|
pendingMobileTradeOfferIDs.Clear();
|
||||||
@@ -1465,7 +1465,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
// The user likely no longer has the items we need, this is fine, we can continue the matching with other ones
|
// The user likely no longer has the items we need, this is fine, we can continue the matching with other ones
|
||||||
failuresInRow++;
|
failuresInRow++;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Localization.Strings.TradeOfferFailed, listedUser.SteamID, listedUser.Nickname));
|
Bot.ArchiLogger.LogGenericWarning(Localization.Strings.FormatTradeOfferFailed(listedUser.SteamID, listedUser.Nickname));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1550,11 +1550,11 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
(bool twoFactorSuccess, IReadOnlyCollection<Confirmation>? handledConfirmations, _) = Bot.IsConnectedAndLoggedOn ? await Bot.Actions.HandleTwoFactorAuthenticationConfirmations(true, Confirmation.EConfirmationType.Trade, pendingMobileTradeOfferIDs, true).ConfigureAwait(false) : (false, null, null);
|
(bool twoFactorSuccess, IReadOnlyCollection<Confirmation>? handledConfirmations, _) = Bot.IsConnectedAndLoggedOn ? await Bot.Actions.HandleTwoFactorAuthenticationConfirmations(true, Confirmation.EConfirmationType.Trade, pendingMobileTradeOfferIDs, true).ConfigureAwait(false) : (false, null, null);
|
||||||
|
|
||||||
if (!twoFactorSuccess) {
|
if (!twoFactorSuccess) {
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Localization.Strings.ActivelyMatchingSomeConfirmationsFailed, handledConfirmations?.Count ?? 0, pendingMobileTradeOfferIDs.Count));
|
Bot.ArchiLogger.LogGenericWarning(Localization.Strings.FormatActivelyMatchingSomeConfirmationsFailed(handledConfirmations?.Count ?? 0, pendingMobileTradeOfferIDs.Count));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Localization.Strings.ActivelyMatchingItemsRound, matchedSets));
|
Bot.ArchiLogger.LogGenericInfo(Localization.Strings.FormatActivelyMatchingItemsRound(matchedSets));
|
||||||
|
|
||||||
return matchedSets > 0;
|
return matchedSets > 0;
|
||||||
}
|
}
|
||||||
@@ -1610,10 +1610,10 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (response.StatusCode.IsRedirectionCode()) {
|
if (response.StatusCode.IsRedirectionCode()) {
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(response.StatusCode));
|
||||||
|
|
||||||
if (response.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
if (response.FinalUri.Host != ArchiWebHandler.SteamCommunityURL.Host) {
|
||||||
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(response.FinalUri), response.FinalUri));
|
ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(response.FinalUri), response.FinalUri));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1629,7 +1629,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
if (!response.StatusCode.IsSuccessCode()) {
|
if (!response.StatusCode.IsSuccessCode()) {
|
||||||
ShouldSendHeartBeats = false;
|
ShouldSendHeartBeats = false;
|
||||||
|
|
||||||
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.StatusCode));
|
Bot.ArchiLogger.LogGenericWarning(Strings.FormatWarningFailedWithError(response.StatusCode));
|
||||||
|
|
||||||
switch (response.StatusCode) {
|
switch (response.StatusCode) {
|
||||||
case HttpStatusCode.Conflict:
|
case HttpStatusCode.Conflict:
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ConfigureAwaitChecker.Analyzer" PrivateAssets="all" />
|
|
||||||
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
<PackageReference Include="JetBrains.Annotations" PrivateAssets="all" />
|
||||||
|
<PackageReference Include="Microsoft.CodeAnalysis.ResxSourceGenerator" PrivateAssets="all" />
|
||||||
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
<PackageReference Include="SteamKit2" IncludeAssets="compile" />
|
||||||
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
<PackageReference Include="System.Composition.AttributedModel" IncludeAssets="compile" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -15,17 +15,10 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Update="Localization\Strings.resx">
|
<EmbeddedResource Update="Localization\Strings.resx" EmitFormatMethods="true" />
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
|
|
||||||
</EmbeddedResource>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||||
<Compile Update="Localization\Strings.Designer.cs">
|
<Copy SourceFolders="$(TargetDir)" DestinationFolder="..\ArchiSteamFarm\bin\$(Configuration)\$(TargetFramework)\plugins\$(AssemblyName)\" SkipUnchangedFiles="true" />
|
||||||
<AutoGen>True</AutoGen>
|
</Target>
|
||||||
<DependentUpon>Strings.resx</DependentUpon>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||||
// ----------------------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------------------
|
||||||
// |
|
// |
|
||||||
// Copyright 2015-2024 Łukasz "JustArchi" Domeradzki
|
// Copyright 2015-2025 Łukasz "JustArchi" Domeradzki
|
||||||
// Contact: JustArchi@JustArchi.net
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// 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
|
// Contact: JustArchi@JustArchi.net
|
||||||
// |
|
// |
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -100,7 +99,7 @@ internal static class Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bot.HasMobileAuthenticator) {
|
if (bot.HasMobileAuthenticator) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(bot.HasMobileAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(bot.HasMobileAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot.IsConnectedAndLoggedOn) {
|
if (!bot.IsConnectedAndLoggedOn) {
|
||||||
@@ -121,49 +120,43 @@ internal static class Commands {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
bot.ArchiLogger.LogGenericException(e);
|
bot.ArchiLogger.LogGenericException(e);
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, e.Message));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(e.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(json)) {
|
if (string.IsNullOrEmpty(json)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
|
return bot.Commands.FormatBotResponse(Strings.FormatErrorIsEmpty(nameof(json)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Steam.Security.MobileAuthenticator? mobileAuthenticator = json.ToJsonObject<Steam.Security.MobileAuthenticator>();
|
Steam.Security.MobileAuthenticator? mobileAuthenticator = json.ToJsonObject<Steam.Security.MobileAuthenticator>();
|
||||||
|
|
||||||
if (mobileAuthenticator == null) {
|
if (mobileAuthenticator == null) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
|
return bot.Commands.FormatBotResponse(Strings.FormatErrorIsEmpty(nameof(json)));
|
||||||
}
|
}
|
||||||
|
|
||||||
mobileAuthenticator.Init(bot);
|
mobileAuthenticator.Init(bot);
|
||||||
|
|
||||||
MobileAuthenticatorHandler? mobileAuthenticatorHandler = bot.GetHandler<MobileAuthenticatorHandler>();
|
|
||||||
|
|
||||||
if (mobileAuthenticatorHandler == null) {
|
|
||||||
throw new InvalidOperationException(nameof(mobileAuthenticatorHandler));
|
|
||||||
}
|
|
||||||
|
|
||||||
ulong steamTime = await mobileAuthenticator.GetSteamTime().ConfigureAwait(false);
|
ulong steamTime = await mobileAuthenticator.GetSteamTime().ConfigureAwait(false);
|
||||||
|
|
||||||
string? code = mobileAuthenticator.GenerateTokenForTime(steamTime);
|
string? code = mobileAuthenticator.GenerateTokenForTime(steamTime);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(code)) {
|
if (string.IsNullOrEmpty(code)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(mobileAuthenticator.GenerateTokenForTime)));
|
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) {
|
if (response == null) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(mobileAuthenticatorHandler.FinalizeAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(MobileAuthenticatorWebHandler.FinalizeAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!response.success) {
|
if (!response.success) {
|
||||||
EResult result = (EResult) response.status;
|
EResult result = (EResult) response.status;
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, result));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot.TryImportAuthenticator(mobileAuthenticator)) {
|
if (!bot.TryImportAuthenticator(mobileAuthenticator)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(bot.TryImportAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(bot.TryImportAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
string maFileFinishedPath = $"{maFilePath}.NEW";
|
string maFileFinishedPath = $"{maFilePath}.NEW";
|
||||||
@@ -173,7 +166,7 @@ internal static class Commands {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
bot.ArchiLogger.LogGenericException(e);
|
bot.ArchiLogger.LogGenericException(e);
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, e.Message));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(e.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(Strings.Done);
|
return bot.Commands.FormatBotResponse(Strings.Done);
|
||||||
@@ -194,12 +187,12 @@ internal static class Commands {
|
|||||||
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
||||||
|
|
||||||
if ((bots == null) || (bots.Count == 0)) {
|
if ((bots == null) || (bots.Count == 0)) {
|
||||||
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(string.Format(CultureInfo.CurrentCulture, Strings.BotNotFound, botNames)) : null;
|
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(Strings.FormatBotNotFound(botNames)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorFinalize(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot, activationCode))).ConfigureAwait(false);
|
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))!];
|
||||||
|
|
||||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||||
}
|
}
|
||||||
@@ -216,7 +209,7 @@ internal static class Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bot.HasMobileAuthenticator) {
|
if (bot.HasMobileAuthenticator) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(bot.HasMobileAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(bot.HasMobileAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
string maFilePath = bot.GetFilePath(Bot.EFileType.MobileAuthenticator);
|
string maFilePath = bot.GetFilePath(Bot.EFileType.MobileAuthenticator);
|
||||||
@@ -233,17 +226,17 @@ internal static class Commands {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
bot.ArchiLogger.LogGenericException(e);
|
bot.ArchiLogger.LogGenericException(e);
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, e.Message));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(e.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(json)) {
|
if (string.IsNullOrEmpty(json)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
|
return bot.Commands.FormatBotResponse(Strings.FormatErrorIsEmpty(nameof(json)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Steam.Security.MobileAuthenticator? mobileAuthenticator = json.ToJsonObject<Steam.Security.MobileAuthenticator>();
|
Steam.Security.MobileAuthenticator? mobileAuthenticator = json.ToJsonObject<Steam.Security.MobileAuthenticator>();
|
||||||
|
|
||||||
if (mobileAuthenticator == null) {
|
if (mobileAuthenticator == null) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(json)));
|
return bot.Commands.FormatBotResponse(Strings.FormatErrorIsEmpty(nameof(json)));
|
||||||
}
|
}
|
||||||
|
|
||||||
mobileAuthenticator.Init(bot);
|
mobileAuthenticator.Init(bot);
|
||||||
@@ -251,13 +244,17 @@ internal static class Commands {
|
|||||||
if (!string.IsNullOrEmpty(activationCode)) {
|
if (!string.IsNullOrEmpty(activationCode)) {
|
||||||
string? generatedCode = await mobileAuthenticator.GenerateToken().ConfigureAwait(false);
|
string? generatedCode = await mobileAuthenticator.GenerateToken().ConfigureAwait(false);
|
||||||
|
|
||||||
if (generatedCode != activationCode) {
|
if (string.IsNullOrEmpty(generatedCode)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{generatedCode} != {activationCode}"));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(generatedCode)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!generatedCode.Equals(activationCode, StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError($"{generatedCode} != {activationCode}"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot.TryImportAuthenticator(mobileAuthenticator)) {
|
if (!bot.TryImportAuthenticator(mobileAuthenticator)) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(bot.TryImportAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(bot.TryImportAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
string maFileFinishedPath = $"{maFilePath}.NEW";
|
string maFileFinishedPath = $"{maFilePath}.NEW";
|
||||||
@@ -267,7 +264,7 @@ internal static class Commands {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
bot.ArchiLogger.LogGenericException(e);
|
bot.ArchiLogger.LogGenericException(e);
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, e.Message));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(e.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(Strings.Done);
|
return bot.Commands.FormatBotResponse(Strings.Done);
|
||||||
@@ -287,12 +284,12 @@ internal static class Commands {
|
|||||||
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
||||||
|
|
||||||
if ((bots == null) || (bots.Count == 0)) {
|
if ((bots == null) || (bots.Count == 0)) {
|
||||||
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(string.Format(CultureInfo.CurrentCulture, Strings.BotNotFound, botNames)) : null;
|
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(Strings.FormatBotNotFound(botNames)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorFinalized(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot, activationCode))).ConfigureAwait(false);
|
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))!];
|
||||||
|
|
||||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||||
}
|
}
|
||||||
@@ -309,31 +306,25 @@ internal static class Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bot.HasMobileAuthenticator) {
|
if (bot.HasMobileAuthenticator) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(bot.HasMobileAuthenticator)));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(bot.HasMobileAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot.IsConnectedAndLoggedOn) {
|
if (!bot.IsConnectedAndLoggedOn) {
|
||||||
return bot.Commands.FormatBotResponse(Strings.BotNotConnected);
|
return bot.Commands.FormatBotResponse(Strings.BotNotConnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
MobileAuthenticatorHandler? mobileAuthenticatorHandler = bot.GetHandler<MobileAuthenticatorHandler>();
|
|
||||||
|
|
||||||
if (mobileAuthenticatorHandler == null) {
|
|
||||||
throw new InvalidOperationException(nameof(mobileAuthenticatorHandler));
|
|
||||||
}
|
|
||||||
|
|
||||||
string deviceID = $"android:{Guid.NewGuid()}";
|
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) {
|
if (response == null) {
|
||||||
return bot.Commands.FormatBotResponse(Strings.WarningFailed);
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(nameof(MobileAuthenticatorWebHandler.AddAuthenticator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
EResult result = (EResult) response.status;
|
EResult result = (EResult) response.status;
|
||||||
|
|
||||||
if (result != EResult.OK) {
|
if (result != EResult.OK) {
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, result));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
MaFileData maFileData = new(response, bot.SteamID, deviceID);
|
MaFileData maFileData = new(response, bot.SteamID, deviceID);
|
||||||
@@ -346,7 +337,7 @@ internal static class Commands {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
bot.ArchiLogger.LogGenericException(e);
|
bot.ArchiLogger.LogGenericException(e);
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, e.Message));
|
return bot.Commands.FormatBotResponse(Strings.FormatWarningFailedWithError(e.Message));
|
||||||
}
|
}
|
||||||
|
|
||||||
return bot.Commands.FormatBotResponse(Strings.Done);
|
return bot.Commands.FormatBotResponse(Strings.Done);
|
||||||
@@ -366,12 +357,12 @@ internal static class Commands {
|
|||||||
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
HashSet<Bot>? bots = Bot.GetBots(botNames);
|
||||||
|
|
||||||
if ((bots == null) || (bots.Count == 0)) {
|
if ((bots == null) || (bots.Count == 0)) {
|
||||||
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(string.Format(CultureInfo.CurrentCulture, Strings.BotNotFound, botNames)) : null;
|
return access >= EAccess.Owner ? Steam.Interaction.Commands.FormatStaticResponse(Strings.FormatBotNotFound(botNames)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
IList<string?> results = await Utilities.InParallel(bots.Select(bot => ResponseTwoFactorInit(Steam.Interaction.Commands.GetProxyAccess(bot, access, steamID), bot))).ConfigureAwait(false);
|
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))!];
|
||||||
|
|
||||||
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
return responses.Count > 0 ? string.Join(Environment.NewLine, responses) : null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace ArchiSteamFarm.OfficialPlugins.MobileAuthenticator.Localization {
|
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
|
||||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
|
||||||
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
|
||||||
internal class Strings {
|
|
||||||
|
|
||||||
private static System.Resources.ResourceManager resourceMan;
|
|
||||||
|
|
||||||
private static System.Globalization.CultureInfo resourceCulture;
|
|
||||||
|
|
||||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
|
||||||
internal Strings() {
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static System.Resources.ResourceManager ResourceManager {
|
|
||||||
get {
|
|
||||||
if (object.Equals(null, resourceMan)) {
|
|
||||||
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ArchiSteamFarm.OfficialPlugins.MobileAuthenticator.Localization.Strings", typeof(Strings).Assembly);
|
|
||||||
resourceMan = temp;
|
|
||||||
}
|
|
||||||
return resourceMan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
|
||||||
internal static System.Globalization.CultureInfo Culture {
|
|
||||||
get {
|
|
||||||
return resourceCulture;
|
|
||||||
}
|
|
||||||
set {
|
|
||||||
resourceCulture = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -53,13 +53,11 @@
|
|||||||
<value>2.0</value>
|
<value>2.0</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="reader">
|
<resheader name="reader">
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
PublicKeyToken=b77a5c561934e089
|
|
||||||
</value>
|
</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user