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;