discord.js-light
Version:
All the power of discord.js, zero caching. This library modifies discord.js's internal classes and functions in order to give you full control over its caching behaviour.
428 lines (367 loc) • 14.4 kB
JavaScript
const path = require("path");
const PacketHandlers = require(path.resolve(require.resolve("discord.js").replace("index.js", "/client/websocket/handlers")));
const {
ClientUser,
Constants,
ClientApplication,
Collection,
LimitedCollection
} = require("discord.js");
const {
getOrCreateGuild,
getOrCreateChannel
} = require("./functions");
/*
not implemented by djs?
GUILD_APPLICATION_COMMAND_COUNTS_UPDATE
INTEGRATION_CREATE
INTEGRATION_DELETE
INTEGRATION_UPDATE
*/
const handlers = {
APPLICATION_COMMAND_CREATE: (client, { d: data }, shard) => {
let command;
if(data.guild_id) {
const guild = getOrCreateGuild(client, data.guild_id, shard.id);
command = guild.commands._add(data);
} else {
command = client.application.commands._add(data);
}
client.emit(Constants.Events.APPLICATION_COMMAND_CREATE, command);
},
APPLICATION_COMMAND_DELETE: (client, { d: data }, shard) => {
let command;
if(data.guild_id) {
const guild = getOrCreateGuild(client, data.guild_id, shard.id);
command = guild.commands._add(data);
guild.commands.cache.delete(data.id);
} else {
command = client.application.commands._add(data);
client.application.commands.cache.delete(data.id);
}
client.emit(Constants.Events.APPLICATION_COMMAND_DELETE, command);
},
APPLICATION_COMMAND_UPDATE: (client, { d: data }, shard) => {
let oldCommand;
let newCommand;
if(data.guild_id) {
const guild = getOrCreateGuild(client, data.guild_id, shard.id);
oldCommand = guild.commands.cache.get(data.id)?._clone();
if(!oldCommand) {
oldCommand = guild.commands._add({ id: data.id });
oldCommand.partial = true;
}
newCommand = guild.commands._add(data);
} else {
oldCommand = client.application.commands.cache.get(data.id)?._clone();
if(!oldCommand) {
oldCommand = client.application.commands._add({ id: data.id });
oldCommand.partial = true;
}
newCommand = client.application.commands._add(data);
}
client.emit(Constants.Events.APPLICATION_COMMAND_UPDATE, oldCommand, newCommand);
},
CHANNEL_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { channel } = client.actions.ChannelCreate.handle(packet.d);
if(!channel) { return; }
client.emit(Constants.Events.CHANNEL_CREATE, channel);
},
CHANNEL_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { channel } = client.actions.ChannelDelete.handle(packet.d);
if(!channel) { return; }
client.emit(Constants.Events.CHANNEL_DELETE, channel);
},
CHANNEL_PINS_UPDATE: (client, { d: data }, shard) => {
const guild = data.guild_id ? getOrCreateGuild(client, data.guild_id, shard.id) : void 0;
const channel = getOrCreateChannel(client, data.channel_id, guild);
if(!channel) { return; }
const time = data.last_pin_timestamp ? new Date(data.last_pin_timestamp).getTime() : null;
channel.lastPinTimestamp = time;
client.emit(Constants.Events.CHANNEL_PINS_UPDATE, channel, time);
},
CHANNEL_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { old, updated } = client.actions.ChannelUpdate.handle(packet.d);
if(!updated) { return; }
client.emit(Constants.Events.CHANNEL_UPDATE, old, updated);
},
GUILD_BAN_ADD: (client, { d: data }, shard) => {
data.shardId = shard.id;
client.actions.GuildBanAdd.handle(data);
},
GUILD_BAN_REMOVE: (client, { d: data }, shard) => {
data.shardId = shard.id;
client.actions.GuildBanRemove.handle(data);
},
GUILD_CREATE: (client, { d: data }, shard) => {
data.shardId = shard.id;
let guild = client.guilds.cache.get(data.id);
if(guild) {
if(!guild.available && !data.unavailable) {
guild._patch(data);
}
} else {
guild = client.guilds._add(data);
if(shard.status === Constants.Status.READY) {
client.emit(Constants.Events.GUILD_CREATE, guild);
}
}
},
GUILD_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { guild } = client.actions.GuildDelete.handle(packet.d);
if(!guild) { return; }
client.emit(Constants.Events.GUILD_DELETE, guild);
},
GUILD_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { old, updated } = client.actions.GuildUpdate.handle(packet.d);
client.emit(Constants.Events.GUILD_UPDATE, old, updated);
},
GUILD_EMOJIS_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const guild = getOrCreateGuild(client, packet.d.guild_id, packet.d.shardId);
if(guild.emojis.cache instanceof LimitedCollection) {
const emojis = new Collection();
for(const emoji of packet.d.emojis) {
emojis.set(emoji.id, guild.emojis._add(emoji));
}
client.emit("guildEmojisUpdate", emojis);
} else {
client.actions.GuildEmojisUpdate.handle(packet.d);
}
},
GUILD_INTEGRATIONS_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.GuildIntegrationsUpdate.handle(packet.d);
},
GUILD_MEMBERS_CHUNK: (client, { d: data }, shard) => {
const guild = getOrCreateGuild(client, data.guild_id, shard.id);
const members = new Collection();
for(const member of data.members) {
members.set(member.user.id, guild.members._add(member));
}
if(data.presences) {
for(const presence of data.presences) {
guild.presences._add(Object.assign(presence, { guild }));
}
}
client.emit(Constants.Events.GUILD_MEMBERS_CHUNK, members, guild, {
count: data.chunk_count,
index: data.chunk_index,
nonce: data.nonce
});
},
GUILD_MEMBER_ADD: (client, { d: data }, shard) => {
const guild = getOrCreateGuild(client, data.guild_id, shard.id);
const member = guild.members._add(data);
if(Number.isInteger(guild.memberCount)) { guild.memberCount++; }
client.emit(Constants.Events.GUILD_MEMBER_ADD, member);
},
GUILD_MEMBER_REMOVE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { member } = client.actions.GuildMemberRemove.handle(packet.d);
client.emit(Constants.Events.GUILD_MEMBER_REMOVE, member);
},
GUILD_MEMBER_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.GuildMemberUpdate.handle(packet.d);
},
GUILD_ROLE_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { role } = client.actions.GuildRoleCreate.handle(packet.d);
client.emit(Constants.Events.GUILD_ROLE_CREATE, role);
},
GUILD_ROLE_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { role } = client.actions.GuildRoleDelete.handle(packet.d);
client.emit(Constants.Events.GUILD_ROLE_DELETE, role);
},
GUILD_ROLE_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { old, updated } = client.actions.GuildRoleUpdate.handle(packet.d);
client.emit(Constants.Events.GUILD_ROLE_UPDATE, old, updated);
},
GUILD_SCHEDULED_EVENT_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { guildScheduledEvent } = client.actions.GuildScheduledEventCreate.handle(packet.d);
client.emit(Constants.Events.GUILD_SCHEDULED_EVENT_CREATE, guildScheduledEvent);
},
GUILD_SCHEDULED_EVENT_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { guildScheduledEvent } = client.actions.GuildScheduledEventDelete.handle(packet.d);
client.emit(Constants.Events.GUILD_SCHEDULED_EVENT_DELETE, guildScheduledEvent);
},
GUILD_SCHEDULED_EVENT_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { oldGuildScheduledEvent, newGuildScheduledEvent } = client.actions.GuildScheduledEventUpdate.handle(packet.d);
client.emit(Constants.Events.GUILD_SCHEDULED_EVENT_UPDATE, oldGuildScheduledEvent, newGuildScheduledEvent);
},
GUILD_SCHEDULED_EVENT_USER_ADD: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { guildScheduledEvent, user } = client.actions.GuildScheduledEventUserAdd.handle(packet.d);
client.emit(Constants.Events.GUILD_SCHEDULED_EVENT_USER_ADD, guildScheduledEvent, user);
},
GUILD_SCHEDULED_EVENT_USER_REMOVE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { guildScheduledEvent, user } = client.actions.GuildScheduledEventUserRemove.handle(packet.d);
client.emit(Constants.Events.GUILD_SCHEDULED_EVENT_USER_REMOVE, guildScheduledEvent, user);
},
GUILD_STICKERS_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const guild = getOrCreateGuild(client, packet.d.guild_id, packet.d.shardId);
if(guild.stickers.cache instanceof LimitedCollection) {
const stickers = new Collection();
for(const sticker of packet.d.stickers) {
stickers.set(sticker.id, guild.stickers._add(sticker));
}
client.emit("guildStickersUpdate", stickers);
} else {
client.actions.GuildStickersUpdate.handle(packet.d);
}
},
INTERACTION_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.InteractionCreate.handle(packet.d);
},
INVITE_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { invite } = client.actions.InviteCreate.handle(packet.d);
if(!invite) { return; }
client.emit(Constants.Events.INVITE_CREATE, invite);
},
INVITE_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { invite } = client.actions.InviteDelete.handle(packet.d);
if(!invite) { return; }
client.emit(Constants.Events.INVITE_DELETE, invite);
},
MESSAGE_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { message } = client.actions.MessageCreate.handle(packet.d);
if(!message) { return; }
client.emit(Constants.Events.MESSAGE_CREATE, message);
},
MESSAGE_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { message } = client.actions.MessageDelete.handle(packet.d);
if(!message) { return; }
client.emit(Constants.Events.MESSAGE_DELETE, message);
},
MESSAGE_DELETE_BULK: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { messages } = client.actions.MessageDeleteBulk.handle(packet.d);
if(!messages) { return; }
client.emit(Constants.Events.MESSAGE_BULK_DELETE, messages);
},
MESSAGE_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { old, updated } = client.actions.MessageUpdate.handle(packet.d);
if(!updated) { return; }
client.emit(Constants.Events.MESSAGE_UPDATE, old, updated);
},
MESSAGE_REACTION_ADD: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { reaction, user } = client.actions.MessageReactionAdd.handle(packet.d);
if(!reaction) { return; }
client.emit(Constants.Events.MESSAGE_REACTION_ADD, reaction, user);
},
MESSAGE_REACTION_REMOVE: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { reaction, user } = client.actions.MessageReactionRemove.handle(packet.d);
if(!reaction) { return; }
client.emit(Constants.Events.MESSAGE_REACTION_REMOVE, reaction, user);
},
MESSAGE_REACTION_REMOVE_ALL: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { message, removed } = client.actions.MessageReactionRemoveAll.handle(packet.d);
if(!message) { return; }
client.emit(Constants.Events.MESSAGE_REACTION_REMOVE_ALL, message, removed);
},
MESSAGE_REACTION_REMOVE_EMOJI: (client, packet, shard) => {
packet.d.shardId = shard.id;
const { reaction } = client.actions.MessageReactionRemoveEmoji.handle(packet.d);
if(!reaction) { return; }
client.emit(Constants.Events.MESSAGE_REACTION_REMOVE_EMOJI, reaction);
},
PRESENCE_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.PresenceUpdate.handle(packet.d);
},
READY: (client, { d: data }, shard) => {
if(client.user) {
client.user._patch(data.user);
} else {
client.user = new ClientUser(client, data.user);
client.users.cache.set(client.user.id, client.user);
}
for(const guild of data.guilds) {
guild.shardId = shard.id;
client.guilds._add(guild);
}
if (client.application) {
client.application._patch(data.application);
} else {
client.application = new ClientApplication(client, data.application);
}
client.emit("shardConnect", shard.id, data.guilds);
shard.checkReady();
},
STAGE_INSTANCE_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.StageInstanceCreate.handle(packet.d);
},
STAGE_INSTANCE_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.StageInstanceDelete.handle(packet.d);
},
STAGE_INSTANCE_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.StageInstanceUpdate.handle(packet.d);
},
THREAD_CREATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.ThreadCreate.handle(packet.d);
},
THREAD_DELETE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.ThreadDelete.handle(packet.d);
},
THREAD_LIST_SYNC: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.ThreadListSync.handle(packet.d);
},
THREAD_MEMBER_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.ThreadMemberUpdate.handle(packet.d);
},
THREAD_MEMBERS_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.ThreadMembersUpdate.handle(packet.d);
},
THREAD_UPDATE: (client, packet) => {
const { old, updated } = client.actions.ChannelUpdate.handle(packet.d);
client.emit(Constants.Events.THREAD_UPDATE, old, updated);
},
TYPING_START: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.TypingStart.handle(packet.d);
},
USER_UPDATE: (client, packet) => {
const { old, updated } = client.actions.UserUpdate.handle(packet.d);
client.emit(Constants.Events.USER_UPDATE, old, updated);
},
VOICE_STATE_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.VoiceStateUpdate.handle(packet.d);
},
WEBHOOKS_UPDATE: (client, packet, shard) => {
packet.d.shardId = shard.id;
client.actions.WebhooksUpdate.handle(packet.d);
}
};
module.exports = Object.assign(PacketHandlers, handlers);
;