steamutils 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/.idea/codeStyles/Project.xml +1 -0
  2. package/.idea/deployment.xml +14 -0
  3. package/.prettierrc.json +3 -3
  4. package/SteamClient.js +3184 -3184
  5. package/_steamproto.js +39 -39
  6. package/axios.js +84 -84
  7. package/bufferHelpers.js +115 -115
  8. package/cheerio.js +103 -103
  9. package/const.js +518 -518
  10. package/create_proto.js +96 -96
  11. package/create_remote_file.js +153 -153
  12. package/full_steamproto.js +39 -39
  13. package/helpers/protos.js +48 -48
  14. package/index.js +88 -0
  15. package/package.json +2 -1
  16. package/protos/csgo/base_gcmessages.proto +553 -553
  17. package/protos/csgo/base_gcmessages_csgo.proto +547 -547
  18. package/protos/csgo/c_peer2peer_netmessages.proto +55 -55
  19. package/protos/csgo/clientmessages.proto +48 -48
  20. package/protos/csgo/connectionless_netmessages.proto +17 -17
  21. package/protos/csgo/cs_gameevents.proto +35 -35
  22. package/protos/csgo/cs_usercmd.proto +34 -34
  23. package/protos/csgo/cstrike15_usermessages.proto +592 -592
  24. package/protos/csgo/demo.proto +165 -165
  25. package/protos/csgo/econ_gcmessages.proto +219 -219
  26. package/protos/csgo/enums_clientserver.proto +1529 -1529
  27. package/protos/csgo/fatdemo.proto +125 -125
  28. package/protos/csgo/gameevents.proto +120 -120
  29. package/protos/csgo/gcsdk_gcmessages.proto +323 -323
  30. package/protos/csgo/gcsystemmsgs.proto +243 -243
  31. package/protos/csgo/netmessages.proto +618 -618
  32. package/protos/csgo/networkbasetypes.proto +246 -246
  33. package/protos/csgo/networksystem_protomessages.proto +17 -17
  34. package/protos/csgo/steamdatagram_messages_auth.proto +65 -65
  35. package/protos/csgo/steamdatagram_messages_sdr.proto +534 -534
  36. package/protos/csgo/steammessages_cloud.steamworkssdk.proto +68 -68
  37. package/protos/csgo/steammessages_gamenetworkingui.proto +61 -61
  38. package/protos/csgo/steammessages_helprequest.steamworkssdk.proto +22 -22
  39. package/protos/csgo/steammessages_oauth.steamworkssdk.proto +18 -18
  40. package/protos/csgo/steammessages_player.steamworkssdk.proto +254 -254
  41. package/protos/csgo/steammessages_publishedfile.steamworkssdk.proto +233 -233
  42. package/protos/csgo/steamnetworkingsockets_messages.proto +205 -205
  43. package/protos/csgo/steamnetworkingsockets_messages_certs.proto +39 -39
  44. package/protos/csgo/steamnetworkingsockets_messages_udp.proto +75 -75
  45. package/protos/csgo/te.proto +259 -259
  46. package/protos/csgo/uifontfile_format.proto +13 -13
  47. package/protos/csgo/usercmd.proto +39 -39
  48. package/protos/csgo/usermessages.proto +752 -752
  49. package/protos/google/protobuf/descriptor.proto +281 -281
  50. package/protos/steam/clientmetrics.proto +45 -45
  51. package/protos/steam/content_manifest.proto +62 -62
  52. package/protos/steam/contenthubs.proto +41 -41
  53. package/protos/steam/encrypted_app_ticket.proto +10 -10
  54. package/protos/steam/enums.proto +501 -501
  55. package/protos/steam/enums_clientserver.proto +1508 -1508
  56. package/protos/steam/enums_productinfo.proto +14 -14
  57. package/protos/steam/htmlmessages.proto +1039 -1039
  58. package/protos/steam/offline_ticket.proto +8 -8
  59. package/protos/steam/steamdatagram_messages_auth.proto +65 -65
  60. package/protos/steam/steamdatagram_messages_sdr.proto +533 -533
  61. package/protos/steam/steammessages_accounthardware.steamclient.proto +167 -167
  62. package/protos/steam/steammessages_appoverview.proto +204 -204
  63. package/protos/steam/steammessages_auth.steamclient.proto +375 -375
  64. package/protos/steam/steammessages_broadcast.steamclient.proto +618 -618
  65. package/protos/steam/steammessages_chat.steamclient.proto +1070 -1070
  66. package/protos/steam/steammessages_client_objects.proto +649 -649
  67. package/protos/steam/steammessages_clientlanp2p.proto +43 -43
  68. package/protos/steam/steammessages_clientmetrics.steamclient.proto +192 -192
  69. package/protos/steam/steammessages_clientnotificationtypes.proto +250 -250
  70. package/protos/steam/steammessages_clientserver.proto +392 -392
  71. package/protos/steam/steammessages_clientserver_2.proto +771 -771
  72. package/protos/steam/steammessages_clientserver_appinfo.proto +131 -131
  73. package/protos/steam/steammessages_clientserver_friends.proto +260 -260
  74. package/protos/steam/steammessages_clientserver_gameservers.proto +159 -159
  75. package/protos/steam/steammessages_clientserver_lbs.proto +70 -70
  76. package/protos/steam/steammessages_clientserver_login.proto +167 -167
  77. package/protos/steam/steammessages_clientserver_mms.proto +233 -233
  78. package/protos/steam/steammessages_clientserver_ucm.proto +207 -207
  79. package/protos/steam/steammessages_clientserver_uds.proto +125 -125
  80. package/protos/steam/steammessages_clientserver_ufs.proto +45 -45
  81. package/protos/steam/steammessages_clientserver_userstats.proto +80 -80
  82. package/protos/steam/steammessages_cloud.steamclient.proto +422 -422
  83. package/protos/steam/steammessages_contentsystem.steamclient.proto +123 -123
  84. package/protos/steam/steammessages_credentials.steamclient.proto +96 -96
  85. package/protos/steam/steammessages_datapublisher.steamclient.proto +102 -102
  86. package/protos/steam/steammessages_depotbuilder.steamclient.proto +99 -99
  87. package/protos/steam/steammessages_deviceauth.steamclient.proto +169 -169
  88. package/protos/steam/steammessages_econ.steamclient.proto +137 -137
  89. package/protos/steam/steammessages_familygroups.steamclient.proto +441 -441
  90. package/protos/steam/steammessages_friendmessages.steamclient.proto +141 -141
  91. package/protos/steam/steammessages_gamenetworking.steamclient.proto +25 -25
  92. package/protos/steam/steammessages_gamenetworkingui.proto +61 -61
  93. package/protos/steam/steammessages_gamenotifications.steamclient.proto +131 -131
  94. package/protos/steam/steammessages_gameservers.steamclient.proto +136 -136
  95. package/protos/steam/steammessages_hiddevices.proto +157 -157
  96. package/protos/steam/steammessages_inventory.steamclient.proto +172 -172
  97. package/protos/steam/steammessages_linkfilter.steamclient.proto +39 -39
  98. package/protos/steam/steammessages_lobbymatchmaking.steamclient.proto +29 -29
  99. package/protos/steam/steammessages_market.steamclient.proto +22 -22
  100. package/protos/steam/steammessages_marketingmessages.steamclient.proto +273 -273
  101. package/protos/steam/steammessages_offline.steamclient.proto +33 -33
  102. package/protos/steam/steammessages_parental.steamclient.proto +262 -262
  103. package/protos/steam/steammessages_parties.steamclient.proto +75 -75
  104. package/protos/steam/steammessages_partnerapps.steamclient.proto +106 -106
  105. package/protos/steam/steammessages_player.steamclient.proto +915 -915
  106. package/protos/steam/steammessages_publishedfile.steamclient.proto +737 -737
  107. package/protos/steam/steammessages_qms.steamclient.proto +111 -111
  108. package/protos/steam/steammessages_remoteclient.proto +100 -100
  109. package/protos/steam/steammessages_remoteclient_discovery.proto +244 -244
  110. package/protos/steam/steammessages_remoteclient_service.steamclient.proto +31 -31
  111. package/protos/steam/steammessages_remoteclient_service_messages.proto +217 -217
  112. package/protos/steam/steammessages_remoteplay.proto +975 -975
  113. package/protos/steam/steammessages_secrets.steamclient.proto +35 -35
  114. package/protos/steam/steammessages_shader.steamclient.proto +89 -89
  115. package/protos/steam/steammessages_site_license.steamclient.proto +103 -103
  116. package/protos/steam/steammessages_sitelicenseclient.proto +38 -38
  117. package/protos/steam/steammessages_siteserverui.proto +130 -130
  118. package/protos/steam/steammessages_steamtv.steamclient.proto +533 -533
  119. package/protos/steam/steammessages_store.steamclient.proto +404 -404
  120. package/protos/steam/steammessages_storebrowse.steamclient.proto +457 -457
  121. package/protos/steam/steammessages_timedtrial.steamclient.proto +40 -40
  122. package/protos/steam/steammessages_twofactor.steamclient.proto +157 -157
  123. package/protos/steam/steammessages_unified_test.steamclient.proto +51 -51
  124. package/protos/steam/steammessages_useraccount.steamclient.proto +211 -211
  125. package/protos/steam/steammessages_vac.steamclient.proto +37 -37
  126. package/protos/steam/steammessages_video.steamclient.proto +68 -68
  127. package/protos/steam/steammessages_virtualcontroller.proto +138 -138
  128. package/protos/steam/steammessages_workshop.steamclient.proto +19 -19
  129. package/protos/steam/steamnetworkingsockets_messages.proto +205 -205
  130. package/protos/steam/steamnetworkingsockets_messages_certs.proto +39 -39
  131. package/protos/steam/steamnetworkingsockets_messages_udp.proto +75 -75
  132. package/protos/steam/webuimessages_achievements.proto +29 -29
  133. package/protos/steam/webuimessages_gamenotes.proto +21 -21
  134. package/protos/steam/webuimessages_gamescope.proto +57 -57
  135. package/protos/steam/webuimessages_steamengine.proto +41 -41
  136. package/protos/steam/webuimessages_steamos.proto +114 -114
  137. package/protos/steam/webuimessages_storagedevicemanager.proto +110 -110
  138. package/protos/steam/webuimessages_systemmanager.proto +17 -17
  139. package/protos/steam/webuimessages_transport.proto +22 -22
  140. package/protos/steam/webuimessages_transportvalidation.proto +111 -111
  141. package/protos/webui/common.proto +4024 -4024
  142. package/protos/webui/service_accountcart.proto +153 -153
  143. package/protos/webui/service_accountlinking.proto +27 -27
  144. package/protos/webui/service_accountprivacy.proto +42 -42
  145. package/protos/webui/service_accountprivateapps.proto +34 -34
  146. package/protos/webui/service_auction.proto +97 -97
  147. package/protos/webui/service_authentication.proto +222 -222
  148. package/protos/webui/service_authenticationsupport.proto +74 -74
  149. package/protos/webui/service_broadcast.proto +562 -562
  150. package/protos/webui/service_chat.proto +11 -11
  151. package/protos/webui/service_chatroom.proto +810 -810
  152. package/protos/webui/service_chatusability.proto +107 -107
  153. package/protos/webui/service_checkout.proto +84 -84
  154. package/protos/webui/service_clan.proto +41 -41
  155. package/protos/webui/service_clanchatrooms.proto +25 -25
  156. package/protos/webui/service_clanfaqs.proto +202 -202
  157. package/protos/webui/service_clientcomm.proto +151 -151
  158. package/protos/webui/service_clientmetrics.proto +22 -22
  159. package/protos/webui/service_cloud.proto +222 -222
  160. package/protos/webui/service_cloudconfigstore.proto +51 -51
  161. package/protos/webui/service_cloudgaming.proto +30 -30
  162. package/protos/webui/service_community.proto +365 -365
  163. package/protos/webui/service_dailydeal.proto +89 -89
  164. package/protos/webui/service_econ.proto +134 -134
  165. package/protos/webui/service_embedded.proto +24 -24
  166. package/protos/webui/service_experimentservice.proto +6 -6
  167. package/protos/webui/service_familygroups.proto +355 -355
  168. package/protos/webui/service_fovasvideo.proto +15 -15
  169. package/protos/webui/service_friendmessages.proto +133 -133
  170. package/protos/webui/service_friendslist.proto +70 -70
  171. package/protos/webui/service_gamenotes.proto +15 -15
  172. package/protos/webui/service_gamerecording.proto +265 -265
  173. package/protos/webui/service_gamerecordingclip.proto +85 -85
  174. package/protos/webui/service_gamerecordingdebug.proto +52 -52
  175. package/protos/webui/service_helprequestlogs.proto +16 -16
  176. package/protos/webui/service_loyaltyrewards.proto +252 -252
  177. package/protos/webui/service_marketingmessages.proto +215 -215
  178. package/protos/webui/service_mobileapp.proto +18 -18
  179. package/protos/webui/service_mobileauth.proto +24 -24
  180. package/protos/webui/service_mobiledevice.proto +26 -26
  181. package/protos/webui/service_mobileperaccount.proto +31 -31
  182. package/protos/webui/service_news.proto +110 -110
  183. package/protos/webui/service_parental.proto +258 -258
  184. package/protos/webui/service_partnermembershipinvite.proto +34 -34
  185. package/protos/webui/service_partnerstorebrowse.proto +28 -28
  186. package/protos/webui/service_phone.proto +51 -51
  187. package/protos/webui/service_physicalgoods.proto +15 -15
  188. package/protos/webui/service_player.proto +918 -918
  189. package/protos/webui/service_promotioneventinvites.proto +109 -109
  190. package/protos/webui/service_promotionplanning.proto +186 -186
  191. package/protos/webui/service_promotionstats.proto +23 -23
  192. package/protos/webui/service_publishedfile.proto +714 -714
  193. package/protos/webui/service_publishing.proto +200 -200
  194. package/protos/webui/service_quest.proto +127 -127
  195. package/protos/webui/service_salefeature.proto +373 -373
  196. package/protos/webui/service_saleitemrewards.proto +54 -54
  197. package/protos/webui/service_shoppingcart.proto +152 -152
  198. package/protos/webui/service_steamawards.proto +76 -76
  199. package/protos/webui/service_steamcharts.proto +75 -75
  200. package/protos/webui/service_steamengine.proto +36 -36
  201. package/protos/webui/service_steamlearn.proto +876 -876
  202. package/protos/webui/service_steamnotification.proto +73 -73
  203. package/protos/webui/service_steamtv.proto +495 -495
  204. package/protos/webui/service_steamvrvoicechat.proto +67 -67
  205. package/protos/webui/service_steamvrwebrtc.proto +48 -48
  206. package/protos/webui/service_storagedevicemanager.proto +104 -104
  207. package/protos/webui/service_store.proto +359 -359
  208. package/protos/webui/service_storeappsimilarity.proto +76 -76
  209. package/protos/webui/service_storebrowse.proto +103 -103
  210. package/protos/webui/service_storemarketing.proto +44 -44
  211. package/protos/webui/service_storequery.proto +103 -103
  212. package/protos/webui/service_storesales.proto +87 -87
  213. package/protos/webui/service_storetopsellers.proto +44 -44
  214. package/protos/webui/service_systemmanager.proto +11 -11
  215. package/protos/webui/service_test_transporterror.proto +6 -6
  216. package/protos/webui/service_transportauth.proto +17 -17
  217. package/protos/webui/service_transportvalidation.proto +69 -69
  218. package/protos/webui/service_twofactor.proto +170 -170
  219. package/protos/webui/service_useraccount.proto +142 -142
  220. package/protos/webui/service_usergameactivity.proto +34 -34
  221. package/protos/webui/service_usergamenotes.proto +70 -70
  222. package/protos/webui/service_usernews.proto +68 -68
  223. package/protos/webui/service_userreviews.proto +97 -97
  224. package/protos/webui/service_video.proto +50 -50
  225. package/protos/webui/service_videoclip.proto +62 -62
  226. package/protos/webui/service_voicechat.proto +139 -139
  227. package/protos/webui/service_webrtc.proto +52 -52
  228. package/remote.js +19 -0
  229. package/steamproto.js +106 -1
  230. package/utils.js +1050 -1050
  231. package/.idea/gbrowser_project.xml +0 -11
  232. package/.idea/git_toolbox_blame.xml +0 -6
  233. package/.idea/git_toolbox_prj.xml +0 -15
package/utils.js CHANGED
@@ -1,1050 +1,1050 @@
1
- import moment from "moment";
2
- import SteamTotp from "steam-totp";
3
- import { EAuthTokenPlatformType } from "./const.js";
4
- import fs from "fs";
5
- import axios from "axios";
6
-
7
- const isBrowser = typeof window !== "undefined";
8
- const g_rgCurrencyData = {
9
- USD: {
10
- strCode: "USD",
11
- eCurrencyCode: 1,
12
- strSymbol: "$",
13
- bSymbolIsPrefix: true,
14
- bWholeUnitsOnly: false,
15
- strDecimalSymbol: ".",
16
- strThousandsSeparator: ",",
17
- strSymbolAndNumberSeparator: "",
18
- },
19
- GBP: {
20
- strCode: "GBP",
21
- eCurrencyCode: 2,
22
- strSymbol: "\u00a3",
23
- bSymbolIsPrefix: true,
24
- bWholeUnitsOnly: false,
25
- strDecimalSymbol: ".",
26
- strThousandsSeparator: ",",
27
- strSymbolAndNumberSeparator: "",
28
- },
29
- EUR: {
30
- strCode: "EUR",
31
- eCurrencyCode: 3,
32
- strSymbol: "\u20ac",
33
- bSymbolIsPrefix: false,
34
- bWholeUnitsOnly: false,
35
- strDecimalSymbol: ",",
36
- strThousandsSeparator: " ",
37
- strSymbolAndNumberSeparator: "",
38
- },
39
- CHF: {
40
- strCode: "CHF",
41
- eCurrencyCode: 4,
42
- strSymbol: "CHF",
43
- bSymbolIsPrefix: true,
44
- bWholeUnitsOnly: false,
45
- strDecimalSymbol: ".",
46
- strThousandsSeparator: " ",
47
- strSymbolAndNumberSeparator: " ",
48
- },
49
- RUB: {
50
- strCode: "RUB",
51
- eCurrencyCode: 5,
52
- strSymbol: "p\u0443\u0431.",
53
- bSymbolIsPrefix: false,
54
- bWholeUnitsOnly: true,
55
- strDecimalSymbol: ",",
56
- strThousandsSeparator: "",
57
- strSymbolAndNumberSeparator: " ",
58
- },
59
- BRL: {
60
- strCode: "BRL",
61
- eCurrencyCode: 7,
62
- strSymbol: "R$",
63
- bSymbolIsPrefix: true,
64
- bWholeUnitsOnly: false,
65
- strDecimalSymbol: ",",
66
- strThousandsSeparator: ".",
67
- strSymbolAndNumberSeparator: " ",
68
- },
69
- JPY: {
70
- strCode: "JPY",
71
- eCurrencyCode: 8,
72
- strSymbol: "\u00a5",
73
- bSymbolIsPrefix: true,
74
- bWholeUnitsOnly: true,
75
- strDecimalSymbol: ".",
76
- strThousandsSeparator: ",",
77
- strSymbolAndNumberSeparator: " ",
78
- },
79
- NOK: {
80
- strCode: "NOK",
81
- eCurrencyCode: 9,
82
- strSymbol: "kr",
83
- bSymbolIsPrefix: false,
84
- bWholeUnitsOnly: false,
85
- strDecimalSymbol: ",",
86
- strThousandsSeparator: ".",
87
- strSymbolAndNumberSeparator: " ",
88
- },
89
- IDR: {
90
- strCode: "IDR",
91
- eCurrencyCode: 10,
92
- strSymbol: "Rp",
93
- bSymbolIsPrefix: true,
94
- bWholeUnitsOnly: true,
95
- strDecimalSymbol: ".",
96
- strThousandsSeparator: " ",
97
- strSymbolAndNumberSeparator: " ",
98
- },
99
- MYR: {
100
- strCode: "MYR",
101
- eCurrencyCode: 11,
102
- strSymbol: "RM",
103
- bSymbolIsPrefix: true,
104
- bWholeUnitsOnly: false,
105
- strDecimalSymbol: ".",
106
- strThousandsSeparator: ",",
107
- strSymbolAndNumberSeparator: "",
108
- },
109
- PHP: {
110
- strCode: "PHP",
111
- eCurrencyCode: 12,
112
- strSymbol: "P",
113
- bSymbolIsPrefix: true,
114
- bWholeUnitsOnly: false,
115
- strDecimalSymbol: ".",
116
- strThousandsSeparator: ",",
117
- strSymbolAndNumberSeparator: "",
118
- },
119
- SGD: {
120
- strCode: "SGD",
121
- eCurrencyCode: 13,
122
- strSymbol: "S$",
123
- bSymbolIsPrefix: true,
124
- bWholeUnitsOnly: false,
125
- strDecimalSymbol: ".",
126
- strThousandsSeparator: ",",
127
- strSymbolAndNumberSeparator: "",
128
- },
129
- THB: {
130
- strCode: "THB",
131
- eCurrencyCode: 14,
132
- strSymbol: "\u0e3f",
133
- bSymbolIsPrefix: true,
134
- bWholeUnitsOnly: false,
135
- strDecimalSymbol: ".",
136
- strThousandsSeparator: ",",
137
- strSymbolAndNumberSeparator: "",
138
- },
139
- VND: {
140
- strCode: "VND",
141
- eCurrencyCode: 15,
142
- strSymbol: "\u20ab",
143
- bSymbolIsPrefix: false,
144
- bWholeUnitsOnly: true,
145
- strDecimalSymbol: ",",
146
- strThousandsSeparator: ".",
147
- strSymbolAndNumberSeparator: "",
148
- },
149
- KRW: {
150
- strCode: "KRW",
151
- eCurrencyCode: 16,
152
- strSymbol: "\u20a9",
153
- bSymbolIsPrefix: true,
154
- bWholeUnitsOnly: true,
155
- strDecimalSymbol: ".",
156
- strThousandsSeparator: ",",
157
- strSymbolAndNumberSeparator: " ",
158
- },
159
- TRY: {
160
- strCode: "TRY",
161
- eCurrencyCode: 17,
162
- strSymbol: "TL",
163
- bSymbolIsPrefix: false,
164
- bWholeUnitsOnly: false,
165
- strDecimalSymbol: ",",
166
- strThousandsSeparator: ".",
167
- strSymbolAndNumberSeparator: " ",
168
- },
169
- UAH: {
170
- strCode: "UAH",
171
- eCurrencyCode: 18,
172
- strSymbol: "\u20b4",
173
- bSymbolIsPrefix: false,
174
- bWholeUnitsOnly: true,
175
- strDecimalSymbol: ",",
176
- strThousandsSeparator: " ",
177
- strSymbolAndNumberSeparator: "",
178
- },
179
- MXN: {
180
- strCode: "MXN",
181
- eCurrencyCode: 19,
182
- strSymbol: "Mex$",
183
- bSymbolIsPrefix: true,
184
- bWholeUnitsOnly: false,
185
- strDecimalSymbol: ".",
186
- strThousandsSeparator: ",",
187
- strSymbolAndNumberSeparator: " ",
188
- },
189
- CAD: {
190
- strCode: "CAD",
191
- eCurrencyCode: 20,
192
- strSymbol: "CDN$",
193
- bSymbolIsPrefix: true,
194
- bWholeUnitsOnly: false,
195
- strDecimalSymbol: ".",
196
- strThousandsSeparator: ",",
197
- strSymbolAndNumberSeparator: " ",
198
- },
199
- AUD: {
200
- strCode: "AUD",
201
- eCurrencyCode: 21,
202
- strSymbol: "A$",
203
- bSymbolIsPrefix: true,
204
- bWholeUnitsOnly: false,
205
- strDecimalSymbol: ".",
206
- strThousandsSeparator: ",",
207
- strSymbolAndNumberSeparator: " ",
208
- },
209
- NZD: {
210
- strCode: "NZD",
211
- eCurrencyCode: 22,
212
- strSymbol: "NZ$",
213
- bSymbolIsPrefix: true,
214
- bWholeUnitsOnly: false,
215
- strDecimalSymbol: ".",
216
- strThousandsSeparator: ",",
217
- strSymbolAndNumberSeparator: " ",
218
- },
219
- PLN: {
220
- strCode: "PLN",
221
- eCurrencyCode: 6,
222
- strSymbol: "z\u0142",
223
- bSymbolIsPrefix: false,
224
- bWholeUnitsOnly: false,
225
- strDecimalSymbol: ",",
226
- strThousandsSeparator: " ",
227
- strSymbolAndNumberSeparator: "",
228
- },
229
- CNY: {
230
- strCode: "CNY",
231
- eCurrencyCode: 23,
232
- strSymbol: "\u00a5",
233
- bSymbolIsPrefix: true,
234
- bWholeUnitsOnly: false,
235
- strDecimalSymbol: ".",
236
- strThousandsSeparator: ",",
237
- strSymbolAndNumberSeparator: " ",
238
- },
239
- INR: {
240
- strCode: "INR",
241
- eCurrencyCode: 24,
242
- strSymbol: "\u20b9",
243
- bSymbolIsPrefix: true,
244
- bWholeUnitsOnly: true,
245
- strDecimalSymbol: ".",
246
- strThousandsSeparator: ",",
247
- strSymbolAndNumberSeparator: " ",
248
- },
249
- CLP: {
250
- strCode: "CLP",
251
- eCurrencyCode: 25,
252
- strSymbol: "CLP$",
253
- bSymbolIsPrefix: true,
254
- bWholeUnitsOnly: true,
255
- strDecimalSymbol: ",",
256
- strThousandsSeparator: ".",
257
- strSymbolAndNumberSeparator: " ",
258
- },
259
- PEN: {
260
- strCode: "PEN",
261
- eCurrencyCode: 26,
262
- strSymbol: "S/.",
263
- bSymbolIsPrefix: true,
264
- bWholeUnitsOnly: false,
265
- strDecimalSymbol: ".",
266
- strThousandsSeparator: ",",
267
- strSymbolAndNumberSeparator: "",
268
- },
269
- COP: {
270
- strCode: "COP",
271
- eCurrencyCode: 27,
272
- strSymbol: "COL$",
273
- bSymbolIsPrefix: true,
274
- bWholeUnitsOnly: true,
275
- strDecimalSymbol: ",",
276
- strThousandsSeparator: ".",
277
- strSymbolAndNumberSeparator: " ",
278
- },
279
- ZAR: {
280
- strCode: "ZAR",
281
- eCurrencyCode: 28,
282
- strSymbol: "R",
283
- bSymbolIsPrefix: true,
284
- bWholeUnitsOnly: false,
285
- strDecimalSymbol: ".",
286
- strThousandsSeparator: " ",
287
- strSymbolAndNumberSeparator: " ",
288
- },
289
- HKD: {
290
- strCode: "HKD",
291
- eCurrencyCode: 29,
292
- strSymbol: "HK$",
293
- bSymbolIsPrefix: true,
294
- bWholeUnitsOnly: false,
295
- strDecimalSymbol: ".",
296
- strThousandsSeparator: ",",
297
- strSymbolAndNumberSeparator: " ",
298
- },
299
- TWD: {
300
- strCode: "TWD",
301
- eCurrencyCode: 30,
302
- strSymbol: "NT$",
303
- bSymbolIsPrefix: true,
304
- bWholeUnitsOnly: true,
305
- strDecimalSymbol: ".",
306
- strThousandsSeparator: ",",
307
- strSymbolAndNumberSeparator: " ",
308
- },
309
- SAR: {
310
- strCode: "SAR",
311
- eCurrencyCode: 31,
312
- strSymbol: "SR",
313
- bSymbolIsPrefix: false,
314
- bWholeUnitsOnly: false,
315
- strDecimalSymbol: ".",
316
- strThousandsSeparator: ",",
317
- strSymbolAndNumberSeparator: " ",
318
- },
319
- AED: {
320
- strCode: "AED",
321
- eCurrencyCode: 32,
322
- strSymbol: "AED",
323
- bSymbolIsPrefix: false,
324
- bWholeUnitsOnly: false,
325
- strDecimalSymbol: ".",
326
- strThousandsSeparator: ",",
327
- strSymbolAndNumberSeparator: " ",
328
- },
329
- SEK: {
330
- strCode: "SEK",
331
- eCurrencyCode: 33,
332
- strSymbol: "kr",
333
- bSymbolIsPrefix: false,
334
- bWholeUnitsOnly: false,
335
- strDecimalSymbol: ".",
336
- strThousandsSeparator: ",",
337
- strSymbolAndNumberSeparator: " ",
338
- },
339
- ARS: {
340
- strCode: "ARS",
341
- eCurrencyCode: 34,
342
- strSymbol: "ARS$",
343
- bSymbolIsPrefix: true,
344
- bWholeUnitsOnly: false,
345
- strDecimalSymbol: ",",
346
- strThousandsSeparator: ".",
347
- strSymbolAndNumberSeparator: " ",
348
- },
349
- ILS: {
350
- strCode: "ILS",
351
- eCurrencyCode: 35,
352
- strSymbol: "\u20aa",
353
- bSymbolIsPrefix: true,
354
- bWholeUnitsOnly: false,
355
- strDecimalSymbol: ".",
356
- strThousandsSeparator: ",",
357
- strSymbolAndNumberSeparator: "",
358
- },
359
- BYN: {
360
- strCode: "BYN",
361
- eCurrencyCode: 36,
362
- strSymbol: "Br",
363
- bSymbolIsPrefix: true,
364
- bWholeUnitsOnly: false,
365
- strDecimalSymbol: ".",
366
- strThousandsSeparator: ",",
367
- strSymbolAndNumberSeparator: "",
368
- },
369
- KZT: {
370
- strCode: "KZT",
371
- eCurrencyCode: 37,
372
- strSymbol: "\u20b8",
373
- bSymbolIsPrefix: false,
374
- bWholeUnitsOnly: true,
375
- strDecimalSymbol: ",",
376
- strThousandsSeparator: " ",
377
- strSymbolAndNumberSeparator: "",
378
- },
379
- KWD: {
380
- strCode: "KWD",
381
- eCurrencyCode: 38,
382
- strSymbol: "KD",
383
- bSymbolIsPrefix: false,
384
- bWholeUnitsOnly: false,
385
- strDecimalSymbol: ".",
386
- strThousandsSeparator: ",",
387
- strSymbolAndNumberSeparator: " ",
388
- },
389
- QAR: {
390
- strCode: "QAR",
391
- eCurrencyCode: 39,
392
- strSymbol: "QR",
393
- bSymbolIsPrefix: false,
394
- bWholeUnitsOnly: false,
395
- strDecimalSymbol: ".",
396
- strThousandsSeparator: ",",
397
- strSymbolAndNumberSeparator: " ",
398
- },
399
- CRC: {
400
- strCode: "CRC",
401
- eCurrencyCode: 40,
402
- strSymbol: "\u20a1",
403
- bSymbolIsPrefix: true,
404
- bWholeUnitsOnly: true,
405
- strDecimalSymbol: ",",
406
- strThousandsSeparator: ".",
407
- strSymbolAndNumberSeparator: "",
408
- },
409
- UYU: {
410
- strCode: "UYU",
411
- eCurrencyCode: 41,
412
- strSymbol: "$U",
413
- bSymbolIsPrefix: true,
414
- bWholeUnitsOnly: true,
415
- strDecimalSymbol: ",",
416
- strThousandsSeparator: ".",
417
- strSymbolAndNumberSeparator: "",
418
- },
419
- BGN: {
420
- strCode: "BGN",
421
- eCurrencyCode: 42,
422
- strSymbol: "\u043b\u0432",
423
- bSymbolIsPrefix: false,
424
- bWholeUnitsOnly: false,
425
- strDecimalSymbol: ".",
426
- strThousandsSeparator: ",",
427
- strSymbolAndNumberSeparator: " ",
428
- },
429
- HRK: {
430
- strCode: "HRK",
431
- eCurrencyCode: 43,
432
- strSymbol: "kn",
433
- bSymbolIsPrefix: false,
434
- bWholeUnitsOnly: false,
435
- strDecimalSymbol: ".",
436
- strThousandsSeparator: ",",
437
- strSymbolAndNumberSeparator: " ",
438
- },
439
- CZK: {
440
- strCode: "CZK",
441
- eCurrencyCode: 44,
442
- strSymbol: "K\u010d",
443
- bSymbolIsPrefix: false,
444
- bWholeUnitsOnly: false,
445
- strDecimalSymbol: ".",
446
- strThousandsSeparator: ",",
447
- strSymbolAndNumberSeparator: " ",
448
- },
449
- DKK: {
450
- strCode: "DKK",
451
- eCurrencyCode: 45,
452
- strSymbol: "kr.",
453
- bSymbolIsPrefix: false,
454
- bWholeUnitsOnly: false,
455
- strDecimalSymbol: ".",
456
- strThousandsSeparator: ",",
457
- strSymbolAndNumberSeparator: " ",
458
- },
459
- HUF: {
460
- strCode: "HUF",
461
- eCurrencyCode: 46,
462
- strSymbol: "Ft",
463
- bSymbolIsPrefix: false,
464
- bWholeUnitsOnly: false,
465
- strDecimalSymbol: ".",
466
- strThousandsSeparator: ",",
467
- strSymbolAndNumberSeparator: " ",
468
- },
469
- RON: {
470
- strCode: "RON",
471
- eCurrencyCode: 47,
472
- strSymbol: "lei",
473
- bSymbolIsPrefix: false,
474
- bWholeUnitsOnly: false,
475
- strDecimalSymbol: ".",
476
- strThousandsSeparator: ",",
477
- strSymbolAndNumberSeparator: " ",
478
- },
479
- RMB: {
480
- strCode: "RMB",
481
- eCurrencyCode: 9000,
482
- strSymbol: "\u5200\u5e01",
483
- bSymbolIsPrefix: false,
484
- bWholeUnitsOnly: true,
485
- strDecimalSymbol: ".",
486
- strThousandsSeparator: "",
487
- strSymbolAndNumberSeparator: " ",
488
- },
489
- NXP: {
490
- strCode: "NXP",
491
- eCurrencyCode: 9001,
492
- strSymbol: "\uc6d0",
493
- bSymbolIsPrefix: false,
494
- bWholeUnitsOnly: true,
495
- strDecimalSymbol: ".",
496
- strThousandsSeparator: ",",
497
- strSymbolAndNumberSeparator: "",
498
- },
499
- };
500
- const g_rgWalletInfo = {
501
- wallet_currency: 15,
502
- wallet_country: "VN",
503
- wallet_state: "",
504
- wallet_fee: "1",
505
- wallet_fee_minimum: "1",
506
- wallet_fee_percent: "0.05",
507
- wallet_publisher_fee_percent_default: "0.10",
508
- wallet_fee_base: "0",
509
- wallet_balance: "6540490",
510
- wallet_delayed_balance: "0",
511
- wallet_max_balance: "4500000000",
512
- wallet_trade_max_balance: "4049999616",
513
- success: 1,
514
- rwgrsn: -2,
515
- };
516
-
517
- export const sleep = (ms) => {
518
- return new Promise((resolve) => {
519
- setTimeout(resolve, ms);
520
- });
521
- };
522
-
523
- export const sleepRandom = async (startMs, endMs) => {
524
- return await sleep(Math.random() * (endMs - startMs) + startMs);
525
- };
526
-
527
- /**
528
- * const audioTrack = stream.getAudioTracks()[0]
529
- * const videoStream = UserMedia.createBlankVideoTrack()
530
- * videoStream.addTrack(audioTrack)
531
- * stream = videoStream
532
- * **/
533
- export const createBlankVideoTrack = (opts = {}) => {
534
- const { width = 1920, height = 1080 } = opts;
535
-
536
- const canvas = Object.assign(document.createElement("canvas"), {
537
- width,
538
- height,
539
- });
540
-
541
- canvas.getContext("2d").fillRect(0, 0, width, height);
542
-
543
- return canvas.captureStream();
544
- };
545
-
546
- const minDate = new Date(0),
547
- maxDate = new Date(parseInt("ffffffff", 16) * 1000);
548
-
549
- export function objectIdFromDate(date) {
550
- if (date < minDate || date > maxDate) {
551
- return `Error: date must be between ${minDate.getFullYear()} and ${maxDate.getFullYear()}`;
552
- }
553
- var pad = "00000000";
554
- var hexSeconds = Math.floor(date.getTime() / 1000).toString(16);
555
- return `${pad.substring(0, pad.length - hexSeconds.length) + hexSeconds}0000000000000000`;
556
- }
557
-
558
- export function dateFromObjectId(objectId) {
559
- return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
560
- }
561
-
562
- export function console_log(...args) {
563
- const params = [];
564
- params.push(new Date().toUTCString());
565
- const errorStack = new Error().stack;
566
- const fnName = errorStack
567
- .split("\n")
568
- .map((e) => e?.trim())
569
- .filter((e) => e.startsWith("at") && !e.startsWith("at console_log") && !e.startsWith("at processTicksAndRejections"))[0]
570
- .substr(3);
571
- params.push(fnName);
572
- console.log(
573
- params
574
- .filter(Boolean)
575
- .map((p) => `[${p.trim()}]`)
576
- .join(" "),
577
- ...args,
578
- );
579
- }
580
-
581
- export function removeSpaceKeys(object) {
582
- //mutate object
583
- if (!object || Array.isArray(object)) {
584
- return object;
585
- }
586
-
587
- Object.entries(object).forEach(([key, value]) => {
588
- const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
589
- if (newKey !== key) {
590
- delete object[key];
591
- object[newKey] = value;
592
- }
593
- });
594
- return object;
595
- }
596
-
597
- export function getCleanObject(object) {
598
- //like removeSpaceKeys but not mutate object
599
- if (!object || Array.isArray(object)) {
600
- return object;
601
- }
602
-
603
- const newObject = {};
604
- Object.entries(object).forEach(([key, value]) => {
605
- const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
606
- newObject[newKey] = value;
607
- });
608
- return newObject;
609
- }
610
-
611
- export function JSON_parse(data) {
612
- try {
613
- return JSON.parse(data);
614
- } catch (e) {
615
- return null;
616
- }
617
- }
618
-
619
- export function JSON_stringify(data) {
620
- try {
621
- return JSON.stringify(data);
622
- } catch (e) {
623
- return null;
624
- }
625
- }
626
-
627
- export async function throttle(fn, delay) {
628
- let canFire = true;
629
- let queue = [];
630
-
631
- async function pop() {
632
- if (queue.length < 1) return;
633
-
634
- const [that, args] = queue.pop();
635
- await fn.apply(that, args);
636
- canFire = false;
637
- setTimeout(async () => {
638
- canFire = true;
639
- await pop();
640
- }, delay);
641
- }
642
-
643
- async function push() {
644
- queue.push([this, arguments]);
645
- if (canFire) {
646
- await pop();
647
- }
648
- }
649
-
650
- push.cancel = () => {
651
- queue = [];
652
- };
653
-
654
- return push;
655
- }
656
-
657
- export const secretAsBuffer = (sharedSecret) => {
658
- if (Buffer.isBuffer(sharedSecret)) {
659
- return sharedSecret;
660
- }
661
-
662
- if (sharedSecret.match(/^[0-9a-f]{40}$/i)) {
663
- // Looks like it's hex
664
- return Buffer.from(sharedSecret, "hex");
665
- }
666
-
667
- // It must be base64
668
- return Buffer.from(sharedSecret, "base64");
669
- };
670
-
671
- export function decodeLoginQrUrl(qrUrl) {
672
- if (!qrUrl || typeof qrUrl !== "string") {
673
- return null;
674
- }
675
- const match = qrUrl.match(/^https?:\/\/s\.team\/q\/(\d+)\/(\d+)(\?|$)/);
676
- if (!match) {
677
- console.log("Invalid QR code URL");
678
- return null;
679
- }
680
-
681
- return { clientId: match[2], version: parseInt(match[1], 10) };
682
- }
683
-
684
- export function decodeJwt(jwt) {
685
- try {
686
- const parts = jwt.split(".");
687
- if (parts.length !== 3) {
688
- console.err("decodeJwt Error", new Error("Invalid JWT"));
689
- return;
690
- }
691
-
692
- const standardBase64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
693
- return JSON.parse(Buffer.from(standardBase64, "base64").toString("utf8"));
694
- } catch (e) {
695
- console.error("decodeJwt Error", e);
696
- }
697
- }
698
-
699
- export async function renewRefreshToken({ refreshToken, accessToken }) {
700
- const steamId = arguments[0]?.steamId;
701
- try {
702
- const { aud } = decodeJwt(accessToken);
703
- let platformType = EAuthTokenPlatformType.SteamClient;
704
- if (aud.includes("mobile")) {
705
- platformType = EAuthTokenPlatformType.MobileApp;
706
- } else if (aud.includes("client")) {
707
- platformType = EAuthTokenPlatformType.SteamClient;
708
- } else if (aud.includes("web")) {
709
- platformType = EAuthTokenPlatformType.WebBrowser;
710
- }
711
-
712
- const { LoginSession } = await import("steam-session");
713
- const session = new LoginSession(platformType);
714
- session.refreshToken = refreshToken;
715
- await session.refreshAccessToken();
716
- const cookie = (await session.getWebCookies())?.join?.(";");
717
- return {
718
- cookie,
719
- accessToken: session.accessToken,
720
- accessTokenDecoded: decodeJwt(session.accessToken),
721
- };
722
- } catch (e) {
723
- console.error(`${steamId ? `[${steamId}] ` : ""}renewRefreshToken Error`, e);
724
- }
725
- }
726
-
727
- export async function approveLogin({ steamId, url, sharedSecret, accessToken, shouldApprove }) {
728
- try {
729
- const { LoginApprover } = await import("steam-session");
730
- const approver = new LoginApprover(accessToken, sharedSecret, {});
731
- const sessionInfo = await approver.getAuthSessionInfo(url);
732
- sessionInfo.steamId = steamId;
733
-
734
- if (typeof shouldApprove === "function" && !shouldApprove(sessionInfo)) {
735
- return;
736
- }
737
-
738
- await approver.approveAuthSession({
739
- qrChallengeUrl: url,
740
- approve: true,
741
- });
742
-
743
- return {
744
- steamId,
745
- sessionInfo,
746
- };
747
- } catch (error) {
748
- console.error(`[${steamId}] approveLogin Error`, error);
749
- return {
750
- steamId,
751
- error,
752
- };
753
- }
754
- }
755
-
756
- export function getBonusXpTimeRefresh() {
757
- let resetDay = moment.utc().startOf("isoWeek").add(2, "days").add(1, "hours");
758
- while (moment().isAfter(resetDay)) {
759
- resetDay = resetDay.add(7, "days");
760
- }
761
- if (moment().isBefore(resetDay)) {
762
- resetDay = resetDay.subtract(7, "days");
763
- }
764
- return resetDay;
765
- }
766
-
767
- export function estimateNextXp(currentXp, xpEarned) {
768
- //estimate next xp
769
- let bonusTime = 1;
770
- if (xpEarned < 4500) {
771
- bonusTime = 4;
772
- } else if (xpEarned < 7500) {
773
- bonusTime = 2;
774
- } else if (xpEarned < 11200) {
775
- bonusTime = 1;
776
- } else {
777
- bonusTime = 0.175;
778
- }
779
-
780
- const nextXp = 30 * 13 * bonusTime;
781
- return nextXp + currentXp;
782
- }
783
-
784
- export function formatMarketCurrency(valueInCents, currencyCode = getMarketCurrencyCode(g_rgWalletInfo.wallet_currency), countryCode) {
785
- if (!valueInCents && valueInCents !== 0) {
786
- return "";
787
- }
788
-
789
- let currencyFormat = (valueInCents / 100).toFixed(2);
790
-
791
- if (g_rgCurrencyData[currencyCode]) {
792
- const currencyData = g_rgCurrencyData[currencyCode];
793
- if (isCurrencyWholeUnits(currencyCode)) {
794
- currencyFormat = currencyFormat.replace(".00", "");
795
- }
796
-
797
- if (currencyData.strDecimalSymbol !== ".") {
798
- currencyFormat = currencyFormat.replace(".", currencyData.strDecimalSymbol);
799
- }
800
-
801
- const currencySymbol = getMarketCurrencySymbol(currencyCode);
802
- const currencyReturn = isCurrencySymbolBeforeValue(currencyCode) ? currencySymbol + currencyData.strSymbolAndNumberSeparator + currencyFormat : currencyFormat + currencyData.strSymbolAndNumberSeparator + currencySymbol;
803
-
804
- if (currencyCode === "USD" && typeof countryCode != "undefined" && countryCode != "US") {
805
- return `${currencyReturn} USD`;
806
- } else if (currencyCode === "EUR") {
807
- return currencyReturn.replace(",00", ",--");
808
- } else {
809
- return currencyReturn;
810
- }
811
- } else {
812
- return `${currencyFormat} ${currencyCode}`;
813
- }
814
- }
815
-
816
- export function getMarketPriceValueAsInt(strAmount) {
817
- let nAmount;
818
- if (!strAmount) {
819
- return 0;
820
- }
821
-
822
- // Users may enter either comma or period for the decimal mark and digit group separators.
823
- strAmount = strAmount.replace(/,/g, ".");
824
-
825
- // strip the currency symbol, set .-- to .00
826
- strAmount = strAmount.replace(getMarketCurrencySymbol(getMarketCurrencyCode(g_rgWalletInfo.wallet_currency)), "").replace(".--", ".00");
827
-
828
- // strip spaces
829
- strAmount = strAmount.replace(/ /g, "");
830
-
831
- // Remove all but the last period so that entries like "1,147.6" work
832
- if (strAmount.includes(".")) {
833
- var splitAmount = strAmount.split(".");
834
- var strLastSegment = splitAmount[splitAmount.length - 1];
835
-
836
- if (!isNaN(strLastSegment) && strLastSegment.length == 3 && splitAmount[splitAmount.length - 2] != "0") {
837
- // Looks like the user only entered thousands separators. Remove all commas and periods.
838
- // Ensures an entry like "1,147" is not treated as "1.147"
839
- //
840
- // Users may be surprised to find that "1.147" is treated as "1,147". "1.147" is either an error or the user
841
- // really did mean one thousand one hundred and forty seven since no currencies can be split into more than
842
- // hundredths. If it was an error, the user should notice in the next step of the dialog and can go back and
843
- // correct it. If they happen to not notice, it is better that we list the item at a higher price than
844
- // intended instead of lower than intended (which we would have done if we accepted the 1.147 value as is).
845
- strAmount = splitAmount.join("");
846
- } else {
847
- strAmount = `${splitAmount.slice(0, -1).join("")}.${strLastSegment}`;
848
- }
849
- }
850
-
851
- let flAmount = parseFloat(strAmount) * 100;
852
- nAmount = Math.floor(isNaN(flAmount) ? 0 : flAmount + 0.000001); // round down
853
-
854
- nAmount = Math.max(nAmount, 0);
855
- return nAmount;
856
- }
857
-
858
- export function isCurrencyWholeUnits(currencyCode) {
859
- return g_rgCurrencyData[currencyCode] && g_rgCurrencyData[currencyCode].bWholeUnitsOnly && currencyCode !== "RUB";
860
- }
861
-
862
- export function isCurrencySymbolBeforeValue(currencyCode) {
863
- return g_rgCurrencyData[currencyCode] && g_rgCurrencyData[currencyCode].bSymbolIsPrefix;
864
- }
865
-
866
- // Return the symbol to use for a currency
867
- export function getMarketCurrencySymbol(currencyCode) {
868
- return g_rgCurrencyData[currencyCode]?.strSymbol ?? currencyCode;
869
- }
870
-
871
- export function getMarketCurrencyCode(currencyId) {
872
- currencyId = parseInt(currencyId);
873
- for (const code in g_rgCurrencyData) {
874
- if (g_rgCurrencyData[code].eCurrencyCode === currencyId) {
875
- return code;
876
- }
877
- }
878
- return "Unknown";
879
- }
880
-
881
- export async function loginWithCredentials({ username, password, timeoutMs = 120000, sharedSecret, getMailSteamGuardCodes }) {
882
- if (!username) {
883
- return {
884
- error: "No username",
885
- };
886
- }
887
-
888
- if (!password) {
889
- return {
890
- error: "No password",
891
- };
892
- }
893
-
894
- const { LoginSession } = await import("steam-session");
895
- let authenticated = false;
896
- return new Promise((resolve) => {
897
- const timeout = setTimeout(function () {
898
- resolve({
899
- error: "Timed out",
900
- });
901
- }, timeoutMs);
902
-
903
- const session = new LoginSession(EAuthTokenPlatformType.MobileApp);
904
- session.on("authenticated", async () => {
905
- authenticated = true;
906
- const cookie = (await session.getWebCookies())?.join?.(";");
907
- return onResolve({
908
- cookie,
909
- accessToken: session.accessToken,
910
- refreshToken: session.refreshToken,
911
- accessTokenDecoded: decodeJwt(session.accessToken),
912
- });
913
- });
914
-
915
- session
916
- .startWithCredentials({
917
- accountName: username,
918
- password: password,
919
- steamGuardMachineToken: "",
920
- })
921
- .then(async function (startResult) {
922
- if (!startResult.actionRequired) {
923
- return;
924
- }
925
-
926
- if (sharedSecret) {
927
- let error = null;
928
- const maxRetry = 3;
929
- for (let i = 0; i < maxRetry; i++) {
930
- try {
931
- await session.submitSteamGuardCode(SteamTotp.generateAuthCode(sharedSecret));
932
- error = null;
933
- } catch (e) {
934
- error = e;
935
- }
936
- await sleep(1000);
937
- }
938
- if (error) {
939
- console.error(error);
940
- onResolve({ error });
941
- }
942
- } else {
943
- if (startResult.validActions.every((validAction) => validAction.type !== 2)) {
944
- console.error(startResult.validActions);
945
- return onResolve({
946
- error: "validActions",
947
- });
948
- }
949
-
950
- if (typeof getMailSteamGuardCodes === "function") {
951
- const codes = await getMailSteamGuardCodes();
952
- if (!Array.isArray(codes) || !codes.length) {
953
- return onResolve({
954
- error: "Can't find steam guard code",
955
- });
956
- }
957
-
958
- let error = null;
959
- for (const code of codes) {
960
- if (!authenticated) {
961
- try {
962
- await session.submitSteamGuardCode(code);
963
- error = null;
964
- } catch (e) {
965
- error = e;
966
- }
967
- await sleep(1000);
968
- }
969
- }
970
- if (!authenticated && error) {
971
- onResolve(error);
972
- }
973
- } else {
974
- return onResolve({
975
- error: "MailCodeError",
976
- });
977
- }
978
- }
979
- })
980
- .catch(function (e) {
981
- return onResolve(e);
982
- });
983
-
984
- function onResolve(data) {
985
- clearTimeout(timeout);
986
- return resolve(data);
987
- }
988
- });
989
- }
990
-
991
- export function calculateAccountXP(currentXp, xpEarnedThisWeek, xpEarned, nextXp) {
992
- return (
993
- (() => {
994
- if (typeof nextXp !== "number" || !Number.isFinite(nextXp)) {
995
- return;
996
- }
997
-
998
- currentXp = currentXp || 0;
999
- if (currentXp === nextXp) {
1000
- return;
1001
- }
1002
-
1003
- const update = { currentXp: nextXp };
1004
- if (nextXp < currentXp) {
1005
- update.xpExceed = Date.now();
1006
- }
1007
- const resetDay = getBonusXpTimeRefresh().format("YYYY-MM-DD");
1008
- const isWeekReset = xpEarnedThisWeek !== resetDay;
1009
- let xpEarnedThisRank = nextXp - currentXp;
1010
- if (xpEarnedThisRank < 0) {
1011
- xpEarnedThisRank += 5000;
1012
- }
1013
- if (isWeekReset) {
1014
- update.xpEarnedThisWeek = resetDay;
1015
- update.xpEarned = xpEarnedThisRank;
1016
- } else {
1017
- update.xpEarned = (xpEarned || 0) + xpEarnedThisRank;
1018
- if (xpEarnedThisRank === 0) {
1019
- return;
1020
- }
1021
- }
1022
-
1023
- return update;
1024
- })() || {}
1025
- );
1026
- }
1027
-
1028
- export async function downloadImage(url, filePath) {
1029
- let response = null;
1030
- try {
1031
- response = await axios.get(url, {
1032
- responseType: "arraybuffer",
1033
- });
1034
- } catch (e) {
1035
- /* empty */
1036
- }
1037
-
1038
- if (!response || !response.data) {
1039
- return;
1040
- }
1041
-
1042
- return new Promise((resolve) => {
1043
- fs.writeFile(filePath, response.data, (err) => {
1044
- if (err) {
1045
- resolve();
1046
- }
1047
- resolve(filePath);
1048
- });
1049
- });
1050
- }
1
+ import moment from "moment";
2
+ import SteamTotp from "steam-totp";
3
+ import { EAuthTokenPlatformType } from "./const.js";
4
+ import fs from "fs";
5
+ import axios from "axios";
6
+
7
+ const isBrowser = typeof window !== "undefined";
8
+ const g_rgCurrencyData = {
9
+ USD: {
10
+ strCode: "USD",
11
+ eCurrencyCode: 1,
12
+ strSymbol: "$",
13
+ bSymbolIsPrefix: true,
14
+ bWholeUnitsOnly: false,
15
+ strDecimalSymbol: ".",
16
+ strThousandsSeparator: ",",
17
+ strSymbolAndNumberSeparator: "",
18
+ },
19
+ GBP: {
20
+ strCode: "GBP",
21
+ eCurrencyCode: 2,
22
+ strSymbol: "\u00a3",
23
+ bSymbolIsPrefix: true,
24
+ bWholeUnitsOnly: false,
25
+ strDecimalSymbol: ".",
26
+ strThousandsSeparator: ",",
27
+ strSymbolAndNumberSeparator: "",
28
+ },
29
+ EUR: {
30
+ strCode: "EUR",
31
+ eCurrencyCode: 3,
32
+ strSymbol: "\u20ac",
33
+ bSymbolIsPrefix: false,
34
+ bWholeUnitsOnly: false,
35
+ strDecimalSymbol: ",",
36
+ strThousandsSeparator: " ",
37
+ strSymbolAndNumberSeparator: "",
38
+ },
39
+ CHF: {
40
+ strCode: "CHF",
41
+ eCurrencyCode: 4,
42
+ strSymbol: "CHF",
43
+ bSymbolIsPrefix: true,
44
+ bWholeUnitsOnly: false,
45
+ strDecimalSymbol: ".",
46
+ strThousandsSeparator: " ",
47
+ strSymbolAndNumberSeparator: " ",
48
+ },
49
+ RUB: {
50
+ strCode: "RUB",
51
+ eCurrencyCode: 5,
52
+ strSymbol: "p\u0443\u0431.",
53
+ bSymbolIsPrefix: false,
54
+ bWholeUnitsOnly: true,
55
+ strDecimalSymbol: ",",
56
+ strThousandsSeparator: "",
57
+ strSymbolAndNumberSeparator: " ",
58
+ },
59
+ BRL: {
60
+ strCode: "BRL",
61
+ eCurrencyCode: 7,
62
+ strSymbol: "R$",
63
+ bSymbolIsPrefix: true,
64
+ bWholeUnitsOnly: false,
65
+ strDecimalSymbol: ",",
66
+ strThousandsSeparator: ".",
67
+ strSymbolAndNumberSeparator: " ",
68
+ },
69
+ JPY: {
70
+ strCode: "JPY",
71
+ eCurrencyCode: 8,
72
+ strSymbol: "\u00a5",
73
+ bSymbolIsPrefix: true,
74
+ bWholeUnitsOnly: true,
75
+ strDecimalSymbol: ".",
76
+ strThousandsSeparator: ",",
77
+ strSymbolAndNumberSeparator: " ",
78
+ },
79
+ NOK: {
80
+ strCode: "NOK",
81
+ eCurrencyCode: 9,
82
+ strSymbol: "kr",
83
+ bSymbolIsPrefix: false,
84
+ bWholeUnitsOnly: false,
85
+ strDecimalSymbol: ",",
86
+ strThousandsSeparator: ".",
87
+ strSymbolAndNumberSeparator: " ",
88
+ },
89
+ IDR: {
90
+ strCode: "IDR",
91
+ eCurrencyCode: 10,
92
+ strSymbol: "Rp",
93
+ bSymbolIsPrefix: true,
94
+ bWholeUnitsOnly: true,
95
+ strDecimalSymbol: ".",
96
+ strThousandsSeparator: " ",
97
+ strSymbolAndNumberSeparator: " ",
98
+ },
99
+ MYR: {
100
+ strCode: "MYR",
101
+ eCurrencyCode: 11,
102
+ strSymbol: "RM",
103
+ bSymbolIsPrefix: true,
104
+ bWholeUnitsOnly: false,
105
+ strDecimalSymbol: ".",
106
+ strThousandsSeparator: ",",
107
+ strSymbolAndNumberSeparator: "",
108
+ },
109
+ PHP: {
110
+ strCode: "PHP",
111
+ eCurrencyCode: 12,
112
+ strSymbol: "P",
113
+ bSymbolIsPrefix: true,
114
+ bWholeUnitsOnly: false,
115
+ strDecimalSymbol: ".",
116
+ strThousandsSeparator: ",",
117
+ strSymbolAndNumberSeparator: "",
118
+ },
119
+ SGD: {
120
+ strCode: "SGD",
121
+ eCurrencyCode: 13,
122
+ strSymbol: "S$",
123
+ bSymbolIsPrefix: true,
124
+ bWholeUnitsOnly: false,
125
+ strDecimalSymbol: ".",
126
+ strThousandsSeparator: ",",
127
+ strSymbolAndNumberSeparator: "",
128
+ },
129
+ THB: {
130
+ strCode: "THB",
131
+ eCurrencyCode: 14,
132
+ strSymbol: "\u0e3f",
133
+ bSymbolIsPrefix: true,
134
+ bWholeUnitsOnly: false,
135
+ strDecimalSymbol: ".",
136
+ strThousandsSeparator: ",",
137
+ strSymbolAndNumberSeparator: "",
138
+ },
139
+ VND: {
140
+ strCode: "VND",
141
+ eCurrencyCode: 15,
142
+ strSymbol: "\u20ab",
143
+ bSymbolIsPrefix: false,
144
+ bWholeUnitsOnly: true,
145
+ strDecimalSymbol: ",",
146
+ strThousandsSeparator: ".",
147
+ strSymbolAndNumberSeparator: "",
148
+ },
149
+ KRW: {
150
+ strCode: "KRW",
151
+ eCurrencyCode: 16,
152
+ strSymbol: "\u20a9",
153
+ bSymbolIsPrefix: true,
154
+ bWholeUnitsOnly: true,
155
+ strDecimalSymbol: ".",
156
+ strThousandsSeparator: ",",
157
+ strSymbolAndNumberSeparator: " ",
158
+ },
159
+ TRY: {
160
+ strCode: "TRY",
161
+ eCurrencyCode: 17,
162
+ strSymbol: "TL",
163
+ bSymbolIsPrefix: false,
164
+ bWholeUnitsOnly: false,
165
+ strDecimalSymbol: ",",
166
+ strThousandsSeparator: ".",
167
+ strSymbolAndNumberSeparator: " ",
168
+ },
169
+ UAH: {
170
+ strCode: "UAH",
171
+ eCurrencyCode: 18,
172
+ strSymbol: "\u20b4",
173
+ bSymbolIsPrefix: false,
174
+ bWholeUnitsOnly: true,
175
+ strDecimalSymbol: ",",
176
+ strThousandsSeparator: " ",
177
+ strSymbolAndNumberSeparator: "",
178
+ },
179
+ MXN: {
180
+ strCode: "MXN",
181
+ eCurrencyCode: 19,
182
+ strSymbol: "Mex$",
183
+ bSymbolIsPrefix: true,
184
+ bWholeUnitsOnly: false,
185
+ strDecimalSymbol: ".",
186
+ strThousandsSeparator: ",",
187
+ strSymbolAndNumberSeparator: " ",
188
+ },
189
+ CAD: {
190
+ strCode: "CAD",
191
+ eCurrencyCode: 20,
192
+ strSymbol: "CDN$",
193
+ bSymbolIsPrefix: true,
194
+ bWholeUnitsOnly: false,
195
+ strDecimalSymbol: ".",
196
+ strThousandsSeparator: ",",
197
+ strSymbolAndNumberSeparator: " ",
198
+ },
199
+ AUD: {
200
+ strCode: "AUD",
201
+ eCurrencyCode: 21,
202
+ strSymbol: "A$",
203
+ bSymbolIsPrefix: true,
204
+ bWholeUnitsOnly: false,
205
+ strDecimalSymbol: ".",
206
+ strThousandsSeparator: ",",
207
+ strSymbolAndNumberSeparator: " ",
208
+ },
209
+ NZD: {
210
+ strCode: "NZD",
211
+ eCurrencyCode: 22,
212
+ strSymbol: "NZ$",
213
+ bSymbolIsPrefix: true,
214
+ bWholeUnitsOnly: false,
215
+ strDecimalSymbol: ".",
216
+ strThousandsSeparator: ",",
217
+ strSymbolAndNumberSeparator: " ",
218
+ },
219
+ PLN: {
220
+ strCode: "PLN",
221
+ eCurrencyCode: 6,
222
+ strSymbol: "z\u0142",
223
+ bSymbolIsPrefix: false,
224
+ bWholeUnitsOnly: false,
225
+ strDecimalSymbol: ",",
226
+ strThousandsSeparator: " ",
227
+ strSymbolAndNumberSeparator: "",
228
+ },
229
+ CNY: {
230
+ strCode: "CNY",
231
+ eCurrencyCode: 23,
232
+ strSymbol: "\u00a5",
233
+ bSymbolIsPrefix: true,
234
+ bWholeUnitsOnly: false,
235
+ strDecimalSymbol: ".",
236
+ strThousandsSeparator: ",",
237
+ strSymbolAndNumberSeparator: " ",
238
+ },
239
+ INR: {
240
+ strCode: "INR",
241
+ eCurrencyCode: 24,
242
+ strSymbol: "\u20b9",
243
+ bSymbolIsPrefix: true,
244
+ bWholeUnitsOnly: true,
245
+ strDecimalSymbol: ".",
246
+ strThousandsSeparator: ",",
247
+ strSymbolAndNumberSeparator: " ",
248
+ },
249
+ CLP: {
250
+ strCode: "CLP",
251
+ eCurrencyCode: 25,
252
+ strSymbol: "CLP$",
253
+ bSymbolIsPrefix: true,
254
+ bWholeUnitsOnly: true,
255
+ strDecimalSymbol: ",",
256
+ strThousandsSeparator: ".",
257
+ strSymbolAndNumberSeparator: " ",
258
+ },
259
+ PEN: {
260
+ strCode: "PEN",
261
+ eCurrencyCode: 26,
262
+ strSymbol: "S/.",
263
+ bSymbolIsPrefix: true,
264
+ bWholeUnitsOnly: false,
265
+ strDecimalSymbol: ".",
266
+ strThousandsSeparator: ",",
267
+ strSymbolAndNumberSeparator: "",
268
+ },
269
+ COP: {
270
+ strCode: "COP",
271
+ eCurrencyCode: 27,
272
+ strSymbol: "COL$",
273
+ bSymbolIsPrefix: true,
274
+ bWholeUnitsOnly: true,
275
+ strDecimalSymbol: ",",
276
+ strThousandsSeparator: ".",
277
+ strSymbolAndNumberSeparator: " ",
278
+ },
279
+ ZAR: {
280
+ strCode: "ZAR",
281
+ eCurrencyCode: 28,
282
+ strSymbol: "R",
283
+ bSymbolIsPrefix: true,
284
+ bWholeUnitsOnly: false,
285
+ strDecimalSymbol: ".",
286
+ strThousandsSeparator: " ",
287
+ strSymbolAndNumberSeparator: " ",
288
+ },
289
+ HKD: {
290
+ strCode: "HKD",
291
+ eCurrencyCode: 29,
292
+ strSymbol: "HK$",
293
+ bSymbolIsPrefix: true,
294
+ bWholeUnitsOnly: false,
295
+ strDecimalSymbol: ".",
296
+ strThousandsSeparator: ",",
297
+ strSymbolAndNumberSeparator: " ",
298
+ },
299
+ TWD: {
300
+ strCode: "TWD",
301
+ eCurrencyCode: 30,
302
+ strSymbol: "NT$",
303
+ bSymbolIsPrefix: true,
304
+ bWholeUnitsOnly: true,
305
+ strDecimalSymbol: ".",
306
+ strThousandsSeparator: ",",
307
+ strSymbolAndNumberSeparator: " ",
308
+ },
309
+ SAR: {
310
+ strCode: "SAR",
311
+ eCurrencyCode: 31,
312
+ strSymbol: "SR",
313
+ bSymbolIsPrefix: false,
314
+ bWholeUnitsOnly: false,
315
+ strDecimalSymbol: ".",
316
+ strThousandsSeparator: ",",
317
+ strSymbolAndNumberSeparator: " ",
318
+ },
319
+ AED: {
320
+ strCode: "AED",
321
+ eCurrencyCode: 32,
322
+ strSymbol: "AED",
323
+ bSymbolIsPrefix: false,
324
+ bWholeUnitsOnly: false,
325
+ strDecimalSymbol: ".",
326
+ strThousandsSeparator: ",",
327
+ strSymbolAndNumberSeparator: " ",
328
+ },
329
+ SEK: {
330
+ strCode: "SEK",
331
+ eCurrencyCode: 33,
332
+ strSymbol: "kr",
333
+ bSymbolIsPrefix: false,
334
+ bWholeUnitsOnly: false,
335
+ strDecimalSymbol: ".",
336
+ strThousandsSeparator: ",",
337
+ strSymbolAndNumberSeparator: " ",
338
+ },
339
+ ARS: {
340
+ strCode: "ARS",
341
+ eCurrencyCode: 34,
342
+ strSymbol: "ARS$",
343
+ bSymbolIsPrefix: true,
344
+ bWholeUnitsOnly: false,
345
+ strDecimalSymbol: ",",
346
+ strThousandsSeparator: ".",
347
+ strSymbolAndNumberSeparator: " ",
348
+ },
349
+ ILS: {
350
+ strCode: "ILS",
351
+ eCurrencyCode: 35,
352
+ strSymbol: "\u20aa",
353
+ bSymbolIsPrefix: true,
354
+ bWholeUnitsOnly: false,
355
+ strDecimalSymbol: ".",
356
+ strThousandsSeparator: ",",
357
+ strSymbolAndNumberSeparator: "",
358
+ },
359
+ BYN: {
360
+ strCode: "BYN",
361
+ eCurrencyCode: 36,
362
+ strSymbol: "Br",
363
+ bSymbolIsPrefix: true,
364
+ bWholeUnitsOnly: false,
365
+ strDecimalSymbol: ".",
366
+ strThousandsSeparator: ",",
367
+ strSymbolAndNumberSeparator: "",
368
+ },
369
+ KZT: {
370
+ strCode: "KZT",
371
+ eCurrencyCode: 37,
372
+ strSymbol: "\u20b8",
373
+ bSymbolIsPrefix: false,
374
+ bWholeUnitsOnly: true,
375
+ strDecimalSymbol: ",",
376
+ strThousandsSeparator: " ",
377
+ strSymbolAndNumberSeparator: "",
378
+ },
379
+ KWD: {
380
+ strCode: "KWD",
381
+ eCurrencyCode: 38,
382
+ strSymbol: "KD",
383
+ bSymbolIsPrefix: false,
384
+ bWholeUnitsOnly: false,
385
+ strDecimalSymbol: ".",
386
+ strThousandsSeparator: ",",
387
+ strSymbolAndNumberSeparator: " ",
388
+ },
389
+ QAR: {
390
+ strCode: "QAR",
391
+ eCurrencyCode: 39,
392
+ strSymbol: "QR",
393
+ bSymbolIsPrefix: false,
394
+ bWholeUnitsOnly: false,
395
+ strDecimalSymbol: ".",
396
+ strThousandsSeparator: ",",
397
+ strSymbolAndNumberSeparator: " ",
398
+ },
399
+ CRC: {
400
+ strCode: "CRC",
401
+ eCurrencyCode: 40,
402
+ strSymbol: "\u20a1",
403
+ bSymbolIsPrefix: true,
404
+ bWholeUnitsOnly: true,
405
+ strDecimalSymbol: ",",
406
+ strThousandsSeparator: ".",
407
+ strSymbolAndNumberSeparator: "",
408
+ },
409
+ UYU: {
410
+ strCode: "UYU",
411
+ eCurrencyCode: 41,
412
+ strSymbol: "$U",
413
+ bSymbolIsPrefix: true,
414
+ bWholeUnitsOnly: true,
415
+ strDecimalSymbol: ",",
416
+ strThousandsSeparator: ".",
417
+ strSymbolAndNumberSeparator: "",
418
+ },
419
+ BGN: {
420
+ strCode: "BGN",
421
+ eCurrencyCode: 42,
422
+ strSymbol: "\u043b\u0432",
423
+ bSymbolIsPrefix: false,
424
+ bWholeUnitsOnly: false,
425
+ strDecimalSymbol: ".",
426
+ strThousandsSeparator: ",",
427
+ strSymbolAndNumberSeparator: " ",
428
+ },
429
+ HRK: {
430
+ strCode: "HRK",
431
+ eCurrencyCode: 43,
432
+ strSymbol: "kn",
433
+ bSymbolIsPrefix: false,
434
+ bWholeUnitsOnly: false,
435
+ strDecimalSymbol: ".",
436
+ strThousandsSeparator: ",",
437
+ strSymbolAndNumberSeparator: " ",
438
+ },
439
+ CZK: {
440
+ strCode: "CZK",
441
+ eCurrencyCode: 44,
442
+ strSymbol: "K\u010d",
443
+ bSymbolIsPrefix: false,
444
+ bWholeUnitsOnly: false,
445
+ strDecimalSymbol: ".",
446
+ strThousandsSeparator: ",",
447
+ strSymbolAndNumberSeparator: " ",
448
+ },
449
+ DKK: {
450
+ strCode: "DKK",
451
+ eCurrencyCode: 45,
452
+ strSymbol: "kr.",
453
+ bSymbolIsPrefix: false,
454
+ bWholeUnitsOnly: false,
455
+ strDecimalSymbol: ".",
456
+ strThousandsSeparator: ",",
457
+ strSymbolAndNumberSeparator: " ",
458
+ },
459
+ HUF: {
460
+ strCode: "HUF",
461
+ eCurrencyCode: 46,
462
+ strSymbol: "Ft",
463
+ bSymbolIsPrefix: false,
464
+ bWholeUnitsOnly: false,
465
+ strDecimalSymbol: ".",
466
+ strThousandsSeparator: ",",
467
+ strSymbolAndNumberSeparator: " ",
468
+ },
469
+ RON: {
470
+ strCode: "RON",
471
+ eCurrencyCode: 47,
472
+ strSymbol: "lei",
473
+ bSymbolIsPrefix: false,
474
+ bWholeUnitsOnly: false,
475
+ strDecimalSymbol: ".",
476
+ strThousandsSeparator: ",",
477
+ strSymbolAndNumberSeparator: " ",
478
+ },
479
+ RMB: {
480
+ strCode: "RMB",
481
+ eCurrencyCode: 9000,
482
+ strSymbol: "\u5200\u5e01",
483
+ bSymbolIsPrefix: false,
484
+ bWholeUnitsOnly: true,
485
+ strDecimalSymbol: ".",
486
+ strThousandsSeparator: "",
487
+ strSymbolAndNumberSeparator: " ",
488
+ },
489
+ NXP: {
490
+ strCode: "NXP",
491
+ eCurrencyCode: 9001,
492
+ strSymbol: "\uc6d0",
493
+ bSymbolIsPrefix: false,
494
+ bWholeUnitsOnly: true,
495
+ strDecimalSymbol: ".",
496
+ strThousandsSeparator: ",",
497
+ strSymbolAndNumberSeparator: "",
498
+ },
499
+ };
500
+ const g_rgWalletInfo = {
501
+ wallet_currency: 15,
502
+ wallet_country: "VN",
503
+ wallet_state: "",
504
+ wallet_fee: "1",
505
+ wallet_fee_minimum: "1",
506
+ wallet_fee_percent: "0.05",
507
+ wallet_publisher_fee_percent_default: "0.10",
508
+ wallet_fee_base: "0",
509
+ wallet_balance: "6540490",
510
+ wallet_delayed_balance: "0",
511
+ wallet_max_balance: "4500000000",
512
+ wallet_trade_max_balance: "4049999616",
513
+ success: 1,
514
+ rwgrsn: -2,
515
+ };
516
+
517
+ export const sleep = (ms) => {
518
+ return new Promise((resolve) => {
519
+ setTimeout(resolve, ms);
520
+ });
521
+ };
522
+
523
+ export const sleepRandom = async (startMs, endMs) => {
524
+ return await sleep(Math.random() * (endMs - startMs) + startMs);
525
+ };
526
+
527
+ /**
528
+ * const audioTrack = stream.getAudioTracks()[0]
529
+ * const videoStream = UserMedia.createBlankVideoTrack()
530
+ * videoStream.addTrack(audioTrack)
531
+ * stream = videoStream
532
+ * **/
533
+ export const createBlankVideoTrack = (opts = {}) => {
534
+ const { width = 1920, height = 1080 } = opts;
535
+
536
+ const canvas = Object.assign(document.createElement("canvas"), {
537
+ width,
538
+ height,
539
+ });
540
+
541
+ canvas.getContext("2d").fillRect(0, 0, width, height);
542
+
543
+ return canvas.captureStream();
544
+ };
545
+
546
+ const minDate = new Date(0),
547
+ maxDate = new Date(parseInt("ffffffff", 16) * 1000);
548
+
549
+ export function objectIdFromDate(date) {
550
+ if (date < minDate || date > maxDate) {
551
+ return `Error: date must be between ${minDate.getFullYear()} and ${maxDate.getFullYear()}`;
552
+ }
553
+ var pad = "00000000";
554
+ var hexSeconds = Math.floor(date.getTime() / 1000).toString(16);
555
+ return `${pad.substring(0, pad.length - hexSeconds.length) + hexSeconds}0000000000000000`;
556
+ }
557
+
558
+ export function dateFromObjectId(objectId) {
559
+ return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
560
+ }
561
+
562
+ export function console_log(...args) {
563
+ const params = [];
564
+ params.push(new Date().toUTCString());
565
+ const errorStack = new Error().stack;
566
+ const fnName = errorStack
567
+ .split("\n")
568
+ .map((e) => e?.trim())
569
+ .filter((e) => e.startsWith("at") && !e.startsWith("at console_log") && !e.startsWith("at processTicksAndRejections"))[0]
570
+ .substr(3);
571
+ params.push(fnName);
572
+ console.log(
573
+ params
574
+ .filter(Boolean)
575
+ .map((p) => `[${p.trim()}]`)
576
+ .join(" "),
577
+ ...args,
578
+ );
579
+ }
580
+
581
+ export function removeSpaceKeys(object) {
582
+ //mutate object
583
+ if (!object || Array.isArray(object)) {
584
+ return object;
585
+ }
586
+
587
+ Object.entries(object).forEach(([key, value]) => {
588
+ const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
589
+ if (newKey !== key) {
590
+ delete object[key];
591
+ object[newKey] = value;
592
+ }
593
+ });
594
+ return object;
595
+ }
596
+
597
+ export function getCleanObject(object) {
598
+ //like removeSpaceKeys but not mutate object
599
+ if (!object || Array.isArray(object)) {
600
+ return object;
601
+ }
602
+
603
+ const newObject = {};
604
+ Object.entries(object).forEach(([key, value]) => {
605
+ const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
606
+ newObject[newKey] = value;
607
+ });
608
+ return newObject;
609
+ }
610
+
611
+ export function JSON_parse(data) {
612
+ try {
613
+ return JSON.parse(data);
614
+ } catch (e) {
615
+ return null;
616
+ }
617
+ }
618
+
619
+ export function JSON_stringify(data) {
620
+ try {
621
+ return JSON.stringify(data);
622
+ } catch (e) {
623
+ return null;
624
+ }
625
+ }
626
+
627
+ export async function throttle(fn, delay) {
628
+ let canFire = true;
629
+ let queue = [];
630
+
631
+ async function pop() {
632
+ if (queue.length < 1) return;
633
+
634
+ const [that, args] = queue.pop();
635
+ await fn.apply(that, args);
636
+ canFire = false;
637
+ setTimeout(async () => {
638
+ canFire = true;
639
+ await pop();
640
+ }, delay);
641
+ }
642
+
643
+ async function push() {
644
+ queue.push([this, arguments]);
645
+ if (canFire) {
646
+ await pop();
647
+ }
648
+ }
649
+
650
+ push.cancel = () => {
651
+ queue = [];
652
+ };
653
+
654
+ return push;
655
+ }
656
+
657
+ export const secretAsBuffer = (sharedSecret) => {
658
+ if (Buffer.isBuffer(sharedSecret)) {
659
+ return sharedSecret;
660
+ }
661
+
662
+ if (sharedSecret.match(/^[0-9a-f]{40}$/i)) {
663
+ // Looks like it's hex
664
+ return Buffer.from(sharedSecret, "hex");
665
+ }
666
+
667
+ // It must be base64
668
+ return Buffer.from(sharedSecret, "base64");
669
+ };
670
+
671
+ export function decodeLoginQrUrl(qrUrl) {
672
+ if (!qrUrl || typeof qrUrl !== "string") {
673
+ return null;
674
+ }
675
+ const match = qrUrl.match(/^https?:\/\/s\.team\/q\/(\d+)\/(\d+)(\?|$)/);
676
+ if (!match) {
677
+ console.log("Invalid QR code URL");
678
+ return null;
679
+ }
680
+
681
+ return { clientId: match[2], version: parseInt(match[1], 10) };
682
+ }
683
+
684
+ export function decodeJwt(jwt) {
685
+ try {
686
+ const parts = jwt.split(".");
687
+ if (parts.length !== 3) {
688
+ console.err("decodeJwt Error", new Error("Invalid JWT"));
689
+ return;
690
+ }
691
+
692
+ const standardBase64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
693
+ return JSON.parse(Buffer.from(standardBase64, "base64").toString("utf8"));
694
+ } catch (e) {
695
+ console.error("decodeJwt Error", e);
696
+ }
697
+ }
698
+
699
+ export async function renewRefreshToken({ refreshToken, accessToken }) {
700
+ const steamId = arguments[0]?.steamId;
701
+ try {
702
+ const { aud } = decodeJwt(accessToken);
703
+ let platformType = EAuthTokenPlatformType.SteamClient;
704
+ if (aud.includes("mobile")) {
705
+ platformType = EAuthTokenPlatformType.MobileApp;
706
+ } else if (aud.includes("client")) {
707
+ platformType = EAuthTokenPlatformType.SteamClient;
708
+ } else if (aud.includes("web")) {
709
+ platformType = EAuthTokenPlatformType.WebBrowser;
710
+ }
711
+
712
+ const { LoginSession } = await import("steam-session");
713
+ const session = new LoginSession(platformType);
714
+ session.refreshToken = refreshToken;
715
+ await session.refreshAccessToken();
716
+ const cookie = (await session.getWebCookies())?.join?.(";");
717
+ return {
718
+ cookie,
719
+ accessToken: session.accessToken,
720
+ accessTokenDecoded: decodeJwt(session.accessToken),
721
+ };
722
+ } catch (e) {
723
+ console.error(`${steamId ? `[${steamId}] ` : ""}renewRefreshToken Error`, e);
724
+ }
725
+ }
726
+
727
+ export async function approveLogin({ steamId, url, sharedSecret, accessToken, shouldApprove }) {
728
+ try {
729
+ const { LoginApprover } = await import("steam-session");
730
+ const approver = new LoginApprover(accessToken, sharedSecret, {});
731
+ const sessionInfo = await approver.getAuthSessionInfo(url);
732
+ sessionInfo.steamId = steamId;
733
+
734
+ if (typeof shouldApprove === "function" && !shouldApprove(sessionInfo)) {
735
+ return;
736
+ }
737
+
738
+ await approver.approveAuthSession({
739
+ qrChallengeUrl: url,
740
+ approve: true,
741
+ });
742
+
743
+ return {
744
+ steamId,
745
+ sessionInfo,
746
+ };
747
+ } catch (error) {
748
+ console.error(`[${steamId}] approveLogin Error`, error);
749
+ return {
750
+ steamId,
751
+ error,
752
+ };
753
+ }
754
+ }
755
+
756
+ export function getBonusXpTimeRefresh() {
757
+ let resetDay = moment.utc().startOf("isoWeek").add(2, "days").add(1, "hours");
758
+ while (moment().isAfter(resetDay)) {
759
+ resetDay = resetDay.add(7, "days");
760
+ }
761
+ if (moment().isBefore(resetDay)) {
762
+ resetDay = resetDay.subtract(7, "days");
763
+ }
764
+ return resetDay;
765
+ }
766
+
767
+ export function estimateNextXp(currentXp, xpEarned) {
768
+ //estimate next xp
769
+ let bonusTime = 1;
770
+ if (xpEarned < 4500) {
771
+ bonusTime = 4;
772
+ } else if (xpEarned < 7500) {
773
+ bonusTime = 2;
774
+ } else if (xpEarned < 11200) {
775
+ bonusTime = 1;
776
+ } else {
777
+ bonusTime = 0.175;
778
+ }
779
+
780
+ const nextXp = 30 * 13 * bonusTime;
781
+ return nextXp + currentXp;
782
+ }
783
+
784
+ export function formatMarketCurrency(valueInCents, currencyCode = getMarketCurrencyCode(g_rgWalletInfo.wallet_currency), countryCode) {
785
+ if (!valueInCents && valueInCents !== 0) {
786
+ return "";
787
+ }
788
+
789
+ let currencyFormat = (valueInCents / 100).toFixed(2);
790
+
791
+ if (g_rgCurrencyData[currencyCode]) {
792
+ const currencyData = g_rgCurrencyData[currencyCode];
793
+ if (isCurrencyWholeUnits(currencyCode)) {
794
+ currencyFormat = currencyFormat.replace(".00", "");
795
+ }
796
+
797
+ if (currencyData.strDecimalSymbol !== ".") {
798
+ currencyFormat = currencyFormat.replace(".", currencyData.strDecimalSymbol);
799
+ }
800
+
801
+ const currencySymbol = getMarketCurrencySymbol(currencyCode);
802
+ const currencyReturn = isCurrencySymbolBeforeValue(currencyCode) ? currencySymbol + currencyData.strSymbolAndNumberSeparator + currencyFormat : currencyFormat + currencyData.strSymbolAndNumberSeparator + currencySymbol;
803
+
804
+ if (currencyCode === "USD" && typeof countryCode != "undefined" && countryCode != "US") {
805
+ return `${currencyReturn} USD`;
806
+ } else if (currencyCode === "EUR") {
807
+ return currencyReturn.replace(",00", ",--");
808
+ } else {
809
+ return currencyReturn;
810
+ }
811
+ } else {
812
+ return `${currencyFormat} ${currencyCode}`;
813
+ }
814
+ }
815
+
816
+ export function getMarketPriceValueAsInt(strAmount) {
817
+ let nAmount;
818
+ if (!strAmount) {
819
+ return 0;
820
+ }
821
+
822
+ // Users may enter either comma or period for the decimal mark and digit group separators.
823
+ strAmount = strAmount.replace(/,/g, ".");
824
+
825
+ // strip the currency symbol, set .-- to .00
826
+ strAmount = strAmount.replace(getMarketCurrencySymbol(getMarketCurrencyCode(g_rgWalletInfo.wallet_currency)), "").replace(".--", ".00");
827
+
828
+ // strip spaces
829
+ strAmount = strAmount.replace(/ /g, "");
830
+
831
+ // Remove all but the last period so that entries like "1,147.6" work
832
+ if (strAmount.includes(".")) {
833
+ var splitAmount = strAmount.split(".");
834
+ var strLastSegment = splitAmount[splitAmount.length - 1];
835
+
836
+ if (!isNaN(strLastSegment) && strLastSegment.length == 3 && splitAmount[splitAmount.length - 2] != "0") {
837
+ // Looks like the user only entered thousands separators. Remove all commas and periods.
838
+ // Ensures an entry like "1,147" is not treated as "1.147"
839
+ //
840
+ // Users may be surprised to find that "1.147" is treated as "1,147". "1.147" is either an error or the user
841
+ // really did mean one thousand one hundred and forty seven since no currencies can be split into more than
842
+ // hundredths. If it was an error, the user should notice in the next step of the dialog and can go back and
843
+ // correct it. If they happen to not notice, it is better that we list the item at a higher price than
844
+ // intended instead of lower than intended (which we would have done if we accepted the 1.147 value as is).
845
+ strAmount = splitAmount.join("");
846
+ } else {
847
+ strAmount = `${splitAmount.slice(0, -1).join("")}.${strLastSegment}`;
848
+ }
849
+ }
850
+
851
+ let flAmount = parseFloat(strAmount) * 100;
852
+ nAmount = Math.floor(isNaN(flAmount) ? 0 : flAmount + 0.000001); // round down
853
+
854
+ nAmount = Math.max(nAmount, 0);
855
+ return nAmount;
856
+ }
857
+
858
+ export function isCurrencyWholeUnits(currencyCode) {
859
+ return g_rgCurrencyData[currencyCode] && g_rgCurrencyData[currencyCode].bWholeUnitsOnly && currencyCode !== "RUB";
860
+ }
861
+
862
+ export function isCurrencySymbolBeforeValue(currencyCode) {
863
+ return g_rgCurrencyData[currencyCode] && g_rgCurrencyData[currencyCode].bSymbolIsPrefix;
864
+ }
865
+
866
+ // Return the symbol to use for a currency
867
+ export function getMarketCurrencySymbol(currencyCode) {
868
+ return g_rgCurrencyData[currencyCode]?.strSymbol ?? currencyCode;
869
+ }
870
+
871
+ export function getMarketCurrencyCode(currencyId) {
872
+ currencyId = parseInt(currencyId);
873
+ for (const code in g_rgCurrencyData) {
874
+ if (g_rgCurrencyData[code].eCurrencyCode === currencyId) {
875
+ return code;
876
+ }
877
+ }
878
+ return "Unknown";
879
+ }
880
+
881
+ export async function loginWithCredentials({ username, password, timeoutMs = 120000, sharedSecret, getMailSteamGuardCodes }) {
882
+ if (!username) {
883
+ return {
884
+ error: "No username",
885
+ };
886
+ }
887
+
888
+ if (!password) {
889
+ return {
890
+ error: "No password",
891
+ };
892
+ }
893
+
894
+ const { LoginSession } = await import("steam-session");
895
+ let authenticated = false;
896
+ return new Promise((resolve) => {
897
+ const timeout = setTimeout(function () {
898
+ resolve({
899
+ error: "Timed out",
900
+ });
901
+ }, timeoutMs);
902
+
903
+ const session = new LoginSession(EAuthTokenPlatformType.MobileApp);
904
+ session.on("authenticated", async () => {
905
+ authenticated = true;
906
+ const cookie = (await session.getWebCookies())?.join?.(";");
907
+ return onResolve({
908
+ cookie,
909
+ accessToken: session.accessToken,
910
+ refreshToken: session.refreshToken,
911
+ accessTokenDecoded: decodeJwt(session.accessToken),
912
+ });
913
+ });
914
+
915
+ session
916
+ .startWithCredentials({
917
+ accountName: username,
918
+ password: password,
919
+ steamGuardMachineToken: "",
920
+ })
921
+ .then(async function (startResult) {
922
+ if (!startResult.actionRequired) {
923
+ return;
924
+ }
925
+
926
+ if (sharedSecret) {
927
+ let error = null;
928
+ const maxRetry = 3;
929
+ for (let i = 0; i < maxRetry; i++) {
930
+ try {
931
+ await session.submitSteamGuardCode(SteamTotp.generateAuthCode(sharedSecret));
932
+ error = null;
933
+ } catch (e) {
934
+ error = e;
935
+ }
936
+ await sleep(1000);
937
+ }
938
+ if (error) {
939
+ console.error(error);
940
+ onResolve({ error });
941
+ }
942
+ } else {
943
+ if (startResult.validActions.every((validAction) => validAction.type !== 2)) {
944
+ console.error(startResult.validActions);
945
+ return onResolve({
946
+ error: "validActions",
947
+ });
948
+ }
949
+
950
+ if (typeof getMailSteamGuardCodes === "function") {
951
+ const codes = await getMailSteamGuardCodes();
952
+ if (!Array.isArray(codes) || !codes.length) {
953
+ return onResolve({
954
+ error: "Can't find steam guard code",
955
+ });
956
+ }
957
+
958
+ let error = null;
959
+ for (const code of codes) {
960
+ if (!authenticated) {
961
+ try {
962
+ await session.submitSteamGuardCode(code);
963
+ error = null;
964
+ } catch (e) {
965
+ error = e;
966
+ }
967
+ await sleep(1000);
968
+ }
969
+ }
970
+ if (!authenticated && error) {
971
+ onResolve(error);
972
+ }
973
+ } else {
974
+ return onResolve({
975
+ error: "MailCodeError",
976
+ });
977
+ }
978
+ }
979
+ })
980
+ .catch(function (e) {
981
+ return onResolve(e);
982
+ });
983
+
984
+ function onResolve(data) {
985
+ clearTimeout(timeout);
986
+ return resolve(data);
987
+ }
988
+ });
989
+ }
990
+
991
+ export function calculateAccountXP(currentXp, xpEarnedThisWeek, xpEarned, nextXp) {
992
+ return (
993
+ (() => {
994
+ if (typeof nextXp !== "number" || !Number.isFinite(nextXp)) {
995
+ return;
996
+ }
997
+
998
+ currentXp = currentXp || 0;
999
+ if (currentXp === nextXp) {
1000
+ return;
1001
+ }
1002
+
1003
+ const update = { currentXp: nextXp };
1004
+ if (nextXp < currentXp) {
1005
+ update.xpExceed = Date.now();
1006
+ }
1007
+ const resetDay = getBonusXpTimeRefresh().format("YYYY-MM-DD");
1008
+ const isWeekReset = xpEarnedThisWeek !== resetDay;
1009
+ let xpEarnedThisRank = nextXp - currentXp;
1010
+ if (xpEarnedThisRank < 0) {
1011
+ xpEarnedThisRank += 5000;
1012
+ }
1013
+ if (isWeekReset) {
1014
+ update.xpEarnedThisWeek = resetDay;
1015
+ update.xpEarned = xpEarnedThisRank;
1016
+ } else {
1017
+ update.xpEarned = (xpEarned || 0) + xpEarnedThisRank;
1018
+ if (xpEarnedThisRank === 0) {
1019
+ return;
1020
+ }
1021
+ }
1022
+
1023
+ return update;
1024
+ })() || {}
1025
+ );
1026
+ }
1027
+
1028
+ export async function downloadImage(url, filePath) {
1029
+ let response = null;
1030
+ try {
1031
+ response = await axios.get(url, {
1032
+ responseType: "arraybuffer",
1033
+ });
1034
+ } catch (e) {
1035
+ /* empty */
1036
+ }
1037
+
1038
+ if (!response || !response.data) {
1039
+ return;
1040
+ }
1041
+
1042
+ return new Promise((resolve) => {
1043
+ fs.writeFile(filePath, response.data, (err) => {
1044
+ if (err) {
1045
+ resolve();
1046
+ }
1047
+ resolve(filePath);
1048
+ });
1049
+ });
1050
+ }