n8n-nodes-discord-dnd
Version:
n8n node to create triggers for Discord events
735 lines • 35.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TriggerEventHandler = void 0;
const discord_js_1 = require("discord.js");
const MessageTransformer_1 = require("../../transformers/MessageTransformer");
const types_1 = require("../../Interfaces/types");
class TriggerEventHandler {
constructor(client, triggerInstance) {
this.client = client;
this.triggerInstance = triggerInstance;
}
async setupEventHandler(event, includeBot = false, directMessage = false, pattern = "botMention", value = "", serverIds = [], channelIds = [], roleIds = [], userIds = []) {
// Handle main events
this.client.on(event, async (...args) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const data = {};
// Perform checks based on the event type
if (event === discord_js_1.Events.MessageCreate) {
const message = args[0];
// Skip if message is from a bot and includeBot is false
if (!includeBot && ((_a = message.author) === null || _a === void 0 ? void 0 : _a.bot)) {
return;
}
// Skip if message is a DM and directMessage is false, or if it's not a DM and directMessage is true
if ((!directMessage && message.channel.type === discord_js_1.ChannelType.DM) ||
(directMessage && message.channel.type !== discord_js_1.ChannelType.DM)) {
return;
}
// Check server, channel and user ID filters
if (serverIds.length > 0 &&
(!message.guildId || !serverIds.includes(message.guildId))) {
return;
}
if (channelIds.length > 0 && !channelIds.includes(message.channelId)) {
return;
}
if (userIds.length > 0 && !userIds.includes(message.author.id)) {
return;
}
// Check role filter if not a DM
if (roleIds.length > 0) {
if (!message.guild || !message.member) {
return;
}
const hasRole = message.member.roles.cache.some((role) => roleIds.includes(role.id));
if (!hasRole) {
return;
}
}
// Apply pattern filtering for message triggers
if (pattern) {
let shouldTrigger = false;
const content = message.content.toLowerCase();
const filterValue = value.toLowerCase();
switch (pattern) {
case types_1.PatternType.BOT_MENTION:
// Check if the bot is mentioned or if the message is a reply to the bot
const isMentioned = message.mentions.users.has(this.client.user.id);
const isReplyToBot = ((_b = message.reference) === null || _b === void 0 ? void 0 : _b.messageId)
? await message.channel.messages
.fetch(message.reference.messageId)
.then((msg) => msg.author.id === this.client.user.id)
.catch(() => false)
: false;
shouldTrigger = isMentioned || isReplyToBot;
break;
case types_1.PatternType.CONTAINS:
shouldTrigger = content.includes(filterValue);
break;
case types_1.PatternType.STARTS_WITH:
shouldTrigger = content.startsWith(filterValue);
break;
case types_1.PatternType.ENDS_WITH:
shouldTrigger = content.endsWith(filterValue);
break;
case types_1.PatternType.EQUALS:
shouldTrigger = content === filterValue;
break;
case types_1.PatternType.REGEX:
try {
const regex = new RegExp(value, "i");
shouldTrigger = regex.test(message.content);
}
catch (error) {
console.error(`Invalid regex pattern: ${value}`, error);
}
break;
case types_1.PatternType.EVERY:
// Trigger on every message (no filtering)
shouldTrigger = true;
break;
default:
shouldTrigger = true;
break;
}
// Skip if pattern doesn't match
if (!shouldTrigger) {
return;
}
}
}
else {
// Apply general filters for non-message events
const guildId = this.getGuildIdFromEvent(event, args);
const channelId = this.getChannelIdFromEvent(event, args);
const userId = this.getUserIdFromEvent(event, args);
const member = this.getMemberFromEvent(event, args);
// Filter by server ID if available
if (serverIds.length > 0 &&
(!guildId || !serverIds.includes(guildId))) {
return;
}
// Filter by channel ID if available
if (channelIds.length > 0 &&
(!channelId || !channelIds.includes(channelId))) {
return;
}
// Filter by user ID if available
if (userIds.length > 0 && (!userId || !userIds.includes(userId))) {
return;
}
// Filter by role ID if available
if (roleIds.length > 0 && member) {
const hasRole = (_c = member.roles) === null || _c === void 0 ? void 0 : _c.cache.some((role) => roleIds.includes(role.id));
if (!hasRole) {
return;
}
}
}
switch (event) {
// Message events
case discord_js_1.Events.MessageCreate:
const message = args[0];
data.message = await (0, MessageTransformer_1.messageToJson)(message);
break;
case discord_js_1.Events.MessageDelete:
const deletedMessage = args[0];
data.message = { ...deletedMessage };
break;
case discord_js_1.Events.MessageBulkDelete:
const deletedMessages = args[0]; // Collection<Snowflake, Message>
const channelMessageDeleteBulk = args[1]; // TextBasedChannel
data.channel = {
...channelMessageDeleteBulk,
};
data.deletedMessages = deletedMessages.map((message) => ({
...message,
}));
data.deletedCount = deletedMessages.size;
break;
case discord_js_1.Events.MessageUpdate:
const oldMessage = args[0];
const newMessage = args[1];
data.oldMessage = { ...oldMessage };
data.newMessage = { ...newMessage };
break;
case discord_js_1.Events.MessageReactionAdd:
case discord_js_1.Events.MessageReactionRemove:
const messageReaction = args[0];
const reactUser = args[1];
const details = args[2]; // MessageReactionEventDetails
data.messageReaction = {
...messageReaction,
message: await messageReaction.message.fetch(),
};
data.user = {
...reactUser,
};
data.details = { ...details };
break;
case discord_js_1.Events.MessageReactionRemoveAll:
const messageReactionRemoved = args[0];
const reactions = args[1]; // Collection<Snowflake, MessageReaction>
data.message = { ...messageReactionRemoved };
data.reactions = reactions.map((reaction) => ({
...reaction,
}));
break;
case discord_js_1.Events.MessageReactionRemoveEmoji:
const reactionMessageReactionRemoveEmoji = args[0]; // MessageReaction
data.reaction = {
...reactionMessageReactionRemoveEmoji,
};
break;
case discord_js_1.Events.TypingStart:
const typing = args[0];
data.typing = { ...typing };
break;
// Guild events
case discord_js_1.Events.ChannelCreate:
const channel = args[0];
data.channel = { ...channel };
break;
case discord_js_1.Events.ChannelDelete:
const deletedChannel = args[0];
data.channel = { ...deletedChannel };
break;
case discord_js_1.Events.ChannelPinsUpdate:
const pinsChannel = args[0]; // GuildChannel hoặc ThreadChannel
const pinTimestamp = args[1]; // Date
data.channel = {
...pinsChannel,
};
data.pinTimestamp = pinTimestamp.toISOString();
try {
const pinnedMessages = await pinsChannel.messages.fetchPinned();
const latestPinnedMessage = pinnedMessages.last();
if (latestPinnedMessage) {
data.pinnedMessage = {
id: latestPinnedMessage.id,
content: latestPinnedMessage.content,
channelId: latestPinnedMessage.channelId,
guildId: latestPinnedMessage.guildId,
createdTimestamp: latestPinnedMessage.createdTimestamp,
author: {
id: (_d = latestPinnedMessage.author) === null || _d === void 0 ? void 0 : _d.id,
username: (_e = latestPinnedMessage.author) === null || _e === void 0 ? void 0 : _e.username,
discriminator: (_f = latestPinnedMessage.author) === null || _f === void 0 ? void 0 : _f.discriminator,
globalName: (_g = latestPinnedMessage.author) === null || _g === void 0 ? void 0 : _g.globalName,
avatar: (_h = latestPinnedMessage.author) === null || _h === void 0 ? void 0 : _h.avatar,
bot: (_j = latestPinnedMessage.author) === null || _j === void 0 ? void 0 : _j.bot,
},
pinned: latestPinnedMessage.pinned,
pinnedAt: pinTimestamp.toISOString(),
};
}
else {
console.log("🚀 ~ channelPinsUpdate - Không có tin nhắn ghim nào trong kênh.");
data.pinnedMessage = null;
}
data.pinnedMessages = pinnedMessages.map((message) => ({
...message,
}));
}
catch (error) {
console.error("Lỗi khi fetch tin nhắn ghim:", error);
data.pinnedMessage = null;
data.pinnedMessages = [];
}
break;
case discord_js_1.Events.ChannelUpdate:
const oldChannel = args[0];
const newChannel = args[1];
data.oldChannel = { ...oldChannel };
data.newChannel = { ...newChannel };
break;
case discord_js_1.Events.GuildAvailable:
const guildAvailable = args[0];
data.guild = {
...guildAvailable,
channels: guildAvailable.channels.cache.map((channel) => ({
...channel,
})),
roles: guildAvailable.roles.cache.map((role) => ({
...role,
})),
owner: await guildAvailable
.fetchOwner()
.then((owner) => ({
...owner,
}))
.catch((error) => {
console.error("Lỗi khi fetch owner:", error);
return null;
}),
};
break;
case discord_js_1.Events.GuildCreate:
const guildCreated = args[0];
console.log(`🚀 ~ guildCreate - Bot được thêm vào guild ${guildCreated.name} (ID: ${guildCreated.id})`);
data.guild = {
...guildCreated,
channels: guildCreated.channels.cache.map((channel) => ({
...channel,
})),
roles: guildCreated.roles.cache.map((role) => ({
...role,
})),
owner: await guildCreated
.fetchOwner()
.then((owner) => ({
...owner,
}))
.catch((error) => {
console.error("Lỗi khi fetch owner:", error);
return null;
}),
};
break;
case discord_js_1.Events.GuildDelete:
const guildDeleted = args[0];
data.guild = {
...guildDeleted,
};
break;
case discord_js_1.Events.GuildUnavailable:
const guildUnavailable = args[0];
data.guild = {
...guildUnavailable,
};
break;
case discord_js_1.Events.GuildUpdate:
const oldGuild = args[0];
const newGuild = args[1];
data.oldGuild = {
...oldGuild,
};
data.newGuild = {
...newGuild,
};
data.changes = {};
if (oldGuild.name !== newGuild.name)
data.changes.name = {
old: oldGuild.name,
new: newGuild.name,
};
if (oldGuild.icon !== newGuild.icon)
data.changes.icon = {
old: oldGuild.icon,
new: newGuild.icon,
};
if (oldGuild.description !== newGuild.description)
data.changes.description = {
old: oldGuild.description,
new: newGuild.description,
};
break;
case discord_js_1.Events.GuildRoleCreate:
case discord_js_1.Events.GuildRoleDelete:
const role = args[0];
data.role = { ...role };
break;
case discord_js_1.Events.GuildRoleUpdate:
const oldRole = args[0];
const newRole = args[1];
data.oldRole = { ...oldRole };
data.newRole = { ...newRole };
break;
case discord_js_1.Events.StageInstanceCreate:
case discord_js_1.Events.StageInstanceDelete:
const stageInstance = args[0];
data.stageInstance = { ...stageInstance };
break;
case discord_js_1.Events.StageInstanceUpdate:
const oldStageInstance = args[0];
const newStageInstance = args[1];
data.oldStageInstance = oldStageInstance
? {
...oldStageInstance,
}
: null;
data.newStageInstance = {
...newStageInstance,
};
data.changes = {};
if (oldStageInstance &&
oldStageInstance.topic !== newStageInstance.topic) {
data.changes.topic = {
old: oldStageInstance.topic,
new: newStageInstance.topic,
};
}
if (oldStageInstance &&
oldStageInstance.privacyLevel !== newStageInstance.privacyLevel) {
data.changes.privacyLevel = {
old: oldStageInstance.privacyLevel,
new: newStageInstance.privacyLevel,
};
}
break;
case discord_js_1.Events.ThreadCreate:
const threadCreate = args[0];
const newlyCreated = args[1];
data.thread = { ...threadCreate };
data.newlyCreated = newlyCreated;
break;
case discord_js_1.Events.ThreadDelete:
const deletedThread = args[0];
data.thread = { ...deletedThread };
break;
case discord_js_1.Events.ThreadListSync:
const syncedThreads = args[0];
const guildThreadListSync = args[1];
data.syncedThreads = syncedThreads.map((thread) => ({
...thread,
}));
data.guild = { ...guildThreadListSync };
break;
case discord_js_1.Events.ThreadMembersUpdate:
const addedMembers = args[0];
const removedMembers = args[1];
const threadMembersUpdate = args[2];
data.thread = {
...threadMembersUpdate,
};
data.addedMembers = addedMembers.map((member) => ({
...member,
}));
data.removedMembers = removedMembers.map((member) => ({
...member,
}));
break;
case discord_js_1.Events.ThreadMemberUpdate:
const oldMember = args[0];
const newMember = args[1];
data.oldMember = {
...oldMember,
};
data.newMember = {
...newMember,
};
break;
case discord_js_1.Events.ThreadUpdate:
const oldThread = args[0];
const newThread = args[1];
data.oldThread = { ...oldThread };
data.newThread = { ...newThread };
break;
// Moderation events
case discord_js_1.Events.GuildBanAdd:
case discord_js_1.Events.GuildBanRemove:
const ban = args[0];
data.ban = { ...ban };
break;
case discord_js_1.Events.GuildAuditLogEntryCreate:
const auditLogEntry = args[0];
const guildAuditLogEntry = args[1];
data.auditLogEntry = {
...auditLogEntry,
};
if (auditLogEntry.executorId) {
try {
const executor = await guildAuditLogEntry.client.users.fetch(auditLogEntry.executorId);
data.executor = {
...executor,
};
}
catch (error) {
console.error("Lỗi khi fetch executor:", error);
data.executor = null;
}
}
data.guildAuditLogEntry = { ...guildAuditLogEntry };
break;
// Emoji & Sticker events
case discord_js_1.Events.GuildEmojiCreate:
case discord_js_1.Events.GuildEmojiDelete:
const emoji = args[0];
data.emoji = { ...emoji };
break;
case discord_js_1.Events.GuildEmojiUpdate:
const oldEmoji = args[0];
const newEmoji = args[1];
data.oldEmoji = { ...oldEmoji };
data.newEmoji = { ...newEmoji };
break;
case discord_js_1.Events.GuildStickerCreate:
case discord_js_1.Events.GuildStickerDelete:
const sticker = args[0];
data.sticker = { ...sticker };
break;
case discord_js_1.Events.GuildStickerUpdate:
const oldSticker = args[0];
const newSticker = args[1];
data.oldSticker = { ...oldSticker };
data.newSticker = { ...newSticker };
break;
// Integration & Webhook events
case discord_js_1.Events.GuildIntegrationsUpdate:
const guildIntegrations = args[0];
data.guild = {
...guildIntegrations,
};
break;
case discord_js_1.Events.WebhooksUpdate:
const webhooksChannel = args[0];
data.webhooksChannel = {
...webhooksChannel,
};
break;
// Invite events
case discord_js_1.Events.InviteCreate:
case discord_js_1.Events.InviteDelete:
const inviteCreated = args[0];
data.invite = { ...inviteCreated };
break;
// Voice events
case discord_js_1.Events.VoiceChannelEffectSend:
const voiceChannelEffectSend = args[0];
data.voiceChannelEffectSend = { ...voiceChannelEffectSend };
break;
case discord_js_1.Events.VoiceStateUpdate:
const oldVoiceState = args[0];
const newVoiceState = args[1];
const userVoice = (_k = newVoiceState.member) === null || _k === void 0 ? void 0 : _k.user;
data.oldVoiceState = { ...oldVoiceState };
data.newVoiceState = { ...newVoiceState };
data.user = userVoice
? {
...userVoice,
avatarURL: userVoice.displayAvatarURL({ size: 4096 }),
}
: null;
break;
// Presence events
case discord_js_1.Events.PresenceUpdate:
const oldPresence = args[0];
const newPresence = args[1];
data.oldPresence = oldPresence
? {
...oldPresence,
}
: null;
data.newPresence = { ...newPresence };
break;
// Scheduled event events
case discord_js_1.Events.GuildScheduledEventCreate:
case discord_js_1.Events.GuildScheduledEventDelete:
const guildScheduled = args[0];
data.guildScheduledEvent = { ...guildScheduled };
data.guild = { ...guildScheduled.guild };
break;
case discord_js_1.Events.GuildScheduledEventUpdate:
const oldGuildScheduledEvent = args[0];
const newGuildScheduledEvent = args[1];
data.oldGuildScheduledEvent = oldGuildScheduledEvent
? { ...oldGuildScheduledEvent }
: null;
data.newGuildScheduledEvent = { ...newGuildScheduledEvent };
break;
case discord_js_1.Events.GuildScheduledEventUserAdd:
case discord_js_1.Events.GuildScheduledEventUserRemove:
const guildScheduledEvent = args[0];
const user = args[1];
data.user = { ...user };
data.guildScheduledEvent = { ...guildScheduledEvent };
break;
// Interaction events
case discord_js_1.Events.InteractionCreate:
const interaction = args[0];
data.interaction = { ...interaction };
break;
case discord_js_1.Events.ApplicationCommandPermissionsUpdate:
const dataApp = args[0];
data.dataApp = { ...dataApp };
break;
// Bot status events
case discord_js_1.Events.Debug:
const info = args[0];
data.info = info;
break;
case discord_js_1.Events.Error:
const error = args[0];
data.error = { ...error };
break;
case discord_js_1.Events.Warn:
const warn = args[0];
data.warn = warn;
break;
case discord_js_1.Events.ClientReady:
const client = args[0];
data.client = { ...client };
break;
case discord_js_1.Events.ShardDisconnect:
const event = args[0];
const ShardDisconnectId = args[1];
data.event = { ...event };
data.id = ShardDisconnectId;
break;
case discord_js_1.Events.ShardError:
const shardError = args[0];
const shardId = args[1];
data.errorShard = { ...shardError };
data.shardId = shardId;
break;
case discord_js_1.Events.ShardReady:
const ShardReadyId = args[0];
const unavailableGuilds = args[1];
data.ShardReadyId = ShardReadyId;
data.unavailableGuilds = { ...unavailableGuilds };
break;
case discord_js_1.Events.ShardReconnecting:
const ShardReconnectingId = args[0];
data.id = ShardReconnectingId;
break;
case discord_js_1.Events.ShardResume:
const ShardResumeId = args[0];
const replayedEvents = args[1];
data.id = ShardResumeId;
data.replayedEvent = replayedEvents;
break;
// User event
case discord_js_1.Events.UserUpdate:
const oldUser = args[0];
const newUser = args[1];
data.oldUser = { ...oldUser };
data.newUser = { ...newUser };
break;
// Member events
case discord_js_1.Events.GuildMemberAdd:
case discord_js_1.Events.GuildMemberAvailable:
case discord_js_1.Events.GuildMemberRemove:
const member = args[0];
data.member = { ...member };
break;
case discord_js_1.Events.GuildMemberUpdate:
const oldMemberUpdate = args[0];
const newMemberUpdate = args[1];
data.oldMemberUpdate = { ...oldMemberUpdate };
data.newMemberUpdate = { ...newMemberUpdate };
break;
case discord_js_1.Events.GuildMembersChunk:
const membersChunk = args[0];
const guild = args[1];
const chunk = args[2];
data.members = { ...membersChunk };
data.guild = { ...guild };
data.chunk = { ...chunk };
break;
// Auto moderation events
case discord_js_1.Events.AutoModerationActionExecution:
const action = args[0];
data.action = { ...action };
break;
case discord_js_1.Events.AutoModerationRuleCreate:
case discord_js_1.Events.AutoModerationRuleDelete:
const ruleCreated = args[0];
data.rule = { ...ruleCreated };
break;
case discord_js_1.Events.AutoModerationRuleUpdate:
const oldRule = args[0];
const newRule = args[1];
data.oldRule = { ...oldRule };
data.newRule = { ...newRule };
break;
// Poll event
case discord_js_1.Events.MessagePollVoteAdd:
case discord_js_1.Events.MessagePollVoteRemove:
const pollVoteAdd = args[0];
const userId = args[1];
data.pollVote = { ...pollVoteAdd };
data.userId = userId;
break;
default:
data.eventData = args;
break;
}
this.triggerInstance.emit([
this.triggerInstance.helpers.returnJsonArray([data]),
]);
});
}
// Helper method to extract guild ID from different event types
getGuildIdFromEvent(event, args) {
var _a, _b, _c, _d, _e, _f, _g, _h;
switch (event) {
case discord_js_1.Events.MessageDelete:
case discord_js_1.Events.MessageUpdate:
return (_a = args[0]) === null || _a === void 0 ? void 0 : _a.guildId;
case discord_js_1.Events.MessageReactionAdd:
case discord_js_1.Events.MessageReactionRemove:
return (_b = args[0]) === null || _b === void 0 ? void 0 : _b.message.guildId;
case discord_js_1.Events.ChannelCreate:
case discord_js_1.Events.ChannelDelete:
case discord_js_1.Events.ChannelUpdate:
return (_c = args[0]) === null || _c === void 0 ? void 0 : _c.guildId;
case discord_js_1.Events.GuildAvailable:
case discord_js_1.Events.GuildCreate:
case discord_js_1.Events.GuildDelete:
case discord_js_1.Events.GuildUnavailable:
return (_d = args[0]) === null || _d === void 0 ? void 0 : _d.id;
case discord_js_1.Events.GuildMemberAdd:
case discord_js_1.Events.GuildMemberAvailable:
case discord_js_1.Events.GuildMemberRemove:
return (_f = (_e = args[0]) === null || _e === void 0 ? void 0 : _e.guild) === null || _f === void 0 ? void 0 : _f.id;
case discord_js_1.Events.GuildRoleCreate:
case discord_js_1.Events.GuildRoleDelete:
case discord_js_1.Events.GuildRoleUpdate:
return (_h = (_g = args[0]) === null || _g === void 0 ? void 0 : _g.guild) === null || _h === void 0 ? void 0 : _h.id;
default:
return undefined;
}
}
// Helper method to extract channel ID from different event types
getChannelIdFromEvent(event, args) {
var _a, _b, _c;
switch (event) {
case discord_js_1.Events.MessageDelete:
case discord_js_1.Events.MessageUpdate:
return (_a = args[0]) === null || _a === void 0 ? void 0 : _a.channelId;
case discord_js_1.Events.MessageReactionAdd:
case discord_js_1.Events.MessageReactionRemove:
return (_b = args[0]) === null || _b === void 0 ? void 0 : _b.message.channelId;
case discord_js_1.Events.ChannelCreate:
case discord_js_1.Events.ChannelDelete:
case discord_js_1.Events.ChannelUpdate:
return (_c = args[0]) === null || _c === void 0 ? void 0 : _c.id;
default:
return undefined;
}
}
// Helper method to extract user ID from different event types
getUserIdFromEvent(event, args) {
var _a, _b, _c, _d;
switch (event) {
case discord_js_1.Events.MessageDelete:
case discord_js_1.Events.MessageUpdate:
return (_b = (_a = args[0]) === null || _a === void 0 ? void 0 : _a.author) === null || _b === void 0 ? void 0 : _b.id;
case discord_js_1.Events.MessageReactionAdd:
case discord_js_1.Events.MessageReactionRemove:
return (_c = args[1]) === null || _c === void 0 ? void 0 : _c.id;
case discord_js_1.Events.GuildMemberAdd:
case discord_js_1.Events.GuildMemberAvailable:
case discord_js_1.Events.GuildMemberRemove:
case discord_js_1.Events.GuildMemberUpdate:
return (_d = args[0]) === null || _d === void 0 ? void 0 : _d.id;
default:
return undefined;
}
}
// Helper method to extract member from different event types
getMemberFromEvent(event, args) {
switch (event) {
case discord_js_1.Events.GuildMemberAdd:
case discord_js_1.Events.GuildMemberAvailable:
case discord_js_1.Events.GuildMemberRemove:
case discord_js_1.Events.GuildMemberUpdate:
return args[0];
default:
return undefined;
}
}
}
exports.TriggerEventHandler = TriggerEventHandler;
//# sourceMappingURL=TriggerEventHandler.js.map