From 929ff9ccd0f1aa3c1d070915d567f594077b8288 Mon Sep 17 00:00:00 2001 From: BorgerKing <38166539+RDambrosio016@users.noreply.github.com> Date: Fri, 24 Jan 2020 10:38:26 -0500 Subject: [PATCH] feat(Client): add support for INVITE_CREATE and INVITE_DELETE events (#3720) * Add support for new Invite events * Merge typings for events Co-Authored-By: Sugden * Add warning about requiring permissions * Null check channel and guild * fix: .guilds not .channels --- src/client/actions/ActionsManager.js | 2 ++ src/client/actions/InviteCreate.js | 28 ++++++++++++++++++ src/client/actions/InviteDelete.js | 29 +++++++++++++++++++ .../websocket/handlers/INVITE_CREATE.js | 5 ++++ .../websocket/handlers/INVITE_DELETE.js | 5 ++++ src/util/Constants.js | 4 +++ typings/index.d.ts | 1 + 7 files changed, 74 insertions(+) create mode 100644 src/client/actions/InviteCreate.js create mode 100644 src/client/actions/InviteDelete.js create mode 100644 src/client/websocket/handlers/INVITE_CREATE.js create mode 100644 src/client/websocket/handlers/INVITE_DELETE.js diff --git a/src/client/actions/ActionsManager.js b/src/client/actions/ActionsManager.js index 268e4371b..730f507c0 100644 --- a/src/client/actions/ActionsManager.js +++ b/src/client/actions/ActionsManager.js @@ -16,6 +16,8 @@ class ActionsManager { this.register(require('./ChannelUpdate')); this.register(require('./GuildDelete')); this.register(require('./GuildUpdate')); + this.register(require('./InviteCreate')); + this.register(require('./InviteDelete')); this.register(require('./GuildMemberRemove')); this.register(require('./GuildBanRemove')); this.register(require('./GuildRoleCreate')); diff --git a/src/client/actions/InviteCreate.js b/src/client/actions/InviteCreate.js new file mode 100644 index 000000000..5552ea2f0 --- /dev/null +++ b/src/client/actions/InviteCreate.js @@ -0,0 +1,28 @@ +'use strict'; + +const Action = require('./Action'); +const Invite = require('../../structures/Invite'); +const { Events } = require('../../util/Constants'); + +class InviteCreateAction extends Action { + handle(data) { + const client = this.client; + const channel = client.channels.get(data.channel_id); + const guild = client.guilds.get(data.guild_id); + if (!channel && !guild) return false; + + const inviteData = Object.assign(data, { channel, guild }); + const invite = new Invite(client, inviteData); + /** + * Emitted when an invite is created. + * This event only triggers if the client has `MANAGE_GUILD` permissions for the guild, + * or `MANAGE_CHANNEL` permissions for the channel. + * @event Client#inviteCreate + * @param {Invite} invite The invite that was created + */ + client.emit(Events.INVITE_CREATE, invite); + return { invite }; + } +} + +module.exports = InviteCreateAction; diff --git a/src/client/actions/InviteDelete.js b/src/client/actions/InviteDelete.js new file mode 100644 index 000000000..83933d34f --- /dev/null +++ b/src/client/actions/InviteDelete.js @@ -0,0 +1,29 @@ +'use strict'; + +const Action = require('./Action'); +const Invite = require('../../structures/Invite'); +const { Events } = require('../../util/Constants'); + +class InviteDeleteAction extends Action { + handle(data) { + const client = this.client; + const channel = client.channels.get(data.channel_id); + const guild = client.guilds.get(data.guild_id); + if (!channel && !guild) return false; + + const inviteData = Object.assign(data, { channel, guild }); + const invite = new Invite(client, inviteData); + + /** + * Emitted when an invite is deleted. + * This event only triggers if the client has `MANAGE_GUILD` permissions for the guild, + * or `MANAGE_CHANNEL` permissions for the channel. + * @event Client#inviteDelete + * @param {Invite} invite The invite that was deleted + */ + client.emit(Events.INVITE_DELETE, invite); + return { invite }; + } +} + +module.exports = InviteDeleteAction; diff --git a/src/client/websocket/handlers/INVITE_CREATE.js b/src/client/websocket/handlers/INVITE_CREATE.js new file mode 100644 index 000000000..50a2e72dd --- /dev/null +++ b/src/client/websocket/handlers/INVITE_CREATE.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = (client, packet) => { + client.actions.InviteCreate.handle(packet.d); +}; diff --git a/src/client/websocket/handlers/INVITE_DELETE.js b/src/client/websocket/handlers/INVITE_DELETE.js new file mode 100644 index 000000000..597185234 --- /dev/null +++ b/src/client/websocket/handlers/INVITE_DELETE.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = (client, packet) => { + client.actions.InviteDelete.handle(packet.d); +}; diff --git a/src/util/Constants.js b/src/util/Constants.js index a2e86d4ae..a8f93a856 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -243,6 +243,8 @@ exports.Events = { GUILD_INTEGRATIONS_UPDATE: 'guildIntegrationsUpdate', GUILD_ROLE_CREATE: 'roleCreate', GUILD_ROLE_DELETE: 'roleDelete', + INVITE_CREATE: 'inviteCreate', + INVITE_DELETE: 'inviteDelete', GUILD_ROLE_UPDATE: 'roleUpdate', GUILD_EMOJI_CREATE: 'emojiCreate', GUILD_EMOJI_DELETE: 'emojiDelete', @@ -353,6 +355,8 @@ exports.WSEvents = keyMirror([ 'GUILD_CREATE', 'GUILD_DELETE', 'GUILD_UPDATE', + 'INVITE_CREATE', + 'INVITE_DELETE', 'GUILD_MEMBER_ADD', 'GUILD_MEMBER_REMOVE', 'GUILD_MEMBER_UPDATE', diff --git a/typings/index.d.ts b/typings/index.d.ts index 4c5a5ae28..fc23f027f 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -188,6 +188,7 @@ declare module 'discord.js' { public on(event: 'guildMemberSpeaking', listener: (member: GuildMember | PartialGuildMember, speaking: Readonly) => void): this; public on(event: 'guildMemberUpdate', listener: (oldMember: GuildMember | PartialGuildMember, newMember: GuildMember | PartialGuildMember) => void): this; public on(event: 'guildUpdate', listener: (oldGuild: Guild, newGuild: Guild) => void): this; + public on(event: 'inviteCreate' | 'inviteDelete', listener: (invite: Invite) => void): this; public on(event: 'guildIntegrationsUpdate', listener: (guild: Guild) => void): this; public on(event: 'message' | 'messageDelete' | 'messageReactionRemoveAll', listener: (message: Message | PartialMessage) => void): this; public on(event: 'messageDeleteBulk', listener: (messages: Collection) => void): this;