Files
discord.js-selfbot/discord.js-selfbot.js
2024-06-27 01:00:05 +02:00

342 lines
11 KiB
JavaScript

const axios = require('axios');
const { cp } = require('fs');
const WebSocket = require('ws');
class EventEmitter {
constructor() {
this.events = {};
}
on(event, listener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
}
emit(event, ...args) {
if (this.events[event]) {
this.events[event].forEach(listener => {
listener(...args);
});
}
}
}
class Client extends EventEmitter {
constructor() {
super();
this.baseUrl = 'https://discord.com/api/v10';
}
async login(token) {
try {
this.token = token;
const user = await this.getUser();
this.user = user;
this.emit('ready');
this.initWebSocket();
} catch (error) {
console.error('Erreur lors de l\'initialisation :', error);
}
}
initWebSocket() {
// Simplified example to open a WebSocket connection
this.ws = new WebSocket('wss://gateway.discord.gg/?v=10&encoding=json')
this.ws.on('open', () => {
// Envoyer un payload pour identifier et initialiser la session
this.ws.send(JSON.stringify({
op: 2,
d: {
token: this.token,
intents: 3276799, // Intents pour avoir tous les événements
properties: {
$os: 'linux',
$browser: 'my_library',
$device: 'my_library'
}
}
}));
});
this.ws.on('message', (data) => {
const payload = JSON.parse(data);
// Vérifier le type de l'événement reçu
switch (payload.op) {
case 10: // Hello
// Répondre avec le heartbeat
const interval = payload.d.heartbeat_interval;
setInterval(() => {
this.ws.send(JSON.stringify({
op: 1,
d: null
}));
}, interval);
break;
case 0: // Dispatch
const { t, d } = payload;
switch (t) {
case 'APPLICATION_COMMAND_PERMISSIONS_UPDATE':
this.emit('applicationCommandPermissionsUpdate', d);
break;
case 'AUTO_MODERATION_ACTION_EXECUTION':
this.emit('autoModerationActionExecution', d);
break;
case 'AUTO_MODERATION_RULE_CREATE':
this.emit('autoModerationRuleCreate', d);
break;
case 'AUTO_MODERATION_RULE_DELETE':
this.emit('autoModerationRuleDelete', d);
break;
case 'AUTO_MODERATION_RULE_UPDATE':
this.emit('autoModerationRuleUpdate', d);
break;
case 'CHANNEL_CREATE':
this.emit('channelCreate', d);
break;
case 'CHANNEL_DELETE':
this.emit('channelDelete', d);
break;
case 'CHANNEL_PINS_UPDATE':
this.emit('channelPinsUpdate', d);
break;
case 'CHANNEL_UPDATE':
this.emit('channelUpdate', d);
break;
case 'DEBUG':
this.emit('debug', d);
break;
case 'EMOJI_CREATE':
this.emit('emojiCreate', d);
break;
case 'EMOJI_DELETE':
this.emit('emojiDelete', d);
break;
case 'EMOJI_UPDATE':
this.emit('emojiUpdate', d);
break;
case 'ENTITLEMENT_CREATE':
this.emit('entitlementCreate', d);
break;
case 'ENTITLEMENT_DELETE':
this.emit('entitlementDelete', d);
break;
case 'ENTITLEMENT_UPDATE':
this.emit('entitlementUpdate', d);
break;
case 'ERROR':
this.emit('error', d);
break;
case 'GUILD_AUDIT_LOG_ENTRY_CREATE':
this.emit('guildAuditLogEntryCreate', d);
break;
case 'GUILD_AVAILABLE':
this.emit('guildAvailable', d);
break;
case 'GUILD_BAN_ADD':
this.emit('guildBanAdd', d);
break;
case 'GUILD_BAN_REMOVE':
this.emit('guildBanRemove', d);
break;
case 'GUILD_CREATE':
this.emit('guildCreate', d);
break;
case 'GUILD_DELETE':
this.emit('guildDelete', d);
break;
case 'GUILD_INTEGRATIONS_UPDATE':
this.emit('guildIntegrationsUpdate', d);
break;
case 'GUILD_MEMBER_ADD':
this.emit('guildMemberAdd', d);
break;
case 'GUILD_MEMBER_AVAILABLE':
this.emit('guildMemberAvailable', d);
break;
case 'GUILD_MEMBER_REMOVE':
this.emit('guildMemberRemove', d);
break;
case 'GUILD_MEMBERS_CHUNK':
this.emit('guildMembersChunk', d);
break;
case 'GUILD_MEMBER_UPDATE':
this.emit('guildMemberUpdate', d);
break;
case 'GUILD_SCHEDULED_EVENT_CREATE':
this.emit('guildScheduledEventCreate', d);
break;
case 'GUILD_SCHEDULED_EVENT_DELETE':
this.emit('guildScheduledEventDelete', d);
break;
case 'GUILD_SCHEDULED_EVENT_UPDATE':
this.emit('guildScheduledEventUpdate', d);
break;
case 'GUILD_SCHEDULED_EVENT_USER_ADD':
this.emit('guildScheduledEventUserAdd', d);
break;
case 'GUILD_SCHEDULED_EVENT_USER_REMOVE':
this.emit('guildScheduledEventUserRemove', d);
break;
case 'GUILD_UNAVAILABLE':
this.emit('guildUnavailable', d);
break;
case 'GUILD_UPDATE':
this.emit('guildUpdate', d);
break;
case 'INTERACTION_CREATE':
this.emit('interactionCreate', d);
break;
case 'INVITE_CREATE':
this.emit('inviteCreate', d);
break;
case 'INVITE_DELETE':
this.emit('inviteDelete', d);
break;
case 'MESSAGE_CREATE':
this.emit('messageCreate', d);
break;
case 'MESSAGE_DELETE':
this.emit('messageDelete', d);
break;
case 'MESSAGE_DELETE_BULK':
this.emit('messageDeleteBulk', d);
break;
case 'MESSAGE_POLL_VOTE_ADD':
this.emit('messagePollVoteAdd', d);
break;
case 'MESSAGE_POLL_VOTE_REMOVE':
this.emit('messagePollVoteRemove', d);
break;
case 'MESSAGE_REACTION_ADD':
this.emit('messageReactionAdd', d);
break;
case 'MESSAGE_REACTION_REMOVE':
this.emit('messageReactionRemove', d);
break;
case 'MESSAGE_REACTION_REMOVE_ALL':
this.emit('messageReactionRemoveAll', d);
break;
case 'MESSAGE_REACTION_REMOVE_EMOJI':
this.emit('messageReactionRemoveEmoji', d);
break;
case 'MESSAGE_UPDATE':
this.emit('messageUpdate', d);
break;
case 'PRESENCE_UPDATE':
this.emit('presenceUpdate', d);
break;
//case 'READY':
// this.emit('ready', d);
// break;
case 'ROLE_CREATE':
this.emit('roleCreate', d);
break;
case 'ROLE_DELETE':
this.emit('roleDelete', d);
break;
case 'ROLE_UPDATE':
this.emit('roleUpdate', d);
break;
case 'SHARD_DISCONNECT':
this.emit('shardDisconnect', d);
break;
case 'SHARD_ERROR':
this.emit('shardError', d);
break;
case 'SHARD_READY':
this.emit('shardReady', d);
break;
case 'SHARD_RECONNECTING':
this.emit('shardReconnecting', d);
break;
case 'SHARD_RESUME':
this.emit('shardResume', d);
break;
case 'STAGE_INSTANCE_CREATE':
this.emit('stageInstanceCreate', d);
break;
case 'STAGE_INSTANCE_DELETE':
this.emit('stageInstanceDelete', d);
break;
case 'STAGE_INSTANCE_UPDATE':
this.emit('stageInstanceUpdate', d);
break;
case 'STICKER_CREATE':
this.emit('stickerCreate', d);
break;
case 'STICKER_DELETE':
this.emit('stickerDelete', d);
break;
case 'STICKER_UPDATE':
this.emit('stickerUpdate', d);
break;
case 'THREAD_CREATE':
this.emit('threadCreate', d);
break;
case 'THREAD_DELETE':
this.emit('threadDelete', d);
break;
case 'THREAD_LIST_SYNC':
this.emit('threadListSync', d);
break;
case 'THREAD_MEMBERS_UPDATE':
this.emit('threadMembersUpdate', d);
break;
case 'THREAD_MEMBER_UPDATE':
this.emit('threadMemberUpdate', d);
break;
case 'THREAD_UPDATE':
this.emit('threadUpdate', d);
break;
case 'TYPING_START':
this.emit('typingStart', d);
break;
case 'USER_UPDATE':
this.emit('userUpdate', d);
break;
case 'VOICE_STATE_UPDATE':
this.emit('voiceStateUpdate', d);
break;
case 'WARN':
this.emit('warn', d);
break;
case 'WEBHOOKS_UPDATE':
this.emit('webhooksUpdate', d);
break;
case 'WEBHOOK_UPDATE':
this.emit('webhookUpdate', d);
break;
default:
break;
}
break;
default:
break;
}
});
}
async getUser() {
const url = `${this.baseUrl}/users/@me`;
try {
const response = await axios.get(url, {
headers: {
'Authorization': this.token
}
});
return response.data;
} catch (error) {
console.error(`Error: ${error.response ? error.response.data.message : error.message}`);
throw new Error(`Error: ${error.response ? error.response.data.message : error.message}`);
}
}
}
module.exports = { Client };