mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2025-12-25 10:46:48 +00:00
Compare commits
439 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
941e19ecc5 | ||
|
|
e7b6cc7801 | ||
|
|
3edc89c34e | ||
|
|
d1af9d0495 | ||
|
|
ba3a792ca4 | ||
|
|
dba6fdfeeb | ||
|
|
5835bcbd54 | ||
|
|
1df0abb494 | ||
|
|
d6097106d8 | ||
|
|
db56078494 | ||
|
|
8d7098bf76 | ||
|
|
5a6edb4e25 | ||
|
|
089363af1b | ||
|
|
e0450452ab | ||
|
|
1dd1f81884 | ||
|
|
182975ce21 | ||
|
|
65a838c117 | ||
|
|
df8f5febd8 | ||
|
|
7e696125e8 | ||
|
|
3b5a9c6029 | ||
|
|
d4ebe33394 | ||
|
|
de0862c597 | ||
|
|
4252184f37 | ||
|
|
bd99f3fdc3 | ||
|
|
c8343993c7 | ||
|
|
a917d0133b | ||
|
|
05b4b9e907 | ||
|
|
10dd737e5c | ||
|
|
3b0ebf4126 | ||
|
|
1fb980f2bf | ||
|
|
8926297614 | ||
|
|
72141c53a3 | ||
|
|
24350dcba5 | ||
|
|
0d6942b8ec | ||
|
|
6c1d28c978 | ||
|
|
fef93c5907 | ||
|
|
27072c688c | ||
|
|
94aa422cb8 | ||
|
|
3188a56af5 | ||
|
|
d5b1073f78 | ||
|
|
61c3b2f9cf | ||
|
|
861c502cb4 | ||
|
|
c622218a70 | ||
|
|
9089029d16 | ||
|
|
335c26efbc | ||
|
|
1f11817a37 | ||
|
|
9e2dfef644 | ||
|
|
cd287a4831 | ||
|
|
bd9fde0799 | ||
|
|
fd3aca7cbb | ||
|
|
e560456d52 | ||
|
|
3de44af605 | ||
|
|
5bbb546b8a | ||
|
|
b1ff0a34db | ||
|
|
6d5fef4260 | ||
|
|
58725f0866 | ||
|
|
d4cb9a326e | ||
|
|
81f19c8971 | ||
|
|
b94c381263 | ||
|
|
6edc7d21a6 | ||
|
|
9cd6801e67 | ||
|
|
ec5e34d664 | ||
|
|
15c8ada4fa | ||
|
|
8d6842430d | ||
|
|
1e172b3266 | ||
|
|
f89fe15e4d | ||
|
|
f6b0589920 | ||
|
|
94d29720df | ||
|
|
cc13e1d423 | ||
|
|
4c960f3850 | ||
|
|
7912142dd3 | ||
|
|
68c9eb8dcc | ||
|
|
f905123946 | ||
|
|
a35a5af795 | ||
|
|
39fec43f29 | ||
|
|
6072cd21f0 | ||
|
|
1edb25b8cd | ||
|
|
94e18257b6 | ||
|
|
f938a2b21f | ||
|
|
91009af8f8 | ||
|
|
922f2476b3 | ||
|
|
b8e07ce765 | ||
|
|
58b1e5f92a | ||
|
|
c813e464fb | ||
|
|
3e837c9689 | ||
|
|
83baf9be92 | ||
|
|
67726e0dee | ||
|
|
cdd5bfd307 | ||
|
|
c2c262ea09 | ||
|
|
111d3c4cd5 | ||
|
|
de7f4f2857 | ||
|
|
66c8b32b8e | ||
|
|
09e738771b | ||
|
|
7d0d370330 | ||
|
|
52fc58006d | ||
|
|
70952ad17e | ||
|
|
7e3a9dbb7c | ||
|
|
6fea823060 | ||
|
|
7cbfa24e7f | ||
|
|
245c04f7c5 | ||
|
|
53c865d42b | ||
|
|
fa99281d49 | ||
|
|
88a0124ff0 | ||
|
|
5ee5dfb9b4 | ||
|
|
4c0971399c | ||
|
|
5dce8bed4c | ||
|
|
57cfac8e78 | ||
|
|
5854605446 | ||
|
|
5293b69261 | ||
|
|
f8f5df4e0e | ||
|
|
758bf868b2 | ||
|
|
f8f1de285f | ||
|
|
38112387ba | ||
|
|
3696f14e9a | ||
|
|
56ca507ca7 | ||
|
|
025e008bcb | ||
|
|
7659f5a994 | ||
|
|
23f2a5c269 | ||
|
|
d5aa87fe93 | ||
|
|
77a6461eb4 | ||
|
|
67a50ee6c1 | ||
|
|
368a19e76f | ||
|
|
23b722ebe0 | ||
|
|
5365ad09ba | ||
|
|
de5f5ae908 | ||
|
|
60eb99d4fd | ||
|
|
677e60328c | ||
|
|
d5e865dff3 | ||
|
|
fb4cda513b | ||
|
|
c3007d2d8f | ||
|
|
805f8d621b | ||
|
|
fb606b4459 | ||
|
|
085d1a7290 | ||
|
|
8e7ebfd2d1 | ||
|
|
515ddedfd1 | ||
|
|
431621a125 | ||
|
|
ec697c2681 | ||
|
|
cece83e75d | ||
|
|
ed27bcf034 | ||
|
|
39301469ce | ||
|
|
83041622ad | ||
|
|
abbde82ab3 | ||
|
|
5c03d463ea | ||
|
|
cc1b47d765 | ||
|
|
720a6d1e32 | ||
|
|
6e8e8d2d39 | ||
|
|
6b0c894268 | ||
|
|
5a61512af6 | ||
|
|
9f6af19712 | ||
|
|
d882fe1a29 | ||
|
|
e4ce791e27 | ||
|
|
52128fd549 | ||
|
|
e5700e5518 | ||
|
|
a22079f38c | ||
|
|
4b0f5d2dad | ||
|
|
e9d8de9031 | ||
|
|
a5763ba1a8 | ||
|
|
77e5f98f37 | ||
|
|
23353fe1c1 | ||
|
|
1ee5d00486 | ||
|
|
3650af0a94 | ||
|
|
445e3ad9d4 | ||
|
|
69b829e883 | ||
|
|
71d9bcb5a0 | ||
|
|
ea38ead992 | ||
|
|
9101b0dc13 | ||
|
|
897dd9012f | ||
|
|
d3f3151ceb | ||
|
|
80129464ac | ||
|
|
5bf62ec4df | ||
|
|
9ea3e18c28 | ||
|
|
bfa3bdcaf0 | ||
|
|
3a2f0078f7 | ||
|
|
35ff24b28e | ||
|
|
0e22b0a577 | ||
|
|
b0efae7171 | ||
|
|
64d07b4764 | ||
|
|
53eeb87225 | ||
|
|
a3b323741b | ||
|
|
7e71fd706a | ||
|
|
8cd1210ee4 | ||
|
|
7ea771f3fa | ||
|
|
f5c19c4cd3 | ||
|
|
32c12b14e4 | ||
|
|
1a15bd7677 | ||
|
|
40747ae55d | ||
|
|
0c2d08af47 | ||
|
|
aa0269f987 | ||
|
|
8f0dd4960a | ||
|
|
46ce27e0fb | ||
|
|
0cbca1e36f | ||
|
|
a5c1b0c253 | ||
|
|
4deeb0fb10 | ||
|
|
a33b7b2278 | ||
|
|
019e52dc99 | ||
|
|
e7360188d0 | ||
|
|
95b19e8f93 | ||
|
|
0617bd7713 | ||
|
|
94363d79a9 | ||
|
|
a3de120d24 | ||
|
|
b75cdf927b | ||
|
|
14476863bd | ||
|
|
5d5fe7b32a | ||
|
|
4ea3a2859f | ||
|
|
8ca9366416 | ||
|
|
5c78923d21 | ||
|
|
478c890105 | ||
|
|
f87bd605fa | ||
|
|
e5fd1b85c8 | ||
|
|
b604206fd6 | ||
|
|
9a9c85baca | ||
|
|
265d869b58 | ||
|
|
beb1b63611 | ||
|
|
51e4b2341f | ||
|
|
8a71c550dd | ||
|
|
d6e5140c9b | ||
|
|
be05a63d1e | ||
|
|
1101ebc9d1 | ||
|
|
a601977b0a | ||
|
|
23e1834d2e | ||
|
|
6c336dc4d7 | ||
|
|
32071078ff | ||
|
|
3254c99f59 | ||
|
|
af3ee45e7d | ||
|
|
6c3808ff80 | ||
|
|
6c49a9d756 | ||
|
|
2c1f3280dd | ||
|
|
945868d2f3 | ||
|
|
2f861d7645 | ||
|
|
49388c4c22 | ||
|
|
ee2aae9d4c | ||
|
|
a7420d14ea | ||
|
|
df6a1785a1 | ||
|
|
bb7d7558ef | ||
|
|
b975b9d2bf | ||
|
|
8f3eb6382c | ||
|
|
6d37fa958c | ||
|
|
276cc6bfc5 | ||
|
|
0ce2f00a16 | ||
|
|
99e07056ea | ||
|
|
17bfe74deb | ||
|
|
ef462b241c | ||
|
|
0b4dc6ac7b | ||
|
|
daa0e02fbe | ||
|
|
deee1093b9 | ||
|
|
cc407e5d2c | ||
|
|
37f46043f9 | ||
|
|
4a856ac31e | ||
|
|
892ede79a1 | ||
|
|
d7c4bbc7a6 | ||
|
|
283b255886 | ||
|
|
a6ef3a9259 | ||
|
|
737f90ca43 | ||
|
|
7d21015df3 | ||
|
|
7e86cf269c | ||
|
|
10578d0844 | ||
|
|
28efaae76a | ||
|
|
3cb7116809 | ||
|
|
86bd5d8843 | ||
|
|
27d0c9de04 | ||
|
|
c610d5cb01 | ||
|
|
29d6846dae | ||
|
|
2597e1b9da | ||
|
|
d37908cb00 | ||
|
|
1ccbcd737a | ||
|
|
40c5c322c5 | ||
|
|
602eec3596 | ||
|
|
c426ddece7 | ||
|
|
4133254f7f | ||
|
|
281577698b | ||
|
|
10085f9dd4 | ||
|
|
3bf792eba5 | ||
|
|
ac3bf2eb31 | ||
|
|
e5c6ca120b | ||
|
|
3ddf03de7b | ||
|
|
9743786aeb | ||
|
|
d6293101ec | ||
|
|
b70bde0b94 | ||
|
|
b858acfb79 | ||
|
|
816efbd712 | ||
|
|
29fbde4533 | ||
|
|
71a9e25720 | ||
|
|
22f3ca4c4f | ||
|
|
b6dd768c0b | ||
|
|
92d5b99e36 | ||
|
|
a61a70c27e | ||
|
|
b148c41147 | ||
|
|
25a5f76bac | ||
|
|
618cdb0fd1 | ||
|
|
cbfe1623e1 | ||
|
|
fe6ac73095 | ||
|
|
d559dc1fa2 | ||
|
|
1ad7ff008d | ||
|
|
4bce3d4b19 | ||
|
|
5570a00a29 | ||
|
|
0f6546d56b | ||
|
|
3662a0b3de | ||
|
|
8cd6ae4b43 | ||
|
|
d183ec567a | ||
|
|
793c844416 | ||
|
|
61f1f25e24 | ||
|
|
1d5c319359 | ||
|
|
372e71dcfd | ||
|
|
2ce5428e94 | ||
|
|
17d999faba | ||
|
|
4842421fbc | ||
|
|
b1fa7d7d56 | ||
|
|
4f994792f8 | ||
|
|
e78412d9f2 | ||
|
|
64d3146ab2 | ||
|
|
a31f734711 | ||
|
|
fc4574d143 | ||
|
|
eb60cd9553 | ||
|
|
bd605abf00 | ||
|
|
53aa032df9 | ||
|
|
716d6a47c1 | ||
|
|
e4f4859eb4 | ||
|
|
0481ba3123 | ||
|
|
52079ec15b | ||
|
|
65e2d97434 | ||
|
|
b2720e112c | ||
|
|
04773c48c1 | ||
|
|
8691050ed7 | ||
|
|
da4a595e58 | ||
|
|
218883c45c | ||
|
|
5253528551 | ||
|
|
c2b47af1cc | ||
|
|
3529c9a6cf | ||
|
|
95efc09463 | ||
|
|
f37f49e97e | ||
|
|
08367648b6 | ||
|
|
a3134e841c | ||
|
|
f70d15b611 | ||
|
|
be530e35da | ||
|
|
c2de92857b | ||
|
|
e5fe508c0d | ||
|
|
b37c1c77f6 | ||
|
|
5a4542bbc1 | ||
|
|
99bd384b2a | ||
|
|
fc1ce23462 | ||
|
|
780d46b01b | ||
|
|
ce0095f6c4 | ||
|
|
747110e48f | ||
|
|
15a62af5bc | ||
|
|
47de0baa5b | ||
|
|
8bc814b8a1 | ||
|
|
1873a93726 | ||
|
|
e68a0c63e8 | ||
|
|
7338361fed | ||
|
|
c8ca85387f | ||
|
|
4363be199c | ||
|
|
78d87395d8 | ||
|
|
76b3453eff | ||
|
|
bea517d437 | ||
|
|
5022d716d5 | ||
|
|
e7c80af31e | ||
|
|
2422c97a37 | ||
|
|
a3f8026beb | ||
|
|
07d0d94660 | ||
|
|
9a3973cb24 | ||
|
|
adbbe0b6d8 | ||
|
|
8937295020 | ||
|
|
ecd028477f | ||
|
|
51a7eeca13 | ||
|
|
8fbc49073f | ||
|
|
c22740aaab | ||
|
|
b169f570dd | ||
|
|
fd41cf735f | ||
|
|
41460f93ea | ||
|
|
66ac79feaa | ||
|
|
a1202dc91b | ||
|
|
7f455fd334 | ||
|
|
6d38000c72 | ||
|
|
2b3a9e127b | ||
|
|
c101a9c7b1 | ||
|
|
13b2e76461 | ||
|
|
a8903d0e1b | ||
|
|
f39b075f6c | ||
|
|
222ffcc84a | ||
|
|
9c3b5b4171 | ||
|
|
3ded3a6918 | ||
|
|
3e158318d5 | ||
|
|
c472722dcf | ||
|
|
3905ec1663 | ||
|
|
3d77559986 | ||
|
|
acb33371f7 | ||
|
|
a3b6b0df3e | ||
|
|
ddf2002b5d | ||
|
|
a921ddabf1 | ||
|
|
7abd9afc34 | ||
|
|
51a200f313 | ||
|
|
fdfb204114 | ||
|
|
fdb0065fda | ||
|
|
807eceeb94 | ||
|
|
893667a85f | ||
|
|
67bc6331fa | ||
|
|
23993c7e5f | ||
|
|
d9dda4888b | ||
|
|
f2d56ec663 | ||
|
|
6f80a884ce | ||
|
|
a1b4b4d1b0 | ||
|
|
fe959c28f8 | ||
|
|
e032e8c65f | ||
|
|
7d054fbe47 | ||
|
|
c2af8a672c | ||
|
|
1419ccabf7 | ||
|
|
5dffe115a9 | ||
|
|
2bff46dd1d | ||
|
|
da70c0a9d3 | ||
|
|
bf0a8f34f9 | ||
|
|
02409fc66b | ||
|
|
1a83b95c30 | ||
|
|
3dc05d2f55 | ||
|
|
cd590872b9 | ||
|
|
75e9162bcd | ||
|
|
77f532d687 | ||
|
|
b228f8f31f | ||
|
|
7c394fcebd | ||
|
|
77f08760f0 | ||
|
|
b3768ea607 | ||
|
|
ba7fa4a2a1 | ||
|
|
b638e4a38a | ||
|
|
d13af74d38 | ||
|
|
44f8a04f3c | ||
|
|
acd5887b1b | ||
|
|
760068fe91 | ||
|
|
c48f05f5cc | ||
|
|
ca7707280d | ||
|
|
3ca4b2d925 | ||
|
|
80b5d54e0b | ||
|
|
9c30503b27 | ||
|
|
8103e4d6d9 | ||
|
|
bd0116aa59 | ||
|
|
a3c5e8ab0c | ||
|
|
b5e33ec38e | ||
|
|
9775f07644 | ||
|
|
7ddac87541 | ||
|
|
bc66adbf96 | ||
|
|
a3da884205 |
@@ -324,6 +324,7 @@
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AES/@EntryIndexedValue">AES</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=API/@EntryIndexedValue">API</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ASF/@EntryIndexedValue">ASF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EWCF/@EntryIndexedValue">EWCF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FA/@EntryIndexedValue">FA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FS/@EntryIndexedValue">FS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HTML/@EntryIndexedValue">HTML</s:String>
|
||||
@@ -337,6 +338,7 @@
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TTL/@EntryIndexedValue">TTL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=URL/@EntryIndexedValue">URL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WCF/@EntryIndexedValue">WCF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WS/@EntryIndexedValue">WS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WTF/@EntryIndexedValue">WTF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XML/@EntryIndexedValue">XML</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="I" Suffix="" Style="AaBb" /></Policy></s:String>
|
||||
|
||||
@@ -37,15 +37,21 @@ namespace ArchiSteamFarm {
|
||||
internal static class ASF {
|
||||
private const byte AutoUpdatePeriodInHours = 24;
|
||||
|
||||
internal static readonly ArchiLogger ArchiLogger = new ArchiLogger(SharedInfo.ASF);
|
||||
|
||||
private static readonly ConcurrentDictionary<Bot, DateTime> LastWriteTimes = new ConcurrentDictionary<Bot, DateTime>();
|
||||
|
||||
private static Timer AutoUpdatesTimer;
|
||||
private static FileSystemWatcher FileSystemWatcher;
|
||||
|
||||
internal static async Task CheckForUpdate(bool updateOverride = false) {
|
||||
if (Debugging.IsDebugBuild && !updateOverride) {
|
||||
return;
|
||||
}
|
||||
|
||||
string exeFile = Assembly.GetEntryAssembly().Location;
|
||||
if (string.IsNullOrEmpty(exeFile)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(exeFile));
|
||||
ArchiLogger.LogNullError(nameof(exeFile));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -59,8 +65,8 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
File.Delete(oldExeFile);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorRemovingOldBinary, oldExeFile));
|
||||
ArchiLogger.LogGenericException(e);
|
||||
ArchiLogger.LogGenericError(string.Format(Strings.ErrorRemovingOldBinary, oldExeFile));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +82,7 @@ namespace ArchiSteamFarm {
|
||||
TimeSpan.FromHours(AutoUpdatePeriodInHours) // Period
|
||||
);
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.AutoUpdateCheckInfo, AutoUpdatePeriodInHours));
|
||||
ArchiLogger.LogGenericInfo(string.Format(Strings.AutoUpdateCheckInfo, AutoUpdatePeriodInHours));
|
||||
}
|
||||
|
||||
string releaseURL = SharedInfo.GithubReleaseURL;
|
||||
@@ -84,20 +90,20 @@ namespace ArchiSteamFarm {
|
||||
releaseURL += "/latest";
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.UpdateCheckingNewVersion);
|
||||
ArchiLogger.LogGenericInfo(Strings.UpdateCheckingNewVersion);
|
||||
|
||||
GitHub.ReleaseResponse releaseResponse;
|
||||
|
||||
if (Program.GlobalConfig.UpdateChannel == GlobalConfig.EUpdateChannel.Stable) {
|
||||
releaseResponse = await Program.WebBrowser.UrlGetToJsonResultRetry<GitHub.ReleaseResponse>(releaseURL).ConfigureAwait(false);
|
||||
if (releaseResponse == null) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
List<GitHub.ReleaseResponse> releases = await Program.WebBrowser.UrlGetToJsonResultRetry<List<GitHub.ReleaseResponse>>(releaseURL).ConfigureAwait(false);
|
||||
if ((releases == null) || (releases.Count == 0)) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -105,32 +111,32 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(releaseResponse.Tag)) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateCheckFailed);
|
||||
return;
|
||||
}
|
||||
|
||||
Version newVersion = new Version(releaseResponse.Tag);
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.UpdateVersionInfo, SharedInfo.Version, newVersion));
|
||||
ArchiLogger.LogGenericInfo(string.Format(Strings.UpdateVersionInfo, SharedInfo.Version, newVersion));
|
||||
|
||||
if (SharedInfo.Version.CompareTo(newVersion) >= 0) { // If local version is the same or newer than remote version
|
||||
return;
|
||||
}
|
||||
|
||||
if (!updateOverride && !Program.GlobalConfig.AutoUpdates) {
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.UpdateNewVersionAvailable);
|
||||
ArchiLogger.LogGenericInfo(Strings.UpdateNewVersionAvailable);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (File.Exists(oldExeFile)) {
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorRemovingOldBinary, oldExeFile));
|
||||
ArchiLogger.LogGenericError(string.Format(Strings.ErrorRemovingOldBinary, oldExeFile));
|
||||
return;
|
||||
}
|
||||
|
||||
// Auto update logic starts here
|
||||
if (releaseResponse.Assets == null) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorUpdateNoAssets);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateNoAssets);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -138,16 +144,16 @@ namespace ArchiSteamFarm {
|
||||
GitHub.ReleaseResponse.Asset binaryAsset = releaseResponse.Assets.FirstOrDefault(asset => !string.IsNullOrEmpty(asset.Name) && asset.Name.Equals(exeFileName, StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
if (binaryAsset == null) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorUpdateNoAssetForThisBinary);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUpdateNoAssetForThisBinary);
|
||||
return;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(binaryAsset.DownloadURL)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(binaryAsset.DownloadURL));
|
||||
ArchiLogger.LogNullError(nameof(binaryAsset.DownloadURL));
|
||||
return;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.UpdateDownloadingNewVersion);
|
||||
ArchiLogger.LogGenericInfo(Strings.UpdateDownloadingNewVersion);
|
||||
|
||||
byte[] result = await Program.WebBrowser.UrlGetToBytesRetry(binaryAsset.DownloadURL).ConfigureAwait(false);
|
||||
if (result == null) {
|
||||
@@ -160,7 +166,7 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
File.WriteAllBytes(newExeFile, result);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ArchiLogger.LogGenericException(e);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -168,7 +174,7 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
File.Move(exeFile, oldExeFile);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ArchiLogger.LogGenericException(e);
|
||||
try {
|
||||
// Cleanup
|
||||
File.Delete(newExeFile);
|
||||
@@ -182,7 +188,7 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
File.Move(newExeFile, exeFile);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ArchiLogger.LogGenericException(e);
|
||||
try {
|
||||
// Cleanup
|
||||
File.Move(oldExeFile, exeFile);
|
||||
@@ -193,7 +199,7 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.UpdateFinished);
|
||||
ArchiLogger.LogGenericInfo(Strings.UpdateFinished);
|
||||
await RestartOrExit().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
@@ -217,7 +223,7 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (Bot.Bots.Count == 0) {
|
||||
Program.ArchiLogger.LogGenericWarning(Strings.ErrorNoBotsDefined);
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorNoBotsDefined);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +246,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static async Task CreateBot(string botName) {
|
||||
if (string.IsNullOrEmpty(botName)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(botName));
|
||||
ArchiLogger.LogNullError(nameof(botName));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -260,7 +266,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static async void OnChanged(object sender, FileSystemEventArgs e) {
|
||||
if ((sender == null) || (e == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -270,7 +276,7 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (botName.Equals(SharedInfo.ASF)) {
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.GlobalConfigChanged);
|
||||
ArchiLogger.LogGenericInfo(Strings.GlobalConfigChanged);
|
||||
await RestartOrExit().ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
@@ -312,7 +318,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static void OnCreated(object sender, FileSystemEventArgs e) {
|
||||
if ((sender == null) || (e == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -324,9 +330,9 @@ namespace ArchiSteamFarm {
|
||||
CreateBot(botName).Forget();
|
||||
}
|
||||
|
||||
private static void OnDeleted(object sender, FileSystemEventArgs e) {
|
||||
private static async void OnDeleted(object sender, FileSystemEventArgs e) {
|
||||
if ((sender == null) || (e == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -336,8 +342,8 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (botName.Equals(SharedInfo.ASF)) {
|
||||
Program.ArchiLogger.LogGenericError(Strings.ErrorGlobalConfigRemoved);
|
||||
Program.Exit(1);
|
||||
ArchiLogger.LogGenericError(Strings.ErrorGlobalConfigRemoved);
|
||||
await Program.Exit(1).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -347,9 +353,9 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
private static void OnRenamed(object sender, RenamedEventArgs e) {
|
||||
private static async void OnRenamed(object sender, RenamedEventArgs e) {
|
||||
if ((sender == null) || (e == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -359,8 +365,8 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (oldBotName.Equals(SharedInfo.ASF)) {
|
||||
Program.ArchiLogger.LogGenericError(Strings.ErrorGlobalConfigRemoved);
|
||||
Program.Exit(1);
|
||||
ArchiLogger.LogGenericError(Strings.ErrorGlobalConfigRemoved);
|
||||
await Program.Exit(1).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -379,13 +385,13 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static async Task RestartOrExit() {
|
||||
if (Program.GlobalConfig.AutoRestart) {
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.Restarting);
|
||||
ArchiLogger.LogGenericInfo(Strings.Restarting);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
Program.Restart();
|
||||
await Program.Restart().ConfigureAwait(false);
|
||||
} else {
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.Exiting);
|
||||
ArchiLogger.LogGenericInfo(Strings.Exiting);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
Program.Exit();
|
||||
await Program.Exit().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
PlayGames(new List<uint> { gameID }, gameName);
|
||||
PlayGames(gameID.ToEnumerable(), gameName);
|
||||
}
|
||||
|
||||
internal void PlayGames(IEnumerable<uint> gameIDs, string gameName = null) {
|
||||
@@ -395,13 +395,14 @@ namespace ArchiSteamFarm {
|
||||
PurchaseResult = (EPurchaseResult) msg.purchase_result_details;
|
||||
|
||||
if (msg.purchase_receipt_info == null) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(msg.purchase_receipt_info));
|
||||
return;
|
||||
}
|
||||
|
||||
KeyValue receiptInfo = new KeyValue();
|
||||
using (MemoryStream ms = new MemoryStream(msg.purchase_receipt_info)) {
|
||||
if (!receiptInfo.TryReadAsBinary(ms)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(ms));
|
||||
ASF.ArchiLogger.LogNullError(nameof(ms));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -415,22 +416,24 @@ namespace ArchiSteamFarm {
|
||||
foreach (KeyValue lineItem in lineItems) {
|
||||
uint packageID = lineItem["PackageID"].AsUnsignedInteger();
|
||||
if (packageID == 0) {
|
||||
// Valid, coupons have PackageID of -1 (don't ask me why)
|
||||
// Coupons have PackageID of -1 (don't ask me why)
|
||||
// We'll use ItemAppID in this case
|
||||
packageID = lineItem["ItemAppID"].AsUnsignedInteger();
|
||||
if (packageID == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(packageID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(packageID));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
string gameName = lineItem["ItemDescription"].Value;
|
||||
if (string.IsNullOrEmpty(gameName)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(gameName));
|
||||
ASF.ArchiLogger.LogNullError(nameof(gameName));
|
||||
return;
|
||||
}
|
||||
|
||||
gameName = WebUtility.HtmlDecode(gameName); // Apparently steam expects client to decode sent HTML
|
||||
Items[packageID] = WebUtility.HtmlDecode(gameName);
|
||||
// Apparently steam expects client to decode sent HTML
|
||||
gameName = WebUtility.HtmlDecode(gameName);
|
||||
Items[packageID] = gameName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,8 +92,8 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="SteamKit2, Version=1.8.0.26737, Culture=neutral, PublicKeyToken=ed3ce47ed5aad940, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SteamKit2.1.8.0\lib\net45\SteamKit2.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>lib\SteamKit2.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration.Install" />
|
||||
@@ -144,6 +144,7 @@
|
||||
<Compile Include="SharedInfo.cs" />
|
||||
<Compile Include="Statistics.cs" />
|
||||
<Compile Include="SteamSaleEvent.cs" />
|
||||
<Compile Include="SteamTarget.cs" />
|
||||
<Compile Include="Trading.cs" />
|
||||
<Compile Include="Utilities.cs" />
|
||||
<Compile Include="WCF.cs" />
|
||||
|
||||
@@ -1142,7 +1142,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static uint GetAppIDFromMarketHashName(string hashName) {
|
||||
if (string.IsNullOrEmpty(hashName)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(hashName));
|
||||
ASF.ArchiLogger.LogNullError(nameof(hashName));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1157,7 +1157,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static Steam.Item.EType GetItemType(string name) {
|
||||
if (string.IsNullOrEmpty(name)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(name));
|
||||
ASF.ArchiLogger.LogNullError(nameof(name));
|
||||
return Steam.Item.EType.Unknown;
|
||||
}
|
||||
|
||||
@@ -1194,32 +1194,32 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static bool ParseItems(Dictionary<ulong, Tuple<uint, Steam.Item.EType>> descriptions, List<KeyValue> input, HashSet<Steam.Item> output) {
|
||||
if ((descriptions == null) || (input == null) || (input.Count == 0) || (output == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(descriptions) + " || " + nameof(input) + " || " + nameof(output));
|
||||
ASF.ArchiLogger.LogNullError(nameof(descriptions) + " || " + nameof(input) + " || " + nameof(output));
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (KeyValue item in input) {
|
||||
uint appID = item["appid"].AsUnsignedInteger();
|
||||
if (appID == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(appID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(appID));
|
||||
return false;
|
||||
}
|
||||
|
||||
ulong contextID = item["contextid"].AsUnsignedLong();
|
||||
if (contextID == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(contextID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(contextID));
|
||||
return false;
|
||||
}
|
||||
|
||||
ulong classID = item["classid"].AsUnsignedLong();
|
||||
if (classID == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(classID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(classID));
|
||||
return false;
|
||||
}
|
||||
|
||||
uint amount = item["amount"].AsUnsignedInteger();
|
||||
if (amount == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(amount));
|
||||
ASF.ArchiLogger.LogNullError(nameof(amount));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -108,7 +108,7 @@ namespace ArchiSteamFarm {
|
||||
internal readonly string SteamTradeToken = null;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly ETradingPreferences TradingPreferences = ETradingPreferences.AcceptDonations;
|
||||
internal readonly ETradingPreferences TradingPreferences = ETradingPreferences.None;
|
||||
|
||||
[JsonProperty]
|
||||
internal string SteamLogin { get; set; }
|
||||
@@ -124,7 +124,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static BotConfig Load(string filePath) {
|
||||
if (string.IsNullOrEmpty(filePath)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(filePath));
|
||||
ASF.ArchiLogger.LogNullError(nameof(filePath));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -137,12 +137,12 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
botConfig = JsonConvert.DeserializeObject<BotConfig>(File.ReadAllText(filePath));
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (botConfig == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(botConfig));
|
||||
ASF.ArchiLogger.LogNullError(nameof(botConfig));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ namespace ArchiSteamFarm {
|
||||
return botConfig;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningTooManyGamesToPlay, ArchiHandler.MaxGamesPlayedConcurrently, nameof(botConfig.GamesPlayedWhileIdle)));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningTooManyGamesToPlay, ArchiHandler.MaxGamesPlayedConcurrently, nameof(botConfig.GamesPlayedWhileIdle)));
|
||||
|
||||
HashSet<uint> validGames = new HashSet<uint>(botConfig.GamesPlayedWhileIdle.Take(ArchiHandler.MaxGamesPlayedConcurrently));
|
||||
botConfig.GamesPlayedWhileIdle.IntersectWith(validGames);
|
||||
@@ -193,7 +193,8 @@ namespace ArchiSteamFarm {
|
||||
None = 0,
|
||||
AcceptDonations = 1,
|
||||
SteamTradeMatcher = 2,
|
||||
MatchEverything = 4
|
||||
MatchEverything = 4,
|
||||
DontAcceptBotTrades = 8
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,7 +82,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static BotDatabase Load(string filePath) {
|
||||
if (string.IsNullOrEmpty(filePath)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(filePath));
|
||||
ASF.ArchiLogger.LogNullError(nameof(filePath));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -95,12 +95,12 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
botDatabase = JsonConvert.DeserializeObject<BotDatabase>(File.ReadAllText(filePath));
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (botDatabase == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(botDatabase));
|
||||
ASF.ArchiLogger.LogNullError(nameof(botDatabase));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ namespace ArchiSteamFarm {
|
||||
internal void Save() {
|
||||
string json = JsonConvert.SerializeObject(this);
|
||||
if (string.IsNullOrEmpty(json)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(json));
|
||||
ASF.ArchiLogger.LogNullError(nameof(json));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace ArchiSteamFarm {
|
||||
File.WriteAllText(FilePath, json);
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
|
||||
Thread.Sleep(1000);
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace ArchiSteamFarm.CMsgs {
|
||||
|
||||
void ISteamSerializable.Deserialize(Stream stream) {
|
||||
if (stream == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(stream));
|
||||
ASF.ArchiLogger.LogNullError(nameof(stream));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace ArchiSteamFarm.CMsgs {
|
||||
|
||||
void ISteamSerializable.Serialize(Stream stream) {
|
||||
if (stream == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(stream));
|
||||
ASF.ArchiLogger.LogNullError(nameof(stream));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
@@ -36,7 +37,9 @@ using Newtonsoft.Json;
|
||||
namespace ArchiSteamFarm {
|
||||
internal sealed class CardsFarmer : IDisposable {
|
||||
private const byte HoursToBump = 2; // How many hours are required for restricted accounts
|
||||
private const byte HoursToIgnore = 24; // How many hours we ignore unreleased appIDs and don't bother checking them again
|
||||
|
||||
private static readonly ConcurrentDictionary<uint, DateTime> IgnoredAppIDs = new ConcurrentDictionary<uint, DateTime>(); // Reserved for unreleased games
|
||||
private static readonly HashSet<uint> UntrustedAppIDs = new HashSet<uint> { 440, 570, 730 };
|
||||
|
||||
[JsonProperty]
|
||||
@@ -178,20 +181,6 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove from our list all games that were not released yet
|
||||
HashSet<uint> appIDs = new HashSet<uint>(GamesToFarm.Select(game => game.AppID));
|
||||
|
||||
HashSet<uint> unreleasedAppIDs = await Bot.GetUnreleasedAppIDs(appIDs).ConfigureAwait(false);
|
||||
if ((unreleasedAppIDs != null) && (unreleasedAppIDs.Count > 0)) {
|
||||
if (GamesToFarm.RemoveWhere(game => unreleasedAppIDs.Contains(game.AppID)) > 0) {
|
||||
if (GamesToFarm.Count == 0) {
|
||||
Bot.ArchiLogger.LogGenericInfo(Strings.NothingToIdle);
|
||||
await Bot.OnFarmingFinished(false).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Bot.ArchiLogger.LogGenericInfo(string.Format(Strings.GamesToIdle, GamesToFarm.Count, GamesToFarm.Sum(game => game.CardsRemaining), TimeRemaining.ToHumanReadable()));
|
||||
|
||||
// This is the last moment for final check if we can farm
|
||||
@@ -320,7 +309,7 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
HashSet<Task> extraTasks = new HashSet<Task>();
|
||||
HashSet<Task> backgroundTasks = new HashSet<Task>();
|
||||
|
||||
foreach (HtmlNode htmlNode in htmlNodes) {
|
||||
HtmlNode appIDNode = htmlNode.SelectSingleNode(".//div[@class='card_drop_info_dialog']");
|
||||
@@ -354,6 +343,17 @@ namespace ArchiSteamFarm {
|
||||
continue;
|
||||
}
|
||||
|
||||
DateTime lastPICSReport;
|
||||
if (IgnoredAppIDs.TryGetValue(appID, out lastPICSReport)) {
|
||||
if (lastPICSReport.AddHours(HoursToIgnore) < DateTime.UtcNow) {
|
||||
// This game served its time as being ignored
|
||||
IgnoredAppIDs.TryRemove(appID, out lastPICSReport);
|
||||
} else {
|
||||
// This game is still ignored
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Cards
|
||||
HtmlNode progressNode = htmlNode.SelectSingleNode(".//span[@class='progress_info_bold']");
|
||||
if (progressNode == null) {
|
||||
@@ -488,12 +488,22 @@ namespace ArchiSteamFarm {
|
||||
if (cardsRemaining > 0) {
|
||||
GamesToFarm.Add(new Game(appID, name, hours, cardsRemaining));
|
||||
} else {
|
||||
extraTasks.Add(CheckGame(appID, name, hours));
|
||||
Task task = CheckGame(appID, name, hours);
|
||||
switch (Program.GlobalConfig.OptimizationMode) {
|
||||
case GlobalConfig.EOptimizationMode.MinMemoryUsage:
|
||||
await task.ConfigureAwait(false);
|
||||
break;
|
||||
default:
|
||||
backgroundTasks.Add(task);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we have any pending tasks, wait for them
|
||||
await Task.WhenAll(extraTasks).ConfigureAwait(false);
|
||||
// If we have any background tasks, wait for them
|
||||
if (backgroundTasks.Count > 0) {
|
||||
await Task.WhenAll(backgroundTasks).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task CheckPage(byte page) {
|
||||
@@ -516,29 +526,35 @@ namespace ArchiSteamFarm {
|
||||
return false;
|
||||
}
|
||||
|
||||
Bot.ArchiHandler.PlayGame(game.AppID, Bot.BotConfig.CustomGamePlayedWhileFarming);
|
||||
DateTime endFarmingDate = DateTime.UtcNow.AddHours(Program.GlobalConfig.MaxFarmingTime);
|
||||
|
||||
bool success = true;
|
||||
bool? keepFarming = await ShouldFarm(game).ConfigureAwait(false);
|
||||
bool? isReleased = await Bot.IsReleased(game.AppID).ConfigureAwait(false);
|
||||
|
||||
while (keepFarming.GetValueOrDefault(true) && (DateTime.UtcNow < endFarmingDate)) {
|
||||
Bot.ArchiLogger.LogGenericInfo(string.Format(Strings.StillIdling, game.AppID, game.GameName));
|
||||
if (isReleased.GetValueOrDefault(true)) {
|
||||
Bot.ArchiHandler.PlayGame(game.AppID, Bot.BotConfig.CustomGamePlayedWhileFarming);
|
||||
DateTime endFarmingDate = DateTime.UtcNow.AddHours(Program.GlobalConfig.MaxFarmingTime);
|
||||
|
||||
DateTime startFarmingPeriod = DateTime.UtcNow;
|
||||
if (FarmResetEvent.Wait(60 * 1000 * Program.GlobalConfig.FarmingDelay)) {
|
||||
FarmResetEvent.Reset();
|
||||
success = KeepFarming;
|
||||
bool? keepFarming = await ShouldFarm(game).ConfigureAwait(false);
|
||||
while (keepFarming.GetValueOrDefault(true) && (DateTime.UtcNow < endFarmingDate)) {
|
||||
Bot.ArchiLogger.LogGenericInfo(string.Format(Strings.StillIdling, game.AppID, game.GameName));
|
||||
|
||||
DateTime startFarmingPeriod = DateTime.UtcNow;
|
||||
if (FarmResetEvent.Wait(60 * 1000 * Program.GlobalConfig.FarmingDelay)) {
|
||||
FarmResetEvent.Reset();
|
||||
success = KeepFarming;
|
||||
}
|
||||
|
||||
// Don't forget to update our GamesToFarm hours
|
||||
game.HoursPlayed += (float) DateTime.UtcNow.Subtract(startFarmingPeriod).TotalHours;
|
||||
|
||||
if (!success) {
|
||||
break;
|
||||
}
|
||||
|
||||
keepFarming = await ShouldFarm(game).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
// Don't forget to update our GamesToFarm hours
|
||||
game.HoursPlayed += (float) DateTime.UtcNow.Subtract(startFarmingPeriod).TotalHours;
|
||||
|
||||
if (!success) {
|
||||
break;
|
||||
}
|
||||
|
||||
keepFarming = await ShouldFarm(game).ConfigureAwait(false);
|
||||
} else {
|
||||
IgnoredAppIDs[game.AppID] = DateTime.UtcNow;
|
||||
Bot.ArchiLogger.LogGenericInfo(string.Format(Strings.IdlingGameNotReleasedYet, game.AppID, game.GameName));
|
||||
}
|
||||
|
||||
Bot.ArchiLogger.LogGenericInfo(string.Format(Strings.StoppedIdling, game.AppID, game.GameName));
|
||||
@@ -689,18 +705,43 @@ namespace ArchiSteamFarm {
|
||||
|
||||
GamesToFarm.ClearAndTrim();
|
||||
|
||||
List<Task> tasks = new List<Task>(maxPages - 1) { CheckPage(htmlDocument) };
|
||||
List<Task> backgroundTasks = new List<Task>();
|
||||
Task task = CheckPage(htmlDocument);
|
||||
|
||||
switch (Program.GlobalConfig.OptimizationMode) {
|
||||
case GlobalConfig.EOptimizationMode.MinMemoryUsage:
|
||||
await task.ConfigureAwait(false);
|
||||
break;
|
||||
default:
|
||||
backgroundTasks.Add(task);
|
||||
break;
|
||||
}
|
||||
|
||||
if (maxPages > 1) {
|
||||
Bot.ArchiLogger.LogGenericInfo(Strings.CheckingOtherBadgePages);
|
||||
|
||||
for (byte page = 2; page <= maxPages; page++) {
|
||||
byte currentPage = page; // We need a copy of variable being passed when in for loops, as loop will proceed before task is launched
|
||||
tasks.Add(CheckPage(currentPage));
|
||||
switch (Program.GlobalConfig.OptimizationMode) {
|
||||
case GlobalConfig.EOptimizationMode.MinMemoryUsage:
|
||||
for (byte page = 2; page <= maxPages; page++) {
|
||||
await CheckPage(page).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
for (byte page = 2; page <= maxPages; page++) {
|
||||
// We need a copy of variable being passed when in for loops, as loop will proceed before our task is launched
|
||||
byte currentPage = page;
|
||||
backgroundTasks.Add(CheckPage(currentPage));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
if (backgroundTasks.Count > 0) {
|
||||
await Task.WhenAll(backgroundTasks).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
SortGamesToFarm();
|
||||
return GamesToFarm.Count > 0;
|
||||
}
|
||||
|
||||
@@ -114,16 +114,6 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
internal int RemoveWhere(Predicate<T> match) {
|
||||
Lock.EnterWriteLock();
|
||||
|
||||
try {
|
||||
return HashSet.RemoveWhere(match);
|
||||
} finally {
|
||||
Lock.ExitWriteLock();
|
||||
}
|
||||
}
|
||||
|
||||
internal bool ReplaceIfNeededWith(ICollection<T> items) {
|
||||
Lock.EnterUpgradeableReadLock();
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static string Decrypt(ECryptoMethod cryptoMethod, string encrypted) {
|
||||
if (string.IsNullOrEmpty(encrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static string Encrypt(ECryptoMethod cryptoMethod, string decrypted) {
|
||||
if (string.IsNullOrEmpty(decrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static void SetEncryptionKey(string key) {
|
||||
if (string.IsNullOrEmpty(key)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(key));
|
||||
ASF.ArchiLogger.LogNullError(nameof(key));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static string DecryptAES(string encrypted) {
|
||||
if (string.IsNullOrEmpty(encrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -91,14 +91,14 @@ namespace ArchiSteamFarm {
|
||||
decryptedData = SteamKit2.CryptoHelper.SymmetricDecrypt(decryptedData, key);
|
||||
return Encoding.UTF8.GetString(decryptedData);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static string DecryptProtectedDataForCurrentUser(string encrypted) {
|
||||
if (string.IsNullOrEmpty(encrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(encrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -111,14 +111,14 @@ namespace ArchiSteamFarm {
|
||||
|
||||
return Encoding.UTF8.GetString(decryptedData);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static string EncryptAES(string decrypted) {
|
||||
if (string.IsNullOrEmpty(decrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -132,14 +132,14 @@ namespace ArchiSteamFarm {
|
||||
encryptedData = SteamKit2.CryptoHelper.SymmetricEncrypt(encryptedData, key);
|
||||
return Convert.ToBase64String(encryptedData);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static string EncryptProtectedDataForCurrentUser(string decrypted) {
|
||||
if (string.IsNullOrEmpty(decrypted)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
ASF.ArchiLogger.LogNullError(nameof(decrypted));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
return Convert.ToBase64String(encryptedData);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,14 +35,16 @@ namespace ArchiSteamFarm {
|
||||
internal static readonly bool IsDebugBuild = false;
|
||||
#endif
|
||||
|
||||
internal static bool IsUserDebugging => IsDebugBuild || Program.GlobalConfig.Debug;
|
||||
|
||||
internal sealed class DebugListener : IDebugListener {
|
||||
public void WriteLine(string category, string msg) {
|
||||
if (string.IsNullOrEmpty(category) && string.IsNullOrEmpty(msg)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(category) + " && " + nameof(msg));
|
||||
ASF.ArchiLogger.LogNullError(nameof(category) + " && " + nameof(msg));
|
||||
return;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericDebug(category + " | " + msg);
|
||||
ASF.ArchiLogger.LogGenericDebug(category + " | " + msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,9 +34,9 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.NoBotsAreRunning);
|
||||
ASF.ArchiLogger.LogGenericInfo(Strings.NoBotsAreRunning);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
Program.Exit();
|
||||
await Program.Exit().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
internal static void OnPersonaState(Bot bot, SteamFriends.PersonaStateCallback callback) { }
|
||||
|
||||
@@ -38,10 +38,6 @@ namespace ArchiSteamFarm {
|
||||
internal const byte DefaultConnectionTimeout = 60;
|
||||
internal const ushort DefaultWCFPort = 1242;
|
||||
|
||||
private const byte DefaultFarmingDelay = 15;
|
||||
private const byte DefaultMaxFarmingTime = 10;
|
||||
private const ProtocolType DefaultSteamProtocol = ProtocolType.Tcp;
|
||||
|
||||
// This is hardcoded blacklist which should not be possible to change
|
||||
internal static readonly HashSet<uint> GlobalBlacklist = new HashSet<uint> { 267420, 303700, 335590, 368020, 425280, 480730, 566020 };
|
||||
|
||||
@@ -64,7 +60,7 @@ namespace ArchiSteamFarm {
|
||||
internal readonly bool Debug = false;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly byte FarmingDelay = DefaultFarmingDelay;
|
||||
internal readonly byte FarmingDelay = 15;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly byte GiftsLimiterDelay = 1;
|
||||
@@ -82,11 +78,14 @@ namespace ArchiSteamFarm {
|
||||
internal readonly byte LoginLimiterDelay = 10;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly byte MaxFarmingTime = DefaultMaxFarmingTime;
|
||||
internal readonly byte MaxFarmingTime = 10;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly byte MaxTradeHoldDuration = 15;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly EOptimizationMode OptimizationMode = EOptimizationMode.MaxPerformance;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly bool Statistics = true;
|
||||
|
||||
@@ -94,11 +93,14 @@ namespace ArchiSteamFarm {
|
||||
internal readonly ulong SteamOwnerID = 0;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly ProtocolType SteamProtocol = DefaultSteamProtocol;
|
||||
internal readonly ProtocolType SteamProtocol = ProtocolType.Tcp;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly EUpdateChannel UpdateChannel = EUpdateChannel.Stable;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly EWCFBinding WCFBinding = EWCFBinding.NetTcp;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
internal readonly ushort WCFPort = DefaultWCFPort;
|
||||
|
||||
@@ -110,7 +112,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static GlobalConfig Load(string filePath) {
|
||||
if (string.IsNullOrEmpty(filePath)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(filePath));
|
||||
ASF.ArchiLogger.LogNullError(nameof(filePath));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -123,12 +125,12 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
globalConfig = JsonConvert.DeserializeObject<GlobalConfig>(File.ReadAllText(filePath));
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (globalConfig == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(globalConfig));
|
||||
ASF.ArchiLogger.LogNullError(nameof(globalConfig));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -139,24 +141,24 @@ namespace ArchiSteamFarm {
|
||||
case ProtocolType.Udp:
|
||||
break;
|
||||
default:
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.SteamProtocol), globalConfig.SteamProtocol));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.SteamProtocol), globalConfig.SteamProtocol));
|
||||
return null;
|
||||
}
|
||||
|
||||
// User might not know what he's doing
|
||||
// Ensure that he can't screw core ASF variables
|
||||
if (globalConfig.MaxFarmingTime == 0) {
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.MaxFarmingTime), globalConfig.MaxFarmingTime));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.MaxFarmingTime), globalConfig.MaxFarmingTime));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (globalConfig.FarmingDelay == 0) {
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.FarmingDelay), globalConfig.FarmingDelay));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.FarmingDelay), globalConfig.FarmingDelay));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (globalConfig.ConnectionTimeout == 0) {
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.ConnectionTimeout), globalConfig.ConnectionTimeout));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.ConnectionTimeout), globalConfig.ConnectionTimeout));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -164,15 +166,26 @@ namespace ArchiSteamFarm {
|
||||
return globalConfig;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.WCFPort), globalConfig.WCFPort));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(globalConfig.WCFPort), globalConfig.WCFPort));
|
||||
return null;
|
||||
}
|
||||
|
||||
internal enum EOptimizationMode : byte {
|
||||
MaxPerformance,
|
||||
MinMemoryUsage
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Global")]
|
||||
internal enum EUpdateChannel : byte {
|
||||
None,
|
||||
Stable,
|
||||
Experimental
|
||||
}
|
||||
|
||||
internal enum EWCFBinding : byte {
|
||||
NetTcp,
|
||||
BasicHttp,
|
||||
WSHttp
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static GlobalDatabase Load(string filePath) {
|
||||
if (string.IsNullOrEmpty(filePath)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(filePath));
|
||||
ASF.ArchiLogger.LogNullError(nameof(filePath));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -97,12 +97,12 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
globalDatabase = JsonConvert.DeserializeObject<GlobalDatabase>(File.ReadAllText(filePath), CustomSerializerSettings);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (globalDatabase == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(globalDatabase));
|
||||
ASF.ArchiLogger.LogNullError(nameof(globalDatabase));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace ArchiSteamFarm {
|
||||
private void Save() {
|
||||
string json = JsonConvert.SerializeObject(this, CustomSerializerSettings);
|
||||
if (string.IsNullOrEmpty(json)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(json));
|
||||
ASF.ArchiLogger.LogNullError(nameof(json));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace ArchiSteamFarm {
|
||||
File.WriteAllText(FilePath, json);
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
|
||||
Thread.Sleep(1000);
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
public Task UpdateServerListAsync(IEnumerable<IPEndPoint> endPoints) {
|
||||
if (endPoints == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(endPoints));
|
||||
ASF.ArchiLogger.LogNullError(nameof(endPoints));
|
||||
return Task.Delay(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,25 +67,25 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
HtmlNode htmlNode = HtmlDocument.DocumentNode.SelectSingleNode("//div[@class='tradeoffer']");
|
||||
if (htmlNode == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(htmlNode));
|
||||
ASF.ArchiLogger.LogNullError(nameof(htmlNode));
|
||||
return 0;
|
||||
}
|
||||
|
||||
string id = htmlNode.GetAttributeValue("id", null);
|
||||
if (string.IsNullOrEmpty(id)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(id));
|
||||
ASF.ArchiLogger.LogNullError(nameof(id));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int index = id.IndexOf('_');
|
||||
if (index < 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(index));
|
||||
ASF.ArchiLogger.LogNullError(nameof(index));
|
||||
return 0;
|
||||
}
|
||||
|
||||
index++;
|
||||
if (id.Length <= index) {
|
||||
Program.ArchiLogger.LogNullError(nameof(id.Length));
|
||||
ASF.ArchiLogger.LogNullError(nameof(id.Length));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace ArchiSteamFarm.JSON {
|
||||
return _TradeOfferID;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogNullError(nameof(_TradeOfferID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(_TradeOfferID));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -131,13 +131,13 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
HtmlNode htmlNode = HtmlDocument.DocumentNode.SelectSingleNode("//a/@data-miniprofile");
|
||||
if (htmlNode == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(htmlNode));
|
||||
ASF.ArchiLogger.LogNullError(nameof(htmlNode));
|
||||
return 0;
|
||||
}
|
||||
|
||||
string miniProfile = htmlNode.GetAttributeValue("data-miniprofile", null);
|
||||
if (string.IsNullOrEmpty(miniProfile)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(miniProfile));
|
||||
ASF.ArchiLogger.LogNullError(nameof(miniProfile));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ namespace ArchiSteamFarm.JSON {
|
||||
return _OtherSteamID3;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogNullError(nameof(_OtherSteamID3));
|
||||
ASF.ArchiLogger.LogNullError(nameof(_OtherSteamID3));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -182,7 +182,7 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (value == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -237,13 +237,13 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (string.IsNullOrEmpty(value)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
uint amount;
|
||||
if (!uint.TryParse(value, out amount) || (amount == 0)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(amount));
|
||||
ASF.ArchiLogger.LogNullError(nameof(amount));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -258,13 +258,13 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (string.IsNullOrEmpty(value)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
uint appID;
|
||||
if (!uint.TryParse(value, out appID) || (appID == 0)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(appID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(appID));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -278,13 +278,13 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (string.IsNullOrEmpty(value)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
ulong assetID;
|
||||
if (!ulong.TryParse(value, out assetID) || (assetID == 0)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(assetID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(assetID));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -299,7 +299,7 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (string.IsNullOrEmpty(value)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -319,13 +319,13 @@ namespace ArchiSteamFarm.JSON {
|
||||
|
||||
set {
|
||||
if (string.IsNullOrEmpty(value)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(value));
|
||||
ASF.ArchiLogger.LogNullError(nameof(value));
|
||||
return;
|
||||
}
|
||||
|
||||
ulong contextID;
|
||||
if (!ulong.TryParse(value, out contextID) || (contextID == 0)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(contextID));
|
||||
ASF.ArchiLogger.LogNullError(nameof(contextID));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -405,7 +405,7 @@ namespace ArchiSteamFarm.JSON {
|
||||
}
|
||||
|
||||
if (OtherSteamID3 == 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(OtherSteamID3));
|
||||
ASF.ArchiLogger.LogNullError(nameof(OtherSteamID3));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
3
ArchiSteamFarm/Localization/README.md
Normal file
3
ArchiSteamFarm/Localization/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
This directory contains ASF strings for display and localization purposes.
|
||||
|
||||
All strings used by ASF can be found in main ```Strings.resx``` file, and that's also the only file that should be modified - all other files are managed automatically and should not be touched. Please visit **[localization](https://github.com/JustArchi/ArchiSteamFarm/wiki/Localization)** section on the wiki if you want to improve translation of other files.
|
||||
9
ArchiSteamFarm/Localization/Strings.Designer.cs
generated
9
ArchiSteamFarm/Localization/Strings.Designer.cs
generated
@@ -954,6 +954,15 @@ namespace ArchiSteamFarm.Localization {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Idling {0} ({1}) is temporarily disabled, as that game was not released yet..
|
||||
/// </summary>
|
||||
internal static string IdlingGameNotReleasedYet {
|
||||
get {
|
||||
return ResourceManager.GetString("IdlingGameNotReleasedYet", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Idling status for {0} ({1}): {2} cards remaining.
|
||||
/// </summary>
|
||||
|
||||
@@ -278,6 +278,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -350,6 +350,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -133,35 +133,67 @@
|
||||
<value>Конфигурираното свойство {0} е невалидно: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
|
||||
<value>ASF V{0} претърпя критичен срив, преди основния записващ модул, да стартира!</value>
|
||||
<comment>{0} will be replaced by version number</comment>
|
||||
</data>
|
||||
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
|
||||
<value>Изключение: {0}() {1} StackTrace:{2}</value>
|
||||
<comment>{0} will be replaced by function name, {1} will be replaced by exception message, {2} will be replaced by entire stack trace. Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorExitingWithNonZeroErrorCode" xml:space="preserve">
|
||||
<value>Изключване при код за грешка различен от 0 (нула)!</value>
|
||||
</data>
|
||||
<data name="ErrorFailingRequest" xml:space="preserve">
|
||||
<value>Провалена заявка: {0}</value>
|
||||
<comment>{0} will be replaced by URL of the request</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
|
||||
<value>Общата настройка не може да бъде заредена, моля уверете се, че {0} съществува и е валидна! Прочетете наръчника за настройване в wiki страницата, ако сте объркани.</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorIsInvalid" xml:space="preserve">
|
||||
<value>{0} е невалидно!</value>
|
||||
<value>{0} е невалиден!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="ErrorMobileAuthenticatorInvalidDeviceID" xml:space="preserve">
|
||||
<value>Отказва да изпълни тази функцията, поради невалиден DeviceID в ASF 2FA!</value>
|
||||
</data>
|
||||
<data name="ErrorNoBotsDefined" xml:space="preserve">
|
||||
<value>Няма настрени ботове, да не би да сте забравили да настроите ASF?</value>
|
||||
</data>
|
||||
<data name="ErrorObjectIsNull" xml:space="preserve">
|
||||
<value>{0} е нулев!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="ErrorParsingObject" xml:space="preserve">
|
||||
<value>Разборът {0} се провали!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorRemovingOldBinary" xml:space="preserve">
|
||||
<value>Не може да се премахне старият ASF файл, моля премахнете {0} ръчно, за може обновлението да сработи!</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
|
||||
<value>Операцията не може да се изпълни въпреки {0} опита!</value>
|
||||
<comment>{0} will be replaced by maximum number of tries</comment>
|
||||
</data>
|
||||
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
|
||||
<value>Не успя да се провери за последната версия!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssetForThisBinary" xml:space="preserve">
|
||||
<value>Не може да се премине към обновление, защото няма файл, който е свързан с работещата в момента програма! Моля проверете, че вашата ASF програма е именувана правилно!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssets" xml:space="preserve">
|
||||
<value>Не може да се премине към обновление, защото тази версия не включва никакви файлове!</value>
|
||||
</data>
|
||||
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
|
||||
<value>Получено е желание за промяна от потребителя, но процеса продължава в режим без възможност за промяна!</value>
|
||||
</data>
|
||||
<data name="ErrorWCFAccessDenied" xml:space="preserve">
|
||||
<value>Отказване на желанието, защото SteamOwnerID не е зададено!</value>
|
||||
<comment>SteamOwnerID is name of bot config property, it should not be translated</comment>
|
||||
</data>
|
||||
<data name="Exiting" xml:space="preserve">
|
||||
<value>Излизане…</value>
|
||||
</data>
|
||||
@@ -170,11 +202,24 @@
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="IgnoringTrade" xml:space="preserve">
|
||||
<value>Пренебрегване на замяната: {0}</value>
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="LoggingIn" xml:space="preserve">
|
||||
<value>Записване в {0}...</value>
|
||||
<comment>{0} will be replaced by service's name</comment>
|
||||
</data>
|
||||
<data name="NoBotsAreRunning" xml:space="preserve">
|
||||
<value>Не работят ботове, излизане...</value>
|
||||
</data>
|
||||
<data name="RefreshingOurSession" xml:space="preserve">
|
||||
<value>Обновление на сесията!</value>
|
||||
</data>
|
||||
<data name="RejectingTrade" xml:space="preserve">
|
||||
<value>Отказване на замяната: {0}</value>
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="Restarting" xml:space="preserve">
|
||||
<value>Рестартиране…</value>
|
||||
</data>
|
||||
@@ -182,8 +227,13 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Starting" xml:space="preserve">
|
||||
<value>Стартиране...</value>
|
||||
</data>
|
||||
<data name="StatusCode" xml:space="preserve">
|
||||
<value>Статус код: {0}</value>
|
||||
<comment>{0} will be replaced by status code number/name</comment>
|
||||
</data>
|
||||
<data name="Success" xml:space="preserve">
|
||||
<value>Успешно!</value>
|
||||
</data>
|
||||
@@ -234,20 +284,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Готово!</value>
|
||||
<data name="WCFReady" xml:space="preserve">
|
||||
<value>WSF сървърът е готов!</value>
|
||||
</data>
|
||||
<data name="WCFResponseReceived" xml:space="preserve">
|
||||
<value>WCF отговор получен: {0}</value>
|
||||
<comment>{0} will be replaced by WCF response</comment>
|
||||
</data>
|
||||
|
||||
|
||||
@@ -256,18 +298,68 @@
|
||||
|
||||
|
||||
|
||||
<data name="CheckingFirstBadgePage" xml:space="preserve">
|
||||
<value>Проверяване на първата страница със значки...</value>
|
||||
</data>
|
||||
<data name="CheckingOtherBadgePages" xml:space="preserve">
|
||||
<value>Проверяване на други страници със значки...</value>
|
||||
</data>
|
||||
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
|
||||
<value>Избиране на алгоритъм за вадене на карти: {0}</value>
|
||||
<comment>{0} will be replaced by the name of chosen idling algorithm</comment>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Готово!</value>
|
||||
</data>
|
||||
|
||||
<data name="IdlingFinished" xml:space="preserve">
|
||||
<value>Изкарването на карти приключи!</value>
|
||||
</data>
|
||||
|
||||
<data name="IdlingFinishedForGames" xml:space="preserve">
|
||||
<value>Завърши ваденето на карти на: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
|
||||
<data name="IdlingStopped" xml:space="preserve">
|
||||
<value>Изкарването на карти е спряно!</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="NowIdling" xml:space="preserve">
|
||||
<value>Сега се вадят карти на: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="NowIdlingList" xml:space="preserve">
|
||||
<value>Сега се вадят карти на: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
|
||||
<data name="StillIdling" xml:space="preserve">
|
||||
<value>Все още се вадят карти на: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="StillIdlingList" xml:space="preserve">
|
||||
<value>Все още се вадят карти на: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="StoppedIdling" xml:space="preserve">
|
||||
<value>Прекратено е ваденето на карти на: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="StoppedIdlingList" xml:space="preserve">
|
||||
<value>Прекратено е ваденето на карти на: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="UnknownCommand" xml:space="preserve">
|
||||
<value>Непозната команда!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotAcceptingGift" xml:space="preserve">
|
||||
<value>Приемане на подарък: {0}...</value>
|
||||
<comment>{0} will be replaced by giftID (number)</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
@@ -294,7 +386,7 @@
|
||||
|
||||
|
||||
<data name="BotLoggedOn" xml:space="preserve">
|
||||
<value>Влязли сте успешно!</value>
|
||||
<value>Влезли сте успешно!</value>
|
||||
</data>
|
||||
<data name="BotLoggingIn" xml:space="preserve">
|
||||
<value>Влизане…</value>
|
||||
@@ -329,8 +421,14 @@
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotStatusNotConnected" xml:space="preserve">
|
||||
<value>Бот {0} не е свързан.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusNotRunning" xml:space="preserve">
|
||||
<value>Бот {0} не работи.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
@@ -340,7 +438,7 @@
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="UnusedKeys" xml:space="preserve">
|
||||
<value>Неизползваните ключове: {0}</value>
|
||||
<value>Неизползвани ключове: {0}</value>
|
||||
<comment>{0} will be replaced by list of cd-keys (strings), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="WarningFailedWithError" xml:space="preserve">
|
||||
@@ -362,11 +460,12 @@
|
||||
|
||||
|
||||
<data name="Initializing" xml:space="preserve">
|
||||
<value>Инициализиране {0}…</value>
|
||||
<value>Стартиране {0}…</value>
|
||||
<comment>{0} will be replaced by service name that is being initialized</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -278,6 +278,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF se pokusí použít váš preferovaný jazyk {0}. Překlad tohoto jazyka je ale dokončen pouze z {1}. Možná chcete pomoci zlepšit překlad aplikace ASF pro váš jazyk?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Farmení hry {0} ({1}) je dočasně zrušeno, protože hra zatím nevyšla.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -278,6 +278,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -541,7 +541,7 @@ StackTrace:
|
||||
<value>Erfolgreich angemeldet!</value>
|
||||
</data>
|
||||
<data name="BotLoggingIn" xml:space="preserve">
|
||||
<value>Melde an...</value>
|
||||
<value>Anmelden...</value>
|
||||
</data>
|
||||
<data name="BotLogonSessionReplaced" xml:space="preserve">
|
||||
<value>Dieses Benutzerkonto scheint bereits von einer anderen ASF-Instanz verwendet zu werden, welches ein undefiniertes Verhalten ist, verweigere es weiter laufen zu lassen!</value>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF wird versuchen deine bevorzugte {0} Sprache zu verwenden, jedoch wurde die Übersetzung in dieser Sprache nur zu {1} abgeschlossen. Kannst du uns vielleicht helfen die ASF-Übersetzung in deiner Sprache zu verbessern?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Sammeln {0} ({1}) ist vorübergehend deaktiviert, da dieses Spiel bis jetzt noch nicht veröffentlicht wurde.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -144,7 +144,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by function name, {1} will be replaced by exception message, {2} will be replaced by entire stack trace. Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
<data name="ErrorExitingWithNonZeroErrorCode" xml:space="preserve">
|
||||
<value>Έξοδο με κωδικό σφάλματος μη μηδενική τιμή!</value>
|
||||
<value>Έξοδο με κωδικό σφάλματος με μη μηδενική τιμή!</value>
|
||||
</data>
|
||||
<data name="ErrorFailingRequest" xml:space="preserve">
|
||||
<value>Αποτυχία αίτησης: {0}</value>
|
||||
@@ -173,11 +173,11 @@ StackTrace:
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorRemovingOldBinary" xml:space="preserve">
|
||||
<value>Αδυναμία να αφαιρεθεί το παλιό ASF binary, παρακαλώ αφαιρέστε το {0} χειροκίνητα ώστε να λειτουργήσει η διαδικασία ενημέρωσης!</value>
|
||||
<value>Αδυναμία αφαίρεσης του παλιού ASF binary, παρακαλώ αφαιρέστε το {0} χειροκίνητα ώστε να λειτουργήσει η λειτουργία ενημέρωσης!</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
|
||||
<value>Η αίτηση απέτυχε παρά τις {0} προσπαθείες!</value>
|
||||
<value>Το αίτημα απέτυχε παρά τις {0} προσπάθειες!</value>
|
||||
<comment>{0} will be replaced by maximum number of tries</comment>
|
||||
</data>
|
||||
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
|
||||
@@ -220,7 +220,7 @@ StackTrace:
|
||||
<value>Δεν τρέχει κανένα bot, τερματισμός...</value>
|
||||
</data>
|
||||
<data name="RefreshingOurSession" xml:space="preserve">
|
||||
<value>Επανεκκίνηση της συνεδρίας!</value>
|
||||
<value>Ανανέωση της συνεδρίας!</value>
|
||||
</data>
|
||||
<data name="RejectingTrade" xml:space="preserve">
|
||||
<value>Απόρριψη ανταλλαγής: {0}</value>
|
||||
@@ -696,4 +696,8 @@ StackTrace:
|
||||
<value>Το ASF θα επιχειρήσει να χρησιμοποιήσει τη γλώσσα {0}, αλλά η μετάφραση σ'αυτή τη γλώσσα έχει συμπληρωθεί μόνο κατά {1}. Ισως θα μπορούσατε να μας βοηθήσετε να βελτιώσουμε τη μετάφραση του ASF για τη γλώσσα σας;</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Η συλλογή καρτών για το {0} ({1}) έχει απενεργοποιηθεί προσωρινά, καθώς το παιχνίδι δεν έχει κυκλοφορήσει ακόμα.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF will attempt to use your preferred {0} culture, but translation in that language was completed only in {1}. Perhaps you could help us improve ASF translation for your language?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Idling {0} ({1}) is temporarily disabled, as that game was not released yet.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -333,7 +333,10 @@ Trazo de pila:
|
||||
<value><{0}>, Introduzca su host de WCF: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
|
||||
<value>Recibido valor desconocido para {0}. Por favor, informa de ello: {1}</value>
|
||||
<comment>{0} will be replaced by object's name, {1} will be replaced by value for that object</comment>
|
||||
</data>
|
||||
<data name="WarningTooManyGamesToPlay" xml:space="preserve">
|
||||
<value>¡Ejecutar más de {0} juegos a la vez no es posible, sólo se usarán las primeras {0} entradas de {1}!</value>
|
||||
<comment>{0} will be replaced by max number of games, {1} will be replaced by name of the configuration property</comment>
|
||||
@@ -693,4 +696,8 @@ Trazo de pila:
|
||||
<value>ASF intentará utilizar tu idioma {0}, pero la traducción en este idioma está completa sólo en un {1}. ¿Tal vez podrías ayudarnos a mejorar la traducción de ASF para tu idioma?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>No se pueden aumentar las horas jugadas de {0} ({1}) porque el juego aún no ha salido.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -122,7 +122,7 @@
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="AutoUpdateCheckInfo" xml:space="preserve">
|
||||
<value>ASF tarkistaa automaattisesti uusia päivityksiä {0} tunnin välein.</value>
|
||||
<value>ASF tarkistaa päivitykset automaattisesti {0} tunnin välein.</value>
|
||||
<comment>{0} will be replaced by number of hours</comment>
|
||||
</data>
|
||||
<data name="Content" xml:space="preserve">
|
||||
@@ -145,13 +145,15 @@
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
|
||||
<value>Viimeisimmän version tarkistus epäonnistui!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Exiting" xml:space="preserve">
|
||||
<value>Poistutaan...</value>
|
||||
<value>Suljetaan...</value>
|
||||
</data>
|
||||
|
||||
|
||||
@@ -165,12 +167,19 @@
|
||||
<value>Käynnistetään uudelleen...</value>
|
||||
</data>
|
||||
|
||||
<data name="RuntimeVersionComparison" xml:space="preserve">
|
||||
<value>Vaadittu versio: {0} | Nykyinen versio: {1}</value>
|
||||
<comment>{0} will be replaced by required version, {1} will be replaced by current version</comment>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="Starting" xml:space="preserve">
|
||||
<value>Käynnistetään...</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Success" xml:space="preserve">
|
||||
<value>Valmis!</value>
|
||||
</data>
|
||||
<data name="TimeSpanDay" xml:space="preserve">
|
||||
<value>1 päivä</value>
|
||||
</data>
|
||||
@@ -235,61 +244,122 @@
|
||||
|
||||
|
||||
|
||||
<data name="WCFReady" xml:space="preserve">
|
||||
<value>WCF-palvelin on valmiina!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotNotFound" xml:space="preserve">
|
||||
<value>Bottia nimeltä {0} ei voitu löytää!</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="CheckingFirstBadgePage" xml:space="preserve">
|
||||
<value>Tarkastellaan ensimmäistä badge sivua...</value>
|
||||
</data>
|
||||
<data name="CheckingOtherBadgePages" xml:space="preserve">
|
||||
<value>Tarkastellaan muita badge sivuja...</value>
|
||||
</data>
|
||||
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
|
||||
<value>Asetettu idlaus algoritmi: {0}</value>
|
||||
<comment>{0} will be replaced by the name of chosen idling algorithm</comment>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Valmis!</value>
|
||||
</data>
|
||||
<data name="GamesToIdle" xml:space="preserve">
|
||||
<value>In case there is only 1 game left to idle and only one card drop left, "peliä" should be "peli" and "korttia" should "kortti". Same goes for timestamps, if only 1 left its "minuutti, tunti, päivä, kuukausi
|
||||
|
||||
edit; also word "joissa" should be "jossa" if only card left
|
||||
|
||||
{0}{1}{2}</value>
|
||||
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="IdlingFinished" xml:space="preserve">
|
||||
<value>Idlaus valmis!</value>
|
||||
</data>
|
||||
<data name="IdlingFinishedForGame" xml:space="preserve">
|
||||
<value>Idlaus valmis {0} ({1}) Kulunut aika: {2}!
|
||||
|
||||
I think this works alot better in finnish...</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="IdlingStopped" xml:space="preserve">
|
||||
<value>Idlaus pysäytetty!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="StillIdling" xml:space="preserve">
|
||||
<value>Idlataan: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="StillIdlingList" xml:space="preserve">
|
||||
<value>Idlataan: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="StoppedIdling" xml:space="preserve">
|
||||
<value>Idlaus pysäytetty: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="StoppedIdlingList" xml:space="preserve">
|
||||
<value>Idlaus pysäytetty: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="UnknownCommand" xml:space="preserve">
|
||||
<value>Tuntematon komento!</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="BotAcceptingGift" xml:space="preserve">
|
||||
<value>Hyväksytään lahjaa: {0}...</value>
|
||||
<comment>{0} will be replaced by giftID (number)</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotAuthenticatorInvalidDeviceID" xml:space="preserve">
|
||||
<value>Sinun DeviceID on virheellinen tai sitä ei ole olemassa!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotAutomaticIdlingPausedWithCountdown" xml:space="preserve">
|
||||
<value>Automaattinen idlaus on pysäytetty! Sinulla on {0} minuuttia aikaa käynnistää peli.</value>
|
||||
<comment>{0} will be replaced by number of minutes</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotConnected" xml:space="preserve">
|
||||
<value>Yhdistetty Steamiin!</value>
|
||||
</data>
|
||||
<data name="BotDisconnected" xml:space="preserve">
|
||||
<value>Katkaistu yhteys Steamista!</value>
|
||||
</data>
|
||||
<data name="BotDisconnecting" xml:space="preserve">
|
||||
<value>Katkaistaan yhteyttä...</value>
|
||||
</data>
|
||||
<data name="BotEncryptedPassword" xml:space="preserve">
|
||||
<value>[{0}] salasana: {1}</value>
|
||||
<comment>{0} will be replaced by password encryption method (string), {1} will be replaced by encrypted password using that method (string)</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotLoggedOn" xml:space="preserve">
|
||||
<value>Onnistuneesti kirjauduttu sisään!</value>
|
||||
</data>
|
||||
<data name="BotLoggingIn" xml:space="preserve">
|
||||
<value>Kirjaudutaan sisään...</value>
|
||||
</data>
|
||||
@@ -307,33 +377,61 @@
|
||||
|
||||
|
||||
|
||||
<data name="BotReconnecting" xml:space="preserve">
|
||||
<value>Yhdistetään uudelleen...</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="BotStatusNotConnected" xml:space="preserve">
|
||||
<value>Botti {0} ei ole yhdistetty.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusNotRunning" xml:space="preserve">
|
||||
<value>Botti {0} ei ole käynnissä.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="ErrorIsEmpty" xml:space="preserve">
|
||||
<value>{0} on tyhjä!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="UnusedKeys" xml:space="preserve">
|
||||
<value>Käyttämättömät CD-keyt: {0}</value>
|
||||
<comment>{0} will be replaced by list of cd-keys (strings), separated by a comma</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotConnectionLost" xml:space="preserve">
|
||||
<value>Yhteys Steamin palvelimeen katkesi, yhdistetään uudelleen...</value>
|
||||
</data>
|
||||
<data name="BotAccountFree" xml:space="preserve">
|
||||
<value>Suljit pelin, idlaus prosessi jatkuu!</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="BotConnecting" xml:space="preserve">
|
||||
<value>Yhdistetään...</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="BotStopping" xml:space="preserve">
|
||||
<value>Pysäytetään...</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="Initializing" xml:space="preserve">
|
||||
<value>Alustetaan {0}...</value>
|
||||
<comment>{0} will be replaced by service name that is being initialized</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Welcome" xml:space="preserve">
|
||||
<value>Huomasin että käynnistit ohjelman ensimmäisen kerran, tervetuloa!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -224,14 +224,14 @@ StackTrace :
|
||||
<value>Rafraîchissement de notre session !</value>
|
||||
</data>
|
||||
<data name="RejectingTrade" xml:space="preserve">
|
||||
<value>L'Offre : {0} est rejetée</value>
|
||||
<value>Offre rejetée : {0}</value>
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="Restarting" xml:space="preserve">
|
||||
<value>Redémarrage...</value>
|
||||
</data>
|
||||
<data name="WarningRuntimeUnsupported" xml:space="preserve">
|
||||
<value>ASF a détecté un environnement d'exécution en cours non pris en charge, le programme pourrait NE PAS fonctionner. Vous le lancer à vos propres risques et périls, et sans aide !</value>
|
||||
<value>ASF a détecté un environnement d'exécution en cours non pris en charge, le programme pourrait NE PAS fonctionner. Vous le lancez à vos propres risques et périls, et sans aide !</value>
|
||||
</data>
|
||||
<data name="RuntimeVersionComparison" xml:space="preserve">
|
||||
<value>Version requise : {0} | Version trouvée : {1}</value>
|
||||
@@ -697,4 +697,8 @@ StackTrace :
|
||||
<value>ASF va tenter d’utiliser votre langage préféré {0}, mais la traduction dans ce langage est achevée seulement à {1}. Peut-être vous pourriez nous aider à améliorer la traduction ASF pour votre langue ?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>La collecte des cartes pour {0} ({1}) est temporairement désactivée, car ce jeu n’est pas encore sorti.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -323,7 +323,10 @@ StackTrace:
|
||||
<value><{0}> בבקשה הזן את את סיסמת הPIN (סיסמה בעלת 4 ספרות) של הגדרות ההרות של סטים: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
<data name="UserInputSteamPassword" xml:space="preserve">
|
||||
<value>lt&;{0}> הכנס בבקשה את סיסמת הסטים שלך:</value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
<data name="UserInputWCFHost" xml:space="preserve">
|
||||
<value><{0} >, נא להזין WCF host: </value>
|
||||
@@ -450,7 +453,9 @@ StackTrace:
|
||||
<value>מופע בוט זה פועל כבר!</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
|
||||
<data name="BotAuthenticatorConverting" xml:space="preserve">
|
||||
<value>המרת .maFile לפורמט ASF</value>
|
||||
</data>
|
||||
|
||||
<data name="BotAuthenticatorInvalidDeviceID" xml:space="preserve">
|
||||
<value>ה- DeviceID שלך שגוי או אינו קיים!</value>
|
||||
@@ -618,4 +623,5 @@ StackTrace:
|
||||
<value>CurrentCulture שסופק אינו חוקי, ConfigGenerator תמשיך לפעול עם ברירת המחדל!</value>
|
||||
</data>
|
||||
|
||||
|
||||
</root>
|
||||
@@ -331,6 +331,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -379,4 +379,5 @@ StackTrace: {2}</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -695,4 +695,8 @@
|
||||
<value>ASF akan mencoba untuk menggunakan bahasa {0} pilihan Anda, tetapi terjemahan dalam bahasa tersebut baru {1}. Mungkin Anda bisa membantu ASF untuk melengkapi terjemahan ke dalam bahasa Anda?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Pendiaman {0} ({1}) sementara dinonaktifkan, seperti permainan yang belum dirilis.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -692,7 +692,11 @@
|
||||
<value>Il valore CurrentCulture che hai fornito non è valido, ASF continuerà ad utilizzare quello di default!</value>
|
||||
</data>
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASF proverà ad utilizzare la tua cultura preferita {0}, ma la traduzione in questa lingua é completa solo al {1}. Magari potresti aiutarci a migliorare la traduzione di ASF nella tua lingua?</value>
|
||||
<value>ASF proverà ad utilizzare la tua lingua preferita {0}, ma la traduzione è completa solo al {1}. Forse potresti aiutarci a migliorare la traduzione di ASF nella tua lingua?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Idling di {0} ({1}) è temporaneamente disabilitato, poiché il gioco non è stato ancora rilasciato.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -690,5 +690,12 @@
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>指定されたCurrentCultureが有効ではありません。ASFはデフォルトで実行されます!</value>
|
||||
</data>
|
||||
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASFはあなたの言語{0} の使用を試みますが、この言語の翻訳の完成度は{1} です。もしかしたらあなたが翻訳の向上を助けられるかもしれませんよ?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>このゲームはまだリリースされていないため、{0} ({1}) のアイドリングは一時的に無効になります。</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -699,4 +699,8 @@ ASF 실행 파일의 이름이 적절한지 확인하시기 바랍니다!</value
|
||||
<value>ASF는 {0} 지역 언어를 사용하려고 시도했지만, 해당 언어의 번역이 {1}만 완료되어 있습니다. 혹시 당신의 언어로 ASF 번역을 개선하는 것을 도와줄 수 있나요?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>해당 게임이 아직 출시 전이므로, {0} ({1})의 농사가 일시적으로 비활성화 되었습니다.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -694,4 +694,8 @@
|
||||
<value>ASF bandys naudoti jūsų pageidaujamą {0} kalbą, bet vertimas į tą kalba buvo užbaigtas tik {1}. Galbūt jūs galėtumėte mums padėti pagerinti ASF vertimą į šią kalbą?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Kortelių rinkimas iš {0}({1}) laikinai sustabdytas, nes žaidimas dar nėra išleistas.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -278,6 +278,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -122,7 +122,7 @@
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="AutoUpdateCheckInfo" xml:space="preserve">
|
||||
<value>ASF checkt automatisch voor een nieuwe versie elke {0} uur.</value>
|
||||
<value>ASF controleert automatisch voor een nieuwe versie om de {0} uren.</value>
|
||||
<comment>{0} will be replaced by number of hours</comment>
|
||||
</data>
|
||||
<data name="Content" xml:space="preserve">
|
||||
@@ -147,11 +147,11 @@ StackTrace:
|
||||
<value>Afsluiten met een niet-nulzijnde foutcode!</value>
|
||||
</data>
|
||||
<data name="ErrorFailingRequest" xml:space="preserve">
|
||||
<value>Verzoek fout: {0}</value>
|
||||
<value>Vezoek mislukt: {0}</value>
|
||||
<comment>{0} will be replaced by URL of the request</comment>
|
||||
</data>
|
||||
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
|
||||
<value>Globale configuratie kan niet worden geladen, check of het bestand {0} bestaat en of het geldig is! Volg de handleiding op de wiki als je niet weet je wat je moet doen.</value>
|
||||
<value>Globale configuratie kan niet worden geladen, controleer of het bestand {0} bestaat en of het geldig is! Volg de handleiding op de wiki als je niet weet je wat je moet doen.</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorIsInvalid" xml:space="preserve">
|
||||
@@ -162,18 +162,18 @@ StackTrace:
|
||||
<value>Deze functie wordt niet uitgevoerd als gevolg van de ongeldige DeviceID in ASF 2FA!</value>
|
||||
</data>
|
||||
<data name="ErrorNoBotsDefined" xml:space="preserve">
|
||||
<value>Geen bots zijn gedefineerd, ben je vergeten om ASF te configureren?</value>
|
||||
<value>Er zijn geen bots gedefinieerd, ben je vergeten om ASF te configureren?</value>
|
||||
</data>
|
||||
<data name="ErrorObjectIsNull" xml:space="preserve">
|
||||
<value>{0} is nul!</value>
|
||||
<value>{0} is null!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorParsingObject" xml:space="preserve">
|
||||
<value>Parsing {0} mislukt!</value>
|
||||
<value>Verwerking van {0} mislukt!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorRemovingOldBinary" xml:space="preserve">
|
||||
<value>Kon de oude ASF binary niet verwijderen, verwijder deze alsjeblieft {0} handmatig zodat de update-functie werkt!</value>
|
||||
<value>Kon niet de oude ASF binary verwijderen, verwijder alsjeblieft {0} handmatig zodat de updatefunctie werkt!</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
|
||||
@@ -181,19 +181,19 @@ StackTrace:
|
||||
<comment>{0} will be replaced by maximum number of tries</comment>
|
||||
</data>
|
||||
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
|
||||
<value>Controleren op de laatste versie is mislukt!</value>
|
||||
<value>Controle voor de laatste versie is mislukt!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssetForThisBinary" xml:space="preserve">
|
||||
<value>Kan niet verdergaan met update omdat er geen bezit is dat gerelateerd is aan de momenteel actieve binary! Controleer of de ASF Binary de juiste naam heeft!</value>
|
||||
<value>Kon niet verdergaan met update omdat er geen bestand bestaat dat gerelateerd is aan de momenteel actieve binary! Controleer of de ASF Binary de juiste naam heeft!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssets" xml:space="preserve">
|
||||
<value>Kan niet verdergaan met update omdat die versie geen alle bestanden omvat!</value>
|
||||
<value>Kan niet verdergaan met update omdat deze versie niet alle bestanden omvat!</value>
|
||||
</data>
|
||||
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
|
||||
<value>Aanvraag voor gebruikersinvoer gekregen, maar het proces draait momenteel in headless mode!</value>
|
||||
</data>
|
||||
<data name="ErrorWCFAccessDenied" xml:space="preserve">
|
||||
<value>Het verzoek wordt niet in behandeling genomen omdat het SteamOwnerID niet is ingesteld!</value>
|
||||
<value>Het verzoek wordt niet in behandeling genomen omdat SteamOwnerID niet is ingesteld!</value>
|
||||
<comment>SteamOwnerID is name of bot config property, it should not be translated</comment>
|
||||
</data>
|
||||
<data name="Exiting" xml:space="preserve">
|
||||
@@ -203,13 +203,13 @@ StackTrace:
|
||||
<value>Mislukt!</value>
|
||||
</data>
|
||||
<data name="GlobalConfigChanged" xml:space="preserve">
|
||||
<value>Globale configuratie bestand is gewijzigd!</value>
|
||||
<value>Globaal configuratiebestand is aangepast!</value>
|
||||
</data>
|
||||
<data name="ErrorGlobalConfigRemoved" xml:space="preserve">
|
||||
<value>Globale configuratie bestand is verwijderd!</value>
|
||||
<value>Globaal configuratiebestand is verwijderd!</value>
|
||||
</data>
|
||||
<data name="IgnoringTrade" xml:space="preserve">
|
||||
<value>Trade negeren: {0}</value>
|
||||
<value>Ruilaanbieding {0} wordt genegeerd</value>
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="LoggingIn" xml:space="preserve">
|
||||
@@ -217,23 +217,23 @@ StackTrace:
|
||||
<comment>{0} will be replaced by service's name</comment>
|
||||
</data>
|
||||
<data name="NoBotsAreRunning" xml:space="preserve">
|
||||
<value>Er zijn geen bots actief, afsluiten...</value>
|
||||
<value>Geen bots actief, afsluiten...</value>
|
||||
</data>
|
||||
<data name="RefreshingOurSession" xml:space="preserve">
|
||||
<value>Sessie wordt ververst!</value>
|
||||
</data>
|
||||
<data name="RejectingTrade" xml:space="preserve">
|
||||
<value>Trade wordt afgekeurd: {0}</value>
|
||||
<value>Ruilaanbieding {0} wordt afgekeurd</value>
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="Restarting" xml:space="preserve">
|
||||
<value>Herstarten...</value>
|
||||
</data>
|
||||
<data name="WarningRuntimeUnsupported" xml:space="preserve">
|
||||
<value>ASF heeft een niet ondersteunde runtime versie gedetecteerd, het programma kan NIET correct worden uitgevoerd in de huidige omgeving. Je voert dit met je eigen risico uit zonder ondersteuning!</value>
|
||||
<value>ASF heeft een niet ondersteunde runtime versie gedetecteerd, het programma kan mogelijk NIET correct worden uitgevoerd in de huidige omgeving. Je voert dit met eigen risico en zonder ondersteuning uit!</value>
|
||||
</data>
|
||||
<data name="RuntimeVersionComparison" xml:space="preserve">
|
||||
<value>Benodigde versie: {0} | Gevonden versie: {1}</value>
|
||||
<value>Vereiste versie: {0} | Gevonden versie: {1}</value>
|
||||
<comment>{0} will be replaced by required version, {1} will be replaced by current version</comment>
|
||||
</data>
|
||||
<data name="RuntimeVersionOK" xml:space="preserve">
|
||||
@@ -289,40 +289,40 @@ StackTrace:
|
||||
<value>Controleren op nieuwe versie...</value>
|
||||
</data>
|
||||
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
|
||||
<value>Nieuwe versie wordt gedownload.... Terwijl je aan het wachten bent, wij waarderen het heel veel als je doneert</value>
|
||||
<value>Nieuwe versie wordt gedownloadt... Onder het wachten, overweeg te doneren als je het gedane werk waardeert! :)</value>
|
||||
</data>
|
||||
<data name="UpdateFinished" xml:space="preserve">
|
||||
<value>Update proces compleet!</value>
|
||||
<value>Bijwerken afgerond!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersionAvailable" xml:space="preserve">
|
||||
<value>Nieuwe ASF versie beschikbaar! Overweeg om zelf te updaten!</value>
|
||||
<value>Nieuwe ASF-versie beschikbaar! Overweeg zelf bij te werken!</value>
|
||||
</data>
|
||||
<data name="UpdateVersionInfo" xml:space="preserve">
|
||||
<value>Lokale versie: {0} | Externe versie: {1}</value>
|
||||
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
|
||||
</data>
|
||||
<data name="UserInputDeviceID" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft je Device ID in (inclusief "android:"): </value>
|
||||
<value><{0}> Vul je Device ID in (inclusief "android:"): </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteam2FA" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft je 2FA code in van je Steam authenticatie app: </value>
|
||||
<value><{0}> Vul je 2FA code in van je Steam authenticatie app: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamGuard" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft de SteamGuard authenticatiecode in die naar je e-mail gestuurd is: </value>
|
||||
<value><{0}> Vul de SteamGuard authenticatiecode in die naar je e-mail gestuurd is: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamLogin" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft je Steam gebruikersnaam in: </value>
|
||||
<value><{0}> Vul je Steam gebruikersnaam in: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamParentalPIN" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft je Steam ouderlijktoezichtscode in: </value>
|
||||
<value><{0}> Vul je Steam ouderlijktoezichtscode in: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamPassword" xml:space="preserve">
|
||||
<value><{0}> Vul alsjeblieft je Steam wachtwoord in: </value>
|
||||
<value><{0}> Vul je Steam wachtwoord in: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputUnknown" xml:space="preserve">
|
||||
@@ -333,7 +333,10 @@ StackTrace:
|
||||
<value><{0}> Voer je WCF-host in: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
|
||||
<value>Onbekende waarde ontvangen voor {0}, graag dit melden: {1}</value>
|
||||
<comment>{0} will be replaced by object's name, {1} will be replaced by value for that object</comment>
|
||||
</data>
|
||||
<data name="WarningTooManyGamesToPlay" xml:space="preserve">
|
||||
<value>Het spelen van meer dan {0} games gelijktijdig is niet mogelijk, alleen de eerste {0} games van {1} worden gebruikt!</value>
|
||||
<comment>{0} will be replaced by max number of games, {1} will be replaced by name of the configuration property</comment>
|
||||
@@ -365,7 +368,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by WCF hostname</comment>
|
||||
</data>
|
||||
<data name="BotAlreadyStopped" xml:space="preserve">
|
||||
<value>Die bot-instantie is al gestopt!</value>
|
||||
<value>Deze bot-instantie is al gestopt!</value>
|
||||
</data>
|
||||
<data name="BotNotFound" xml:space="preserve">
|
||||
<value>Kan geen bot vinden genaamd {0}!</value>
|
||||
@@ -376,7 +379,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to idle, {3} will be replaced by total number of cards left to idle</comment>
|
||||
</data>
|
||||
<data name="BotStatusIdling" xml:space="preserve">
|
||||
<value>Bot {0} is spel {1} aan het idlen ({2}, {3} kaarten te gaan) van een totaal van {4} spellen ({5} kaarten) nog te idlen (~{6} resterende).</value>
|
||||
<value>Bot {0} is spel {1} aan het idlen ({2}, {3} kaarten te gaan) van een totaal van {4} spellen ({5} kaarten) nog te verzamelen (~{6} resterende).</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by game's appID (number), {2} will be replaced by game's name, {3} will be replaced by number of cards left to idle, {4} will be replaced by total number of games to idle, {5} will be replaced by total number of cards to idle, {6} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="BotStatusIdlingList" xml:space="preserve">
|
||||
@@ -397,7 +400,7 @@ StackTrace:
|
||||
<value>Klaar!</value>
|
||||
</data>
|
||||
<data name="GamesToIdle" xml:space="preserve">
|
||||
<value>We hebben een totaal van {0} spellen ({1} kaarten) nog te idlen (~{2} resterende)...</value>
|
||||
<value>We hebben een totaal van {0} spellen ({1} kaarten) nog te verzamelen (~{2} resterende)...</value>
|
||||
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="IdlingFinished" xml:space="preserve">
|
||||
@@ -418,7 +421,9 @@ StackTrace:
|
||||
<data name="IdlingStopped" xml:space="preserve">
|
||||
<value>Het idlen is gestopt!</value>
|
||||
</data>
|
||||
|
||||
<data name="IgnoredStickyPauseEnabled" xml:space="preserve">
|
||||
<value>Dit verzoek wordt genegeerd. Permanente pauze staat aan!</value>
|
||||
</data>
|
||||
<data name="NothingToIdle" xml:space="preserve">
|
||||
<value>We hebben niks om te idlen op dit account!</value>
|
||||
</data>
|
||||
@@ -453,10 +458,10 @@ StackTrace:
|
||||
<value>Onbekende opdracht!</value>
|
||||
</data>
|
||||
<data name="WarningCouldNotCheckBadges" xml:space="preserve">
|
||||
<value>Kon de badges informatie niet verkrijgen, we zullen het later nog een keer proberen!</value>
|
||||
<value>Kan de badges informatie niet verkrijgen, we zullen het later nog een keer proberen!</value>
|
||||
</data>
|
||||
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
|
||||
<value>Kaart status kon niet worden gecontroleerd voor {0} ({1}), wij zullen het later nogmaals proberen!</value>
|
||||
<value>Kaart status kan niet worden gecontroleerd voor {0} ({1}), wij zullen het later nogmaals proberen!</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="BotAcceptingGift" xml:space="preserve">
|
||||
@@ -466,8 +471,14 @@ StackTrace:
|
||||
<data name="BotAccountLimited" xml:space="preserve">
|
||||
<value>Dit account is beperkt, het idling proces is permanent onbeschikbaar totdat de beperking is verwijderd!</value>
|
||||
</data>
|
||||
|
||||
|
||||
<data name="BotAddLicenseResponse" xml:space="preserve">
|
||||
<value><{0}> SpelID: {1} | Status: {2}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by gameID (number), {2} will be replaced by status string</comment>
|
||||
</data>
|
||||
<data name="BotAddLicenseResponseWithItems" xml:space="preserve">
|
||||
<value><{0}> SpelID: {1} | Status: {2} | Items: {3}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by gameID (number), {2} will be replaced by status string, {3} will be replaced by list of granted appIDs (numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="BotAlreadyRunning" xml:space="preserve">
|
||||
<value>Die bot-instantie is al bezig!</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
@@ -515,10 +526,10 @@ StackTrace:
|
||||
<comment>{0} will be replaced by password encryption method (string), {1} will be replaced by encrypted password using that method (string)</comment>
|
||||
</data>
|
||||
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
|
||||
<value>Deze bot wordt niet gestart omdat hij uitschakeld is in het configuratie bestand!</value>
|
||||
<value>Deze bot wordt niet gestart omdat hij uitgeschakeld is in het configuratie bestand!</value>
|
||||
</data>
|
||||
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
|
||||
<value>TwoFactoryCodeMisMatch error code {0} ontvangen, dit betekent bijna altijd de verkeerde ASF 2FA login informatie, afbreken!</value>
|
||||
<value>TwoFactorCodeMisMatch foutmelding {0} ontvangen, dit betekent bijna altijd de verkeerde ASF 2FA login informatie, afbreken!</value>
|
||||
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
|
||||
</data>
|
||||
<data name="BotLoggedOff" xml:space="preserve">
|
||||
@@ -537,7 +548,10 @@ StackTrace:
|
||||
<data name="BotLootingFailed" xml:space="preserve">
|
||||
<value>Handelsvoorstel mislukt!</value>
|
||||
</data>
|
||||
|
||||
<data name="BotLootingMasterNotDefined" xml:space="preserve">
|
||||
<value>Trade kon niet verzonden worden, omdat SteamMasterID niet is ingesteld!</value>
|
||||
<comment>SteamMasterID is name of bot config property, it should not be translated</comment>
|
||||
</data>
|
||||
<data name="BotLootingNoLootableTypes" xml:space="preserve">
|
||||
<value>Je hebt geen lootable types ingesteld!</value>
|
||||
</data>
|
||||
@@ -678,5 +692,12 @@ StackTrace:
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>De door jou geleverde CurrentCulture is incorrect, ASF zal de standaard blijven gebruiken!</value>
|
||||
</data>
|
||||
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASF probeert de {0} taal te gebruiken, maar het vertalen in deze taal was tot {1} compleet. Misschien kan je ons helpen om ASF te vertalen in jouw taal?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Idling {0} ({1}) is tijdelijk uitgeschakeld, aangezien dat spel nog niet was uitgegeven.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -363,4 +363,5 @@
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF spróbuje użyć twojej preferowanej kultury {0}, ale tłumaczenie w tym języku zostało ukończone tylko w {1}. Być może mógłbyś pomóc nam w poprawieniu tłumaczenia ASF na Twój język?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Farmienie {0} ({1}) jest tymczasowo niemożliwe, jako że ta gra nie została jeszcze wydana.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -126,15 +126,16 @@
|
||||
<comment>{0} will be replaced by number of hours</comment>
|
||||
</data>
|
||||
<data name="Content" xml:space="preserve">
|
||||
<value>Conteúdo: {0}</value>
|
||||
<value>Conteúdo:
|
||||
{0}</value>
|
||||
<comment>{0} will be replaced by content string. Please note that this string should include newline for formatting.</comment>
|
||||
</data>
|
||||
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
|
||||
<value>Configuração {0} inválida com a propriedade: {1}</value>
|
||||
<value>A propriedade {0} possui valor inválido: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
|
||||
<value>ASF V{0} foi executado com uma exceção fatal antes mesmo que o módulo de registro fosse inicializado!</value>
|
||||
<value>ASF V{0} encontrou uma exceção fatal antes mesmo que o módulo de registro fosse inicializado!</value>
|
||||
<comment>{0} will be replaced by version number</comment>
|
||||
</data>
|
||||
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
|
||||
@@ -151,7 +152,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by URL of the request</comment>
|
||||
</data>
|
||||
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
|
||||
<value>A configuração global não pode ser carregada, por favor, certifique-se que {0} existe e é válido! Caso estiver com dúvidas, siga o guia de configuração na Wiki.</value>
|
||||
<value>A configuração global não pôde ser carregada, confirme que {0} existe e é válido! Caso esteja com dúvidas, siga o guia de configuração na Wiki.</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorIsInvalid" xml:space="preserve">
|
||||
@@ -162,18 +163,18 @@ StackTrace:
|
||||
<value>Recusando a execução desta função devido ao DeviceID inválido no ASF 2FA!</value>
|
||||
</data>
|
||||
<data name="ErrorNoBotsDefined" xml:space="preserve">
|
||||
<value>Nenhum bot foi definido, esqueceu de configurar seu ASF?</value>
|
||||
<value>Nenhum bot foi definido, esqueceu de configurar o seu ASF?</value>
|
||||
</data>
|
||||
<data name="ErrorObjectIsNull" xml:space="preserve">
|
||||
<value>{0} é nulo!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorParsingObject" xml:space="preserve">
|
||||
<value>Falha em analisar o {0}!</value>
|
||||
<value>Falha ao analisar {0}!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorRemovingOldBinary" xml:space="preserve">
|
||||
<value>Não foi possível remover o ASF binário antigo, por favor, remova o {0} manualmente para que a função de atualização funcione!</value>
|
||||
<value>Não foi possível remover o binário do ASF antigo, remova {0} manualmente para que a função de atualização funcione!</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
|
||||
@@ -184,7 +185,7 @@ StackTrace:
|
||||
<value>Não foi possível verificar a última versão!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssetForThisBinary" xml:space="preserve">
|
||||
<value>Não foi possível prosseguir com a atualização pois não existe nenhum recurso associado com o atual binário executado! Por favor certifique-se que seu ASF binário está nomeado corretamente!</value>
|
||||
<value>Não foi possível prosseguir com a atualização pois não existe nenhum arquivo associado com o binário executado! Por favor, confirme que o binário do ASF está nomeado corretamente!</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateNoAssets" xml:space="preserve">
|
||||
<value>Não foi possível prosseguir com a atualização pois esta versão não inclui nenhum recurso!</value>
|
||||
@@ -213,7 +214,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by trade number</comment>
|
||||
</data>
|
||||
<data name="LoggingIn" xml:space="preserve">
|
||||
<value>Iniciando seção em {0}...</value>
|
||||
<value>Iniciando sessão em {0}...</value>
|
||||
<comment>{0} will be replaced by service's name</comment>
|
||||
</data>
|
||||
<data name="NoBotsAreRunning" xml:space="preserve">
|
||||
@@ -230,18 +231,18 @@ StackTrace:
|
||||
<value>Reiniciando...</value>
|
||||
</data>
|
||||
<data name="WarningRuntimeUnsupported" xml:space="preserve">
|
||||
<value>ASF detectou uma versão do runtime sem suporte, o programa pode NÃO funcionar corretamente no ambiente atual. Você está executando sem suporte por sua conta e risco!</value>
|
||||
<value>ASF detectou uma versão do runtime que não é suportada, o programa pode NÃO funcionar corretamente no ambiente atual. Você está executando sem suporte por sua conta e risco!</value>
|
||||
</data>
|
||||
<data name="RuntimeVersionComparison" xml:space="preserve">
|
||||
<value>Versão necessária: {0} | Versão encontrada: {1}</value>
|
||||
<comment>{0} will be replaced by required version, {1} will be replaced by current version</comment>
|
||||
</data>
|
||||
<data name="RuntimeVersionOK" xml:space="preserve">
|
||||
<value>Sua versão do {0} runtime está OK.</value>
|
||||
<value>A versão do runtime {0} está OK.</value>
|
||||
<comment>{0} will be replaced by runtime name (e.g. "Mono")</comment>
|
||||
</data>
|
||||
<data name="WarningRuntimeVersionTooOld" xml:space="preserve">
|
||||
<value>Sua versão do {0} runtime é muito antiga!</value>
|
||||
<value>A versão do runtime {0} é muito antiga!</value>
|
||||
<comment>{0} will be replaced by runtime name (e.g. "Mono")</comment>
|
||||
</data>
|
||||
<data name="Starting" xml:space="preserve">
|
||||
@@ -252,7 +253,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by status code number/name</comment>
|
||||
</data>
|
||||
<data name="Success" xml:space="preserve">
|
||||
<value>Êxito!</value>
|
||||
<value>Sucesso!</value>
|
||||
</data>
|
||||
<data name="TimeSpanDay" xml:space="preserve">
|
||||
<value>1 dia</value>
|
||||
@@ -286,43 +287,43 @@ StackTrace:
|
||||
<value>Desbloqueando modo família...</value>
|
||||
</data>
|
||||
<data name="UpdateCheckingNewVersion" xml:space="preserve">
|
||||
<value>Verificando por nova versão...</value>
|
||||
<value>Verificando se há atualizações...</value>
|
||||
</data>
|
||||
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
|
||||
<value>Baixando a nova versão... Enquanto aguarda, considere fazer uma doação se você aprecia o trabalho que está sendo feito! :)</value>
|
||||
<value>Baixando nova versão... Enquanto aguarda, considere fazer uma doação caso aprecie o trabalho que está sendo feito! :)</value>
|
||||
</data>
|
||||
<data name="UpdateFinished" xml:space="preserve">
|
||||
<value>Processo de atualização finalizado!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersionAvailable" xml:space="preserve">
|
||||
<value>Uma nova versão do ASF está disponível! Considere atualizar!</value>
|
||||
<value>Nova versão do ASF disponível! Considere atualizar!</value>
|
||||
</data>
|
||||
<data name="UpdateVersionInfo" xml:space="preserve">
|
||||
<value>Versão local: {0} | Versão remota: {1}</value>
|
||||
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
|
||||
</data>
|
||||
<data name="UserInputDeviceID" xml:space="preserve">
|
||||
<value><{0}> Insira seu ID do dispositivo (incluindo "android:"): </value>
|
||||
<value><{0}> Insira o ID do dispositivo do autenticador móvel (incluindo "android:"): </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteam2FA" xml:space="preserve">
|
||||
<value><{0}> Insira seu código 2FA de seu autentificador do aplicativo móvel do Steam: </value>
|
||||
<value><{0}> Insira o código atual gerado pelo autenticador móvel do Steam: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamGuard" xml:space="preserve">
|
||||
<value><{0}> Insira seu código de autorização do SteamGuard que foi enviado para seu e-mail: </value>
|
||||
<value><{0}> Insira o código do Steam Guard enviado ao seu e-mail: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamLogin" xml:space="preserve">
|
||||
<value><{0}> Insira seu usuário do Steam: </value>
|
||||
<value><{0}> Insira o seu usuário do Steam: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamParentalPIN" xml:space="preserve">
|
||||
<value><{0}> Insira seu PIN do Steam modo família: </value>
|
||||
<value><{0}> Insira o seu código do modo família: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputSteamPassword" xml:space="preserve">
|
||||
<value><{0}> Insira sua senha do Steam: </value>
|
||||
<value><{0}> Insira a sua senha do Steam: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputUnknown" xml:space="preserve">
|
||||
@@ -330,7 +331,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by property name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="UserInputWCFHost" xml:space="preserve">
|
||||
<value><{0}> Insira seu serviço WCF: </value>
|
||||
<value><{0}> Insira o seu host WCF: </value>
|
||||
<comment>{0} will be replaced by bot's name. Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
|
||||
@@ -342,7 +343,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by max number of games, {1} will be replaced by name of the configuration property</comment>
|
||||
</data>
|
||||
<data name="WarningWCFIgnoringCommand" xml:space="preserve">
|
||||
<value>Ignorando o comando WCF pois o --client não foi especificado: {0}</value>
|
||||
<value>Ignorando o comando do WCF pois --client não foi especificado: {0}</value>
|
||||
<comment>{0} will be replaced by WCF command</comment>
|
||||
</data>
|
||||
<data name="ErrorWCFAddressAccessDeniedException" xml:space="preserve">
|
||||
@@ -353,44 +354,44 @@ StackTrace:
|
||||
<comment>{0} will be replaced by WCF command, {1} will be replaced by WCF answer</comment>
|
||||
</data>
|
||||
<data name="WCFReady" xml:space="preserve">
|
||||
<value>O servidor WCF está pronto!</value>
|
||||
<value>Servidor WCF pronto!</value>
|
||||
</data>
|
||||
<data name="WCFResponseReceived" xml:space="preserve">
|
||||
<value>Resposta do WCF recebida: {0}</value>
|
||||
<comment>{0} will be replaced by WCF response</comment>
|
||||
</data>
|
||||
<data name="WCFSendingCommand" xml:space="preserve">
|
||||
<value>Enviando o comando: {0} para o servidor WCF no {1}...</value>
|
||||
<value>Enviando comando: {0} para o servidor WCF em {1}...</value>
|
||||
<comment>{0} will be replaced by WCF command, {1} will be replaced by WCF hostname</comment>
|
||||
</data>
|
||||
<data name="WCFStarting" xml:space="preserve">
|
||||
<value>Iniciando o servidor WCF em {0}...</value>
|
||||
<value>Iniciando servidor WCF em {0}...</value>
|
||||
<comment>{0} will be replaced by WCF hostname</comment>
|
||||
</data>
|
||||
<data name="BotAlreadyStopped" xml:space="preserve">
|
||||
<value>Este bot já está desligado!</value>
|
||||
</data>
|
||||
<data name="BotNotFound" xml:space="preserve">
|
||||
<value>Não foi possível achar nenhum bot chamado {0}!</value>
|
||||
<value>Não foi possível encontrar nenhum bot chamado {0}!</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotsStatusOverview" xml:space="preserve">
|
||||
<value>Existe {0}/{1} bots em execução, no total de {2} jogos ({3} cartas) restantes para receber.</value>
|
||||
<value>Há {0}/{1} bots em execução, com um total de {2} jogo(s) ({3} cartas) restante(s) para coletar.</value>
|
||||
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to idle, {3} will be replaced by total number of cards left to idle</comment>
|
||||
</data>
|
||||
<data name="BotStatusIdling" xml:space="preserve">
|
||||
<value>Bot {0} está executando o jogo: {1} ({2}, {3} carta restante) no total de {4} jogos ({5} cartas) restante para receber (~{6} restando).</value>
|
||||
<value>Bot {0} está executando o jogo: {1} ({2}, {3} carta(s) restante(s)) de um total de {4} jogo(s) ({5} cartas) restante(s) para a coleta (~{6} restante(s)).</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by game's appID (number), {2} will be replaced by game's name, {3} will be replaced by number of cards left to idle, {4} will be replaced by total number of games to idle, {5} will be replaced by total number of cards to idle, {6} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="BotStatusIdlingList" xml:space="preserve">
|
||||
<value>Bot {0} está executando os jogos: {1} no total de {2} jogos ({3} cartas) restante para executar (~{4} restando).</value>
|
||||
<value>Bot {0} está executando os jogos: {1} de um total de {2} jogo(s) ({3} cartas) restante(s) para coletar (~{4} restante(s)).</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by list of the games (appIDs, numbers), {2} will be replaced by total number of games to idle, {3} will be replaced by total number of cards to idle, {4} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="CheckingFirstBadgePage" xml:space="preserve">
|
||||
<value>Verificando primeira página de insígnias...</value>
|
||||
</data>
|
||||
<data name="CheckingOtherBadgePages" xml:space="preserve">
|
||||
<value>Verificando outras páginas de insignias...</value>
|
||||
<value>Verificando outras páginas de insígnias...</value>
|
||||
</data>
|
||||
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
|
||||
<value>Algoritmo escolhido para a coleta de cartas: {0}</value>
|
||||
@@ -400,35 +401,35 @@ StackTrace:
|
||||
<value>Pronto!</value>
|
||||
</data>
|
||||
<data name="GamesToIdle" xml:space="preserve">
|
||||
<value>ASF contém um total de {0} jogos ({1} cartas) restantes para coletar (faltam ~{2})...</value>
|
||||
<value>Temos um total de {0} jogo(s) ({1} cartas) para a coleta (~{2} restante(s))...</value>
|
||||
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="IdlingFinished" xml:space="preserve">
|
||||
<value>Processo de receber cartas finalizado!</value>
|
||||
<value>Coleta de cartas finalizada!</value>
|
||||
</data>
|
||||
<data name="IdlingFinishedForGame" xml:space="preserve">
|
||||
<value>Finalizado o processo de receber cartas: {0} ({1}) após {2} jogados!</value>
|
||||
<value>Coleta de cartas finalizada: {0} ({1}) após {2} de jogo!</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="IdlingFinishedForGames" xml:space="preserve">
|
||||
<value>Finalizado o processo de receber cartas dos jogos: {0}</value>
|
||||
<value>Finalizada a coleta de cartas dos jogos: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="IdlingStatusForGame" xml:space="preserve">
|
||||
<value>Status do processo de receber cartas para {0} ({1}): {2} cartas restantes</value>
|
||||
<value>Estado do processo de receber cartas para {0} ({1}): {2} carta(s) restante(s)</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to idle</comment>
|
||||
</data>
|
||||
<data name="IdlingStopped" xml:space="preserve">
|
||||
<value>Processo de receber cartas parado!</value>
|
||||
<value>Coleta de cartas interrompida!</value>
|
||||
</data>
|
||||
<data name="IgnoredStickyPauseEnabled" xml:space="preserve">
|
||||
<value>Ignorando esse pedido, já que o pause manual está habilitado!</value>
|
||||
<value>Ignorando esse pedido, já que a pausa forçada está habilitada!</value>
|
||||
</data>
|
||||
<data name="NothingToIdle" xml:space="preserve">
|
||||
<value>Não temos cartas disponíveis nesta conta!</value>
|
||||
</data>
|
||||
<data name="NowIdling" xml:space="preserve">
|
||||
<value>Agora recebendo cartas: {0} ({1})</value>
|
||||
<value>Coletando cartas: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="NowIdlingList" xml:space="preserve">
|
||||
@@ -436,7 +437,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="PlayingNotAvailable" xml:space="preserve">
|
||||
<value>O arquivamento não está disponível no momento. Tente mais tarde!</value>
|
||||
<value>Não é possível jogar no momento, tentaremos novamente mais tarde!</value>
|
||||
</data>
|
||||
<data name="StillIdling" xml:space="preserve">
|
||||
<value>Ainda executando: {0} ({1})</value>
|
||||
@@ -447,40 +448,40 @@ StackTrace:
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="StoppedIdling" xml:space="preserve">
|
||||
<value>Execução pausada: {0} ({1})</value>
|
||||
<value>Coleta interrompida: {0} ({1})</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="StoppedIdlingList" xml:space="preserve">
|
||||
<value>Processo pausado: {0}</value>
|
||||
<value>Coleta interrompida: {0}</value>
|
||||
<comment>{0} will be replaced by list of the games (appIDs, numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="UnknownCommand" xml:space="preserve">
|
||||
<value>Comando desconhecido!</value>
|
||||
</data>
|
||||
<data name="WarningCouldNotCheckBadges" xml:space="preserve">
|
||||
<value>Não foi possível obter informações de insignias, vamos tentar novamente mais tarde!</value>
|
||||
<value>Não foi possível obter informações das insígnias, tentaremos novamente mais tarde!</value>
|
||||
</data>
|
||||
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
|
||||
<value>Não foi possível verificar o status das cartas de: {0} ({1}), tentaremos novamente mais tarde!</value>
|
||||
<value>Não foi possível verificar o estado das cartas de: {0} ({1}), tentaremos novamente mais tarde!</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="BotAcceptingGift" xml:space="preserve">
|
||||
<value>Aceitando o presente: {0}...</value>
|
||||
<value>Aceitando presente: {0}...</value>
|
||||
<comment>{0} will be replaced by giftID (number)</comment>
|
||||
</data>
|
||||
<data name="BotAccountLimited" xml:space="preserve">
|
||||
<value>Essa conta está limitada, o processo de receber cartas está permanentemente indisponível até que a restrição seja removida!</value>
|
||||
<value>Essa conta é limitada, o processo de receber cartas está permanentemente indisponível até que a restrição seja removida!</value>
|
||||
</data>
|
||||
<data name="BotAddLicenseResponse" xml:space="preserve">
|
||||
<value><{0}> GameID: {1} | Status: {2}</value>
|
||||
<value><{0}> GameID: {1} | Estado: {2}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by gameID (number), {2} will be replaced by status string</comment>
|
||||
</data>
|
||||
<data name="BotAddLicenseResponseWithItems" xml:space="preserve">
|
||||
<value><{0}> GameID: {1} | Status: {2} | Itens: {3}</value>
|
||||
<value><{0}> GameID: {1} | Estado: {2} | Itens: {3}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by gameID (number), {2} will be replaced by status string, {3} will be replaced by list of granted appIDs (numbers), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="BotAlreadyRunning" xml:space="preserve">
|
||||
<value>Este bot já está em execução!</value>
|
||||
<value>Uma instância do bot já está sendo executada!</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotAuthenticatorConverting" xml:space="preserve">
|
||||
@@ -493,24 +494,24 @@ StackTrace:
|
||||
<value>Seu DeviceID está incorreto ou não existe!</value>
|
||||
</data>
|
||||
<data name="BotAuthenticatorToken" xml:space="preserve">
|
||||
<value>Código 2FA: {0}</value>
|
||||
<value>Código de autenticação: {0}</value>
|
||||
<comment>{0} will be replaced by generated 2FA token (string)</comment>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
|
||||
<value>Processo automático de receber cartas está agora pausado!</value>
|
||||
<value>A coleta automática de cartas foi pausada!</value>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
|
||||
<value>Processo automático de receber cartas está agora retomado!</value>
|
||||
<value>A coleta automática de cartas foi retomada!</value>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
|
||||
<value>Processo automático de receber cartas já está pausado!</value>
|
||||
<value>A coleta automática de cartas já está pausada!</value>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingPausedWithCountdown" xml:space="preserve">
|
||||
<value>Processo automático de receber cartas está agora pausado! Você tem {0} minutos para iniciar um jogo.</value>
|
||||
<value>A coleta automática de cartas foi pausada! Você tem {0} minutos para iniciar um jogo.</value>
|
||||
<comment>{0} will be replaced by number of minutes</comment>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
|
||||
<value>Processo automático de receber cartas já está retomado!</value>
|
||||
<value>A coleta automática de cartas já foi retomada!</value>
|
||||
</data>
|
||||
<data name="BotConnected" xml:space="preserve">
|
||||
<value>Conectado ao Steam!</value>
|
||||
@@ -526,27 +527,27 @@ StackTrace:
|
||||
<comment>{0} will be replaced by password encryption method (string), {1} will be replaced by encrypted password using that method (string)</comment>
|
||||
</data>
|
||||
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
|
||||
<value>Não foi iniciado esta instância do bot pois está desativado no arquivo de configurações!</value>
|
||||
<value>Este bot não será iniciado, pois está desativado no arquivo de configurações!</value>
|
||||
</data>
|
||||
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
|
||||
<value>Foi recebido o código de erro TwoFactorCodeMismatch {0} vezes seguidas, isto é praticamente um indicativo de que as credenciais do ASF 2FA são inválidas, abortando!</value>
|
||||
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
|
||||
</data>
|
||||
<data name="BotLoggedOff" xml:space="preserve">
|
||||
<value>Deslogado do Steam: {0}</value>
|
||||
<value>Sessão finalizada: {0}</value>
|
||||
<comment>{0} will be replaced by logging off reason (string)</comment>
|
||||
</data>
|
||||
<data name="BotLoggedOn" xml:space="preserve">
|
||||
<value>Logado com sucesso!</value>
|
||||
<value>Sessão iniciada com sucesso!</value>
|
||||
</data>
|
||||
<data name="BotLoggingIn" xml:space="preserve">
|
||||
<value>Logando...</value>
|
||||
<value>Iniciando sessão...</value>
|
||||
</data>
|
||||
<data name="BotLogonSessionReplaced" xml:space="preserve">
|
||||
<value>Esta conta parece que está sendo usada em outra instância do ASF, o que é um comportamento indefinido, recusando em continuar executando!</value>
|
||||
<value>Esta conta parece estar sendo usada em outra instância do ASF, o que é um comportamento indefinido, impedindo-a de ser executada!</value>
|
||||
</data>
|
||||
<data name="BotLootingFailed" xml:space="preserve">
|
||||
<value>Oferta de troca falhou!</value>
|
||||
<value>Proposta de troca falhou!</value>
|
||||
</data>
|
||||
<data name="BotLootingMasterNotDefined" xml:space="preserve">
|
||||
<value>A troca não pôde ser enviada pois o SteamMasterID não foi definido!</value>
|
||||
@@ -556,19 +557,19 @@ StackTrace:
|
||||
<value>Você não configurou nenhum tipo de itens para coletar!</value>
|
||||
</data>
|
||||
<data name="BotLootingNowDisabled" xml:space="preserve">
|
||||
<value>Coleta agora está desabilitada!</value>
|
||||
<value>A coleta está desabilitada!</value>
|
||||
</data>
|
||||
<data name="BotLootingNowEnabled" xml:space="preserve">
|
||||
<value>A coleta agora está ativada!</value>
|
||||
</data>
|
||||
<data name="BotLootingSuccess" xml:space="preserve">
|
||||
<value>Oferta de troca enviada com sucesso!</value>
|
||||
<value>Proposta enviada com sucesso!</value>
|
||||
</data>
|
||||
<data name="BotLootingTemporarilyDisabled" xml:space="preserve">
|
||||
<value>Coleta temporariamente desabilitada!</value>
|
||||
</data>
|
||||
<data name="BotLootingYourself" xml:space="preserve">
|
||||
<value>Você não pode coletar seus próprios itens!</value>
|
||||
<value>Você não pode coletar os seus próprios itens!</value>
|
||||
</data>
|
||||
<data name="BotNoASFAuthenticator" xml:space="preserve">
|
||||
<value>Esse bot não tem ASF 2FA habilitado! Você esqueceu de configurar as confirmações para 2FA ASF?</value>
|
||||
@@ -582,7 +583,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by query (string)</comment>
|
||||
</data>
|
||||
<data name="BotOwnedAlready" xml:space="preserve">
|
||||
<value><{0} > Já possuído: {1} | {2}</value>
|
||||
<value><{0} > Já possui: {1} | {2}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by game's appID (number), {2} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="BotRateLimitExceeded" xml:space="preserve">
|
||||
@@ -593,22 +594,22 @@ StackTrace:
|
||||
<value>Reconectando...</value>
|
||||
</data>
|
||||
<data name="BotRedeemResponse" xml:space="preserve">
|
||||
<value><{0}> Chave: {1} | Status: {2}</value>
|
||||
<value><{0}> Chave: {1} | Estado: {2}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by cd-key (string), {2} will be replaced by status string</comment>
|
||||
</data>
|
||||
<data name="BotRedeemResponseWithItems" xml:space="preserve">
|
||||
<value><{0}> Chave: {1} | Status: {2} | Itens: {3}</value>
|
||||
<value><{0}> Chave: {1} | Estado: {2} | Itens: {3}</value>
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by cd-key (string), {2} will be replaced by status string, {3} will be replaced by list of key-value pairs, separated by a comma</comment>
|
||||
</data>
|
||||
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
|
||||
<value>Chave de login expirada removida!</value>
|
||||
<value>Chave de sessão expirada removida!</value>
|
||||
</data>
|
||||
<data name="BotsStatusNotIdling" xml:space="preserve">
|
||||
<value>Bot {0} não está executando nada.</value>
|
||||
<value>Bot {0} não está coletando nada.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusLimited" xml:space="preserve">
|
||||
<value>Bot {0} é limitado e não é possível receber nenhuma carta através do recurso.</value>
|
||||
<value>Bot {0} é limitado e não pode receber nenhuma carta através da coleta.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusNotConnected" xml:space="preserve">
|
||||
@@ -628,11 +629,11 @@ StackTrace:
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotUnableToConnect" xml:space="preserve">
|
||||
<value>Incapaz de conectar com o Steam: {0}</value>
|
||||
<value>Não foi possível conectar-se ao Steam: {0}</value>
|
||||
<comment>{0} will be replaced by failure reason (string)</comment>
|
||||
</data>
|
||||
<data name="BotUnableToLogin" xml:space="preserve">
|
||||
<value>Incapaz de logar no Steam: {0}/{1}</value>
|
||||
<value>Não foi possível iniciar a sessão no Steam: {0}/{1}</value>
|
||||
<comment>{0} will be replaced by failure reason (string), {1} will be replaced by extended failure reason (string)</comment>
|
||||
</data>
|
||||
<data name="ErrorIsEmpty" xml:space="preserve">
|
||||
@@ -640,7 +641,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="UnusedKeys" xml:space="preserve">
|
||||
<value>Chaves não usadas: {0}</value>
|
||||
<value>Códigos não ativados: {0}</value>
|
||||
<comment>{0} will be replaced by list of cd-keys (strings), separated by a comma</comment>
|
||||
</data>
|
||||
<data name="WarningFailedWithError" xml:space="preserve">
|
||||
@@ -648,7 +649,7 @@ StackTrace:
|
||||
<comment>{0} will be replaced by failure reason (string)</comment>
|
||||
</data>
|
||||
<data name="BotConnectionLost" xml:space="preserve">
|
||||
<value>Conexão perdida com a Steam Network, reconectando...</value>
|
||||
<value>Conexão com a rede Steam perdida, reconectando...</value>
|
||||
</data>
|
||||
<data name="BotAccountFree" xml:space="preserve">
|
||||
<value>A conta não está mais ocupada, o processo de receber cartas foi retomado!</value>
|
||||
@@ -657,22 +658,22 @@ StackTrace:
|
||||
<value>A conta está atualmente em uso, o ASF retomará o processo quando estiver livre...</value>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingPauseTimeout" xml:space="preserve">
|
||||
<value>A Biblioteca compartilhada não foi iniciada no período de tempo especificado, o processo de receber cartas foi retomado!</value>
|
||||
<value>A biblioteca compartilhada não foi iniciada no período de tempo especificado, a coleta foi retomada!</value>
|
||||
</data>
|
||||
<data name="BotConnecting" xml:space="preserve">
|
||||
<value>Conectando...</value>
|
||||
</data>
|
||||
<data name="BotHeartBeatFailed" xml:space="preserve">
|
||||
<value>Falha ao desconectar o cliente, abandonando esse bot!</value>
|
||||
<value>Falha ao desconectar cliente, abandonando instância!</value>
|
||||
</data>
|
||||
<data name="BotSteamDirectoryInitializationFailed" xml:space="preserve">
|
||||
<value>Não foi possível inicializar o SteamDirectory, a conexão com o Steam Network pode demorar mais do que o normal!</value>
|
||||
<value>Não foi possível inicializar o SteamDirectory, a conexão com a rede Steam pode demorar mais do que o normal!</value>
|
||||
</data>
|
||||
<data name="BotStopping" xml:space="preserve">
|
||||
<value>Parando...</value>
|
||||
</data>
|
||||
<data name="ErrorBotConfigInvalid" xml:space="preserve">
|
||||
<value>A configuração do seu bot é inválida, por favor verifique o conteúdo de {0} e tente de novo!</value>
|
||||
<value>A configuração do bot é inválida, verifique o conteúdo de {0} e tente novamente!</value>
|
||||
<comment>{0} will be replaced by file's path</comment>
|
||||
</data>
|
||||
<data name="ErrorDatabaseInvalid" xml:space="preserve">
|
||||
@@ -687,7 +688,7 @@ StackTrace:
|
||||
<value>Por favor revise a seção de política de privacidade na nossa wiki se você está preocupado com o que o ASF realmente está fazendo!</value>
|
||||
</data>
|
||||
<data name="Welcome" xml:space="preserve">
|
||||
<value>Parece que é sua primeira vez abrindo o programa, bem-vindo!</value>
|
||||
<value>Parece que é a sua primeira vez abrindo o programa, bem-vindo(a)!</value>
|
||||
</data>
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>O CurrentCulture providenciado é inválido, o ASF continuará usando o padrão!</value>
|
||||
@@ -696,4 +697,8 @@ StackTrace:
|
||||
<value>O ASF tentará usar seu preferido {0} idle, mas a tradução para este idioma foi concluída somente em {1}. Talvez você possa nos ajudar a melhorar a tradução do ASF ao seu idioma?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>A execução de {0} ({1}) está temporariamente desativada, visto que esse jogo não foi lançado ainda.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -692,4 +692,5 @@ inválidas, abortando!</value>
|
||||
<value>Seu CurrentCulture fornecido é inválido, ASF continuará a funcionar com o predefinido!</value>
|
||||
</data>
|
||||
|
||||
|
||||
</root>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF will attempt to use your preferred {0} culture, but translation in that language was completed only in {1}. Perhaps you could help us improve ASF translation for your language?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Idling {0} ({1}) is temporarily disabled, as that game was not released yet.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -697,4 +697,8 @@ StackTrace:
|
||||
<value>ASF va încerca să utilizeze cultura {0} preferată de tine, dar traducerea în această limbă a fost completată în proporție de {1}. Poate că ai putea ajuta la îmbunatățirea traducerii ASF pentru limba ta?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Farmatul {0} ({1}) este dezactivat temporar, deoarece acest joc nu a fost încă lansat.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -401,7 +401,7 @@
|
||||
<value>Готово!</value>
|
||||
</data>
|
||||
<data name="GamesToIdle" xml:space="preserve">
|
||||
<value>Всего осталось {0} игр ({1} карт), это примерно {2}...</value>
|
||||
<value>Всего {0} игр ({1} карт) осталось фармить (займет примерно {2})...</value>
|
||||
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string built from TimeSpan* translation parts</comment>
|
||||
</data>
|
||||
<data name="IdlingFinished" xml:space="preserve">
|
||||
@@ -694,7 +694,11 @@
|
||||
<value>Выбранный вами CurrentCulture неверный, ASF продолжит работать со значением по умолчанию!</value>
|
||||
</data>
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASF будет пытаться использовать выбранный язык {0}, но перевод готов только на {1}. Возможно, вы смогли бы помочь улучшить перевод ASF на данный язык.</value>
|
||||
<value>ASF будет пытаться использовать выбранный язык {0}, но перевод готов только на {1}. Возможно, Вы могли бы помочь улучшить перевод ASF на данный язык?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Фарм {0} ({1}) временно невозможен, потому что эта игра ещё не вышла.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -697,4 +697,5 @@ StackTrace:
|
||||
<value>ASF će pokušati da koristi vašu preferiranu {0} "kulturu", ali prevod u taj jezik je samo {1} gotov. Možda bi ste mogli da nam pomogne u prevodu ASF na vaš jezik?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
|
||||
</root>
|
||||
@@ -290,6 +290,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -395,7 +395,7 @@ StackTrace:
|
||||
<value>Kollar andra märkessidor...</value>
|
||||
</data>
|
||||
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
|
||||
<value>Vald farm algoritm: {0}</value>
|
||||
<value>Vald farmning algoritm: {0}</value>
|
||||
<comment>{0} will be replaced by the name of chosen idling algorithm</comment>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
@@ -694,5 +694,12 @@ StackTrace:
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>Din angivna CurrentCulture är ogiltlig, ASF kommer fortsätta köras med standardvärdet!</value>
|
||||
</data>
|
||||
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASF kommer försöka att använda din föredragna {0}, men den översättningen är endast {1} färdig. Du kanske kan hjälpa oss att förbättra ASF översättningarna för ditt språk?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Farmning {0} ({1}) är tillfälligt inaktiverad, då spelet inte är släppt ännu.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -278,6 +278,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</root>
|
||||
@@ -693,5 +693,12 @@ Hata bilgileri:
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>Sağlanan CurrentCulture geçersiz, ASF varsayılan ile çalışmaya devam edecek!</value>
|
||||
</data>
|
||||
|
||||
<data name="TranslationIncomplete" xml:space="preserve">
|
||||
<value>ASF tercih ettiğiniz {0} kültürünü kullanmaya çalışacak, ancak o dildeki çeviri yalnızca {1} içinde tamamlandı. Diliniz için ASF çevirisini geliştirmemize belki de yardımcı olabilir misiniz?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Rölantide {0} ({1}) geçici olarak devre dışı bırakıldı, Bu oyun henüz çıkış yapmadı.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -538,7 +538,7 @@
|
||||
<comment>{0} will be replaced by logging off reason (string)</comment>
|
||||
</data>
|
||||
<data name="BotLoggedOn" xml:space="preserve">
|
||||
<value>Успішний вихід із системи!</value>
|
||||
<value>Успішний вхід в систему!</value>
|
||||
</data>
|
||||
<data name="BotLoggingIn" xml:space="preserve">
|
||||
<value>Здійснюється вхід...</value>
|
||||
@@ -566,10 +566,10 @@
|
||||
<value>Обмін надісланий!</value>
|
||||
</data>
|
||||
<data name="BotLootingTemporarilyDisabled" xml:space="preserve">
|
||||
<value>Лутінг тимчасово відключений!</value>
|
||||
<value>Збір предметів тимчасово відключений!</value>
|
||||
</data>
|
||||
<data name="BotLootingYourself" xml:space="preserve">
|
||||
<value>Ви не можете лутати себе!</value>
|
||||
<value>Неможливо збирати предмети з самого себе!</value>
|
||||
</data>
|
||||
<data name="BotNoASFAuthenticator" xml:space="preserve">
|
||||
<value>Цей бот не має включеного ASF 2FA! Забули імпортувати автентифікатор у ASF 2FA?</value>
|
||||
@@ -609,7 +609,7 @@
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusLimited" xml:space="preserve">
|
||||
<value>Бот {0} має обмеження і не може ідліти карти.</value>
|
||||
<value>Бот {0} має обмеження і не може отримувати карти.</value>
|
||||
<comment>{0} will be replaced by bot's name</comment>
|
||||
</data>
|
||||
<data name="BotStatusNotConnected" xml:space="preserve">
|
||||
@@ -652,13 +652,13 @@
|
||||
<value>Підключення до мережі Steam втрачено, повторне підключення...</value>
|
||||
</data>
|
||||
<data name="BotAccountFree" xml:space="preserve">
|
||||
<value>Аккаунт більше не зайнятий, іділінг відновлено!</value>
|
||||
<value>Аккаунт більше не зайнятий, роботу відновлено!</value>
|
||||
</data>
|
||||
<data name="BotAccountOccupied" xml:space="preserve">
|
||||
<value>Акаунт зараз використовується, ASF продовжить коли аккаунт звільниться...</value>
|
||||
</data>
|
||||
<data name="BotAutomaticIdlingPauseTimeout" xml:space="preserve">
|
||||
<value>Сімейна бібліотека не була запущена у відведений період часу, фарм відновлено!</value>
|
||||
<value>Сімейна бібліотека не була запущена у відведений період часу, роботу відновлено!</value>
|
||||
</data>
|
||||
<data name="BotConnecting" xml:space="preserve">
|
||||
<value>Підключення...</value>
|
||||
@@ -697,4 +697,8 @@
|
||||
<value>ASF намагатиметься використовувати обрану мову {0}, але переклад на цю мову завершено лише на {1}. Можливо ви б змогли допомогти в перекладі ASF вашою мовою?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>Обробка {0} ({1}) тимчасово неможлива, тому що ця гра ще не була випущена.</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -697,4 +697,5 @@ StackTrace:
|
||||
<value>ASF sẽ cố gắng sử dụng mã ngôn ngữ {0} ưa thích của bạn, nhưng bản dịch ngôn ngữ đó hoàn thiện chỉ được {1}. Có lẽ bạn có thể giúp chúng tôi cải thiện bản dịch ASF cho ngôn ngữ của bạn?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
|
||||
</root>
|
||||
@@ -694,4 +694,8 @@
|
||||
<value>ASF将尝试使用您偏好的语言{0},但该语言当前的翻译完成度为{1}。或许你可以帮助我们改进ASF的翻译?</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>{0} ({1}) 的挂卡暂时不可用,因为该游戏尚未发布。</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -584,7 +584,7 @@
|
||||
<comment>{0} will be replaced by bot's name, {1} will be replaced by game's appID (number), {2} will be replaced by game's name</comment>
|
||||
</data>
|
||||
<data name="BotRateLimitExceeded" xml:space="preserve">
|
||||
<value>超過頻率限制,我們將在 {0} 分鐘後重試...</value>
|
||||
<value>超過頻率限制,我們將在 {0} 分鐘的CD時間後重試...</value>
|
||||
<comment>{0} will be replaced by number of minutes</comment>
|
||||
</data>
|
||||
<data name="BotReconnecting" xml:space="preserve">
|
||||
@@ -694,4 +694,8 @@
|
||||
<value>ASF 將使用您的偏好語系 {0} ,但該語言的翻譯只完成了 {1}。請協助我們改進 ASF 的翻譯品質。</value>
|
||||
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
|
||||
</data>
|
||||
<data name="IdlingGameNotReleasedYet" xml:space="preserve">
|
||||
<value>掛卡 {0} ({1}) 已暫時停止,因為該遊戲尚未發行。</value>
|
||||
<comment>{0} will be replaced by game's appID (number), {1} will be replaced by game's name</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -116,7 +116,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static void OnConfigurationChanged(object sender, LoggingConfigurationChangedEventArgs e) {
|
||||
if ((sender == null) || (e == null)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
ASF.ArchiLogger.LogNullError(nameof(sender) + " || " + nameof(e));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,12 +34,11 @@ using System.ServiceProcess;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using ArchiSteamFarm.Localization;
|
||||
using NLog.Targets;
|
||||
using SteamKit2;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
internal static class Program {
|
||||
internal static readonly ArchiLogger ArchiLogger = new ArchiLogger(SharedInfo.ASF);
|
||||
|
||||
internal static bool IsWCFRunning => WCF.IsServerRunning;
|
||||
internal static GlobalConfig GlobalConfig { get; private set; }
|
||||
internal static GlobalDatabase GlobalDatabase { get; private set; }
|
||||
@@ -53,12 +52,12 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static bool ShutdownSequenceInitialized;
|
||||
|
||||
internal static void Exit(byte exitCode = 0) {
|
||||
internal static async Task Exit(byte exitCode = 0) {
|
||||
if (exitCode != 0) {
|
||||
ArchiLogger.LogGenericError(Strings.ErrorExitingWithNonZeroErrorCode);
|
||||
ASF.ArchiLogger.LogGenericError(Strings.ErrorExitingWithNonZeroErrorCode);
|
||||
}
|
||||
|
||||
Shutdown();
|
||||
await Shutdown().ConfigureAwait(false);
|
||||
Environment.Exit(exitCode);
|
||||
}
|
||||
|
||||
@@ -68,7 +67,7 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (GlobalConfig.Headless || !Runtime.IsUserInteractive) {
|
||||
ArchiLogger.LogGenericWarning(Strings.ErrorUserInputRunningInHeadlessMode);
|
||||
ASF.ArchiLogger.LogGenericWarning(Strings.ErrorUserInputRunningInHeadlessMode);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -98,7 +97,7 @@ namespace ArchiSteamFarm {
|
||||
Console.Write(Strings.UserInputWCFHost, botName);
|
||||
break;
|
||||
default:
|
||||
ArchiLogger.LogGenericWarning(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(userInputType), userInputType));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(userInputType), userInputType));
|
||||
Console.Write(Strings.UserInputUnknown, botName, userInputType);
|
||||
break;
|
||||
}
|
||||
@@ -115,15 +114,15 @@ namespace ArchiSteamFarm {
|
||||
return !string.IsNullOrEmpty(result) ? result.Trim() : null;
|
||||
}
|
||||
|
||||
internal static void Restart() {
|
||||
if (!InitShutdownSequence()) {
|
||||
internal static async Task Restart() {
|
||||
if (!await InitShutdownSequence().ConfigureAwait(false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
Process.Start(Assembly.GetEntryAssembly().Location, string.Join(" ", Environment.GetCommandLineArgs().Skip(1)));
|
||||
} catch (Exception e) {
|
||||
ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
|
||||
ShutdownResetEvent.Set();
|
||||
@@ -131,6 +130,12 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
private static async Task Init(string[] args) {
|
||||
// We must register our logging target as soon as possible
|
||||
Target.Register<SteamTarget>("Steam");
|
||||
await InitCore(args).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private static async Task InitCore(string[] args) {
|
||||
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
|
||||
TaskScheduler.UnobservedTaskException += UnobservedTaskExceptionHandler;
|
||||
|
||||
@@ -161,15 +166,17 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
Logging.InitLoggers();
|
||||
ArchiLogger.LogGenericInfo("ASF V" + SharedInfo.Version);
|
||||
ASF.ArchiLogger.LogGenericInfo("ASF V" + SharedInfo.Version);
|
||||
|
||||
await InitServices().ConfigureAwait(false);
|
||||
await InitGlobalConfigAndLanguage().ConfigureAwait(false);
|
||||
|
||||
if (!Runtime.IsRuntimeSupported) {
|
||||
ArchiLogger.LogGenericError(Strings.WarningRuntimeUnsupported);
|
||||
await Task.Delay(10 * 1000).ConfigureAwait(false);
|
||||
ASF.ArchiLogger.LogGenericError(Strings.WarningRuntimeUnsupported);
|
||||
await Task.Delay(60 * 1000).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
await InitGlobalDatabaseAndServices().ConfigureAwait(false);
|
||||
|
||||
// If debugging is on, we prepare debug directory prior to running
|
||||
if (GlobalConfig.Debug) {
|
||||
if (Directory.Exists(SharedInfo.DebugDirectory)) {
|
||||
@@ -177,7 +184,7 @@ namespace ArchiSteamFarm {
|
||||
Directory.Delete(SharedInfo.DebugDirectory, true);
|
||||
await Task.Delay(1000).ConfigureAwait(false); // Dirty workaround giving Windows some time to sync
|
||||
} catch (IOException e) {
|
||||
ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,7 +201,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
// If we ran ASF as a client, we're done by now
|
||||
if (Mode.HasFlag(EMode.Client) && !Mode.HasFlag(EMode.Server)) {
|
||||
Exit();
|
||||
await Exit().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
await ASF.CheckForUpdate().ConfigureAwait(false);
|
||||
@@ -202,14 +209,14 @@ namespace ArchiSteamFarm {
|
||||
ASF.InitFileWatcher();
|
||||
}
|
||||
|
||||
private static async Task InitServices() {
|
||||
private static async Task InitGlobalConfigAndLanguage() {
|
||||
string globalConfigFile = Path.Combine(SharedInfo.ConfigDirectory, SharedInfo.GlobalConfigFileName);
|
||||
|
||||
GlobalConfig = GlobalConfig.Load(globalConfigFile);
|
||||
if (GlobalConfig == null) {
|
||||
ArchiLogger.LogGenericError(string.Format(Strings.ErrorGlobalConfigNotLoaded, globalConfigFile));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorGlobalConfigNotLoaded, globalConfigFile));
|
||||
await Task.Delay(5 * 1000).ConfigureAwait(false);
|
||||
Exit(1);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -219,18 +226,17 @@ namespace ArchiSteamFarm {
|
||||
CultureInfo culture = CultureInfo.CreateSpecificCulture(GlobalConfig.CurrentCulture);
|
||||
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = culture;
|
||||
} catch (CultureNotFoundException) {
|
||||
ArchiLogger.LogGenericError(Strings.ErrorInvalidCurrentCulture);
|
||||
ASF.ArchiLogger.LogGenericError(Strings.ErrorInvalidCurrentCulture);
|
||||
}
|
||||
}
|
||||
|
||||
int defaultResourceSetCount = 0;
|
||||
int currentResourceSetCount = 0;
|
||||
|
||||
ResourceSet defaultResourceSet = Strings.ResourceManager.GetResourceSet(CultureInfo.CreateSpecificCulture("en-US"), true, true);
|
||||
ResourceSet defaultResourceSet = Strings.ResourceManager.GetResourceSet(CultureInfo.GetCultureInfo("en-US"), true, true);
|
||||
if (defaultResourceSet != null) {
|
||||
defaultResourceSetCount = defaultResourceSet.Cast<object>().Count();
|
||||
}
|
||||
|
||||
int currentResourceSetCount = 0;
|
||||
ResourceSet currentResourceSet = Strings.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, false);
|
||||
if (currentResourceSet != null) {
|
||||
currentResourceSetCount = currentResourceSet.Cast<object>().Count();
|
||||
@@ -238,22 +244,24 @@ namespace ArchiSteamFarm {
|
||||
|
||||
if (currentResourceSetCount < defaultResourceSetCount) {
|
||||
float translationCompleteness = currentResourceSetCount / (float) defaultResourceSetCount;
|
||||
ArchiLogger.LogGenericInfo(string.Format(Strings.TranslationIncomplete, CultureInfo.CurrentCulture.Name, translationCompleteness.ToString("P1")));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.TranslationIncomplete, CultureInfo.CurrentCulture.Name, translationCompleteness.ToString("P1")));
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task InitGlobalDatabaseAndServices() {
|
||||
string globalDatabaseFile = Path.Combine(SharedInfo.ConfigDirectory, SharedInfo.GlobalDatabaseFileName);
|
||||
|
||||
if (!File.Exists(globalDatabaseFile)) {
|
||||
ArchiLogger.LogGenericInfo(Strings.Welcome);
|
||||
ArchiLogger.LogGenericWarning(Strings.WarningPrivacyPolicy);
|
||||
ASF.ArchiLogger.LogGenericInfo(Strings.Welcome);
|
||||
ASF.ArchiLogger.LogGenericWarning(Strings.WarningPrivacyPolicy);
|
||||
await Task.Delay(15 * 1000).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
GlobalDatabase = GlobalDatabase.Load(globalDatabaseFile);
|
||||
if (GlobalDatabase == null) {
|
||||
ArchiLogger.LogGenericError(string.Format(Strings.ErrorDatabaseInvalid, globalDatabaseFile));
|
||||
ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorDatabaseInvalid, globalDatabaseFile));
|
||||
await Task.Delay(5 * 1000).ConfigureAwait(false);
|
||||
Exit(1);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -261,10 +269,10 @@ namespace ArchiSteamFarm {
|
||||
WebBrowser.Init();
|
||||
WCF.Init();
|
||||
|
||||
WebBrowser = new WebBrowser(ArchiLogger);
|
||||
WebBrowser = new WebBrowser(ASF.ArchiLogger);
|
||||
}
|
||||
|
||||
private static bool InitShutdownSequence() {
|
||||
private static async Task<bool> InitShutdownSequence() {
|
||||
if (ShutdownSequenceInitialized) {
|
||||
return false;
|
||||
}
|
||||
@@ -272,9 +280,9 @@ namespace ArchiSteamFarm {
|
||||
ShutdownSequenceInitialized = true;
|
||||
|
||||
WCF.StopServer();
|
||||
foreach (Bot bot in Bot.Bots.Values) {
|
||||
bot.Stop();
|
||||
}
|
||||
|
||||
IEnumerable<Task> tasks = Bot.Bots.Values.Select(bot => Task.Run(() => bot.Stop()));
|
||||
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(10 * 1000));
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -288,7 +296,7 @@ namespace ArchiSteamFarm {
|
||||
ShutdownResetEvent.Wait();
|
||||
|
||||
// We got a signal to shutdown
|
||||
Exit();
|
||||
Exit().Wait();
|
||||
} else {
|
||||
// Service
|
||||
IsRunningAsService = true;
|
||||
@@ -300,7 +308,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static async Task ParsePostInitArgs(IEnumerable<string> args) {
|
||||
if (args == null) {
|
||||
ArchiLogger.LogNullError(nameof(args));
|
||||
ASF.ArchiLogger.LogNullError(nameof(args));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -326,13 +334,13 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
if (!Mode.HasFlag(EMode.Client)) {
|
||||
ArchiLogger.LogGenericWarning(string.Format(Strings.WarningWCFIgnoringCommand, arg));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningWCFIgnoringCommand, arg));
|
||||
break;
|
||||
}
|
||||
|
||||
string response = WCF.SendCommand(arg);
|
||||
|
||||
ArchiLogger.LogGenericInfo(string.Format(Strings.WCFResponseReceived, response));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFResponseReceived, response));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -340,7 +348,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static void ParsePreInitArgs(IEnumerable<string> args) {
|
||||
if (args == null) {
|
||||
ArchiLogger.LogNullError(nameof(args));
|
||||
ASF.ArchiLogger.LogNullError(nameof(args));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -366,32 +374,34 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
private static void Shutdown() {
|
||||
if (!InitShutdownSequence()) {
|
||||
private static async Task Shutdown() {
|
||||
if (!await InitShutdownSequence().ConfigureAwait(false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ShutdownResetEvent.Set();
|
||||
}
|
||||
|
||||
private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) {
|
||||
private static async void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) {
|
||||
if (args?.ExceptionObject == null) {
|
||||
ArchiLogger.LogNullError(nameof(args) + " || " + nameof(args.ExceptionObject));
|
||||
ASF.ArchiLogger.LogNullError(nameof(args) + " || " + nameof(args.ExceptionObject));
|
||||
return;
|
||||
}
|
||||
|
||||
ArchiLogger.LogFatalException((Exception) args.ExceptionObject);
|
||||
Exit(1);
|
||||
ASF.ArchiLogger.LogFatalException((Exception) args.ExceptionObject);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private static void UnobservedTaskExceptionHandler(object sender, UnobservedTaskExceptionEventArgs args) {
|
||||
if (args?.Exception == null) {
|
||||
ArchiLogger.LogNullError(nameof(args) + " || " + nameof(args.Exception));
|
||||
ASF.ArchiLogger.LogNullError(nameof(args) + " || " + nameof(args.Exception));
|
||||
return;
|
||||
}
|
||||
|
||||
ArchiLogger.LogFatalException(args.Exception);
|
||||
Exit(1);
|
||||
ASF.ArchiLogger.LogFatalException(args.Exception);
|
||||
// Normally we should abort the application here, but many tasks are in fact failing in SK2 code which we can't easily fix
|
||||
// Thanks Valve.
|
||||
}
|
||||
|
||||
[Flags]
|
||||
@@ -417,7 +427,7 @@ namespace ArchiSteamFarm {
|
||||
Stop();
|
||||
});
|
||||
|
||||
protected override void OnStop() => Shutdown();
|
||||
protected override async void OnStop() => await Shutdown().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,42 +40,42 @@ namespace ArchiSteamFarm {
|
||||
if (IsRunningOnMono) {
|
||||
Version monoVersion = GetMonoVersion();
|
||||
if (monoVersion == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(monoVersion));
|
||||
ASF.ArchiLogger.LogNullError(nameof(monoVersion));
|
||||
return false;
|
||||
}
|
||||
|
||||
Version minMonoVersion = new Version(4, 6);
|
||||
|
||||
if (monoVersion >= minMonoVersion) {
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionOK, "Mono"));
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionComparison, minMonoVersion, monoVersion));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionOK, "Mono"));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionComparison, minMonoVersion, monoVersion));
|
||||
_IsRuntimeSupported = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningRuntimeVersionTooOld, "Mono"));
|
||||
Program.ArchiLogger.LogGenericWarning(string.Format(Strings.RuntimeVersionComparison, minMonoVersion, monoVersion));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningRuntimeVersionTooOld, "Mono"));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.RuntimeVersionComparison, minMonoVersion, monoVersion));
|
||||
_IsRuntimeSupported = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
Version netVersion = GetNetVersion();
|
||||
if (netVersion == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(netVersion));
|
||||
ASF.ArchiLogger.LogNullError(nameof(netVersion));
|
||||
return false;
|
||||
}
|
||||
|
||||
Version minNetVersion = new Version(4, 6, 1);
|
||||
|
||||
if (netVersion >= minNetVersion) {
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionOK, ".NET"));
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionComparison, minNetVersion, netVersion));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionOK, ".NET"));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.RuntimeVersionComparison, minNetVersion, netVersion));
|
||||
_IsRuntimeSupported = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningRuntimeVersionTooOld, ".NET"));
|
||||
Program.ArchiLogger.LogGenericWarning(string.Format(Strings.RuntimeVersionComparison, minNetVersion, netVersion));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningRuntimeVersionTooOld, ".NET"));
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.RuntimeVersionComparison, minNetVersion, netVersion));
|
||||
_IsRuntimeSupported = false;
|
||||
return false;
|
||||
}
|
||||
@@ -112,25 +112,25 @@ namespace ArchiSteamFarm {
|
||||
|
||||
private static Version GetMonoVersion() {
|
||||
if (MonoRuntime == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(MonoRuntime));
|
||||
ASF.ArchiLogger.LogNullError(nameof(MonoRuntime));
|
||||
return null;
|
||||
}
|
||||
|
||||
MethodInfo displayName = MonoRuntime.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
|
||||
if (displayName == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(displayName));
|
||||
ASF.ArchiLogger.LogNullError(nameof(displayName));
|
||||
return null;
|
||||
}
|
||||
|
||||
string versionString = (string) displayName.Invoke(null, null);
|
||||
if (string.IsNullOrEmpty(versionString)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(versionString));
|
||||
ASF.ArchiLogger.LogNullError(nameof(versionString));
|
||||
return null;
|
||||
}
|
||||
|
||||
int index = versionString.IndexOf(' ');
|
||||
if (index <= 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(index));
|
||||
ASF.ArchiLogger.LogNullError(nameof(index));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ namespace ArchiSteamFarm {
|
||||
return version;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogNullError(nameof(version));
|
||||
ASF.ArchiLogger.LogNullError(nameof(version));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -149,18 +149,18 @@ namespace ArchiSteamFarm {
|
||||
uint release;
|
||||
using (RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) {
|
||||
if (registryKey == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(registryKey));
|
||||
ASF.ArchiLogger.LogNullError(nameof(registryKey));
|
||||
return null;
|
||||
}
|
||||
|
||||
object releaseObj = registryKey.GetValue("Release");
|
||||
if (releaseObj == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(releaseObj));
|
||||
ASF.ArchiLogger.LogNullError(nameof(releaseObj));
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!uint.TryParse(releaseObj.ToString(), out release) || (release == 0)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(release));
|
||||
ASF.ArchiLogger.LogNullError(nameof(release));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ namespace ArchiSteamFarm {
|
||||
internal const string ServiceDescription = "ASF is an application that allows you to farm steam cards using multiple steam accounts simultaneously.";
|
||||
internal const string ServiceName = "ArchiSteamFarm";
|
||||
internal const string StatisticsServer = "asf.justarchi.net";
|
||||
internal const string VersionNumber = "2.2.1.5";
|
||||
internal const string VersionNumber = "2.2.2.4";
|
||||
|
||||
internal static readonly Version Version = Assembly.GetEntryAssembly().GetName().Version;
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal async Task OnPersonaState(SteamFriends.PersonaStateCallback callback) {
|
||||
if (callback == null) {
|
||||
Program.ArchiLogger.LogNullError(nameof(callback));
|
||||
ASF.ArchiLogger.LogNullError(nameof(callback));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
90
ArchiSteamFarm/SteamTarget.cs
Normal file
90
ArchiSteamFarm/SteamTarget.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
_ _ _ ____ _ _____
|
||||
/ \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
|
||||
/ _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
|
||||
/ ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
|
||||
/_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
|
||||
|
||||
Copyright 2015-2017 Łukasz "JustArchi" Domeradzki
|
||||
Contact: JustArchi@JustArchi.net
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
*/
|
||||
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NLog.Config;
|
||||
using NLog.Targets;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
|
||||
[Target("Steam")]
|
||||
internal sealed class SteamTarget : TargetWithLayout {
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global")]
|
||||
// This is NLog config property, it must have public get() and set() capabilities
|
||||
public string BotName { get; set; }
|
||||
|
||||
[SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
|
||||
[SuppressMessage("ReSharper", "UnusedAutoPropertyAccessor.Global")]
|
||||
[RequiredParameter]
|
||||
// This is NLog config property, it must have public get() and set() capabilities
|
||||
public ulong SteamID { get; set; }
|
||||
|
||||
[SuppressMessage("ReSharper", "EmptyConstructor")]
|
||||
public SteamTarget() {
|
||||
// This constructor is intentionally public, as NLog uses it for creating targets
|
||||
// It must stay like this as we want to have SteamTargets defined in our NLog.config
|
||||
|
||||
// We should use default layout, but keeping date here doesn't make sense
|
||||
// User can already enable dates/times on Steam, so skip it by default
|
||||
Layout = "${level:uppercase=true}|${logger}|${message}";
|
||||
}
|
||||
|
||||
protected override void Write(LogEventInfo logEvent) {
|
||||
if (logEvent == null) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(logEvent));
|
||||
return;
|
||||
}
|
||||
|
||||
if (SteamID == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Bot bot;
|
||||
if (string.IsNullOrEmpty(BotName)) {
|
||||
bot = Bot.Bots.Values.FirstOrDefault(targetBot => targetBot.IsConnectedAndLoggedOn && (targetBot.SteamID != SteamID));
|
||||
if (bot == null) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (!Bot.Bots.TryGetValue(BotName, out bot)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!bot.IsConnectedAndLoggedOn || (bot.SteamID == SteamID)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
string message = Layout.Render(logEvent);
|
||||
if (string.IsNullOrEmpty(message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
bot.SendMessage(SteamID, message);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,21 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
ParseTradeResult[] results = await Task.WhenAll(tradeOffers.Select(ParseTrade)).ConfigureAwait(false);
|
||||
ICollection<ParseTradeResult> results;
|
||||
IEnumerable<Task<ParseTradeResult>> tasks = tradeOffers.Select(ParseTrade);
|
||||
|
||||
switch (Program.GlobalConfig.OptimizationMode) {
|
||||
case GlobalConfig.EOptimizationMode.MinMemoryUsage:
|
||||
results = new List<ParseTradeResult>(tradeOffers.Count);
|
||||
foreach (Task<ParseTradeResult> task in tasks) {
|
||||
results.Add(await task.ConfigureAwait(false));
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
results = await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||
break;
|
||||
}
|
||||
|
||||
if (Bot.HasMobileAuthenticator) {
|
||||
HashSet<ulong> acceptedWithItemLoseTradeIDs = new HashSet<ulong>(results.Where(result => (result != null) && (result.Result == ParseTradeResult.EResult.AcceptedWithItemLose)).Select(result => result.TradeID));
|
||||
@@ -178,7 +192,7 @@ namespace ArchiSteamFarm {
|
||||
// If it's steam fuckup, temporarily ignore it, otherwise react accordingly, depending on our preference
|
||||
if (tradeOffer.ItemsToReceive.Count == 0) {
|
||||
donationResult = ParseTradeResult.EResult.RejectedTemporarily;
|
||||
} else if (Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.AcceptDonations) || ((tradeOffer.OtherSteamID64 != 0) && Bot.Bots.Values.Any(bot => bot.SteamID == tradeOffer.OtherSteamID64))) {
|
||||
} else if (Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.AcceptDonations) || (!Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.DontAcceptBotTrades) && (tradeOffer.OtherSteamID64 != 0) && Bot.Bots.Values.Any(bot => bot.SteamID == tradeOffer.OtherSteamID64))) {
|
||||
donationResult = ParseTradeResult.EResult.AcceptedWithoutItemLose;
|
||||
} else {
|
||||
donationResult = ParseTradeResult.EResult.RejectedPermanently;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
@@ -41,7 +42,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static string GetCookieValue(this CookieContainer cookieContainer, string url, string name) {
|
||||
if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(name)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(url) + " || " + nameof(name));
|
||||
ASF.ArchiLogger.LogNullError(nameof(url) + " || " + nameof(name));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -50,7 +51,7 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
uri = new Uri(url);
|
||||
} catch (UriFormatException e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -63,7 +64,7 @@ namespace ArchiSteamFarm {
|
||||
/*
|
||||
internal static int RandomNext(int maxWithout) {
|
||||
if (maxWithout <= 0) {
|
||||
Program.ArchiLogger.LogNullError(nameof(maxWithout));
|
||||
ASF.ArchiLogger.LogNullError(nameof(maxWithout));
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -79,7 +80,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal static bool IsValidHexadecimalString(string text) {
|
||||
if (string.IsNullOrEmpty(text)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(text));
|
||||
ASF.ArchiLogger.LogNullError(nameof(text));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -96,6 +97,10 @@ namespace ArchiSteamFarm {
|
||||
return true;
|
||||
}
|
||||
|
||||
internal static IEnumerable<T> ToEnumerable<T>(this T item) {
|
||||
yield return item;
|
||||
}
|
||||
|
||||
internal static string ToHumanReadable(this TimeSpan timeSpan) {
|
||||
// It's really dirty, I'd appreciate a lot if C# offered nice TimeSpan formatting by default
|
||||
// Normally I'd use third-party library like Humanizer, but using it only for this bit is not worth it
|
||||
|
||||
@@ -39,8 +39,6 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
internal sealed class WCF : IWCF, IDisposable {
|
||||
private static string URL = "net.tcp://127.0.0.1:1242/ASF";
|
||||
|
||||
internal bool IsServerRunning => ServiceHost != null;
|
||||
|
||||
private Client Client;
|
||||
@@ -55,7 +53,7 @@ namespace ArchiSteamFarm {
|
||||
|
||||
public string HandleCommand(string input) {
|
||||
if (string.IsNullOrEmpty(input)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(input));
|
||||
ASF.ArchiLogger.LogNullError(nameof(input));
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -74,38 +72,40 @@ namespace ArchiSteamFarm {
|
||||
// We must keep it synchronous until either Mono gets fixed, or culprit for freeze located (and corrected)
|
||||
string output = bot.Response(Program.GlobalConfig.SteamOwnerID, command).Result;
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFAnswered, input, output));
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFAnswered, input, output));
|
||||
return output;
|
||||
}
|
||||
|
||||
internal static void Init() {
|
||||
if (string.IsNullOrEmpty(Program.GlobalConfig.WCFHost)) {
|
||||
Program.GlobalConfig.WCFHost = Program.GetUserInput(ASF.EUserInputType.WCFHostname);
|
||||
if (string.IsNullOrEmpty(Program.GlobalConfig.WCFHost)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
URL = "net.tcp://" + Program.GlobalConfig.WCFHost + ":" + Program.GlobalConfig.WCFPort + "/ASF";
|
||||
}
|
||||
|
||||
internal string SendCommand(string input) {
|
||||
if (string.IsNullOrEmpty(input)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(input));
|
||||
ASF.ArchiLogger.LogNullError(nameof(input));
|
||||
return null;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFSendingCommand, input, URL));
|
||||
Binding binding = GetTargetBinding();
|
||||
if (binding == null) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(binding));
|
||||
return null;
|
||||
}
|
||||
|
||||
string url = GetUrlFromBinding(binding);
|
||||
if (string.IsNullOrEmpty(url)) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(url));
|
||||
return null;
|
||||
}
|
||||
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFSendingCommand, input, url));
|
||||
|
||||
if (Client == null) {
|
||||
Client = new Client(
|
||||
new NetTcpBinding {
|
||||
// We use SecurityMode.None for Mono compatibility
|
||||
// Yes, also on Windows, for Mono<->Windows communication
|
||||
Security = { Mode = SecurityMode.None },
|
||||
SendTimeout = new TimeSpan(0, 0, Program.GlobalConfig.ConnectionTimeout)
|
||||
},
|
||||
new EndpointAddress(URL)
|
||||
binding,
|
||||
new EndpointAddress(url)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -117,27 +117,35 @@ namespace ArchiSteamFarm {
|
||||
return;
|
||||
}
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFStarting, URL));
|
||||
Binding binding = GetTargetBinding();
|
||||
if (binding == null) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(binding));
|
||||
return;
|
||||
}
|
||||
|
||||
string url = GetUrlFromBinding(binding);
|
||||
if (string.IsNullOrEmpty(url)) {
|
||||
ASF.ArchiLogger.LogNullError(nameof(url));
|
||||
return;
|
||||
}
|
||||
|
||||
ASF.ArchiLogger.LogGenericInfo(string.Format(Strings.WCFStarting, url));
|
||||
|
||||
try {
|
||||
ServiceHost = new ServiceHost(typeof(WCF), new Uri(URL));
|
||||
ServiceHost = new ServiceHost(typeof(WCF), new Uri(url));
|
||||
ServiceHost.AddServiceEndpoint(
|
||||
typeof(IWCF),
|
||||
new NetTcpBinding {
|
||||
// We use SecurityMode.None for Mono compatibility
|
||||
// Yes, also on Windows, for Mono<->Windows communication
|
||||
Security = { Mode = SecurityMode.None },
|
||||
SendTimeout = new TimeSpan(0, 0, Program.GlobalConfig.ConnectionTimeout)
|
||||
},
|
||||
binding,
|
||||
string.Empty
|
||||
);
|
||||
|
||||
ServiceHost.Open();
|
||||
|
||||
Program.ArchiLogger.LogGenericInfo(Strings.WCFReady);
|
||||
ASF.ArchiLogger.LogGenericInfo(Strings.WCFReady);
|
||||
} catch (AddressAccessDeniedException) {
|
||||
Program.ArchiLogger.LogGenericError(Strings.ErrorWCFAddressAccessDeniedException);
|
||||
ASF.ArchiLogger.LogGenericError(Strings.ErrorWCFAddressAccessDeniedException);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,13 +158,53 @@ namespace ArchiSteamFarm {
|
||||
try {
|
||||
ServiceHost.Close();
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
}
|
||||
}
|
||||
|
||||
ServiceHost = null;
|
||||
}
|
||||
|
||||
private static Binding GetTargetBinding() {
|
||||
Binding result;
|
||||
switch (Program.GlobalConfig.WCFBinding) {
|
||||
case GlobalConfig.EWCFBinding.NetTcp:
|
||||
result = new NetTcpBinding {
|
||||
// We use SecurityMode.None for Mono compatibility
|
||||
// Yes, also on Windows, for Mono<->Windows communication
|
||||
Security = { Mode = SecurityMode.None }
|
||||
};
|
||||
|
||||
break;
|
||||
case GlobalConfig.EWCFBinding.BasicHttp:
|
||||
result = new BasicHttpBinding();
|
||||
break;
|
||||
case GlobalConfig.EWCFBinding.WSHttp:
|
||||
result = new WSHttpBinding {
|
||||
// We use SecurityMode.None for Mono compatibility
|
||||
// Yes, also on Windows, for Mono<->Windows communication
|
||||
Security = { Mode = SecurityMode.None }
|
||||
};
|
||||
|
||||
break;
|
||||
default:
|
||||
ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(Program.GlobalConfig.WCFBinding), Program.GlobalConfig.WCFBinding));
|
||||
goto case GlobalConfig.EWCFBinding.NetTcp;
|
||||
}
|
||||
|
||||
result.SendTimeout = new TimeSpan(0, 0, Program.GlobalConfig.ConnectionTimeout);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static string GetUrlFromBinding(Binding binding) {
|
||||
if (binding != null) {
|
||||
return binding.Scheme + "://" + Program.GlobalConfig.WCFHost + ":" + Program.GlobalConfig.WCFPort + "/ASF";
|
||||
}
|
||||
|
||||
ASF.ArchiLogger.LogNullError(nameof(binding));
|
||||
return null;
|
||||
}
|
||||
|
||||
private void StopClient() {
|
||||
if (Client == null) {
|
||||
return;
|
||||
@@ -175,14 +223,14 @@ namespace ArchiSteamFarm {
|
||||
|
||||
internal string HandleCommand(string input) {
|
||||
if (string.IsNullOrEmpty(input)) {
|
||||
Program.ArchiLogger.LogNullError(nameof(input));
|
||||
ASF.ArchiLogger.LogNullError(nameof(input));
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return Channel.HandleCommand(input);
|
||||
} catch (Exception e) {
|
||||
Program.ArchiLogger.LogGenericException(e);
|
||||
ASF.ArchiLogger.LogGenericException(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ namespace ArchiSteamFarm {
|
||||
// Therefore, call mono-incompatible options in their own function to avoid that, and just leave the function call here
|
||||
// When compiling on Mono, this section is omitted entirely as we never run Mono-compiled ASF on Windows
|
||||
// Moreover, Mono compiler doesn't even include ReusePort field in ServicePointManager, so it's crucial to avoid compilation error
|
||||
if (Runtime.IsRuntimeSupported && !Runtime.IsRunningOnMono) {
|
||||
if (!Runtime.IsRunningOnMono) {
|
||||
InitNonMonoBehaviour();
|
||||
}
|
||||
#endif
|
||||
@@ -517,7 +517,7 @@ namespace ArchiSteamFarm {
|
||||
responseMessage = await HttpClient.SendAsync(requestMessage).ConfigureAwait(false);
|
||||
} catch (Exception e) {
|
||||
// This exception is really common, don't bother with it unless debug mode is enabled
|
||||
if (Debugging.IsDebugBuild || Program.GlobalConfig.Debug) {
|
||||
if (Debugging.IsUserDebugging) {
|
||||
ArchiLogger.LogGenericDebugException(e);
|
||||
}
|
||||
|
||||
@@ -533,7 +533,7 @@ namespace ArchiSteamFarm {
|
||||
return responseMessage;
|
||||
}
|
||||
|
||||
if (Debugging.IsDebugBuild || Program.GlobalConfig.Debug) {
|
||||
if (Debugging.IsUserDebugging) {
|
||||
ArchiLogger.LogGenericDebug(string.Format(Strings.ErrorFailingRequest, request));
|
||||
ArchiLogger.LogGenericDebug(string.Format(Strings.StatusCode, responseMessage.StatusCode));
|
||||
ArchiLogger.LogGenericDebug(string.Format(Strings.Content, await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false)));
|
||||
|
||||
@@ -21,10 +21,12 @@
|
||||
"LoginLimiterDelay": 10,
|
||||
"MaxFarmingTime": 10,
|
||||
"MaxTradeHoldDuration": 15,
|
||||
"OptimizationMode": 0,
|
||||
"Statistics": true,
|
||||
"SteamOwnerID": 0,
|
||||
"SteamProtocol": 6,
|
||||
"UpdateChannel": 1,
|
||||
"WCFBinding": 0,
|
||||
"WCFHost": "127.0.0.1",
|
||||
"WCFPort": 1242
|
||||
}
|
||||
@@ -28,5 +28,5 @@
|
||||
"SteamParentalPIN": "0",
|
||||
"SteamPassword": null,
|
||||
"SteamTradeToken": null,
|
||||
"TradingPreferences": 1
|
||||
"TradingPreferences": 0
|
||||
}
|
||||
|
||||
BIN
ArchiSteamFarm/lib/SteamKit2.dll
Normal file
BIN
ArchiSteamFarm/lib/SteamKit2.dll
Normal file
Binary file not shown.
8328
ArchiSteamFarm/lib/SteamKit2.xml
Normal file
8328
ArchiSteamFarm/lib/SteamKit2.xml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -136,7 +136,7 @@ namespace ConfigGenerator {
|
||||
[LocalizedCategory("Advanced")]
|
||||
[Editor(typeof(FlagEnumUiEditor), typeof(UITypeEditor))]
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public ETradingPreferences TradingPreferences { get; set; } = ETradingPreferences.AcceptDonations;
|
||||
public ETradingPreferences TradingPreferences { get; set; } = ETradingPreferences.None;
|
||||
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Local")]
|
||||
private BotConfig() { }
|
||||
@@ -207,7 +207,8 @@ namespace ConfigGenerator {
|
||||
None = 0,
|
||||
AcceptDonations = 1,
|
||||
SteamTradeMatcher = 2,
|
||||
MatchEverything = 4
|
||||
MatchEverything = 4,
|
||||
DontAcceptBotTrades = 8
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -98,6 +98,10 @@ namespace ConfigGenerator {
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public byte MaxTradeHoldDuration { get; set; } = 15;
|
||||
|
||||
[LocalizedCategory("Performance")]
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public EOptimizationMode OptimizationMode { get; set; } = EOptimizationMode.MaxPerformance;
|
||||
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public bool Statistics { get; set; } = true;
|
||||
|
||||
@@ -113,6 +117,10 @@ namespace ConfigGenerator {
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public EUpdateChannel UpdateChannel { get; set; } = EUpdateChannel.Stable;
|
||||
|
||||
[LocalizedCategory("Access")]
|
||||
[JsonProperty(Required = Required.DisallowNull)]
|
||||
public EWCFBinding WCFBinding { get; set; } = EWCFBinding.NetTcp;
|
||||
|
||||
[LocalizedCategory("Access")]
|
||||
[JsonProperty]
|
||||
public string WCFHost { get; set; } = "127.0.0.1";
|
||||
@@ -206,10 +214,21 @@ namespace ConfigGenerator {
|
||||
Logging.LogGenericWarning(string.Format(CGStrings.WarningConfigPropertyModified, nameof(WCFPort), WCFPort));
|
||||
}
|
||||
|
||||
internal enum EOptimizationMode : byte {
|
||||
MaxPerformance,
|
||||
MinMemoryUsage
|
||||
}
|
||||
|
||||
internal enum EUpdateChannel : byte {
|
||||
None,
|
||||
Stable,
|
||||
Experimental
|
||||
}
|
||||
|
||||
internal enum EWCFBinding : byte {
|
||||
NetTcp,
|
||||
BasicHttp,
|
||||
WSHttp
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -263,7 +263,7 @@ namespace ConfigGenerator.Localization {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuraton section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the softwa [rest of string was truncated]";.
|
||||
/// Looks up a localized string similar to Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuration section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the softw [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string TutorialFinished {
|
||||
get {
|
||||
|
||||
@@ -117,28 +117,82 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="CategoryAccess" xml:space="preserve">
|
||||
<value>Достъп</value>
|
||||
</data>
|
||||
<data name="CategoryAdvanced" xml:space="preserve">
|
||||
<value>Разширени настройки</value>
|
||||
</data>
|
||||
<data name="CategoryCore" xml:space="preserve">
|
||||
<value>Основни</value>
|
||||
</data>
|
||||
<data name="CategoryDebugging" xml:space="preserve">
|
||||
<value>Отстраняване на грешки</value>
|
||||
</data>
|
||||
<data name="CategoryPerformance" xml:space="preserve">
|
||||
<value>Производителност</value>
|
||||
</data>
|
||||
<data name="CategoryUpdates" xml:space="preserve">
|
||||
<value>Обновления</value>
|
||||
</data>
|
||||
<data name="ConfirmRemoval" xml:space="preserve">
|
||||
<value>Наистина ли искате да премахнете тези настройки?</value>
|
||||
</data>
|
||||
<data name="ErrorBotNameEmpty" xml:space="preserve">
|
||||
<value>Не сте задали име на бота!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRemoveGlobalConfig" xml:space="preserve">
|
||||
<value>Не можете да премахнете общите настройки!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRenameGlobalConfig" xml:space="preserve">
|
||||
<value>Не можете да преименувате общите настройки!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
|
||||
<value>Папката с настройките не може да бъде открита!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
|
||||
<value>Конфигурираното свойство {0} е невалидно: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>Задали сте невалиден CurrentCulture. ConfigGenerator ще продължи работа със зададения по подразбиране!</value>
|
||||
</data>
|
||||
<data name="ErrorNameAlreadyUsed" xml:space="preserve">
|
||||
<value>Потребителското име вече използвано!</value>
|
||||
<comment>This happens e.g. when user wants to create a bot with name that exists already</comment>
|
||||
</data>
|
||||
<data name="ErrorNameReserved" xml:space="preserve">
|
||||
<value>Това име е вече запазено!</value>
|
||||
<comment>This happens e.g. when user wants to create a bot with reserved name, such as "ASF"</comment>
|
||||
</data>
|
||||
<data name="ErrorObjectIsNull" xml:space="preserve">
|
||||
<value>{0} е нулев!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorVersionMismatch" xml:space="preserve">
|
||||
<value>Опитахте се да ползвате невалидна версия на ConfigGenerator, за вашия ASF!
|
||||
|
||||
ASF: {0} | ConfigGenerator: {1}
|
||||
|
||||
Моля ползвайте ConfigGenerator със съответсваща версия на вашия ASF! Ще бъдете пренасочен към съответващата версия...</value>
|
||||
<comment>{0} will be replaced by ASF version (string), {1} will be replaced by ConfigGenerator version (string). Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
<data name="New" xml:space="preserve">
|
||||
<value>Ново</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Removal" xml:space="preserve">
|
||||
<value>Премахване</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Rename" xml:space="preserve">
|
||||
<value>Преименуване</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="TutorialBotFormEnabled" xml:space="preserve">
|
||||
<value>Чудесно! Вече твоят бот е в готовност. Всъщност, това бе всичко, което ти трябваше да изпълниш, за да ползваш този бот в ASF, но все пак, може да поискаш да зададеш поне още 2 възможности: {0} и {1}. Ако искаш да продължиш с обучението, моля, заповявай. Не забравяй да се обърнеш към wiki ако не си сигурен, как различните настройки да бъдат зададени или ако искаш допълнителна помощ.</value>
|
||||
<comment>{0} will be replaced by "SteamLogin" configuration property, {1} will be replaced by "SteamPassword" configuration property</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
@@ -150,11 +204,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="UserInputBotName" xml:space="preserve">
|
||||
<value>Моля, въведете ново име за бот: </value>
|
||||
<comment>Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="WarningConfigPropertyModified" xml:space="preserve">
|
||||
<value>{0} бе зададено на: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by new value</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -197,7 +197,7 @@ Please use matching ConfigGenerator version for your ASF binary. You'll be redir
|
||||
<value>Your ASF is now ready! Simply launch ASF.exe binary and if you typed everything properly, you should notice that ASF is logging in and starts idling. If you have SteamGuard or two-factor authentication enabled, ASF might need to ask you for those credentials during runtime.</value>
|
||||
</data>
|
||||
<data name="TutorialFinished" xml:space="preserve">
|
||||
<value>Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuraton section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the software that we coded for you!</value>
|
||||
<value>Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuration section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the software that we coded for you!</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormBotsManagementButtons" xml:space="preserve">
|
||||
<value>At the top of the window you can notice currently loaded configs, and 3 extra buttons for removing [-], renaming [~] and adding new ones [+].</value>
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
<value>Actualizaciones</value>
|
||||
</data>
|
||||
<data name="ConfirmRemoval" xml:space="preserve">
|
||||
<value>¿Realmente quieres eliminar esta configuración?</value>
|
||||
<value>¿Seguro que quieres eliminar esta configuración?</value>
|
||||
</data>
|
||||
<data name="ErrorBotNameEmpty" xml:space="preserve">
|
||||
<value>¡El nombre de tu bot está vacío!</value>
|
||||
@@ -203,13 +203,30 @@ Por favor, usa la versión de ConfigGenerator correspondiente a tu ejecutable de
|
||||
<value>En la parte superior de la ventana puedes ver las configuraciones cargadas actualmente, así como tres botones extra para eliminar [-], renombrar [~] y añadir nuevas[+].</value>
|
||||
<comment>If possible, try to keep visual representation of buttons: [-], [~] and [+]</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="TutorialMainFormConfigurationWiki" xml:space="preserve">
|
||||
<value>Toda la información acerca de las propiedades de configuración disponibles (incluyendo su descripción, finalidad y valores aceptados) está disponible en nuestra wiki de GitHub. No dudes en usarla como referencia.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormConfigurationWindow" xml:space="preserve">
|
||||
<value>En medio de la ventana puedes configurar todas las propiedades disponibles para tu configuración seleccionada actualmente.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormFinished" xml:space="preserve">
|
||||
<value>De acuerdo, empecemos a configurar ASF. ¡Clica en el botón [+] para añadir tu primera cuenta de steam!</value>
|
||||
<comment>If possible, try to keep visual representation of [+] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormHelpButton" xml:space="preserve">
|
||||
<value>En la esquina superior derecha encontrarás el botón de ayuda [?], el cual te redirigirá a la wiki de ASF para más información.</value>
|
||||
<comment>If possible, try to keep visual representation of [?] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormShown" xml:space="preserve">
|
||||
<value>Esta es la pantalla principal del generador de configuraciones de ASF. ¡Es muy fácil de usar!</value>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormFinished" xml:space="preserve">
|
||||
<value>¡Como puedes ver, tu bot ya está listo para ser configurado! Lo primero que querrás hacer es cambiar la propiedad {0} de falso a verdadero. ¡Pruébalo!</value>
|
||||
<comment>{0} will be replaced by name of the configuration property ("Enabled")</comment>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormShown" xml:space="preserve">
|
||||
<value>¡Bien hecho! Ahora se te pedirá el nombre de tu bot. Un buen ejemplo podría ser un nick que estés usando para la cuenta de steam que vas a configurar, o cualquier otro nombre a tu elección que te permita conectar con facilidad con la instancia del bot que está siendo configurado.</value>
|
||||
</data>
|
||||
<data name="TutorialStart" xml:space="preserve">
|
||||
<value>¡Bienvenido! Me he dado cuenta de que estás usando ASF ConfigGenerator por primera vez, así que déjame que te ayude un poco.</value>
|
||||
</data>
|
||||
|
||||
@@ -123,32 +123,92 @@
|
||||
|
||||
|
||||
|
||||
<data name="ConfirmRemoval" xml:space="preserve">
|
||||
<value>Haluatko varmasti poistaa tämän config tiedoston?</value>
|
||||
</data>
|
||||
<data name="ErrorBotNameEmpty" xml:space="preserve">
|
||||
<value>Botin nimi on tyhjä!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRemoveGlobalConfig" xml:space="preserve">
|
||||
<value>Et voi poistaa global config tiedostoa!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRenameGlobalConfig" xml:space="preserve">
|
||||
<value>Et voi uudelleennimetä global config tiedostoa!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
|
||||
<value>Config kansiota ei löytynyt!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
|
||||
<value>Kohdassa {0} muokattu arvo {1} on epäkelpo.</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>Antamasi/syöttämäsi CurrentCulture on epäkelpo, ConfigGenerator jatkaa toimintaa oletusarvolla!</value>
|
||||
</data>
|
||||
<data name="ErrorNameAlreadyUsed" xml:space="preserve">
|
||||
<value>Tämä nimi on jo käytössä!</value>
|
||||
<comment>This happens e.g. when user wants to create a bot with name that exists already</comment>
|
||||
</data>
|
||||
<data name="ErrorNameReserved" xml:space="preserve">
|
||||
<value>Tämä nimi on jo käytössä!</value>
|
||||
<comment>This happens e.g. when user wants to create a bot with reserved name, such as "ASF"</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorVersionMismatch" xml:space="preserve">
|
||||
<value>Yritit käyttää epäsopivaa ConfigGenerator versiota ASF :lläsi!
|
||||
|
||||
ASF: {0} | ConfigGenerator: {1}
|
||||
|
||||
Käytä yhteensopivaa ConfigGenerator versiota ASF binäärillesi. Sinut ohjataan oikean julkaisun sivulle...</value>
|
||||
<comment>{0} will be replaced by ASF version (string), {1} will be replaced by ConfigGenerator version (string). Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
<data name="New" xml:space="preserve">
|
||||
<value>Uusi</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Removal" xml:space="preserve">
|
||||
<value>Poistaminen</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Rename" xml:space="preserve">
|
||||
<value>Nimeä uudelleen</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
|
||||
<data name="TutorialBotFormReady" xml:space="preserve">
|
||||
<value>ASF on nyt valmis! Käynnistä ASF.exe binääri ja jos syötit kaikki tiedot oikein, pitäisi sinun huomata että ASF kirjautuu sisään ja aloittaa idlaamisen. Jos sinulla on SteamGuard tai kaksivaiheinen todennus käytössä, saattaa ASF joutua kysymään sinulta valtuuksia noita käyttäjiä varten.</value>
|
||||
</data>
|
||||
|
||||
<data name="TutorialMainFormBotsManagementButtons" xml:space="preserve">
|
||||
<value>Ikkunan yläosassa voit huomata tällä hetkellä ladatun configin ja 3 extra painiketta, poistamiselle [-], uudelleennimeämiselle [~] ja uusien lisäämiselle [+].</value>
|
||||
<comment>If possible, try to keep visual representation of buttons: [-], [~] and [+]</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="TutorialMainFormFinished" xml:space="preserve">
|
||||
<value>Okei. Aloitetaan konfiguroimaan meidän ASF :ää. Paina plus-painiketta [+] lisätäksesi ensimmäinen steam accountisi!</value>
|
||||
<comment>If possible, try to keep visual representation of [+] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormHelpButton" xml:space="preserve">
|
||||
<value>Oikeasta yläkulmasta löytyy apua-painike [?] joka ohjaa sinut ASF wikiin lisätiedon saamiseksi.</value>
|
||||
<comment>If possible, try to keep visual representation of [?] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormShown" xml:space="preserve">
|
||||
<value>Tämä on ASF ConfigGeneratorin pääikkuna, se on todella helppo käyttää!</value>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormFinished" xml:space="preserve">
|
||||
<value>Kuten näet, sinun bottisi on nyt valmiina muokattavaksi! Ensimmäinen asia jonka haluat tehdä on muuttaa kohdasta {0} arvo false to true, kokeile!</value>
|
||||
<comment>{0} will be replaced by name of the configuration property ("Enabled")</comment>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormShown" xml:space="preserve">
|
||||
<value>Hienoa! Nyt sinua pyydetään nimeämään bottisi. Hyvä esimerkki on nimetä se steam accountin mukaan jota aiot konfiguroida. Mikä tahansa muukin nimi käy, kunhan se on sinulle helposti yhdistettävissä samaan botti-instanssiin jota aiot konfiguroida.</value>
|
||||
</data>
|
||||
<data name="TutorialStart" xml:space="preserve">
|
||||
<value>Tervetuloa! Huomasin, että käytät ASF ConfigGeneratoria ensimmäistä kertaa, anna minun auttaa sinut alkuun.</value>
|
||||
</data>
|
||||
<data name="UserInputBotName" xml:space="preserve">
|
||||
<value>Anna uudelle botillesi nimi: </value>
|
||||
<comment>Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
</root>
|
||||
@@ -117,26 +117,48 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
|
||||
<data name="CategoryAdvanced" xml:space="preserve">
|
||||
<value>Geadvanceerd</value>
|
||||
<data name="CategoryAccess" xml:space="preserve">
|
||||
<value>Toegang</value>
|
||||
</data>
|
||||
<data name="CategoryAdvanced" xml:space="preserve">
|
||||
<value>Geavanceerd</value>
|
||||
</data>
|
||||
<data name="CategoryCore" xml:space="preserve">
|
||||
<value>Kern</value>
|
||||
</data>
|
||||
<data name="CategoryDebugging" xml:space="preserve">
|
||||
<value>Debuggen</value>
|
||||
</data>
|
||||
<data name="CategoryPerformance" xml:space="preserve">
|
||||
<value>Prestaties</value>
|
||||
</data>
|
||||
<data name="CategoryUpdates" xml:space="preserve">
|
||||
<value>Updates</value>
|
||||
</data>
|
||||
<data name="ConfirmRemoval" xml:space="preserve">
|
||||
<value>Wil je deze configuratie echt verwijderen?</value>
|
||||
</data>
|
||||
<data name="ErrorBotNameEmpty" xml:space="preserve">
|
||||
<value>Je bot heeft geen naam!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRemoveGlobalConfig" xml:space="preserve">
|
||||
<value>Je kan het globale config bestand niet verwijderen!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRenameGlobalConfig" xml:space="preserve">
|
||||
<value>Je kan het globale config bestand niet hernoemen!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
|
||||
<value>Configuratiefolder kon niet gevonden worden!</value>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
|
||||
<value>Geconfigureerde {0} eigenschap is ongeldig: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>De opgegeven CurrentCulture is ongeldig, ConfigGenerator blijft draaien met de standaard!</value>
|
||||
</data>
|
||||
<data name="ErrorNameAlreadyUsed" xml:space="preserve">
|
||||
<value>Deze naam is al in gebruik!</value>
|
||||
<value>Deze naam is al gebruikt!</value>
|
||||
<comment>This happens e.g. when user wants to create a bot with name that exists already</comment>
|
||||
</data>
|
||||
<data name="ErrorNameReserved" xml:space="preserve">
|
||||
@@ -147,28 +169,74 @@
|
||||
<value>{0} is nul!</value>
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
|
||||
<data name="ErrorVersionMismatch" xml:space="preserve">
|
||||
<value>Je hebt geprobeerd om een ongeldige ConfigGenerator versie te gebruiken voor ASF!
|
||||
|
||||
ASF: {0} | ConfigGenerator: {1}
|
||||
|
||||
Gebruik een zelfde versie ConfigGenerator voor je ASF bestand. Je wordt verwezen naar de juiste release...</value>
|
||||
<comment>{0} will be replaced by ASF version (string), {1} will be replaced by ConfigGenerator version (string). Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
<data name="New" xml:space="preserve">
|
||||
<value>Nieuw</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<data name="Removal" xml:space="preserve">
|
||||
<value>Verwijderen</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Rename" xml:space="preserve">
|
||||
<value>Hernoemen</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="TutorialBotFormEnabled" xml:space="preserve">
|
||||
<value>Proficiat! Je bot instance is actief. Feitelijk was dat alles dat je moest doen om deze bot in ASF te gebruiken, maar je wilt misschien nog 2 andere config waardes instellen: {0} en {1}.
|
||||
Je kan, als je wilt, doorgaan met deze tutorial. Vergeet niet de wiki te gebruiken als je niet zeker weet hoe een waarde moet worden ingesteld. Dit geldt ook als je meer hulp nodig hebt.</value>
|
||||
<comment>{0} will be replaced by "SteamLogin" configuration property, {1} will be replaced by "SteamPassword" configuration property</comment>
|
||||
</data>
|
||||
<data name="TutorialBotFormReady" xml:space="preserve">
|
||||
<value>Je ASF is nu klaar! Simpelweg ASF.exe starten en als je alles correct hebt ingevuld, zul je merken dat ASF aan het inloggen en begonnen is met idlen. Als je SteamGuard twee factor authenticatie aan hebt staan, kan het zijn dat ASF voor deze gegevens vraagt tijdens het starten.</value>
|
||||
</data>
|
||||
<data name="TutorialFinished" xml:space="preserve">
|
||||
<value>Proficiat! Je hebt alles gedaan dat nodig is om ASF bruikbaar te maken, hiermee is deze tutorial die we hebben klaargezet ook afgerond. Het wordt sterk aanbevolen om de hele 'configuration' sectie op de wiki te lezen, aangezien ASF leuke eigenschappen heeft die geconfigureerd kunnen worden. Zoals offline farmen of afstemmen van ASF voor het meest efficiënte idling algoritme voor je account. Dit alles is optioneel en je kan de ConfigGenerator afsluiten als je dit wilt. We hopen dat je zult genieten van de software die we voor jou hebben geschreven!</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormBotsManagementButtons" xml:space="preserve">
|
||||
<value>Bovenaan het venster zie je de huidig geladen configuraties en 3 extra knoppen voor verwijderen [-], hernoemen [~] en toevoegen van nieuwe configuraties [+].</value>
|
||||
<comment>If possible, try to keep visual representation of buttons: [-], [~] and [+]</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormConfigurationWiki" xml:space="preserve">
|
||||
<value>Hou rekening dat alle informatie met betrekking tot alle beschikbare config eigenschappen, inclusief hun uitleg, doel en geaccepteerde waardes, beschikbaar is op onze GitHub wiki. Graag dit als referentie gebruiken.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormConfigurationWindow" xml:space="preserve">
|
||||
<value>In het midden van de venster kan alle config eigenschappen die beschikbaar zijn configureren. Dit geldt voor de huidig geselecteerde config.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormFinished" xml:space="preserve">
|
||||
<value>Laten we beginnen met het configureren van ASF. Klik op de plus [+] knop om je eerste Steam account toe te voegen!</value>
|
||||
<comment>If possible, try to keep visual representation of [+] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormHelpButton" xml:space="preserve">
|
||||
<value>In de bovenrechter hoek vindt je de help knop [?] die je doorverwijst naar de ASF wiki voor meer informatie.</value>
|
||||
<comment>If possible, try to keep visual representation of [?] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormShown" xml:space="preserve">
|
||||
<value>Dit is de hoofd ASF ConfigGenerator scherm, het is heel simpel in gebruik!</value>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormFinished" xml:space="preserve">
|
||||
<value>Zoals je ziet, je bot is nu gereed voor configuratie! Het eerste dat je wilt doen is {0} eigenschap schakelen van false naar true, probeer het!</value>
|
||||
<comment>{0} will be replaced by name of the configuration property ("Enabled")</comment>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormShown" xml:space="preserve">
|
||||
<value>Goed gedaan! Je wordt nu gevraagd voor een naam voor je bot. Een goede voorbeeld is de nickname die je voor je Steam account gebruikt. Of elk ander naam die makkelijk voor jou is om te herinneren om welke bot het gaat.</value>
|
||||
</data>
|
||||
<data name="TutorialStart" xml:space="preserve">
|
||||
<value>Welkom! Ik zie dat dit de eerste keer is dat je ASF ConfigGenerator gebruikt, laat me je daar een beetje mee helpen.</value>
|
||||
</data>
|
||||
<data name="UserInputBotName" xml:space="preserve">
|
||||
<value>Voer een nieuwe naam in voor de bot: </value>
|
||||
<comment>Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
|
||||
<data name="WarningConfigPropertyModified" xml:space="preserve">
|
||||
<value>{0} staat nu op: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by new value</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -118,16 +118,16 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="CategoryAccess" xml:space="preserve">
|
||||
<value>Permissão de Acesso</value>
|
||||
<value>Permissão de acesso</value>
|
||||
</data>
|
||||
<data name="CategoryAdvanced" xml:space="preserve">
|
||||
<value>Preferências avançadas</value>
|
||||
<value>Avançado</value>
|
||||
</data>
|
||||
<data name="CategoryCore" xml:space="preserve">
|
||||
<value>Básico</value>
|
||||
<value>Principal</value>
|
||||
</data>
|
||||
<data name="CategoryDebugging" xml:space="preserve">
|
||||
<value>Depurando</value>
|
||||
<value>Depuração</value>
|
||||
</data>
|
||||
<data name="CategoryPerformance" xml:space="preserve">
|
||||
<value>Desempenho</value>
|
||||
@@ -136,10 +136,10 @@
|
||||
<value>Atualizações</value>
|
||||
</data>
|
||||
<data name="ConfirmRemoval" xml:space="preserve">
|
||||
<value>Você deseja realmente remover essa configuração?</value>
|
||||
<value>Você realmente deseja remover essa configuração?</value>
|
||||
</data>
|
||||
<data name="ErrorBotNameEmpty" xml:space="preserve">
|
||||
<value>O nome de seu bot está em branco!</value>
|
||||
<value>O nome do bot está em branco!</value>
|
||||
</data>
|
||||
<data name="ErrorCantRemoveGlobalConfig" xml:space="preserve">
|
||||
<value>Você não pode remover a configuração global!</value>
|
||||
@@ -148,14 +148,14 @@
|
||||
<value>Você não pode renomear a configuração global!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
|
||||
<value>Configuração do diretório não pôde ser encontrada!</value>
|
||||
<value>Diretório da configuração não encontrado!</value>
|
||||
</data>
|
||||
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
|
||||
<value>Configuração {0} inválida com a propriedade: {1}</value>
|
||||
<value>Configuração da propriedade {0} inválida: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
|
||||
</data>
|
||||
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
|
||||
<value>Sua CurrentCulture é inválida, o ConfigGenerator continuará executando pelo padrão!</value>
|
||||
<value>A propriedade CurrentCulture fornecida é inválida, o ConfigGenerator continuará executando com o valor padrão!</value>
|
||||
</data>
|
||||
<data name="ErrorNameAlreadyUsed" xml:space="preserve">
|
||||
<value>Este nome já está em uso!</value>
|
||||
@@ -170,11 +170,11 @@
|
||||
<comment>{0} will be replaced by object's name</comment>
|
||||
</data>
|
||||
<data name="ErrorVersionMismatch" xml:space="preserve">
|
||||
<value>Você tentou usar uma versão inválida do ConfigGenerator em seu ASF!
|
||||
<value>Você tentou usar uma versão inválida do ConfigGenerator no seu ASF!
|
||||
|
||||
ASF: {0} | ConfigGenerator: {1}
|
||||
|
||||
Por favor use uma versão do ConfigGenerator correspondente ao seu ASF. Você será redirecionado para a versão apropriada...</value>
|
||||
Por favor, use uma versão do ConfigGenerator correspondente ao seu ASF. Você será redirecionado para a versão apropriada...</value>
|
||||
<comment>{0} will be replaced by ASF version (string), {1} will be replaced by ConfigGenerator version (string). Please note that this string should include newlines for formatting.</comment>
|
||||
</data>
|
||||
<data name="New" xml:space="preserve">
|
||||
@@ -182,7 +182,7 @@ Por favor use uma versão do ConfigGenerator correspondente ao seu ASF. Você se
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Removal" xml:space="preserve">
|
||||
<value>Eliminar</value>
|
||||
<value>Remoção</value>
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="Rename" xml:space="preserve">
|
||||
@@ -190,52 +190,52 @@ Por favor use uma versão do ConfigGenerator correspondente ao seu ASF. Você se
|
||||
<comment>This is used as MessageBox title</comment>
|
||||
</data>
|
||||
<data name="TutorialBotFormEnabled" xml:space="preserve">
|
||||
<value>Excelente! Seu bot agora está ativado. Na verdade, isso era tudo que você precisava fazer para rodar este bot no ASF, mas talvez você deveria configurar mais duas propriedades: {0} e {1}. Caso queira continuar o tutorial, fique à vontade. Lembre-se de consultar a Wiki se você não tem certeza se tal propriedade deve ser configurada, ou se precisar de uma ajuda extra.</value>
|
||||
<value>Excelente! O seu bot agora está ativado. Na verdade, isso era tudo que você precisava fazer para usar esse bot no ASF, mas talvez você queira configurar mais duas propriedades: {0} e {1}. Caso queira continuar o tutorial, fique à vontade. Lembre-se de consultar a Wiki caso não tenha certeza de como alguma propriedade deve ser configurada ou se precisar de uma ajuda extra.</value>
|
||||
<comment>{0} will be replaced by "SteamLogin" configuration property, {1} will be replaced by "SteamPassword" configuration property</comment>
|
||||
</data>
|
||||
<data name="TutorialBotFormReady" xml:space="preserve">
|
||||
<value>Seu ASF está agora pronto! Basta executar o ASF.exe e digitar tudo corretamente, você verá o ASF entrar em seção e começar o processo de receber cartas. Se você tiver o SteamGuard ou autenticação por dois fatores ativado, o ASF te perguntará por essas credenciais durante o processo.</value>
|
||||
<value>O ASF agora está pronto! Basta executar o ASF.exe e digitar tudo corretamente para que o ASF inicie a sessão e comece o processo de coleta. Caso tenha o Steam Guard ou a autenticação em duas etapas ativada, o ASF pedirá por essas credenciais durante o processo.</value>
|
||||
</data>
|
||||
<data name="TutorialFinished" xml:space="preserve">
|
||||
<value>Parabéns! Você fez tudo que era necessário para deixar o ASF em processo de uso, isso também completa o tutorial que preparamos para você. É altamente recomendado agora ler toda a seção de configuração na Wiki, pois o ASF oferece outras ótimas funções para você configurar, como receber cartas em modo offline ou ativar o ASF no melhor modo algorítimo de receber cartas para a sua conta. Tudo isso claro, é opcional, e você pode fechar nosso configurador quando quiser. Nós desejamos que aproveite o programa que desenvolvemos para você!</value>
|
||||
<value>Parabéns! Você fez tudo que era necessário para deixar o ASF usável, isso também completa o tutorial que preparamos para você. É altamente recomendado agora ler toda a seção de configuração na Wiki, pois o ASF oferece outras ótimas funções para você configurar, como receber cartas em modo offline ou ativar o ASF no algoritmo mais eficiente de receber cartas para a sua conta. Claro que tudo isso é opcional e você pode fechar o nosso configurador quando quiser. Nós desejamos que aproveite o programa que desenvolvemos para você!</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormBotsManagementButtons" xml:space="preserve">
|
||||
<value>Na parte superior da janela, você pode notar que atualmente as configurações abertas, e 3 botões extras para remoção [-], renomeação [~] e adição de novos [+].</value>
|
||||
<value>Na parte superior da janela você pode ver as configurações atualmente abertas e 3 botões extras para remoção [-], renomeação [~] e adição [+] de novas.</value>
|
||||
<comment>If possible, try to keep visual representation of buttons: [-], [~] and [+]</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormConfigurationWiki" xml:space="preserve">
|
||||
<value>Por favor, note-se que todas informações sobre as propriedades das configurações disponíveis, incluindo suas descrições, finalidades, e valores aceitos, estão disponíveis em nossa Wiki no GitHub. Por favor use isto como referência.</value>
|
||||
<value>Por favor, observe que todas as informações sobre as propriedades das configurações disponíveis, incluindo descrições, finalidades e valores aceitos estão disponíveis na nossa Wiki no GitHub. Use-a como referência.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormConfigurationWindow" xml:space="preserve">
|
||||
<value>No meio da janela você pode configurar todas as propriedades das configurações que estão disponíveis para você, para as suas atuais configurações selecionadas.</value>
|
||||
<value>No meio da janela você pode configurar todas as propriedades das configurações que estão disponíveis para você, para as configurações selecionadas atualmente.</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormFinished" xml:space="preserve">
|
||||
<value>Certo, vamos começar a configurar nosso ASF. Clique no botão de mais [+] para adicionar sua primeira conta do Steam!</value>
|
||||
<value>Certo, vamos começar a configurar o ASF. Clique no botão de mais [+] para adicionar a sua primeira conta Steam!</value>
|
||||
<comment>If possible, try to keep visual representation of [+] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormHelpButton" xml:space="preserve">
|
||||
<value>No canto superior você encontrará o botão de ajuda [?] que te redirecionará para a Wiki do ASF para mais informações.</value>
|
||||
<value>No canto superior direito você encontrará o botão de ajuda [?] que te redirecionará para a Wiki do ASF para mais informações.</value>
|
||||
<comment>If possible, try to keep visual representation of [?] button</comment>
|
||||
</data>
|
||||
<data name="TutorialMainFormShown" xml:space="preserve">
|
||||
<value>Esta é a janela principal do ASF ConfigGenerator, é muito fácil de usar!</value>
|
||||
<value>Esta é a janela principal do ConfigGenerator do ASF, é muito fácil de usar!</value>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormFinished" xml:space="preserve">
|
||||
<value>Como você pode ver, seu bot está agora pronto para ser configurado! A primeira coisa que você deve fazer é trocar a propriedade {0} de falso para verdadeiro, experimente!</value>
|
||||
<value>Como você pode ver, o seu bot está agora pronto para ser configurado! A primeira coisa que você deve fazer é trocar a propriedade {0} de falso (false) para verdadeiro (true), experimente!</value>
|
||||
<comment>{0} will be replaced by name of the configuration property ("Enabled")</comment>
|
||||
</data>
|
||||
<data name="TutorialNewBotFormShown" xml:space="preserve">
|
||||
<value>Bom trabalho! Agora você será pedido para inserir o nome de seu bot. Um bom exemplo seria um nick que você usa para o nome da sua conta do Steam que está prestes a ser configurada, ou qualquer outro nome que você desejar e seja fácil para você conectar a instância do bot que está sendo configurado.</value>
|
||||
<value>Bom trabalho! Agora você precisará informar o nome do bot. Um bom exemplo seria o apelido usado na conta Steam que você está configurando, ou qualquer outro nome que você desejar que seja fácil para você conectar com a instância configurada.</value>
|
||||
</data>
|
||||
<data name="TutorialStart" xml:space="preserve">
|
||||
<value>Bem-Vindo! Eu notei que você está usando o ASF ConfigGenerator pela primeira vez, então deixe-me te ajudar.</value>
|
||||
<value>Bem-vindo(a)! Notei que você está usando o ConfigGenerator do ASF pela primeira vez, então deixe-me ajudá-lo(a).</value>
|
||||
</data>
|
||||
<data name="UserInputBotName" xml:space="preserve">
|
||||
<value>Por favor, insira o novo nome do bot: </value>
|
||||
<value>Insira o nome do novo do bot: </value>
|
||||
<comment>Please note that this translation should end with space</comment>
|
||||
</data>
|
||||
<data name="WarningConfigPropertyModified" xml:space="preserve">
|
||||
<value>{0} foi definido como: {1}</value>
|
||||
<value>{0} definido como: {1}</value>
|
||||
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by new value</comment>
|
||||
</data>
|
||||
</root>
|
||||
@@ -197,7 +197,7 @@ Please use matching ConfigGenerator version for your ASF binary. You'll be redir
|
||||
<value>Your ASF is now ready! Simply launch ASF.exe binary and if you typed everything properly, you should notice that ASF is logging in and starts idling. If you have SteamGuard or two-factor authentication enabled, ASF might need to ask you for those credentials during runtime.</value>
|
||||
</data>
|
||||
<data name="TutorialFinished" xml:space="preserve">
|
||||
<value>Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuraton section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the software that we coded for you!</value>
|
||||
<value>Congratulations! You've done everything that is needed in order to make ASF usable, that also finishes the tutorial that we prepared for you. It's highly recommended to read entire configuration section on the wiki now, as ASF offers some really neat features for you to configure, such as offline farming or tuning ASF for using the most efficient idling algorithm for your account. All of that is optional though, and you're free to close our configurator whenever you wish. We hope that you'll enjoy the software that we coded for you!</value>
|
||||
</data>
|
||||
<data name="TutorialMainFormBotsManagementButtons" xml:space="preserve">
|
||||
<value>At the top of the window you can notice currently loaded configs, and 3 extra buttons for removing [-], renaming [~] and adding new ones [+].</value>
|
||||
|
||||
@@ -118,10 +118,10 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="CategoryAccess" xml:space="preserve">
|
||||
<value>Erişim</value>
|
||||
<value>Erişim İzni</value>
|
||||
</data>
|
||||
<data name="CategoryAdvanced" xml:space="preserve">
|
||||
<value>Gelişmiş</value>
|
||||
<value>İleri düzey</value>
|
||||
</data>
|
||||
<data name="CategoryCore" xml:space="preserve">
|
||||
<value>Temel</value>
|
||||
|
||||
3
ConfigGenerator/Localization/README.md
Normal file
3
ConfigGenerator/Localization/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
This directory contains ASF strings for display and localization purposes.
|
||||
|
||||
All strings used by ASF can be found in main ```CGStrings.resx``` file, and that's also the only file that should be modified - all other files are managed automatically and should not be touched. Please visit **[localization](https://github.com/JustArchi/ArchiSteamFarm/wiki/Localization)** section on the wiki if you want to improve translation of other files.
|
||||
@@ -65,8 +65,8 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="SteamKit2, Version=1.8.0.26737, Culture=neutral, PublicKeyToken=ed3ce47ed5aad940, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\SteamKit2.1.8.0\lib\net45\SteamKit2.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\ArchiSteamFarm\lib\SteamKit2.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
@@ -160,6 +160,9 @@
|
||||
<Compile Include="..\ArchiSteamFarm\SteamSaleEvent.cs">
|
||||
<Link>SteamSaleEvent.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\ArchiSteamFarm\SteamTarget.cs">
|
||||
<Link>SteamTarget.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\ArchiSteamFarm\Trading.cs">
|
||||
<Link>Trading.cs</Link>
|
||||
</Compile>
|
||||
|
||||
3
GUI/Localization/README.md
Normal file
3
GUI/Localization/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
This directory contains ASF strings for display and localization purposes.
|
||||
|
||||
All strings used by ASF can be found in main ```GUIStrings.resx``` file, and that's also the only file that should be modified - all other files are managed automatically and should not be touched. Please visit **[localization](https://github.com/JustArchi/ArchiSteamFarm/wiki/Localization)** section on the wiki if you want to improve translation of other files.
|
||||
@@ -59,7 +59,7 @@ namespace ArchiSteamFarm {
|
||||
BotStatusForm.BotForms[PreviouslySelectedBotName].Visible = true;
|
||||
}
|
||||
|
||||
private void MainForm_FormClosed(object sender, FormClosedEventArgs e) => Program.InitShutdownSequence();
|
||||
private async void MainForm_FormClosed(object sender, FormClosedEventArgs e) => await Program.InitShutdownSequence().ConfigureAwait(false);
|
||||
|
||||
private async void MainForm_Load(object sender, EventArgs e) {
|
||||
Logging.InitFormLogger();
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using ArchiSteamFarm.Localization;
|
||||
using SteamKit2;
|
||||
|
||||
namespace ArchiSteamFarm {
|
||||
@@ -16,8 +17,14 @@ namespace ArchiSteamFarm {
|
||||
internal static GlobalDatabase GlobalDatabase { get; private set; }
|
||||
internal static WebBrowser WebBrowser { get; private set; }
|
||||
|
||||
internal static void Exit(int exitCode = 0) {
|
||||
InitShutdownSequence();
|
||||
private static bool ShutdownSequenceInitialized;
|
||||
|
||||
internal static async Task Exit(byte exitCode = 0) {
|
||||
if (exitCode != 0) {
|
||||
ASF.ArchiLogger.LogGenericError(Strings.ErrorExitingWithNonZeroErrorCode);
|
||||
}
|
||||
|
||||
await Shutdown().ConfigureAwait(false);
|
||||
Environment.Exit(exitCode);
|
||||
}
|
||||
|
||||
@@ -25,25 +32,28 @@ namespace ArchiSteamFarm {
|
||||
return null; // TODO
|
||||
}
|
||||
|
||||
internal static void InitShutdownSequence() {
|
||||
foreach (Bot bot in Bot.Bots.Values.Where(bot => bot.KeepRunning)) {
|
||||
bot.Stop();
|
||||
}
|
||||
}
|
||||
|
||||
internal static void Restart() {
|
||||
InitShutdownSequence();
|
||||
|
||||
try {
|
||||
Process.Start(Assembly.GetEntryAssembly().Location, string.Join(" ", Environment.GetCommandLineArgs().Skip(1)));
|
||||
} catch (Exception e) {
|
||||
ArchiLogger.LogGenericException(e);
|
||||
internal static async Task<bool> InitShutdownSequence() {
|
||||
if (ShutdownSequenceInitialized) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Environment.Exit(0);
|
||||
ShutdownSequenceInitialized = true;
|
||||
|
||||
IEnumerable<Task> tasks = Bot.Bots.Values.Select(bot => Task.Run(() => bot.Stop()));
|
||||
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(10 * 1000));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void Init() {
|
||||
internal static async Task Restart() {
|
||||
if (!await InitShutdownSequence().ConfigureAwait(false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Application.Restart();
|
||||
}
|
||||
|
||||
private static async Task Init() {
|
||||
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
|
||||
TaskScheduler.UnobservedTaskException += UnobservedTaskExceptionHandler;
|
||||
|
||||
@@ -77,7 +87,7 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
}
|
||||
|
||||
InitServices();
|
||||
await InitServices().ConfigureAwait(false);
|
||||
|
||||
// If debugging is on, we prepare debug directory prior to running
|
||||
if (GlobalConfig.Debug) {
|
||||
@@ -95,13 +105,13 @@ namespace ArchiSteamFarm {
|
||||
Logging.InitEnhancedLoggers();
|
||||
}
|
||||
|
||||
private static void InitServices() {
|
||||
private static async Task InitServices() {
|
||||
string globalConfigFile = Path.Combine(SharedInfo.ConfigDirectory, SharedInfo.GlobalConfigFileName);
|
||||
|
||||
GlobalConfig = GlobalConfig.Load(globalConfigFile);
|
||||
if (GlobalConfig == null) {
|
||||
ArchiLogger.LogGenericError("Global config could not be loaded, please make sure that " + globalConfigFile + " exists and is valid!");
|
||||
Exit(1);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
string globalDatabaseFile = Path.Combine(SharedInfo.ConfigDirectory, SharedInfo.GlobalDatabaseFileName);
|
||||
@@ -109,7 +119,7 @@ namespace ArchiSteamFarm {
|
||||
GlobalDatabase = GlobalDatabase.Load(globalDatabaseFile);
|
||||
if (GlobalDatabase == null) {
|
||||
ArchiLogger.LogGenericError("Global database could not be loaded, if issue persists, please remove " + globalDatabaseFile + " in order to recreate database!");
|
||||
Exit(1);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
ArchiWebHandler.Init();
|
||||
@@ -123,19 +133,29 @@ namespace ArchiSteamFarm {
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
private static void Main() {
|
||||
Init();
|
||||
Init().Wait();
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new MainForm());
|
||||
}
|
||||
|
||||
private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) {
|
||||
private static async Task Shutdown() {
|
||||
if (!await InitShutdownSequence().ConfigureAwait(false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
private static async void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) {
|
||||
if (args?.ExceptionObject == null) {
|
||||
ArchiLogger.LogNullError(nameof(args) + " || " + nameof(args.ExceptionObject));
|
||||
return;
|
||||
}
|
||||
|
||||
ArchiLogger.LogFatalException((Exception) args.ExceptionObject);
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
await Exit(1).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private static void UnobservedTaskExceptionHandler(object sender, UnobservedTaskExceptionEventArgs args) {
|
||||
@@ -145,6 +165,8 @@ namespace ArchiSteamFarm {
|
||||
}
|
||||
|
||||
ArchiLogger.LogFatalException(args.Exception);
|
||||
// Normally we should abort the application here, but many tasks are in fact failing in SK2 code which we can't easily fix
|
||||
// Thanks Valve.
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user