steamutils 1.4.31 → 1.4.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (238) hide show
  1. package/.idea/codeStyles/Project.xml +0 -1
  2. package/.idea/git_toolbox_blame.xml +6 -0
  3. package/.idea/git_toolbox_prj.xml +15 -0
  4. package/.prettierrc.json +3 -3
  5. package/SteamClient.js +2665 -2658
  6. package/axios.js +84 -84
  7. package/bufferHelpers.js +115 -115
  8. package/cheerio.js +103 -103
  9. package/const.js +451 -451
  10. package/create_remote_file.js +66 -66
  11. package/package.json +1 -1
  12. package/protos/csgo/base_gcmessages.proto +553 -553
  13. package/protos/csgo/base_gcmessages_csgo.proto +547 -547
  14. package/protos/csgo/c_peer2peer_netmessages.proto +55 -55
  15. package/protos/csgo/clientmessages.proto +48 -48
  16. package/protos/csgo/connectionless_netmessages.proto +17 -17
  17. package/protos/csgo/cs_gameevents.proto +35 -35
  18. package/protos/csgo/cs_usercmd.proto +34 -34
  19. package/protos/csgo/cstrike15_gcmessages.proto +1431 -1431
  20. package/protos/csgo/cstrike15_usermessages.proto +592 -592
  21. package/protos/csgo/demo.proto +165 -165
  22. package/protos/csgo/econ_gcmessages.proto +219 -219
  23. package/protos/csgo/engine_gcmessages.proto +14 -14
  24. package/protos/csgo/enums_clientserver.proto +1529 -1529
  25. package/protos/csgo/fatdemo.proto +125 -125
  26. package/protos/csgo/gameevents.proto +120 -120
  27. package/protos/csgo/gcsdk_gcmessages.proto +323 -323
  28. package/protos/csgo/gcsystemmsgs.proto +243 -243
  29. package/protos/csgo/netmessages.proto +618 -618
  30. package/protos/csgo/network_connection.proto +126 -126
  31. package/protos/csgo/networkbasetypes.proto +246 -246
  32. package/protos/csgo/networksystem_protomessages.proto +17 -17
  33. package/protos/csgo/steamdatagram_messages_auth.proto +65 -65
  34. package/protos/csgo/steamdatagram_messages_sdr.proto +534 -534
  35. package/protos/csgo/steammessages.proto +620 -620
  36. package/protos/csgo/steammessages_base.proto +301 -301
  37. package/protos/csgo/steammessages_cloud.steamworkssdk.proto +68 -68
  38. package/protos/csgo/steammessages_gamenetworkingui.proto +61 -61
  39. package/protos/csgo/steammessages_helprequest.steamworkssdk.proto +22 -22
  40. package/protos/csgo/steammessages_oauth.steamworkssdk.proto +18 -18
  41. package/protos/csgo/steammessages_player.steamworkssdk.proto +254 -254
  42. package/protos/csgo/steammessages_publishedfile.steamworkssdk.proto +233 -233
  43. package/protos/csgo/steammessages_unified_base.steamworkssdk.proto +30 -30
  44. package/protos/csgo/steamnetworkingsockets_messages.proto +205 -205
  45. package/protos/csgo/steamnetworkingsockets_messages_certs.proto +39 -39
  46. package/protos/csgo/steamnetworkingsockets_messages_udp.proto +75 -75
  47. package/protos/csgo/te.proto +259 -259
  48. package/protos/csgo/uifontfile_format.proto +13 -13
  49. package/protos/csgo/usercmd.proto +39 -39
  50. package/protos/csgo/usermessages.proto +752 -752
  51. package/protos/csgo/valveextensions.proto +17 -17
  52. package/protos/google/protobuf/descriptor.proto +281 -281
  53. package/protos/steam/clientmetrics.proto +45 -45
  54. package/protos/steam/content_manifest.proto +62 -62
  55. package/protos/steam/contenthubs.proto +41 -41
  56. package/protos/steam/encrypted_app_ticket.proto +10 -10
  57. package/protos/steam/enums.proto +501 -501
  58. package/protos/steam/enums_clientserver.proto +1508 -1508
  59. package/protos/steam/enums_productinfo.proto +14 -14
  60. package/protos/steam/htmlmessages.proto +1039 -1039
  61. package/protos/steam/offline_ticket.proto +8 -8
  62. package/protos/steam/steamdatagram_messages_auth.proto +65 -65
  63. package/protos/steam/steamdatagram_messages_sdr.proto +533 -533
  64. package/protos/steam/steammessages_accounthardware.steamclient.proto +167 -167
  65. package/protos/steam/steammessages_appoverview.proto +204 -204
  66. package/protos/steam/steammessages_auth.steamclient.proto +375 -375
  67. package/protos/steam/steammessages_base.proto +335 -335
  68. package/protos/steam/steammessages_broadcast.steamclient.proto +618 -618
  69. package/protos/steam/steammessages_chat.steamclient.proto +1070 -1070
  70. package/protos/steam/steammessages_client_objects.proto +649 -649
  71. package/protos/steam/steammessages_clientlanp2p.proto +43 -43
  72. package/protos/steam/steammessages_clientmetrics.steamclient.proto +192 -192
  73. package/protos/steam/steammessages_clientnotificationtypes.proto +250 -250
  74. package/protos/steam/steammessages_clientserver.proto +392 -392
  75. package/protos/steam/steammessages_clientserver_2.proto +771 -771
  76. package/protos/steam/steammessages_clientserver_appinfo.proto +131 -131
  77. package/protos/steam/steammessages_clientserver_friends.proto +260 -260
  78. package/protos/steam/steammessages_clientserver_gameservers.proto +159 -159
  79. package/protos/steam/steammessages_clientserver_lbs.proto +70 -70
  80. package/protos/steam/steammessages_clientserver_login.proto +167 -167
  81. package/protos/steam/steammessages_clientserver_mms.proto +233 -233
  82. package/protos/steam/steammessages_clientserver_ucm.proto +207 -207
  83. package/protos/steam/steammessages_clientserver_uds.proto +125 -125
  84. package/protos/steam/steammessages_clientserver_ufs.proto +45 -45
  85. package/protos/steam/steammessages_clientserver_userstats.proto +80 -80
  86. package/protos/steam/steammessages_clientsettings.proto +208 -208
  87. package/protos/steam/steammessages_cloud.steamclient.proto +422 -422
  88. package/protos/steam/steammessages_contentsystem.steamclient.proto +123 -123
  89. package/protos/steam/steammessages_credentials.steamclient.proto +96 -96
  90. package/protos/steam/steammessages_datapublisher.steamclient.proto +102 -102
  91. package/protos/steam/steammessages_depotbuilder.steamclient.proto +99 -99
  92. package/protos/steam/steammessages_deviceauth.steamclient.proto +169 -169
  93. package/protos/steam/steammessages_econ.steamclient.proto +137 -137
  94. package/protos/steam/steammessages_familygroups.steamclient.proto +441 -441
  95. package/protos/steam/steammessages_friendmessages.steamclient.proto +141 -141
  96. package/protos/steam/steammessages_gamenetworking.steamclient.proto +25 -25
  97. package/protos/steam/steammessages_gamenetworkingui.proto +61 -61
  98. package/protos/steam/steammessages_gamenotifications.steamclient.proto +131 -131
  99. package/protos/steam/steammessages_gameservers.steamclient.proto +136 -136
  100. package/protos/steam/steammessages_hiddevices.proto +157 -157
  101. package/protos/steam/steammessages_inventory.steamclient.proto +172 -172
  102. package/protos/steam/steammessages_linkfilter.steamclient.proto +39 -39
  103. package/protos/steam/steammessages_lobbymatchmaking.steamclient.proto +29 -29
  104. package/protos/steam/steammessages_market.steamclient.proto +22 -22
  105. package/protos/steam/steammessages_marketingmessages.steamclient.proto +273 -273
  106. package/protos/steam/steammessages_offline.steamclient.proto +33 -33
  107. package/protos/steam/steammessages_parental.steamclient.proto +262 -262
  108. package/protos/steam/steammessages_parties.steamclient.proto +75 -75
  109. package/protos/steam/steammessages_partnerapps.steamclient.proto +106 -106
  110. package/protos/steam/steammessages_player.steamclient.proto +915 -915
  111. package/protos/steam/steammessages_publishedfile.steamclient.proto +737 -737
  112. package/protos/steam/steammessages_qms.steamclient.proto +111 -111
  113. package/protos/steam/steammessages_remoteclient.proto +100 -100
  114. package/protos/steam/steammessages_remoteclient_discovery.proto +244 -244
  115. package/protos/steam/steammessages_remoteclient_service.steamclient.proto +31 -31
  116. package/protos/steam/steammessages_remoteclient_service_messages.proto +217 -217
  117. package/protos/steam/steammessages_remoteplay.proto +975 -975
  118. package/protos/steam/steammessages_secrets.steamclient.proto +35 -35
  119. package/protos/steam/steammessages_shader.steamclient.proto +89 -89
  120. package/protos/steam/steammessages_site_license.steamclient.proto +103 -103
  121. package/protos/steam/steammessages_sitelicenseclient.proto +38 -38
  122. package/protos/steam/steammessages_siteserverui.proto +130 -130
  123. package/protos/steam/steammessages_steamtv.steamclient.proto +533 -533
  124. package/protos/steam/steammessages_store.steamclient.proto +404 -404
  125. package/protos/steam/steammessages_storebrowse.steamclient.proto +457 -457
  126. package/protos/steam/steammessages_timedtrial.steamclient.proto +40 -40
  127. package/protos/steam/steammessages_twofactor.steamclient.proto +157 -157
  128. package/protos/steam/steammessages_unified_base.steamclient.proto +45 -45
  129. package/protos/steam/steammessages_unified_test.steamclient.proto +51 -51
  130. package/protos/steam/steammessages_useraccount.steamclient.proto +211 -211
  131. package/protos/steam/steammessages_vac.steamclient.proto +37 -37
  132. package/protos/steam/steammessages_video.steamclient.proto +68 -68
  133. package/protos/steam/steammessages_virtualcontroller.proto +138 -138
  134. package/protos/steam/steammessages_workshop.steamclient.proto +19 -19
  135. package/protos/steam/steamnetworkingsockets_messages.proto +205 -205
  136. package/protos/steam/steamnetworkingsockets_messages_certs.proto +39 -39
  137. package/protos/steam/steamnetworkingsockets_messages_udp.proto +75 -75
  138. package/protos/steam/webuimessages_achievements.proto +29 -29
  139. package/protos/steam/webuimessages_base.proto +24 -24
  140. package/protos/steam/webuimessages_gamenotes.proto +21 -21
  141. package/protos/steam/webuimessages_gamescope.proto +57 -57
  142. package/protos/steam/webuimessages_steamengine.proto +41 -41
  143. package/protos/steam/webuimessages_steamos.proto +114 -114
  144. package/protos/steam/webuimessages_storagedevicemanager.proto +110 -110
  145. package/protos/steam/webuimessages_systemmanager.proto +17 -17
  146. package/protos/steam/webuimessages_transport.proto +22 -22
  147. package/protos/steam/webuimessages_transportvalidation.proto +111 -111
  148. package/protos/webui/common.proto +4024 -4024
  149. package/protos/webui/common_base.proto +27 -27
  150. package/protos/webui/service_accountcart.proto +153 -153
  151. package/protos/webui/service_accountlinking.proto +27 -27
  152. package/protos/webui/service_accountprivacy.proto +42 -42
  153. package/protos/webui/service_accountprivateapps.proto +34 -34
  154. package/protos/webui/service_auction.proto +97 -97
  155. package/protos/webui/service_authentication.proto +222 -222
  156. package/protos/webui/service_authenticationsupport.proto +74 -74
  157. package/protos/webui/service_broadcast.proto +562 -562
  158. package/protos/webui/service_chat.proto +11 -11
  159. package/protos/webui/service_chatroom.proto +810 -810
  160. package/protos/webui/service_chatusability.proto +107 -107
  161. package/protos/webui/service_checkout.proto +84 -84
  162. package/protos/webui/service_clan.proto +41 -41
  163. package/protos/webui/service_clanchatrooms.proto +25 -25
  164. package/protos/webui/service_clanfaqs.proto +202 -202
  165. package/protos/webui/service_clientcomm.proto +151 -151
  166. package/protos/webui/service_clientmetrics.proto +22 -22
  167. package/protos/webui/service_cloud.proto +222 -222
  168. package/protos/webui/service_cloudconfigstore.proto +51 -51
  169. package/protos/webui/service_cloudgaming.proto +30 -30
  170. package/protos/webui/service_community.proto +365 -365
  171. package/protos/webui/service_dailydeal.proto +89 -89
  172. package/protos/webui/service_econ.proto +134 -134
  173. package/protos/webui/service_embedded.proto +24 -24
  174. package/protos/webui/service_experimentservice.proto +6 -6
  175. package/protos/webui/service_familygroups.proto +355 -355
  176. package/protos/webui/service_fovasvideo.proto +15 -15
  177. package/protos/webui/service_friendmessages.proto +133 -133
  178. package/protos/webui/service_friendslist.proto +70 -70
  179. package/protos/webui/service_gamenotes.proto +15 -15
  180. package/protos/webui/service_gamerecording.proto +265 -265
  181. package/protos/webui/service_gamerecordingclip.proto +85 -85
  182. package/protos/webui/service_gamerecordingdebug.proto +52 -52
  183. package/protos/webui/service_helprequestlogs.proto +16 -16
  184. package/protos/webui/service_loyaltyrewards.proto +252 -252
  185. package/protos/webui/service_marketingmessages.proto +215 -215
  186. package/protos/webui/service_mobileapp.proto +18 -18
  187. package/protos/webui/service_mobileauth.proto +24 -24
  188. package/protos/webui/service_mobiledevice.proto +26 -26
  189. package/protos/webui/service_mobileperaccount.proto +31 -31
  190. package/protos/webui/service_news.proto +110 -110
  191. package/protos/webui/service_parental.proto +258 -258
  192. package/protos/webui/service_partnermembershipinvite.proto +34 -34
  193. package/protos/webui/service_partnerstorebrowse.proto +28 -28
  194. package/protos/webui/service_phone.proto +51 -51
  195. package/protos/webui/service_physicalgoods.proto +15 -15
  196. package/protos/webui/service_player.proto +918 -918
  197. package/protos/webui/service_promotioneventinvites.proto +109 -109
  198. package/protos/webui/service_promotionplanning.proto +186 -186
  199. package/protos/webui/service_promotionstats.proto +23 -23
  200. package/protos/webui/service_publishedfile.proto +714 -714
  201. package/protos/webui/service_publishing.proto +200 -200
  202. package/protos/webui/service_quest.proto +127 -127
  203. package/protos/webui/service_salefeature.proto +373 -373
  204. package/protos/webui/service_saleitemrewards.proto +54 -54
  205. package/protos/webui/service_shoppingcart.proto +152 -152
  206. package/protos/webui/service_steamawards.proto +76 -76
  207. package/protos/webui/service_steamcharts.proto +75 -75
  208. package/protos/webui/service_steamengine.proto +36 -36
  209. package/protos/webui/service_steamlearn.proto +876 -876
  210. package/protos/webui/service_steamnotification.proto +73 -73
  211. package/protos/webui/service_steamtv.proto +495 -495
  212. package/protos/webui/service_steamvrvoicechat.proto +67 -67
  213. package/protos/webui/service_steamvrwebrtc.proto +48 -48
  214. package/protos/webui/service_storagedevicemanager.proto +104 -104
  215. package/protos/webui/service_store.proto +359 -359
  216. package/protos/webui/service_storeappsimilarity.proto +76 -76
  217. package/protos/webui/service_storebrowse.proto +103 -103
  218. package/protos/webui/service_storemarketing.proto +44 -44
  219. package/protos/webui/service_storequery.proto +103 -103
  220. package/protos/webui/service_storesales.proto +87 -87
  221. package/protos/webui/service_storetopsellers.proto +44 -44
  222. package/protos/webui/service_systemmanager.proto +11 -11
  223. package/protos/webui/service_test_transporterror.proto +6 -6
  224. package/protos/webui/service_transportauth.proto +17 -17
  225. package/protos/webui/service_transportvalidation.proto +69 -69
  226. package/protos/webui/service_twofactor.proto +170 -170
  227. package/protos/webui/service_useraccount.proto +142 -142
  228. package/protos/webui/service_usergameactivity.proto +34 -34
  229. package/protos/webui/service_usergamenotes.proto +70 -70
  230. package/protos/webui/service_usernews.proto +68 -68
  231. package/protos/webui/service_userreviews.proto +97 -97
  232. package/protos/webui/service_video.proto +50 -50
  233. package/protos/webui/service_videoclip.proto +62 -62
  234. package/protos/webui/service_voicechat.proto +139 -139
  235. package/protos/webui/service_webrtc.proto +52 -52
  236. package/remote.js +6784 -6784
  237. package/utils.js +249 -238
  238. package/.idea/deployment.xml +0 -14
package/utils.js CHANGED
@@ -1,238 +1,249 @@
1
- import { EAuthTokenPlatformType, LoginApprover, LoginSession } from "steam-session";
2
-
3
- const isBrowser = typeof window !== "undefined";
4
-
5
- export const sleep = (ms) => {
6
- return new Promise((resolve) => {
7
- setTimeout(resolve, ms);
8
- });
9
- };
10
-
11
- export const sleepRandom = async (startMs, endMs) => {
12
- return await sleep(Math.random() * (endMs - startMs) + startMs);
13
- };
14
-
15
- /**
16
- * const audioTrack = stream.getAudioTracks()[0]
17
- * const videoStream = UserMedia.createBlankVideoTrack()
18
- * videoStream.addTrack(audioTrack)
19
- * stream = videoStream
20
- * **/
21
- export const createBlankVideoTrack = (opts = {}) => {
22
- const { width = 1920, height = 1080 } = opts;
23
-
24
- const canvas = Object.assign(document.createElement("canvas"), {
25
- width,
26
- height,
27
- });
28
-
29
- canvas.getContext("2d").fillRect(0, 0, width, height);
30
-
31
- return canvas.captureStream();
32
- };
33
-
34
- const minDate = new Date(0),
35
- maxDate = new Date(parseInt("ffffffff", 16) * 1000);
36
-
37
- export function objectIdFromDate(date) {
38
- if (date < minDate || date > maxDate) {
39
- return `Error: date must be between ${minDate.getFullYear()} and ${maxDate.getFullYear()}`;
40
- }
41
- var pad = "00000000";
42
- var hexSeconds = Math.floor(date.getTime() / 1000).toString(16);
43
- return `${pad.substring(0, pad.length - hexSeconds.length) + hexSeconds}0000000000000000`;
44
- }
45
-
46
- export function dateFromObjectId(objectId) {
47
- return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
48
- }
49
-
50
- export function console_log(...args) {
51
- const params = [];
52
- params.push(new Date().toUTCString());
53
- const errorStack = new Error().stack;
54
- const fnName = errorStack
55
- .split("\n")
56
- .map((e) => e?.trim())
57
- .filter((e) => e.startsWith("at") && !e.startsWith("at console_log") && !e.startsWith("at processTicksAndRejections"))[0]
58
- .substr(3);
59
- params.push(fnName);
60
- console.log(
61
- params
62
- .filter(Boolean)
63
- .map((p) => `[${p.trim()}]`)
64
- .join(" "),
65
- ...args,
66
- );
67
- }
68
-
69
- export function removeSpaceKeys(object) {
70
- //mutate object
71
- if (!object || Array.isArray(object)) {
72
- return object;
73
- }
74
-
75
- Object.entries(object).forEach(([key, value]) => {
76
- const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
77
- if (newKey !== key) {
78
- delete object[key];
79
- object[newKey] = value;
80
- }
81
- });
82
- return object;
83
- }
84
-
85
- export function getCleanObject(object) {
86
- //like removeSpaceKeys but not mutate object
87
- if (!object || Array.isArray(object)) {
88
- return object;
89
- }
90
-
91
- const newObject = {};
92
- Object.entries(object).forEach(([key, value]) => {
93
- const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
94
- newObject[newKey] = value;
95
- });
96
- return newObject;
97
- }
98
-
99
- export function JSON_parse(data) {
100
- try {
101
- return JSON.parse(data);
102
- } catch (e) {
103
- return null;
104
- }
105
- }
106
-
107
- export function JSON_stringify(data) {
108
- try {
109
- return JSON.stringify(data);
110
- } catch (e) {
111
- return null;
112
- }
113
- }
114
-
115
- export async function throttle(fn, delay) {
116
- let canFire = true;
117
- let queue = [];
118
-
119
- async function pop() {
120
- if (queue.length < 1) return;
121
-
122
- const [that, args] = queue.pop();
123
- await fn.apply(that, args);
124
- canFire = false;
125
- setTimeout(async () => {
126
- canFire = true;
127
- await pop();
128
- }, delay);
129
- }
130
-
131
- async function push() {
132
- queue.push([this, arguments]);
133
- if (canFire) {
134
- await pop();
135
- }
136
- }
137
-
138
- push.cancel = () => {
139
- queue = [];
140
- };
141
-
142
- return push;
143
- }
144
-
145
- export const secretAsBuffer = (sharedSecret) => {
146
- if (Buffer.isBuffer(sharedSecret)) {
147
- return sharedSecret;
148
- }
149
-
150
- if (sharedSecret.match(/^[0-9a-f]{40}$/i)) {
151
- // Looks like it's hex
152
- return Buffer.from(sharedSecret, "hex");
153
- }
154
-
155
- // It must be base64
156
- return Buffer.from(sharedSecret, "base64");
157
- };
158
-
159
- export function decodeLoginQrUrl(qrUrl) {
160
- if (!qrUrl || typeof qrUrl !== "string") {
161
- return null;
162
- }
163
- const match = qrUrl.match(/^https?:\/\/s\.team\/q\/(\d+)\/(\d+)(\?|$)/);
164
- if (!match) {
165
- console.log("Invalid QR code URL");
166
- return null;
167
- }
168
-
169
- return { clientId: match[2], version: parseInt(match[1], 10) };
170
- }
171
-
172
- export function decodeJwt(jwt) {
173
- try {
174
- const parts = jwt.split(".");
175
- if (parts.length !== 3) {
176
- console.err("decodeJwt Error", new Error("Invalid JWT"));
177
- return;
178
- }
179
-
180
- const standardBase64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
181
- return JSON.parse(Buffer.from(standardBase64, "base64").toString("utf8"));
182
- } catch (e) {
183
- console.err("decodeJwt Error", e);
184
- }
185
- }
186
-
187
- export async function renewRefreshToken({ refreshToken, accessToken }) {
188
- try {
189
- const { aud } = decodeJwt(accessToken);
190
- let platformType = EAuthTokenPlatformType.SteamClient;
191
- if (aud.includes("mobile")) {
192
- platformType = EAuthTokenPlatformType.MobileApp;
193
- } else if (aud.includes("client")) {
194
- platformType = EAuthTokenPlatformType.SteamClient;
195
- } else if (aud.includes("web")) {
196
- platformType = EAuthTokenPlatformType.WebBrowser;
197
- }
198
- const session = new LoginSession(platformType);
199
- session.refreshToken = refreshToken;
200
- await session.refreshAccessToken();
201
- const cookie = (await session.getWebCookies())?.join?.(";");
202
- return {
203
- cookie,
204
- accessToken: session.accessToken,
205
- accessTokenDecoded: decodeJwt(session.accessToken),
206
- };
207
- } catch (e) {
208
- console.error("renewRefreshToken Error", e);
209
- }
210
- }
211
-
212
- export async function approveLogin({ steamId, url, sharedSecret, accessToken, shouldApprove }) {
213
- try {
214
- const approver = new LoginApprover(accessToken, sharedSecret, {});
215
- const sessionInfo = await approver.getAuthSessionInfo(url);
216
- sessionInfo.steamId = steamId;
217
-
218
- if (typeof shouldApprove === "function" && !shouldApprove(sessionInfo)) {
219
- return;
220
- }
221
-
222
- await approver.approveAuthSession({
223
- qrChallengeUrl: url,
224
- approve: true,
225
- });
226
-
227
- return {
228
- steamId,
229
- sessionInfo,
230
- };
231
- } catch (error) {
232
- console.error("approveLogin Error", error);
233
- return {
234
- steamId,
235
- error,
236
- };
237
- }
238
- }
1
+ import { EAuthTokenPlatformType, LoginApprover, LoginSession } from "steam-session";
2
+
3
+ const isBrowser = typeof window !== "undefined";
4
+
5
+ export const sleep = (ms) => {
6
+ return new Promise((resolve) => {
7
+ setTimeout(resolve, ms);
8
+ });
9
+ };
10
+
11
+ export const sleepRandom = async (startMs, endMs) => {
12
+ return await sleep(Math.random() * (endMs - startMs) + startMs);
13
+ };
14
+
15
+ /**
16
+ * const audioTrack = stream.getAudioTracks()[0]
17
+ * const videoStream = UserMedia.createBlankVideoTrack()
18
+ * videoStream.addTrack(audioTrack)
19
+ * stream = videoStream
20
+ * **/
21
+ export const createBlankVideoTrack = (opts = {}) => {
22
+ const { width = 1920, height = 1080 } = opts;
23
+
24
+ const canvas = Object.assign(document.createElement("canvas"), {
25
+ width,
26
+ height,
27
+ });
28
+
29
+ canvas.getContext("2d").fillRect(0, 0, width, height);
30
+
31
+ return canvas.captureStream();
32
+ };
33
+
34
+ const minDate = new Date(0),
35
+ maxDate = new Date(parseInt("ffffffff", 16) * 1000);
36
+
37
+ export function objectIdFromDate(date) {
38
+ if (date < minDate || date > maxDate) {
39
+ return `Error: date must be between ${minDate.getFullYear()} and ${maxDate.getFullYear()}`;
40
+ }
41
+ var pad = "00000000";
42
+ var hexSeconds = Math.floor(date.getTime() / 1000).toString(16);
43
+ return `${pad.substring(0, pad.length - hexSeconds.length) + hexSeconds}0000000000000000`;
44
+ }
45
+
46
+ export function dateFromObjectId(objectId) {
47
+ return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
48
+ }
49
+
50
+ export function console_log(...args) {
51
+ const params = [];
52
+ params.push(new Date().toUTCString());
53
+ const errorStack = new Error().stack;
54
+ const fnName = errorStack
55
+ .split("\n")
56
+ .map((e) => e?.trim())
57
+ .filter((e) => e.startsWith("at") && !e.startsWith("at console_log") && !e.startsWith("at processTicksAndRejections"))[0]
58
+ .substr(3);
59
+ params.push(fnName);
60
+ console.log(
61
+ params
62
+ .filter(Boolean)
63
+ .map((p) => `[${p.trim()}]`)
64
+ .join(" "),
65
+ ...args,
66
+ );
67
+ }
68
+
69
+ export function removeSpaceKeys(object) {
70
+ //mutate object
71
+ if (!object || Array.isArray(object)) {
72
+ return object;
73
+ }
74
+
75
+ Object.entries(object).forEach(([key, value]) => {
76
+ const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
77
+ if (newKey !== key) {
78
+ delete object[key];
79
+ object[newKey] = value;
80
+ }
81
+ });
82
+ return object;
83
+ }
84
+
85
+ export function getCleanObject(object) {
86
+ //like removeSpaceKeys but not mutate object
87
+ if (!object || Array.isArray(object)) {
88
+ return object;
89
+ }
90
+
91
+ const newObject = {};
92
+ Object.entries(object).forEach(([key, value]) => {
93
+ const newKey = key.replaceAll(/[^a-zA-Z0-9]/gi, "_");
94
+ newObject[newKey] = value;
95
+ });
96
+ return newObject;
97
+ }
98
+
99
+ export function JSON_parse(data) {
100
+ try {
101
+ return JSON.parse(data);
102
+ } catch (e) {
103
+ return null;
104
+ }
105
+ }
106
+
107
+ export function JSON_stringify(data) {
108
+ try {
109
+ return JSON.stringify(data);
110
+ } catch (e) {
111
+ return null;
112
+ }
113
+ }
114
+
115
+ export async function throttle(fn, delay) {
116
+ let canFire = true;
117
+ let queue = [];
118
+
119
+ async function pop() {
120
+ if (queue.length < 1) return;
121
+
122
+ const [that, args] = queue.pop();
123
+ await fn.apply(that, args);
124
+ canFire = false;
125
+ setTimeout(async () => {
126
+ canFire = true;
127
+ await pop();
128
+ }, delay);
129
+ }
130
+
131
+ async function push() {
132
+ queue.push([this, arguments]);
133
+ if (canFire) {
134
+ await pop();
135
+ }
136
+ }
137
+
138
+ push.cancel = () => {
139
+ queue = [];
140
+ };
141
+
142
+ return push;
143
+ }
144
+
145
+ export const secretAsBuffer = (sharedSecret) => {
146
+ if (Buffer.isBuffer(sharedSecret)) {
147
+ return sharedSecret;
148
+ }
149
+
150
+ if (sharedSecret.match(/^[0-9a-f]{40}$/i)) {
151
+ // Looks like it's hex
152
+ return Buffer.from(sharedSecret, "hex");
153
+ }
154
+
155
+ // It must be base64
156
+ return Buffer.from(sharedSecret, "base64");
157
+ };
158
+
159
+ export function decodeLoginQrUrl(qrUrl) {
160
+ if (!qrUrl || typeof qrUrl !== "string") {
161
+ return null;
162
+ }
163
+ const match = qrUrl.match(/^https?:\/\/s\.team\/q\/(\d+)\/(\d+)(\?|$)/);
164
+ if (!match) {
165
+ console.log("Invalid QR code URL");
166
+ return null;
167
+ }
168
+
169
+ return { clientId: match[2], version: parseInt(match[1], 10) };
170
+ }
171
+
172
+ export function decodeJwt(jwt) {
173
+ try {
174
+ const parts = jwt.split(".");
175
+ if (parts.length !== 3) {
176
+ console.err("decodeJwt Error", new Error("Invalid JWT"));
177
+ return;
178
+ }
179
+
180
+ const standardBase64 = parts[1].replace(/-/g, "+").replace(/_/g, "/");
181
+ return JSON.parse(Buffer.from(standardBase64, "base64").toString("utf8"));
182
+ } catch (e) {
183
+ console.error("decodeJwt Error", e);
184
+ }
185
+ }
186
+
187
+ export async function renewRefreshToken({ refreshToken, accessToken }) {
188
+ try {
189
+ const { aud } = decodeJwt(accessToken);
190
+ let platformType = EAuthTokenPlatformType.SteamClient;
191
+ if (aud.includes("mobile")) {
192
+ platformType = EAuthTokenPlatformType.MobileApp;
193
+ } else if (aud.includes("client")) {
194
+ platformType = EAuthTokenPlatformType.SteamClient;
195
+ } else if (aud.includes("web")) {
196
+ platformType = EAuthTokenPlatformType.WebBrowser;
197
+ }
198
+ const session = new LoginSession(platformType);
199
+ session.refreshToken = refreshToken;
200
+ await session.refreshAccessToken();
201
+ const cookie = (await session.getWebCookies())?.join?.(";");
202
+ return {
203
+ cookie,
204
+ accessToken: session.accessToken,
205
+ accessTokenDecoded: decodeJwt(session.accessToken),
206
+ };
207
+ } catch (e) {
208
+ console.error("renewRefreshToken Error", e);
209
+ }
210
+ }
211
+
212
+ export async function approveLogin({ steamId, url, sharedSecret, accessToken, shouldApprove }) {
213
+ try {
214
+ const approver = new LoginApprover(accessToken, sharedSecret, {});
215
+ const sessionInfo = await approver.getAuthSessionInfo(url);
216
+ sessionInfo.steamId = steamId;
217
+
218
+ if (typeof shouldApprove === "function" && !shouldApprove(sessionInfo)) {
219
+ return;
220
+ }
221
+
222
+ await approver.approveAuthSession({
223
+ qrChallengeUrl: url,
224
+ approve: true,
225
+ });
226
+
227
+ return {
228
+ steamId,
229
+ sessionInfo,
230
+ };
231
+ } catch (error) {
232
+ console.error("approveLogin Error", error);
233
+ return {
234
+ steamId,
235
+ error,
236
+ };
237
+ }
238
+ }
239
+
240
+ export function getBonusXpTimeRefresh() {
241
+ let resetDay = moment.utc().startOf("isoWeek").add(2, "days").add(1, "hours");
242
+ while (moment().isAfter(resetDay)) {
243
+ resetDay = resetDay.add(7, "days");
244
+ }
245
+ if (moment().isBefore(resetDay)) {
246
+ resetDay = resetDay.subtract(7, "days");
247
+ }
248
+ return resetDay;
249
+ }
@@ -1,14 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
4
- <serverData>
5
- <paths name="botnatridiscord">
6
- <serverdata>
7
- <mappings>
8
- <mapping local="$PROJECT_DIR$" web="/" />
9
- </mappings>
10
- </serverdata>
11
- </paths>
12
- </serverData>
13
- </component>
14
- </project>