djs-selfbot-v13 3.1.5 → 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.
Files changed (152) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +42 -15
  3. package/package.json +24 -9
  4. package/src/client/BaseClient.js +3 -2
  5. package/src/client/Client.js +539 -187
  6. package/src/client/actions/Action.js +13 -18
  7. package/src/client/actions/ActionsManager.js +1 -7
  8. package/src/client/actions/AutoModerationActionExecution.js +0 -1
  9. package/src/client/actions/AutoModerationRuleCreate.js +0 -1
  10. package/src/client/actions/AutoModerationRuleDelete.js +0 -1
  11. package/src/client/actions/AutoModerationRuleUpdate.js +0 -1
  12. package/src/client/actions/GuildMemberRemove.js +1 -1
  13. package/src/client/actions/GuildMemberUpdate.js +1 -1
  14. package/src/client/actions/InteractionCreate.js +115 -0
  15. package/src/client/actions/MessageCreate.js +4 -0
  16. package/src/client/actions/PresenceUpdate.js +16 -17
  17. package/src/client/websocket/WebSocketManager.js +31 -11
  18. package/src/client/websocket/WebSocketShard.js +38 -39
  19. package/src/client/websocket/handlers/APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE.js +23 -0
  20. package/src/client/websocket/handlers/CALL_CREATE.js +3 -3
  21. package/src/client/websocket/handlers/CALL_DELETE.js +2 -2
  22. package/src/client/websocket/handlers/CALL_UPDATE.js +2 -2
  23. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_ADD.js +13 -16
  24. package/src/client/websocket/handlers/CHANNEL_RECIPIENT_REMOVE.js +11 -11
  25. package/src/client/websocket/handlers/GUILD_APPLICATION_COMMANDS_UPDATE.js +11 -0
  26. package/src/client/websocket/handlers/GUILD_CREATE.js +0 -7
  27. package/src/client/websocket/handlers/GUILD_MEMBER_ADD.js +1 -1
  28. package/src/client/websocket/handlers/GUILD_MEMBER_LIST_UPDATE.js +55 -0
  29. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUNDS_UPDATE.js +0 -0
  30. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_CREATE.js +0 -0
  31. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_DELETE.js +0 -0
  32. package/src/client/websocket/handlers/GUILD_SOUNDBOARD_SOUND_UPDATE.js +0 -0
  33. package/src/client/websocket/handlers/INTERACTION_CREATE.js +16 -0
  34. package/src/client/websocket/handlers/INTERACTION_FAILURE.js +18 -0
  35. package/src/client/websocket/handlers/INTERACTION_MODAL_CREATE.js +0 -1
  36. package/src/client/websocket/handlers/INTERACTION_SUCCESS.js +30 -0
  37. package/src/client/websocket/handlers/MESSAGE_ACK.js +16 -0
  38. package/src/client/websocket/handlers/READY.js +137 -47
  39. package/src/client/websocket/handlers/RELATIONSHIP_ADD.js +5 -7
  40. package/src/client/websocket/handlers/RELATIONSHIP_REMOVE.js +4 -6
  41. package/src/client/websocket/handlers/RELATIONSHIP_UPDATE.js +9 -32
  42. package/src/client/websocket/handlers/SOUNDBOARD_SOUNDS.js +0 -0
  43. package/src/client/websocket/handlers/USER_GUILD_SETTINGS_UPDATE.js +8 -2
  44. package/src/client/websocket/handlers/USER_NOTE_UPDATE.js +1 -1
  45. package/src/client/websocket/handlers/USER_SETTINGS_UPDATE.js +5 -1
  46. package/src/client/websocket/handlers/VOICE_CHANNEL_EFFECT_SEND.js +0 -0
  47. package/src/client/websocket/handlers/index.js +20 -15
  48. package/src/errors/Messages.js +69 -24
  49. package/src/index.js +43 -12
  50. package/src/managers/ApplicationCommandManager.js +12 -9
  51. package/src/managers/ApplicationCommandPermissionsManager.js +11 -3
  52. package/src/managers/ChannelManager.js +4 -2
  53. package/src/managers/ClientUserSettingManager.js +279 -161
  54. package/src/managers/DeveloperPortalManager.js +104 -0
  55. package/src/managers/GuildApplicationCommandManager.js +28 -0
  56. package/src/managers/GuildBanManager.js +1 -1
  57. package/src/managers/GuildChannelManager.js +0 -2
  58. package/src/managers/GuildFolderManager.js +24 -0
  59. package/src/managers/GuildForumThreadManager.js +28 -22
  60. package/src/managers/GuildMemberManager.js +216 -40
  61. package/src/managers/GuildSettingManager.js +15 -22
  62. package/src/managers/MessageManager.js +44 -42
  63. package/src/managers/PermissionOverwriteManager.js +1 -1
  64. package/src/managers/ReactionUserManager.js +5 -5
  65. package/src/managers/RelationshipManager.js +74 -81
  66. package/src/managers/SessionManager.js +57 -0
  67. package/src/managers/ThreadManager.js +45 -12
  68. package/src/managers/ThreadMemberManager.js +1 -1
  69. package/src/managers/UserManager.js +10 -6
  70. package/src/rest/APIRequest.js +20 -42
  71. package/src/rest/CaptchaSolver.js +132 -0
  72. package/src/rest/DiscordAPIError.js +16 -17
  73. package/src/rest/RESTManager.js +21 -1
  74. package/src/rest/RequestHandler.js +21 -35
  75. package/src/structures/ApplicationCommand.js +456 -19
  76. package/src/structures/ApplicationRoleConnectionMetadata.js +0 -3
  77. package/src/structures/AutoModerationRule.js +5 -5
  78. package/src/structures/AutocompleteInteraction.js +0 -1
  79. package/src/structures/BaseGuildTextChannel.js +12 -10
  80. package/src/structures/BaseGuildVoiceChannel.js +18 -16
  81. package/src/structures/{CallState.js → Call.js} +12 -17
  82. package/src/structures/CategoryChannel.js +0 -2
  83. package/src/structures/Channel.js +3 -2
  84. package/src/structures/ClientApplication.js +204 -0
  85. package/src/structures/ClientPresence.js +8 -12
  86. package/src/structures/ClientUser.js +338 -117
  87. package/src/structures/ContextMenuInteraction.js +1 -1
  88. package/src/structures/DMChannel.js +92 -29
  89. package/src/structures/DeveloperPortalApplication.js +520 -0
  90. package/src/structures/ForumChannel.js +10 -0
  91. package/src/structures/Guild.js +271 -135
  92. package/src/structures/GuildAuditLogs.js +5 -0
  93. package/src/structures/GuildChannel.js +2 -16
  94. package/src/structures/GuildFolder.js +75 -0
  95. package/src/structures/GuildMember.js +145 -27
  96. package/src/structures/Interaction.js +62 -1
  97. package/src/structures/InteractionResponse.js +114 -0
  98. package/src/structures/Invite.js +52 -35
  99. package/src/structures/Message.js +202 -222
  100. package/src/structures/MessageAttachment.js +0 -11
  101. package/src/structures/MessageButton.js +67 -1
  102. package/src/structures/MessageEmbed.js +1 -1
  103. package/src/structures/MessageMentions.js +2 -3
  104. package/src/structures/MessagePayload.js +46 -4
  105. package/src/structures/MessageReaction.js +1 -1
  106. package/src/structures/MessageSelectMenu.js +252 -1
  107. package/src/structures/Modal.js +180 -75
  108. package/src/structures/PartialGroupDMChannel.js +433 -0
  109. package/src/structures/Presence.js +2 -2
  110. package/src/structures/RichPresence.js +34 -14
  111. package/src/structures/Role.js +2 -18
  112. package/src/structures/SelectMenuInteraction.js +151 -2
  113. package/src/structures/Session.js +81 -0
  114. package/src/structures/Team.js +49 -0
  115. package/src/structures/TextInputComponent.js +70 -0
  116. package/src/structures/ThreadChannel.js +19 -0
  117. package/src/structures/User.js +345 -117
  118. package/src/structures/UserContextMenuInteraction.js +2 -2
  119. package/src/structures/VoiceState.js +39 -74
  120. package/src/structures/WebEmbed.js +52 -38
  121. package/src/structures/Webhook.js +11 -17
  122. package/src/structures/interfaces/Application.js +23 -146
  123. package/src/structures/interfaces/TextBasedChannel.js +256 -411
  124. package/src/util/ApplicationFlags.js +1 -1
  125. package/src/util/Constants.js +284 -106
  126. package/src/util/Formatters.js +2 -16
  127. package/src/util/LimitedCollection.js +1 -1
  128. package/src/util/Options.js +68 -48
  129. package/src/util/Permissions.js +0 -5
  130. package/src/util/PurchasedFlags.js +0 -2
  131. package/src/util/RemoteAuth.js +356 -221
  132. package/src/util/Sweepers.js +1 -1
  133. package/src/util/Util.js +36 -76
  134. package/src/util/Voice.js +1456 -0
  135. package/src/util/arRPC/index.js +229 -0
  136. package/src/util/arRPC/process/detectable.json +1 -0
  137. package/src/util/arRPC/process/index.js +102 -0
  138. package/src/util/arRPC/process/native/index.js +5 -0
  139. package/src/util/arRPC/process/native/linux.js +37 -0
  140. package/src/util/arRPC/process/native/win32.js +25 -0
  141. package/src/util/arRPC/transports/ipc.js +281 -0
  142. package/src/util/arRPC/transports/websocket.js +128 -0
  143. package/typings/enums.d.ts +73 -18
  144. package/typings/index.d.ts +1250 -898
  145. package/typings/rawDataTypes.d.ts +9 -68
  146. package/src/client/websocket/handlers/USER_REQUIRED_ACTION_UPDATE.js +0 -78
  147. package/src/client/websocket/handlers/VOICE_CHANNEL_STATUS_UPDATE.js +0 -12
  148. package/src/managers/UserNoteManager.js +0 -53
  149. package/src/structures/GroupDMChannel.js +0 -387
  150. package/src/util/AttachmentFlags.js +0 -38
  151. package/src/util/InviteFlags.js +0 -29
  152. 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,5 @@
1
+ 'use strict';
2
+
3
+ const linux = require('./linux.js');
4
+ const win32 = require('./win32.js');
5
+ module.exports = { win32, linux };
@@ -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
+ };
@@ -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
- }