steamutils 1.4.31 → 1.4.32
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.
- package/.idea/codeStyles/Project.xml +0 -1
- package/.idea/git_toolbox_blame.xml +6 -0
- package/.idea/git_toolbox_prj.xml +15 -0
- package/.prettierrc.json +3 -3
- package/SteamClient.js +2665 -2658
- package/axios.js +84 -84
- package/bufferHelpers.js +115 -115
- package/cheerio.js +103 -103
- package/const.js +451 -451
- package/create_remote_file.js +66 -66
- package/package.json +1 -1
- package/protos/csgo/base_gcmessages.proto +553 -553
- package/protos/csgo/base_gcmessages_csgo.proto +547 -547
- package/protos/csgo/c_peer2peer_netmessages.proto +55 -55
- package/protos/csgo/clientmessages.proto +48 -48
- package/protos/csgo/connectionless_netmessages.proto +17 -17
- package/protos/csgo/cs_gameevents.proto +35 -35
- package/protos/csgo/cs_usercmd.proto +34 -34
- package/protos/csgo/cstrike15_gcmessages.proto +1431 -1431
- package/protos/csgo/cstrike15_usermessages.proto +592 -592
- package/protos/csgo/demo.proto +165 -165
- package/protos/csgo/econ_gcmessages.proto +219 -219
- package/protos/csgo/engine_gcmessages.proto +14 -14
- package/protos/csgo/enums_clientserver.proto +1529 -1529
- package/protos/csgo/fatdemo.proto +125 -125
- package/protos/csgo/gameevents.proto +120 -120
- package/protos/csgo/gcsdk_gcmessages.proto +323 -323
- package/protos/csgo/gcsystemmsgs.proto +243 -243
- package/protos/csgo/netmessages.proto +618 -618
- package/protos/csgo/network_connection.proto +126 -126
- package/protos/csgo/networkbasetypes.proto +246 -246
- package/protos/csgo/networksystem_protomessages.proto +17 -17
- package/protos/csgo/steamdatagram_messages_auth.proto +65 -65
- package/protos/csgo/steamdatagram_messages_sdr.proto +534 -534
- package/protos/csgo/steammessages.proto +620 -620
- package/protos/csgo/steammessages_base.proto +301 -301
- package/protos/csgo/steammessages_cloud.steamworkssdk.proto +68 -68
- package/protos/csgo/steammessages_gamenetworkingui.proto +61 -61
- package/protos/csgo/steammessages_helprequest.steamworkssdk.proto +22 -22
- package/protos/csgo/steammessages_oauth.steamworkssdk.proto +18 -18
- package/protos/csgo/steammessages_player.steamworkssdk.proto +254 -254
- package/protos/csgo/steammessages_publishedfile.steamworkssdk.proto +233 -233
- package/protos/csgo/steammessages_unified_base.steamworkssdk.proto +30 -30
- package/protos/csgo/steamnetworkingsockets_messages.proto +205 -205
- package/protos/csgo/steamnetworkingsockets_messages_certs.proto +39 -39
- package/protos/csgo/steamnetworkingsockets_messages_udp.proto +75 -75
- package/protos/csgo/te.proto +259 -259
- package/protos/csgo/uifontfile_format.proto +13 -13
- package/protos/csgo/usercmd.proto +39 -39
- package/protos/csgo/usermessages.proto +752 -752
- package/protos/csgo/valveextensions.proto +17 -17
- package/protos/google/protobuf/descriptor.proto +281 -281
- package/protos/steam/clientmetrics.proto +45 -45
- package/protos/steam/content_manifest.proto +62 -62
- package/protos/steam/contenthubs.proto +41 -41
- package/protos/steam/encrypted_app_ticket.proto +10 -10
- package/protos/steam/enums.proto +501 -501
- package/protos/steam/enums_clientserver.proto +1508 -1508
- package/protos/steam/enums_productinfo.proto +14 -14
- package/protos/steam/htmlmessages.proto +1039 -1039
- package/protos/steam/offline_ticket.proto +8 -8
- package/protos/steam/steamdatagram_messages_auth.proto +65 -65
- package/protos/steam/steamdatagram_messages_sdr.proto +533 -533
- package/protos/steam/steammessages_accounthardware.steamclient.proto +167 -167
- package/protos/steam/steammessages_appoverview.proto +204 -204
- package/protos/steam/steammessages_auth.steamclient.proto +375 -375
- package/protos/steam/steammessages_base.proto +335 -335
- package/protos/steam/steammessages_broadcast.steamclient.proto +618 -618
- package/protos/steam/steammessages_chat.steamclient.proto +1070 -1070
- package/protos/steam/steammessages_client_objects.proto +649 -649
- package/protos/steam/steammessages_clientlanp2p.proto +43 -43
- package/protos/steam/steammessages_clientmetrics.steamclient.proto +192 -192
- package/protos/steam/steammessages_clientnotificationtypes.proto +250 -250
- package/protos/steam/steammessages_clientserver.proto +392 -392
- package/protos/steam/steammessages_clientserver_2.proto +771 -771
- package/protos/steam/steammessages_clientserver_appinfo.proto +131 -131
- package/protos/steam/steammessages_clientserver_friends.proto +260 -260
- package/protos/steam/steammessages_clientserver_gameservers.proto +159 -159
- package/protos/steam/steammessages_clientserver_lbs.proto +70 -70
- package/protos/steam/steammessages_clientserver_login.proto +167 -167
- package/protos/steam/steammessages_clientserver_mms.proto +233 -233
- package/protos/steam/steammessages_clientserver_ucm.proto +207 -207
- package/protos/steam/steammessages_clientserver_uds.proto +125 -125
- package/protos/steam/steammessages_clientserver_ufs.proto +45 -45
- package/protos/steam/steammessages_clientserver_userstats.proto +80 -80
- package/protos/steam/steammessages_clientsettings.proto +208 -208
- package/protos/steam/steammessages_cloud.steamclient.proto +422 -422
- package/protos/steam/steammessages_contentsystem.steamclient.proto +123 -123
- package/protos/steam/steammessages_credentials.steamclient.proto +96 -96
- package/protos/steam/steammessages_datapublisher.steamclient.proto +102 -102
- package/protos/steam/steammessages_depotbuilder.steamclient.proto +99 -99
- package/protos/steam/steammessages_deviceauth.steamclient.proto +169 -169
- package/protos/steam/steammessages_econ.steamclient.proto +137 -137
- package/protos/steam/steammessages_familygroups.steamclient.proto +441 -441
- package/protos/steam/steammessages_friendmessages.steamclient.proto +141 -141
- package/protos/steam/steammessages_gamenetworking.steamclient.proto +25 -25
- package/protos/steam/steammessages_gamenetworkingui.proto +61 -61
- package/protos/steam/steammessages_gamenotifications.steamclient.proto +131 -131
- package/protos/steam/steammessages_gameservers.steamclient.proto +136 -136
- package/protos/steam/steammessages_hiddevices.proto +157 -157
- package/protos/steam/steammessages_inventory.steamclient.proto +172 -172
- package/protos/steam/steammessages_linkfilter.steamclient.proto +39 -39
- package/protos/steam/steammessages_lobbymatchmaking.steamclient.proto +29 -29
- package/protos/steam/steammessages_market.steamclient.proto +22 -22
- package/protos/steam/steammessages_marketingmessages.steamclient.proto +273 -273
- package/protos/steam/steammessages_offline.steamclient.proto +33 -33
- package/protos/steam/steammessages_parental.steamclient.proto +262 -262
- package/protos/steam/steammessages_parties.steamclient.proto +75 -75
- package/protos/steam/steammessages_partnerapps.steamclient.proto +106 -106
- package/protos/steam/steammessages_player.steamclient.proto +915 -915
- package/protos/steam/steammessages_publishedfile.steamclient.proto +737 -737
- package/protos/steam/steammessages_qms.steamclient.proto +111 -111
- package/protos/steam/steammessages_remoteclient.proto +100 -100
- package/protos/steam/steammessages_remoteclient_discovery.proto +244 -244
- package/protos/steam/steammessages_remoteclient_service.steamclient.proto +31 -31
- package/protos/steam/steammessages_remoteclient_service_messages.proto +217 -217
- package/protos/steam/steammessages_remoteplay.proto +975 -975
- package/protos/steam/steammessages_secrets.steamclient.proto +35 -35
- package/protos/steam/steammessages_shader.steamclient.proto +89 -89
- package/protos/steam/steammessages_site_license.steamclient.proto +103 -103
- package/protos/steam/steammessages_sitelicenseclient.proto +38 -38
- package/protos/steam/steammessages_siteserverui.proto +130 -130
- package/protos/steam/steammessages_steamtv.steamclient.proto +533 -533
- package/protos/steam/steammessages_store.steamclient.proto +404 -404
- package/protos/steam/steammessages_storebrowse.steamclient.proto +457 -457
- package/protos/steam/steammessages_timedtrial.steamclient.proto +40 -40
- package/protos/steam/steammessages_twofactor.steamclient.proto +157 -157
- package/protos/steam/steammessages_unified_base.steamclient.proto +45 -45
- package/protos/steam/steammessages_unified_test.steamclient.proto +51 -51
- package/protos/steam/steammessages_useraccount.steamclient.proto +211 -211
- package/protos/steam/steammessages_vac.steamclient.proto +37 -37
- package/protos/steam/steammessages_video.steamclient.proto +68 -68
- package/protos/steam/steammessages_virtualcontroller.proto +138 -138
- package/protos/steam/steammessages_workshop.steamclient.proto +19 -19
- package/protos/steam/steamnetworkingsockets_messages.proto +205 -205
- package/protos/steam/steamnetworkingsockets_messages_certs.proto +39 -39
- package/protos/steam/steamnetworkingsockets_messages_udp.proto +75 -75
- package/protos/steam/webuimessages_achievements.proto +29 -29
- package/protos/steam/webuimessages_base.proto +24 -24
- package/protos/steam/webuimessages_gamenotes.proto +21 -21
- package/protos/steam/webuimessages_gamescope.proto +57 -57
- package/protos/steam/webuimessages_steamengine.proto +41 -41
- package/protos/steam/webuimessages_steamos.proto +114 -114
- package/protos/steam/webuimessages_storagedevicemanager.proto +110 -110
- package/protos/steam/webuimessages_systemmanager.proto +17 -17
- package/protos/steam/webuimessages_transport.proto +22 -22
- package/protos/steam/webuimessages_transportvalidation.proto +111 -111
- package/protos/webui/common.proto +4024 -4024
- package/protos/webui/common_base.proto +27 -27
- package/protos/webui/service_accountcart.proto +153 -153
- package/protos/webui/service_accountlinking.proto +27 -27
- package/protos/webui/service_accountprivacy.proto +42 -42
- package/protos/webui/service_accountprivateapps.proto +34 -34
- package/protos/webui/service_auction.proto +97 -97
- package/protos/webui/service_authentication.proto +222 -222
- package/protos/webui/service_authenticationsupport.proto +74 -74
- package/protos/webui/service_broadcast.proto +562 -562
- package/protos/webui/service_chat.proto +11 -11
- package/protos/webui/service_chatroom.proto +810 -810
- package/protos/webui/service_chatusability.proto +107 -107
- package/protos/webui/service_checkout.proto +84 -84
- package/protos/webui/service_clan.proto +41 -41
- package/protos/webui/service_clanchatrooms.proto +25 -25
- package/protos/webui/service_clanfaqs.proto +202 -202
- package/protos/webui/service_clientcomm.proto +151 -151
- package/protos/webui/service_clientmetrics.proto +22 -22
- package/protos/webui/service_cloud.proto +222 -222
- package/protos/webui/service_cloudconfigstore.proto +51 -51
- package/protos/webui/service_cloudgaming.proto +30 -30
- package/protos/webui/service_community.proto +365 -365
- package/protos/webui/service_dailydeal.proto +89 -89
- package/protos/webui/service_econ.proto +134 -134
- package/protos/webui/service_embedded.proto +24 -24
- package/protos/webui/service_experimentservice.proto +6 -6
- package/protos/webui/service_familygroups.proto +355 -355
- package/protos/webui/service_fovasvideo.proto +15 -15
- package/protos/webui/service_friendmessages.proto +133 -133
- package/protos/webui/service_friendslist.proto +70 -70
- package/protos/webui/service_gamenotes.proto +15 -15
- package/protos/webui/service_gamerecording.proto +265 -265
- package/protos/webui/service_gamerecordingclip.proto +85 -85
- package/protos/webui/service_gamerecordingdebug.proto +52 -52
- package/protos/webui/service_helprequestlogs.proto +16 -16
- package/protos/webui/service_loyaltyrewards.proto +252 -252
- package/protos/webui/service_marketingmessages.proto +215 -215
- package/protos/webui/service_mobileapp.proto +18 -18
- package/protos/webui/service_mobileauth.proto +24 -24
- package/protos/webui/service_mobiledevice.proto +26 -26
- package/protos/webui/service_mobileperaccount.proto +31 -31
- package/protos/webui/service_news.proto +110 -110
- package/protos/webui/service_parental.proto +258 -258
- package/protos/webui/service_partnermembershipinvite.proto +34 -34
- package/protos/webui/service_partnerstorebrowse.proto +28 -28
- package/protos/webui/service_phone.proto +51 -51
- package/protos/webui/service_physicalgoods.proto +15 -15
- package/protos/webui/service_player.proto +918 -918
- package/protos/webui/service_promotioneventinvites.proto +109 -109
- package/protos/webui/service_promotionplanning.proto +186 -186
- package/protos/webui/service_promotionstats.proto +23 -23
- package/protos/webui/service_publishedfile.proto +714 -714
- package/protos/webui/service_publishing.proto +200 -200
- package/protos/webui/service_quest.proto +127 -127
- package/protos/webui/service_salefeature.proto +373 -373
- package/protos/webui/service_saleitemrewards.proto +54 -54
- package/protos/webui/service_shoppingcart.proto +152 -152
- package/protos/webui/service_steamawards.proto +76 -76
- package/protos/webui/service_steamcharts.proto +75 -75
- package/protos/webui/service_steamengine.proto +36 -36
- package/protos/webui/service_steamlearn.proto +876 -876
- package/protos/webui/service_steamnotification.proto +73 -73
- package/protos/webui/service_steamtv.proto +495 -495
- package/protos/webui/service_steamvrvoicechat.proto +67 -67
- package/protos/webui/service_steamvrwebrtc.proto +48 -48
- package/protos/webui/service_storagedevicemanager.proto +104 -104
- package/protos/webui/service_store.proto +359 -359
- package/protos/webui/service_storeappsimilarity.proto +76 -76
- package/protos/webui/service_storebrowse.proto +103 -103
- package/protos/webui/service_storemarketing.proto +44 -44
- package/protos/webui/service_storequery.proto +103 -103
- package/protos/webui/service_storesales.proto +87 -87
- package/protos/webui/service_storetopsellers.proto +44 -44
- package/protos/webui/service_systemmanager.proto +11 -11
- package/protos/webui/service_test_transporterror.proto +6 -6
- package/protos/webui/service_transportauth.proto +17 -17
- package/protos/webui/service_transportvalidation.proto +69 -69
- package/protos/webui/service_twofactor.proto +170 -170
- package/protos/webui/service_useraccount.proto +142 -142
- package/protos/webui/service_usergameactivity.proto +34 -34
- package/protos/webui/service_usergamenotes.proto +70 -70
- package/protos/webui/service_usernews.proto +68 -68
- package/protos/webui/service_userreviews.proto +97 -97
- package/protos/webui/service_video.proto +50 -50
- package/protos/webui/service_videoclip.proto +62 -62
- package/protos/webui/service_voicechat.proto +139 -139
- package/protos/webui/service_webrtc.proto +52 -52
- package/remote.js +6784 -6784
- package/utils.js +249 -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.
|
|
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
|
+
}
|
package/.idea/deployment.xml
DELETED
|
@@ -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>
|