djs-selfbot-v13 3.1.6 → 3.1.7
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/README.md +31 -16
- package/package.json +15 -8
- package/src/client/BaseClient.js +3 -2
- package/src/client/Client.js +539 -187
- package/src/client/actions/Action.js +13 -18
- package/src/client/actions/ActionsManager.js +1 -7
- package/src/client/actions/AutoModerationActionExecution.js +0 -1
- package/src/client/actions/AutoModerationRuleCreate.js +0 -1
- package/src/client/actions/AutoModerationRuleDelete.js +0 -1
- package/src/client/actions/AutoModerationRuleUpdate.js +0 -1
- package/src/client/actions/InteractionCreate.js +115 -0
- package/src/client/actions/MessageCreate.js +4 -0
- package/src/client/actions/PresenceUpdate.js +16 -17
- package/src/client/websocket/WebSocketManager.js +31 -11
- package/src/client/websocket/WebSocketShard.js +38 -39
- package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
- package/src/client/websocket/handlers/CALL_CREATE.js +3 -3
- package/src/client/websocket/handlers/CALL_DELETE.js +2 -2
- package/src/client/websocket/handlers/CALL_UPDATE.js +2 -2
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +13 -16
- package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +11 -11
- package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
- package/src/client/websocket/handlers/GUILD_CREATE.js +0 -7
- package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
- package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUNDS_UPDATE.js +0 -0
- package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_CREATE.js +0 -0
- package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_DELETE.js +0 -0
- package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_UPDATE.js +0 -0
- package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
- package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
- package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +0 -1
- package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
- package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
- package/src/client/websocket/handlers/READY.js +137 -47
- package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +5 -7
- package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +4 -6
- package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +9 -32
- package/src/client/websocket/handlers/SOUNDBOARD_SOUNDS.js +0 -0
- package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +8 -2
- package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +1 -1
- package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -1
- package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +0 -0
- package/src/client/websocket/handlers/index.js +20 -15
- package/src/errors/Messages.js +69 -24
- package/src/index.js +43 -12
- package/src/managers/ApplicationCommandManager.js +12 -9
- package/src/managers/ApplicationCommandPermissionsManager.js +11 -3
- package/src/managers/ChannelManager.js +4 -2
- package/src/managers/ClientUserSettingManager.js +279 -161
- package/src/managers/DeveloperPortalManager.js +104 -0
- package/src/managers/GuildApplicationCommandManager.js +28 -0
- package/src/managers/GuildBanManager.js +1 -1
- package/src/managers/GuildChannelManager.js +0 -2
- package/src/managers/GuildFolderManager.js +24 -0
- package/src/managers/GuildForumThreadManager.js +28 -22
- package/src/managers/GuildMemberManager.js +216 -40
- package/src/managers/GuildSettingManager.js +15 -22
- package/src/managers/MessageManager.js +44 -42
- package/src/managers/PermissionOverwriteManager.js +1 -1
- package/src/managers/ReactionUserManager.js +5 -5
- package/src/managers/RelationshipManager.js +74 -81
- package/src/managers/SessionManager.js +57 -0
- package/src/managers/ThreadManager.js +45 -12
- package/src/managers/ThreadMemberManager.js +1 -1
- package/src/managers/UserManager.js +10 -6
- package/src/rest/APIRequest.js +20 -42
- package/src/rest/CaptchaSolver.js +132 -0
- package/src/rest/DiscordAPIError.js +16 -17
- package/src/rest/RESTManager.js +21 -1
- package/src/rest/RequestHandler.js +21 -35
- package/src/structures/ApplicationCommand.js +456 -19
- package/src/structures/ApplicationRoleConnectionMetadata.js +0 -3
- package/src/structures/AutoModerationRule.js +5 -5
- package/src/structures/AutocompleteInteraction.js +0 -1
- package/src/structures/BaseGuildTextChannel.js +12 -10
- package/src/structures/BaseGuildVoiceChannel.js +18 -16
- package/src/structures/{CallState.js → Call.js} +12 -17
- package/src/structures/CategoryChannel.js +0 -2
- package/src/structures/Channel.js +3 -2
- package/src/structures/ClientApplication.js +204 -0
- package/src/structures/ClientPresence.js +8 -12
- package/src/structures/ClientUser.js +336 -117
- package/src/structures/ContextMenuInteraction.js +1 -1
- package/src/structures/DMChannel.js +92 -29
- package/src/structures/DeveloperPortalApplication.js +520 -0
- package/src/structures/ForumChannel.js +10 -0
- package/src/structures/Guild.js +271 -135
- package/src/structures/GuildAuditLogs.js +5 -0
- package/src/structures/GuildChannel.js +2 -16
- package/src/structures/GuildFolder.js +75 -0
- package/src/structures/GuildMember.js +145 -27
- package/src/structures/Interaction.js +62 -1
- package/src/structures/InteractionResponse.js +114 -0
- package/src/structures/Invite.js +52 -35
- package/src/structures/Message.js +202 -222
- package/src/structures/MessageAttachment.js +0 -11
- package/src/structures/MessageButton.js +67 -1
- package/src/structures/MessageEmbed.js +1 -1
- package/src/structures/MessageMentions.js +2 -3
- package/src/structures/MessagePayload.js +46 -4
- package/src/structures/MessageReaction.js +1 -1
- package/src/structures/MessageSelectMenu.js +252 -1
- package/src/structures/Modal.js +180 -75
- package/src/structures/PartialGroupDMChannel.js +433 -0
- package/src/structures/Presence.js +2 -2
- package/src/structures/RichPresence.js +34 -14
- package/src/structures/Role.js +2 -18
- package/src/structures/SelectMenuInteraction.js +151 -2
- package/src/structures/Session.js +81 -0
- package/src/structures/Team.js +49 -0
- package/src/structures/TextInputComponent.js +70 -0
- package/src/structures/ThreadChannel.js +19 -0
- package/src/structures/User.js +345 -117
- package/src/structures/UserContextMenuInteraction.js +2 -2
- package/src/structures/VoiceState.js +39 -74
- package/src/structures/WebEmbed.js +52 -38
- package/src/structures/Webhook.js +11 -17
- package/src/structures/interfaces/Application.js +23 -146
- package/src/structures/interfaces/TextBasedChannel.js +256 -411
- package/src/util/ApplicationFlags.js +1 -1
- package/src/util/Constants.js +284 -106
- package/src/util/Formatters.js +2 -16
- package/src/util/LimitedCollection.js +1 -1
- package/src/util/Options.js +68 -48
- package/src/util/Permissions.js +0 -5
- package/src/util/PurchasedFlags.js +0 -2
- package/src/util/RemoteAuth.js +356 -221
- package/src/util/Sweepers.js +1 -1
- package/src/util/Util.js +36 -76
- package/src/util/Voice.js +1456 -0
- package/src/util/arRPC/index.js +229 -0
- package/src/util/arRPC/process/detectable.json +1 -0
- package/src/util/arRPC/process/index.js +102 -0
- package/src/util/arRPC/process/native/index.js +5 -0
- package/src/util/arRPC/process/native/linux.js +37 -0
- package/src/util/arRPC/process/native/win32.js +25 -0
- package/src/util/arRPC/transports/ipc.js +281 -0
- package/src/util/arRPC/transports/websocket.js +128 -0
- package/typings/enums.d.ts +73 -18
- package/typings/index.d.ts +1249 -897
- package/typings/rawDataTypes.d.ts +9 -68
- package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +0 -78
- package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +0 -12
- package/src/managers/UserNoteManager.js +0 -53
- package/src/structures/GroupDMChannel.js +0 -387
- package/src/util/AttachmentFlags.js +0 -38
- package/src/util/InviteFlags.js +0 -29
- package/src/util/RoleFlags.js +0 -37
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`;
|
|
4
|
+
const log = (...args) => console.log(`[${rgb(88, 101, 242, 'arRPC')} > ${rgb(237, 66, 69, 'process')}]`, ...args);
|
|
5
|
+
const { setInterval } = require('node:timers');
|
|
6
|
+
const process = require('process');
|
|
7
|
+
const DetectableDB = require('./detectable.json');
|
|
8
|
+
const Natives = require('./native/index.js');
|
|
9
|
+
|
|
10
|
+
const Native = Natives[process.platform];
|
|
11
|
+
|
|
12
|
+
const timestamps = {},
|
|
13
|
+
names = {},
|
|
14
|
+
pids = {};
|
|
15
|
+
module.exports = class ProcessServer {
|
|
16
|
+
constructor(handlers, debug = false) {
|
|
17
|
+
this.debug = debug;
|
|
18
|
+
if (!Native) return; // Log('unsupported platform:', process.platform);
|
|
19
|
+
|
|
20
|
+
this.handlers = handlers;
|
|
21
|
+
|
|
22
|
+
this.scan = this.scan.bind(this);
|
|
23
|
+
|
|
24
|
+
this.scan();
|
|
25
|
+
setInterval(this.scan, 5000).unref();
|
|
26
|
+
|
|
27
|
+
if (this.debug) log('started');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async scan() {
|
|
31
|
+
const processes = await Native.getProcesses();
|
|
32
|
+
const ids = [];
|
|
33
|
+
|
|
34
|
+
for (const [pid, _path] of processes) {
|
|
35
|
+
const path = _path.toLowerCase().replaceAll('\\', '/');
|
|
36
|
+
const toCompare = [path.split('/').pop(), path.split('/').slice(-2).join('/')];
|
|
37
|
+
|
|
38
|
+
for (const p of toCompare.slice()) {
|
|
39
|
+
// Add more possible tweaked paths for less false negatives
|
|
40
|
+
toCompare.push(p.replace('64', '')); // Remove 64bit identifiers-ish
|
|
41
|
+
toCompare.push(p.replace('.x64', ''));
|
|
42
|
+
toCompare.push(p.replace('x64', ''));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (const { executables, id, name } of DetectableDB) {
|
|
46
|
+
if (executables?.some(x => !x.isLauncher && toCompare.some(y => x.name === y))) {
|
|
47
|
+
names[id] = name;
|
|
48
|
+
pids[id] = pid;
|
|
49
|
+
|
|
50
|
+
ids.push(id);
|
|
51
|
+
if (!timestamps[id]) {
|
|
52
|
+
// eslint-disable-next-line max-depth
|
|
53
|
+
if (this.debug) log('detected game!', name);
|
|
54
|
+
timestamps[id] = Date.now();
|
|
55
|
+
|
|
56
|
+
this.handlers.message(
|
|
57
|
+
{
|
|
58
|
+
socketId: id,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
cmd: 'SET_ACTIVITY',
|
|
62
|
+
args: {
|
|
63
|
+
activity: {
|
|
64
|
+
application_id: id,
|
|
65
|
+
name,
|
|
66
|
+
timestamps: {
|
|
67
|
+
start: timestamps[id],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
pid,
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (const id in timestamps) {
|
|
80
|
+
if (!ids.includes(id)) {
|
|
81
|
+
if (this.debug) log('lost game!', names[id]);
|
|
82
|
+
delete timestamps[id];
|
|
83
|
+
|
|
84
|
+
this.handlers.message(
|
|
85
|
+
{
|
|
86
|
+
socketId: id,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
cmd: 'SET_ACTIVITY',
|
|
90
|
+
args: {
|
|
91
|
+
activity: null,
|
|
92
|
+
pid: pids[id],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// If (this.debug) log(`finished scan in ${(performance.now() - startTime).toFixed(2)}ms`);
|
|
100
|
+
// process.stdout.write(`\r${' '.repeat(100)}\r[${rgb(88, 101, 242, 'arRPC')} > ${rgb(237, 66, 69, 'process')}] scanned (took ${(performance.now() - startTime).toFixed(2)}ms)`);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { exec } = require('child_process');
|
|
4
|
+
const { readlink } = require('fs/promises');
|
|
5
|
+
|
|
6
|
+
const getProcesses = () =>
|
|
7
|
+
new Promise(res =>
|
|
8
|
+
exec(`ps a -o "%p;%c;%a"`, async (e, out) => {
|
|
9
|
+
res(
|
|
10
|
+
(
|
|
11
|
+
await Promise.all(
|
|
12
|
+
out
|
|
13
|
+
.toString()
|
|
14
|
+
.split('\n')
|
|
15
|
+
.slice(1, -1)
|
|
16
|
+
|
|
17
|
+
.map(async x => {
|
|
18
|
+
const split = x.trim().split(';');
|
|
19
|
+
// If (split.length === 1) return;
|
|
20
|
+
|
|
21
|
+
const pid = parseInt(split[0].trim());
|
|
22
|
+
/* Unused
|
|
23
|
+
const cmd = split[1].trim();
|
|
24
|
+
const argv = split.slice(2).join(';').trim();
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const path = await readlink(`/proc/${pid}/exe`).catch(() => {}); // Read path from /proc/{pid}/exe symlink
|
|
28
|
+
|
|
29
|
+
return [pid, path];
|
|
30
|
+
}),
|
|
31
|
+
)
|
|
32
|
+
).filter(x => x && x[1]),
|
|
33
|
+
);
|
|
34
|
+
}),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
module.exports = { getProcesses };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { exec } = require('child_process');
|
|
4
|
+
|
|
5
|
+
const getProcesses = () =>
|
|
6
|
+
new Promise(res =>
|
|
7
|
+
exec(`wmic process get ProcessID,ExecutablePath /format:csv`, (e, out) => {
|
|
8
|
+
res(
|
|
9
|
+
out
|
|
10
|
+
.toString()
|
|
11
|
+
.split('\r\n')
|
|
12
|
+
.slice(2)
|
|
13
|
+
|
|
14
|
+
.map(x => {
|
|
15
|
+
// eslint-disable-next-line newline-per-chained-call
|
|
16
|
+
const parsed = x.trim().split(',').slice(1).reverse();
|
|
17
|
+
parsed[0] = parseInt(parsed[0]) || parsed[0]; // Pid to int
|
|
18
|
+
return parsed;
|
|
19
|
+
})
|
|
20
|
+
.filter(x => x[1]),
|
|
21
|
+
);
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
module.exports = { getProcesses };
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`;
|
|
4
|
+
const log = (...args) => console.log(`[${rgb(88, 101, 242, 'arRPC')} > ${rgb(254, 231, 92, 'ipc')}]`, ...args);
|
|
5
|
+
|
|
6
|
+
const { Buffer } = require('buffer');
|
|
7
|
+
const { unlinkSync } = require('fs');
|
|
8
|
+
const { createServer, createConnection } = require('net');
|
|
9
|
+
const { setTimeout } = require('node:timers');
|
|
10
|
+
const { join } = require('path');
|
|
11
|
+
const { platform, env } = require('process');
|
|
12
|
+
|
|
13
|
+
const SOCKET_PATH =
|
|
14
|
+
platform === 'win32'
|
|
15
|
+
? '\\\\?\\pipe\\discord-ipc'
|
|
16
|
+
: join(env.XDG_RUNTIME_DIR || env.TMPDIR || env.TMP || env.TEMP || '/tmp', 'discord-ipc');
|
|
17
|
+
|
|
18
|
+
// Enums for various constants
|
|
19
|
+
const Types = {
|
|
20
|
+
// Types of packets
|
|
21
|
+
HANDSHAKE: 0,
|
|
22
|
+
FRAME: 1,
|
|
23
|
+
CLOSE: 2,
|
|
24
|
+
PING: 3,
|
|
25
|
+
PONG: 4,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const CloseCodes = {
|
|
29
|
+
// Codes for closures
|
|
30
|
+
CLOSE_NORMAL: 1000,
|
|
31
|
+
CLOSE_UNSUPPORTED: 1003,
|
|
32
|
+
CLOSE_ABNORMAL: 1006,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const ErrorCodes = {
|
|
36
|
+
// Codes for errors
|
|
37
|
+
INVALID_CLIENTID: 4000,
|
|
38
|
+
INVALID_ORIGIN: 4001,
|
|
39
|
+
RATELIMITED: 4002,
|
|
40
|
+
TOKEN_REVOKED: 4003,
|
|
41
|
+
INVALID_VERSION: 4004,
|
|
42
|
+
INVALID_ENCODING: 4005,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
let uniqueId = 0;
|
|
46
|
+
|
|
47
|
+
const encode = (type, data) => {
|
|
48
|
+
data = JSON.stringify(data);
|
|
49
|
+
const dataSize = Buffer.byteLength(data);
|
|
50
|
+
|
|
51
|
+
const buf = Buffer.alloc(dataSize + 8);
|
|
52
|
+
buf.writeInt32LE(type, 0); // Type
|
|
53
|
+
buf.writeInt32LE(dataSize, 4); // Data size
|
|
54
|
+
buf.write(data, 8, dataSize); // Data
|
|
55
|
+
|
|
56
|
+
return buf;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const read = socket => {
|
|
60
|
+
let resp = socket.read(8);
|
|
61
|
+
if (!resp) return;
|
|
62
|
+
|
|
63
|
+
resp = Buffer.from(resp);
|
|
64
|
+
const type = resp.readInt32LE(0);
|
|
65
|
+
const dataSize = resp.readInt32LE(4);
|
|
66
|
+
|
|
67
|
+
if (type < 0 || type >= Object.keys(Types).length) throw new Error('invalid type');
|
|
68
|
+
|
|
69
|
+
let data = socket.read(dataSize);
|
|
70
|
+
if (!data) throw new Error('failed reading data');
|
|
71
|
+
|
|
72
|
+
data = JSON.parse(Buffer.from(data).toString());
|
|
73
|
+
|
|
74
|
+
switch (type) {
|
|
75
|
+
case Types.PING:
|
|
76
|
+
socket.emit('ping', data);
|
|
77
|
+
socket.write(encode(Types.PONG, data));
|
|
78
|
+
break;
|
|
79
|
+
|
|
80
|
+
case Types.PONG:
|
|
81
|
+
socket.emit('pong', data);
|
|
82
|
+
break;
|
|
83
|
+
|
|
84
|
+
case Types.HANDSHAKE:
|
|
85
|
+
if (socket._handshook) throw new Error('already handshook');
|
|
86
|
+
|
|
87
|
+
socket._handshook = true;
|
|
88
|
+
socket.emit('handshake', data);
|
|
89
|
+
break;
|
|
90
|
+
|
|
91
|
+
case Types.FRAME:
|
|
92
|
+
if (!socket._handshook) throw new Error('need to handshake first');
|
|
93
|
+
|
|
94
|
+
socket.emit('request', data);
|
|
95
|
+
break;
|
|
96
|
+
|
|
97
|
+
case Types.CLOSE:
|
|
98
|
+
socket.end();
|
|
99
|
+
socket.destroy();
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
read(socket);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const socketIsAvailable = async socket => {
|
|
107
|
+
socket.pause();
|
|
108
|
+
socket.on('readable', () => {
|
|
109
|
+
try {
|
|
110
|
+
read(socket);
|
|
111
|
+
} catch (e) {
|
|
112
|
+
// Debug: log('error whilst reading', e);
|
|
113
|
+
socket.end(
|
|
114
|
+
encode(Types.CLOSE, {
|
|
115
|
+
code: CloseCodes.CLOSE_UNSUPPORTED,
|
|
116
|
+
message: e.message,
|
|
117
|
+
}),
|
|
118
|
+
);
|
|
119
|
+
socket.destroy();
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const stop = () => {
|
|
124
|
+
try {
|
|
125
|
+
socket.end();
|
|
126
|
+
socket.destroy();
|
|
127
|
+
} catch {
|
|
128
|
+
// Debug
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const possibleOutcomes = Promise.race([
|
|
133
|
+
new Promise(res => socket.on('error', res)), // Errored
|
|
134
|
+
// eslint-disable-next-line prefer-promise-reject-errors
|
|
135
|
+
new Promise((res, rej) => socket.on('pong', () => rej('socket ponged'))), // Ponged
|
|
136
|
+
// eslint-disable-next-line prefer-promise-reject-errors
|
|
137
|
+
new Promise((res, rej) => setTimeout(() => rej('timed out'), 1000).unref()), // Timed out
|
|
138
|
+
]).then(
|
|
139
|
+
() => true,
|
|
140
|
+
e => e,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
socket.write(encode(Types.PING, ++uniqueId));
|
|
144
|
+
|
|
145
|
+
const outcome = await possibleOutcomes;
|
|
146
|
+
stop();
|
|
147
|
+
// Debug: log('checked if socket is available:', outcome === true, outcome === true ? '' : `- reason: ${outcome}`);
|
|
148
|
+
|
|
149
|
+
return outcome === true;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const getAvailableSocket = async (tries = 0) => {
|
|
153
|
+
if (tries > 9) {
|
|
154
|
+
throw new Error('ran out of tries to find socket', tries);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const path = `${SOCKET_PATH}-${tries}`;
|
|
158
|
+
const socket = createConnection(path);
|
|
159
|
+
|
|
160
|
+
// Debug: log('checking', path);
|
|
161
|
+
|
|
162
|
+
if (await socketIsAvailable(socket)) {
|
|
163
|
+
if (platform !== 'win32') {
|
|
164
|
+
try {
|
|
165
|
+
unlinkSync(path);
|
|
166
|
+
} catch {
|
|
167
|
+
// Debug
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return path;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Debug: log(`not available, trying again (attempt ${tries + 1})`);
|
|
175
|
+
return getAvailableSocket(tries + 1);
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
module.exports = class IPCServer {
|
|
179
|
+
constructor(handers, debug = false) {
|
|
180
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
181
|
+
return new Promise(async res => {
|
|
182
|
+
this.debug = debug;
|
|
183
|
+
this.handlers = handers;
|
|
184
|
+
|
|
185
|
+
this.onConnection = this.onConnection.bind(this);
|
|
186
|
+
this.onMessage = this.onMessage.bind(this);
|
|
187
|
+
|
|
188
|
+
const server = createServer(this.onConnection);
|
|
189
|
+
server.on('error', e => {
|
|
190
|
+
if (this.debug) log('server error', e);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
const socketPath = await getAvailableSocket();
|
|
194
|
+
server.listen(socketPath, () => {
|
|
195
|
+
if (this.debug) log('listening at', socketPath);
|
|
196
|
+
this.server = server;
|
|
197
|
+
|
|
198
|
+
res(this);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
onConnection(socket) {
|
|
204
|
+
if (this.debug) log('new connection!');
|
|
205
|
+
|
|
206
|
+
socket.pause();
|
|
207
|
+
socket.on('readable', () => {
|
|
208
|
+
try {
|
|
209
|
+
read(socket);
|
|
210
|
+
} catch (e) {
|
|
211
|
+
if (this.debug) log('error whilst reading', e);
|
|
212
|
+
|
|
213
|
+
socket.end(
|
|
214
|
+
encode(Types.CLOSE, {
|
|
215
|
+
code: CloseCodes.CLOSE_UNSUPPORTED,
|
|
216
|
+
message: e.message,
|
|
217
|
+
}),
|
|
218
|
+
);
|
|
219
|
+
socket.destroy();
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
socket.once('handshake', params => {
|
|
224
|
+
if (this.debug) log('handshake:', params);
|
|
225
|
+
|
|
226
|
+
const ver = parseInt(params.v ?? 1);
|
|
227
|
+
const clientId = params.client_id ?? '';
|
|
228
|
+
// Encoding is always json for ipc
|
|
229
|
+
|
|
230
|
+
socket.close = (code = CloseCodes.CLOSE_NORMAL, message = '') => {
|
|
231
|
+
socket.end(
|
|
232
|
+
encode(Types.CLOSE, {
|
|
233
|
+
code,
|
|
234
|
+
message,
|
|
235
|
+
}),
|
|
236
|
+
);
|
|
237
|
+
socket.destroy();
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
if (ver !== 1) {
|
|
241
|
+
if (this.debug) log('unsupported version requested', ver);
|
|
242
|
+
|
|
243
|
+
socket.close(ErrorCodes.INVALID_VERSION);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (clientId === '') {
|
|
248
|
+
if (this.debug) log('client id required');
|
|
249
|
+
|
|
250
|
+
socket.close(ErrorCodes.INVALID_CLIENTID);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
socket.on('error', e => {
|
|
255
|
+
if (this.debug) log('socket error', e);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
socket.on('close', e => {
|
|
259
|
+
if (this.debug) log('socket closed', e);
|
|
260
|
+
this.handlers.close(socket);
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
socket.on('request', this.onMessage.bind(this, socket));
|
|
264
|
+
|
|
265
|
+
socket._send = socket.send;
|
|
266
|
+
socket.send = msg => {
|
|
267
|
+
if (this.debug) log('sending', msg);
|
|
268
|
+
socket.write(encode(Types.FRAME, msg));
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
socket.clientId = clientId;
|
|
272
|
+
|
|
273
|
+
this.handlers.connection(socket);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
onMessage(socket, msg) {
|
|
278
|
+
if (this.debug) log('message', msg);
|
|
279
|
+
this.handlers.message(socket, msg);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const rgb = (r, g, b, msg) => `\x1b[38;2;${r};${g};${b}m${msg}\x1b[0m`;
|
|
4
|
+
const log = (...args) => console.log(`[${rgb(88, 101, 242, 'arRPC')} > ${rgb(235, 69, 158, 'websocket')}]`, ...args);
|
|
5
|
+
|
|
6
|
+
const { createServer } = require('http');
|
|
7
|
+
const { parse } = require('querystring');
|
|
8
|
+
const { WebSocketServer } = require('ws');
|
|
9
|
+
|
|
10
|
+
const portRange = [6463, 6472]; // Ports available/possible: 6463-6472
|
|
11
|
+
|
|
12
|
+
module.exports = class WSServer {
|
|
13
|
+
constructor(handlers, debug = false) {
|
|
14
|
+
return (async () => {
|
|
15
|
+
this.debug = debug;
|
|
16
|
+
|
|
17
|
+
this.handlers = handlers;
|
|
18
|
+
|
|
19
|
+
this.onConnection = this.onConnection.bind(this);
|
|
20
|
+
this.onMessage = this.onMessage.bind(this);
|
|
21
|
+
|
|
22
|
+
let port = portRange[0];
|
|
23
|
+
|
|
24
|
+
let http, wss;
|
|
25
|
+
while (port <= portRange[1]) {
|
|
26
|
+
if (this.debug) log('trying port', port);
|
|
27
|
+
|
|
28
|
+
if (
|
|
29
|
+
await new Promise(res => {
|
|
30
|
+
http = createServer();
|
|
31
|
+
http.on('error', e => {
|
|
32
|
+
// Log('http error', e);
|
|
33
|
+
|
|
34
|
+
if (e.code === 'EADDRINUSE') {
|
|
35
|
+
if (this.debug) log(port, 'in use!');
|
|
36
|
+
res(false);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
wss = new WebSocketServer({ server: http });
|
|
41
|
+
// eslint-disable-next-line no-unused-vars
|
|
42
|
+
wss.on('error', e => {
|
|
43
|
+
// Debug: Log('wss error', e);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
wss.on('connection', this.onConnection);
|
|
47
|
+
|
|
48
|
+
http.listen(port, '127.0.0.1', () => {
|
|
49
|
+
if (this.debug) log('listening on', port);
|
|
50
|
+
|
|
51
|
+
this.http = http;
|
|
52
|
+
this.wss = wss;
|
|
53
|
+
|
|
54
|
+
res(true);
|
|
55
|
+
});
|
|
56
|
+
})
|
|
57
|
+
) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
port++;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return this;
|
|
64
|
+
})();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
onConnection(socket, req) {
|
|
68
|
+
const params = parse(req.url.split('?')[1]);
|
|
69
|
+
const ver = parseInt(params.v ?? 1);
|
|
70
|
+
const encoding = params.encoding ?? 'json'; // Json | etf (erlpack)
|
|
71
|
+
const clientId = params.client_id ?? '';
|
|
72
|
+
|
|
73
|
+
const origin = req.headers.origin ?? '';
|
|
74
|
+
|
|
75
|
+
if (this.debug) log(`new connection! origin:`, origin, JSON.parse(JSON.stringify(params)));
|
|
76
|
+
|
|
77
|
+
if (
|
|
78
|
+
origin !== '' &&
|
|
79
|
+
!['https://discord.com', 'https://ptb.discord.com', 'https://canary.discord.com/'].includes(origin)
|
|
80
|
+
) {
|
|
81
|
+
if (this.debug) log('disallowed origin', origin);
|
|
82
|
+
|
|
83
|
+
socket.close();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (encoding !== 'json') {
|
|
88
|
+
if (this.debug) log('unsupported encoding requested', encoding);
|
|
89
|
+
|
|
90
|
+
socket.close();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (ver !== 1) {
|
|
95
|
+
if (this.debug) log('unsupported version requested', ver);
|
|
96
|
+
|
|
97
|
+
socket.close();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
socket.clientId = clientId;
|
|
102
|
+
socket.encoding = encoding;
|
|
103
|
+
|
|
104
|
+
socket.on('error', e => {
|
|
105
|
+
if (this.debug) log('socket error', e);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
socket.on('close', (e, r) => {
|
|
109
|
+
if (this.debug) log('socket closed', e, r);
|
|
110
|
+
this.handlers.close(socket);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
socket.on('message', this.onMessage.bind(this, socket));
|
|
114
|
+
|
|
115
|
+
socket._send = socket.send;
|
|
116
|
+
socket.send = msg => {
|
|
117
|
+
if (this.debug) log('sending', msg);
|
|
118
|
+
socket._send(JSON.stringify(msg));
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
this.handlers.connection(socket);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
onMessage(socket, msg) {
|
|
125
|
+
if (this.debug) log('message', JSON.parse(msg));
|
|
126
|
+
this.handlers.message(socket, JSON.parse(msg));
|
|
127
|
+
}
|
|
128
|
+
};
|
package/typings/enums.d.ts
CHANGED
|
@@ -10,6 +10,67 @@ export const enum ActivityTypes {
|
|
|
10
10
|
COMPETING = 5,
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export const enum DMScanLevel {
|
|
14
|
+
NOT_SCAN = 0,
|
|
15
|
+
NOT_FRIEND = 1,
|
|
16
|
+
EVERYONE = 2,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const enum stickerAnimationMode {
|
|
20
|
+
ALWAYS = 0,
|
|
21
|
+
INTERACTION = 1,
|
|
22
|
+
NEVER = 2,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const enum NitroType {
|
|
26
|
+
NONE = 0,
|
|
27
|
+
NITRO_CLASSIC = 1,
|
|
28
|
+
NITRO_BOOST = 2,
|
|
29
|
+
NITRO_BASIC = 3,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const enum RelationshipTypes {
|
|
33
|
+
NONE = 0,
|
|
34
|
+
FRIEND = 1,
|
|
35
|
+
BLOCKED = 2,
|
|
36
|
+
PENDING_INCOMING = 3,
|
|
37
|
+
PENDING_OUTGOING = 4,
|
|
38
|
+
IMPLICIT = 5,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const enum localeSetting {
|
|
42
|
+
DANISH = 'da',
|
|
43
|
+
GERMAN = 'de',
|
|
44
|
+
ENGLISH_UK = 'en-GB',
|
|
45
|
+
ENGLISH_US = 'en-US',
|
|
46
|
+
SPANISH = 'es-ES',
|
|
47
|
+
FRENCH = 'fr',
|
|
48
|
+
CROATIAN = 'hr',
|
|
49
|
+
ITALIAN = 'it',
|
|
50
|
+
LITHUANIAN = 'lt',
|
|
51
|
+
HUNGARIAN = 'hu',
|
|
52
|
+
DUTCH = 'nl',
|
|
53
|
+
NORWEGIAN = 'no',
|
|
54
|
+
POLISH = 'pl',
|
|
55
|
+
BRAZILIAN_PORTUGUESE = 'pt-BR',
|
|
56
|
+
ROMANIA_ROMANIAN = 'ro',
|
|
57
|
+
FINNISH = 'fi',
|
|
58
|
+
SWEDISH = 'sv-SE',
|
|
59
|
+
VIETNAMESE = 'vi',
|
|
60
|
+
TURKISH = 'tr',
|
|
61
|
+
CZECH = 'cs',
|
|
62
|
+
GREEK = 'el',
|
|
63
|
+
BULGARIAN = 'bg',
|
|
64
|
+
RUSSIAN = 'ru',
|
|
65
|
+
UKRAINIAN = 'uk',
|
|
66
|
+
HINDI = 'hi',
|
|
67
|
+
THAI = 'th',
|
|
68
|
+
CHINA_CHINESE = 'zh-CN',
|
|
69
|
+
JAPANESE = 'ja',
|
|
70
|
+
TAIWAN_CHINESE = 'zh-TW',
|
|
71
|
+
KOREAN = 'ko',
|
|
72
|
+
}
|
|
73
|
+
|
|
13
74
|
export const enum ApplicationCommandTypes {
|
|
14
75
|
CHAT_INPUT = 1,
|
|
15
76
|
USER = 2,
|
|
@@ -142,6 +203,13 @@ export const enum GuildScheduledEventStatuses {
|
|
|
142
203
|
CANCELED = 4,
|
|
143
204
|
}
|
|
144
205
|
|
|
206
|
+
export const enum HypeSquadType {
|
|
207
|
+
LEAVE = 0,
|
|
208
|
+
HOUSE_BRAVERY = 1,
|
|
209
|
+
HOUSE_BRILLIANCE = 2,
|
|
210
|
+
HOUSE_BALANCE = 3,
|
|
211
|
+
}
|
|
212
|
+
|
|
145
213
|
export const enum InteractionResponseTypes {
|
|
146
214
|
PONG = 1,
|
|
147
215
|
CHANNEL_MESSAGE_WITH_SOURCE = 4,
|
|
@@ -162,15 +230,7 @@ export const enum InteractionTypes {
|
|
|
162
230
|
|
|
163
231
|
export const enum InviteTargetType {
|
|
164
232
|
STREAM = 1,
|
|
165
|
-
EMBEDDED_APPLICATION,
|
|
166
|
-
ROLE_SUBSCRIPTIONS,
|
|
167
|
-
CREATOR_PAGE,
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export const enum InviteType {
|
|
171
|
-
GUILD,
|
|
172
|
-
GROUP_DM,
|
|
173
|
-
FRIEND,
|
|
233
|
+
EMBEDDED_APPLICATION = 2,
|
|
174
234
|
}
|
|
175
235
|
|
|
176
236
|
export const enum MembershipStates {
|
|
@@ -189,6 +249,8 @@ export const enum MessageButtonStyles {
|
|
|
189
249
|
export const enum MessageComponentTypes {
|
|
190
250
|
ACTION_ROW = 1,
|
|
191
251
|
BUTTON = 2,
|
|
252
|
+
/** @deprecated Use `STRING_SELECT` instead */
|
|
253
|
+
SELECT_MENU = 3,
|
|
192
254
|
STRING_SELECT = 3,
|
|
193
255
|
TEXT_INPUT = 4,
|
|
194
256
|
USER_SELECT = 5,
|
|
@@ -198,6 +260,8 @@ export const enum MessageComponentTypes {
|
|
|
198
260
|
}
|
|
199
261
|
|
|
200
262
|
export const enum SelectMenuComponentTypes {
|
|
263
|
+
/** @deprecated Use `STRING_SELECT` instead */
|
|
264
|
+
SELECT_MENU = 3,
|
|
201
265
|
STRING_SELECT = 3,
|
|
202
266
|
USER_SELECT = 5,
|
|
203
267
|
ROLE_SELECT = 6,
|
|
@@ -280,12 +344,3 @@ export enum ApplicationRoleConnectionMetadataTypes {
|
|
|
280
344
|
BOOLEAN_EQUAL,
|
|
281
345
|
BOOLEAN_NOT_EQUAL,
|
|
282
346
|
}
|
|
283
|
-
|
|
284
|
-
export const enum RelationshipTypes {
|
|
285
|
-
NONE = 0,
|
|
286
|
-
FRIEND = 1,
|
|
287
|
-
BLOCKED = 2,
|
|
288
|
-
PENDING_INCOMING = 3,
|
|
289
|
-
PENDING_OUTGOING = 4,
|
|
290
|
-
IMPLICIT = 5,
|
|
291
|
-
}
|