UNPKG

n8n-nodes-discord-dnd

Version:
735 lines 35.8 kB
"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