steamutils 1.4.31 → 1.4.33

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