UNPKG

n8n-nodes-discord-trigger

Version:

A node that triggers a workflow whenever a message from discord is sent.

729 lines 36.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const discord_js_1 = require("discord.js"); const node_ipc_1 = __importDefault(require("node-ipc")); const settings_1 = __importDefault(require("./settings")); function default_1() { node_ipc_1.default.config.id = 'bot'; node_ipc_1.default.config.retry = 1500; node_ipc_1.default.config.silent = true; function spawnClient(token, clientId) { const client = new discord_js_1.Client({ intents: [ discord_js_1.GatewayIntentBits.Guilds, discord_js_1.GatewayIntentBits.GuildMessages, discord_js_1.GatewayIntentBits.GuildMembers, discord_js_1.GatewayIntentBits.GuildPresences, discord_js_1.GatewayIntentBits.GuildModeration, discord_js_1.GatewayIntentBits.GuildMessageReactions, discord_js_1.GatewayIntentBits.GuildMessageTyping, discord_js_1.GatewayIntentBits.DirectMessages, discord_js_1.GatewayIntentBits.DirectMessageReactions, discord_js_1.GatewayIntentBits.MessageContent, ], allowedMentions: { parse: ['roles', 'users', 'everyone'], }, partials: [discord_js_1.Partials.Message, discord_js_1.Partials.Channel, discord_js_1.Partials.Reaction, discord_js_1.Partials.User], }); client.on('guildMemberAdd', (guildMember) => { const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('user-join' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(guildMember.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'guildMemberAdd', { guildMember: guildMember, guild: guildMember.guild, user: guildMember.user, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('guildMemberRemove', (guildMember) => { const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('user-leave' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(guildMember.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'guildMemberRemove', { guildMember: guildMember, guild: guildMember.guild, user: guildMember.user, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('guildMemberUpdate', (oldMember, newMember) => { const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('user-update' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(oldMember.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'guildMemberUpdate', { oldMember: oldMember, newMember: newMember, guild: oldMember.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('messageReactionAdd', async (messageReaction, user) => { var _a, _b; let message = null; const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('message-reaction-add' !== parameters.type) continue; if (!message) { try { await messageReaction.fetch(); message = messageReaction.message; } catch (error) { console.error('Something went wrong when fetching the message:', error); continue; } } const triggerOnExternalBot = ((_a = parameters.additionalFields) === null || _a === void 0 ? void 0 : _a.externalBotTrigger) || false; if (!triggerOnExternalBot) { if (user.bot || user.system) continue; } else if (user.id === message.client.user.id) continue; if (parameters.guildIds.length && message.guild && !parameters.guildIds.includes(message.guild.id)) continue; if (parameters.messageIds.length && !parameters.messageIds.includes(message.id)) continue; if (parameters.channelIds.length) { const isInChannel = parameters.channelIds.some((channelId) => { var _a; return (_a = message.channel.id) === null || _a === void 0 ? void 0 : _a.includes(channelId); }); if (!isInChannel) continue; } const userRoles = (_b = message.member) === null || _b === void 0 ? void 0 : _b.roles.cache.map((role) => role.id); if (parameters.roleIds.length) { const hasRole = parameters.roleIds.some((role) => userRoles === null || userRoles === void 0 ? void 0 : userRoles.includes(role)); if (!hasRole) continue; } node_ipc_1.default.server.emit(parameters.socket, 'messageReactionAdd', { messageReaction: messageReaction, message: message, user: user, guild: message.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('messageReactionRemove', async (messageReaction, user) => { var _a, _b; let message = null; const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('message-reaction-remove' !== parameters.type) continue; if (!message) { try { await messageReaction.fetch(); message = messageReaction.message; } catch (error) { console.error('Something went wrong when fetching the message:', error); continue; } } const triggerOnExternalBot = ((_a = parameters.additionalFields) === null || _a === void 0 ? void 0 : _a.externalBotTrigger) || false; if (!triggerOnExternalBot) { if (user.bot || user.system) continue; } else if (user.id === message.client.user.id) continue; if (parameters.guildIds.length && message.guild && !parameters.guildIds.includes(message.guild.id)) continue; if (parameters.messageIds.length && !parameters.messageIds.includes(message.id)) continue; if (parameters.channelIds.length) { const isInChannel = parameters.channelIds.some((channelId) => { var _a; return (_a = message.channel.id) === null || _a === void 0 ? void 0 : _a.includes(channelId); }); if (!isInChannel) continue; } const userRoles = (_b = message.member) === null || _b === void 0 ? void 0 : _b.roles.cache.map((role) => role.id); if (parameters.roleIds.length) { const hasRole = parameters.roleIds.some((role) => userRoles === null || userRoles === void 0 ? void 0 : userRoles.includes(role)); if (!hasRole) continue; } node_ipc_1.default.server.emit(parameters.socket, 'messageReactionRemove', { messageReaction: messageReaction, message: message, user: user, guild: message.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('roleCreate', (role) => { const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('role-create' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(role.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'roleCreate', { role: role, guild: role.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('roleDelete', (role) => { const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('role-delete' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(role.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'roleDelete', { role: role, guild: role.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); client.on('roleUpdate', (oldRole, newRole) => { if (oldRole.name === newRole.name && oldRole.color === newRole.color && oldRole.hoist === newRole.hoist && oldRole.permissions.bitfield === newRole.permissions.bitfield && oldRole.mentionable === newRole.mentionable && oldRole.icon === newRole.icon && oldRole.unicodeEmoji === newRole.unicodeEmoji) { return; } const triggerMap = settings_1.default.triggerNodes[token]; for (const [nodeId, parameters] of Object.entries(triggerMap)) { try { if ('role-update' !== parameters.type) continue; if (parameters.guildIds.length && !parameters.guildIds.includes(oldRole.guild.id)) continue; node_ipc_1.default.server.emit(parameters.socket, 'roleUpdate', { oldRole, newRole, guild: oldRole.guild, nodeId: nodeId }); } catch (e) { console.log(e); } } }); const onMessageCreate = async (message) => { var _a, _b, _c, _d; console.log("message created", message.id, message.content); let messageReference = null; let messageRerenceFetched = !(message.reference); for (const [nodeId, parameters] of Object.entries(settings_1.default.triggerNodes[token])) { try { const isDirectMessage = message.channel.type === discord_js_1.ChannelType.DM; if (parameters.type === 'direct-message' && !isDirectMessage) continue; if (parameters.type === 'message' && isDirectMessage) continue; if (parameters.type !== 'message' && parameters.type !== 'direct-message') continue; const pattern = parameters.pattern; const triggerOnExternalBot = ((_a = parameters.additionalFields) === null || _a === void 0 ? void 0 : _a.externalBotTrigger) || false; const onlyWithAttachments = ((_b = parameters.additionalFields) === null || _b === void 0 ? void 0 : _b.attachmentsRequired) || false; if (!triggerOnExternalBot) { if (message.author.bot || message.author.system) continue; } else if (message.author.id === message.client.user.id) continue; if (!isDirectMessage && parameters.guildIds.length && message.guild && !parameters.guildIds.includes(message.guild.id)) continue; const userRoles = !isDirectMessage ? (_c = message.member) === null || _c === void 0 ? void 0 : _c.roles.cache.map((role) => role.id) : []; if (!isDirectMessage && parameters.roleIds.length) { const hasRole = parameters.roleIds.some((role) => userRoles === null || userRoles === void 0 ? void 0 : userRoles.includes(role)); if (!hasRole) continue; } if (!isDirectMessage && parameters.channelIds.length) { const isInChannel = parameters.channelIds.some((channelId) => { var _a; return (_a = message.channel.id) === null || _a === void 0 ? void 0 : _a.includes(channelId); }); if (!isInChannel) continue; } if (parameters.messageReferenceRequired && !message.reference) { continue; } if (!messageRerenceFetched) { messageReference = await message.fetchReference(); messageRerenceFetched = true; } const escapedTriggerValue = String(parameters.value) .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') .replace(/-/g, '\\x2d'); const clientId = (_d = client.user) === null || _d === void 0 ? void 0 : _d.id; const botMention = message.mentions.users.some((user) => user.id === clientId); let regStr = `^${escapedTriggerValue}$`; if (pattern === "botMention" && !botMention) continue; else if (pattern === "start" && message.content) regStr = `^${escapedTriggerValue}`; else if (pattern === 'end') regStr = `${escapedTriggerValue}$`; else if (pattern === 'contain') regStr = `${escapedTriggerValue}`; else if (pattern === 'regex') regStr = `${parameters.value}`; else if (pattern === 'every') regStr = `(.*)`; const reg = new RegExp(regStr, parameters.caseSensitive ? '' : 'i'); if ((pattern === "botMention" && botMention) || reg.test(message.content)) { const messageCreateOptions = { message, messageReference, guild: message === null || message === void 0 ? void 0 : message.guild, referenceAuthor: messageReference === null || messageReference === void 0 ? void 0 : messageReference.author, author: message.author, nodeId: nodeId, }; if (onlyWithAttachments && !message.attachments) continue; messageCreateOptions.attachments = message.attachments; console.log("about to emit messageCreate", message.id); node_ipc_1.default.server.emit(parameters.socket, 'messageCreate', messageCreateOptions); } } catch (e) { console.log(e); } } }; client.once('ready', () => { client.on('messageCreate', onMessageCreate); if (client.user) console.log(`Discord bot (${client.user.id}) is ready and listening for messages`); }); client.login(token).catch(console.error); return client; } node_ipc_1.default.serve(function () { console.log(`ipc bot server started`); node_ipc_1.default.server.on('triggerNodeRegistered', (data, socket) => { if (!settings_1.default.triggerNodes[data.token]) settings_1.default.triggerNodes[data.token] = {}; settings_1.default.triggerNodes[data.token][data.nodeId] = { ...data.parameters, socket: socket, }; }); node_ipc_1.default.server.on('triggerNodeRemoved', (data, socket) => { console.log(`Removing trigger node: ${data.nodeId}`); for (const token in settings_1.default.triggerNodes) { delete settings_1.default.triggerNodes[token][data.nodeId]; } }); node_ipc_1.default.server.on('list:roles', (data, socket) => { var _a; try { const client = settings_1.default.clientMap[data.token]; if (!client || !settings_1.default.readyClients[data.token]) return; const guilds = client.guilds.cache.filter(guild => data.guildIds.includes(`${guild.id}`)); const rolesList = []; for (const guild of guilds.values()) { const roles = (_a = guild.roles.cache) !== null && _a !== void 0 ? _a : ([]); for (const role of roles.values()) { rolesList.push({ name: role.name, value: role.id, }); } } node_ipc_1.default.server.emit(socket, 'list:roles', rolesList); } catch (e) { console.log(`${e}`); } }); node_ipc_1.default.server.on('list:guilds', (data, socket) => { var _a; try { const client = settings_1.default.clientMap[data.token]; if (!client || !settings_1.default.readyClients[data.token]) return; const guilds = (_a = client.guilds.cache) !== null && _a !== void 0 ? _a : []; const guildsList = guilds.map((guild) => { return { name: guild.name, value: guild.id, }; }); node_ipc_1.default.server.emit(socket, 'list:guilds', guildsList); } catch (e) { console.log(`${e}`); } }); node_ipc_1.default.server.on('list:channels', (data, socket) => { var _a; try { const client = settings_1.default.clientMap[data.token]; if (!client || !settings_1.default.readyClients[data.token]) return; const guilds = client.guilds.cache.filter(guild => data.guildIds.includes(`${guild.id}`)); const channelsList = []; for (const guild of guilds.values()) { const channels = (_a = guild.channels.cache.filter((channel) => channel.type === discord_js_1.ChannelType.GuildText)) !== null && _a !== void 0 ? _a : []; for (const channel of channels.values()) { channelsList.push({ name: channel.name, value: channel.id, }); } } console.log(channelsList); node_ipc_1.default.server.emit(socket, 'list:channels', channelsList); } catch (e) { console.log(`${e}`); } }); node_ipc_1.default.server.on('credentials', (data, socket) => { const { token, clientId } = data; if (!token || !clientId) { node_ipc_1.default.server.emit(socket, 'credentials', 'missing'); return; } if (settings_1.default.readyClients[token]) { node_ipc_1.default.server.emit(socket, 'credentials', 'already'); return; } if (settings_1.default.loginQueue[token]) { node_ipc_1.default.server.emit(socket, 'credentials', 'login'); return; } settings_1.default.loginQueue[token] = true; try { const client = spawnClient(token, clientId); settings_1.default.clientMap[token] = client; settings_1.default.triggerNodes[token] = {}; settings_1.default.credentials[token] = { token, clientId }; client.once('ready', () => { var _a; settings_1.default.readyClients[token] = true; settings_1.default.loginQueue[token] = false; client.rest.setToken(token); console.log(`Logged in as ${(_a = client.user) === null || _a === void 0 ? void 0 : _a.tag} (${clientId})`); node_ipc_1.default.server.emit(socket, 'credentials', 'ready'); }); client.on('error', (err) => { console.error(`Client error for ${token}`, err); settings_1.default.loginQueue[token] = false; node_ipc_1.default.server.emit(socket, 'credentials', 'error'); }); } catch (err) { settings_1.default.loginQueue[token] = false; console.error(`Failed to login client for ${token}`, err); node_ipc_1.default.server.emit(socket, 'credentials', 'error'); } }); node_ipc_1.default.server.on('send:message', async (data, socket) => { var _a; try { console.log(`send message for ${data.token}`); const client = settings_1.default.clientMap[data.token]; const nodeParameters = data.nodeParameters; if (!client || !settings_1.default.readyClients[data.token]) return; console.log("client ready", (_a = client.user) === null || _a === void 0 ? void 0 : _a.tag); const channel = client.channels.cache.get(nodeParameters.channelId); if (!channel || !channel.isTextBased()) return; const preparedMessage = prepareMessage(nodeParameters); const message = await channel.send(preparedMessage); node_ipc_1.default.server.emit(socket, 'callback:send:message', { channelId: channel.id, messageId: message.id }); } catch (e) { console.log(`${e}`); node_ipc_1.default.server.emit(socket, 'callback:send:message', false); } }); node_ipc_1.default.server.on('send:action', async (data, socket) => { try { const client = settings_1.default.clientMap[data.token]; const nodeParameters = data.nodeParameters; if (!client || !settings_1.default.readyClients[data.token]) return; const performAction = async () => { var _a; if (nodeParameters.actionType === 'removeMessages') { const channel = client.channels.cache.get(nodeParameters.channelId); if (!channel || !channel.isTextBased()) { node_ipc_1.default.server.emit(socket, `callback:send:action`, false); ; return; } await channel.bulkDelete(nodeParameters.removeMessagesNumber).catch((e) => console.log(`${e}`, client)); } else if (['addRole', 'removeRole'].includes(nodeParameters.actionType)) { const guild = await client.guilds.cache.get(nodeParameters.guildId); if (!guild) { node_ipc_1.default.server.emit(socket, `callback:send:action`, false); return; } const user = await client.users.fetch(nodeParameters.userId); const guildMember = await guild.members.fetch(user); const roles = guildMember.roles; const roleUpdateIds = (_a = (typeof nodeParameters.roleUpdateIds === 'string' ? nodeParameters.roleUpdateIds.split(',') : nodeParameters.roleUpdateIds)) !== null && _a !== void 0 ? _a : []; for (const roleId of roleUpdateIds) { if (!roles.cache.has(roleId) && nodeParameters.actionType === 'addRole') roles.add(roleId); else if (roles.cache.has(roleId) && nodeParameters.actionType === 'removeRole') roles.remove(roleId); } } }; await performAction(); console.log("action done"); node_ipc_1.default.server.emit(socket, `callback:send:action`, { action: nodeParameters.actionType, }); } catch (e) { console.log(`${e}`); node_ipc_1.default.server.emit(socket, `callback:send:action`, false); } }); node_ipc_1.default.server.on('send:confirmation', async (data, socket) => { try { console.log(`send confirmation for ${data.token}`, data.nodeParameters); const client = settings_1.default.clientMap[data.token]; const nodeParameters = data.nodeParameters; if (!client || !settings_1.default.readyClients[data.token]) return; const channel = client.channels.cache.get(nodeParameters.channelId); if (!channel || !channel.isTextBased()) return; let confirmationMessage = null; let collectorTimeout = 60 * 1000; if (nodeParameters.additionalConfirmationFields.timeout > 0) { collectorTimeout = parseInt(nodeParameters.additionalConfirmationFields.timeout) * 1000; } const confirmed = await new Promise(async (resolve) => { const preparedMessage = prepareMessage(nodeParameters); prepareMessage.ephemeral = true; const collector = channel.createMessageComponentCollector({ max: 1, time: collectorTimeout, }); let isResolved = false; collector.on("collect", (interaction) => { if (interaction.customId === "yes") { interaction.message.delete(); isResolved = true; return resolve(true); } else if (interaction.customId === "no") { interaction.message.delete(); isResolved = true; return resolve(false); } interaction.message.delete(); isResolved = true; resolve(null); }); collector.on("end", (collected) => { if (!isResolved) resolve(null); confirmationMessage === null || confirmationMessage === void 0 ? void 0 : confirmationMessage.delete(); throw Error("Confirmed message could not be resolved"); }); const yesLabel = nodeParameters.additionalConfirmationFields.yesLabel || 'Yes'; const noLabel = nodeParameters.additionalConfirmationFields.noLabel || 'No'; preparedMessage.components = [new discord_js_1.ActionRowBuilder().addComponents([ new discord_js_1.ButtonBuilder() .setCustomId(`yes`) .setLabel(yesLabel) .setStyle(discord_js_1.ButtonStyle.Success), new discord_js_1.ButtonBuilder() .setCustomId('no') .setLabel(noLabel) .setStyle(discord_js_1.ButtonStyle.Danger), ])]; confirmationMessage = await channel.send(preparedMessage); }); console.log("sending callback to node ", confirmed); node_ipc_1.default.server.emit(socket, 'callback:send:confirmation', { confirmed: confirmed, success: true }); } catch (e) { console.log(`${e}`); node_ipc_1.default.server.emit(socket, 'callback:send:confirmation', { confirmed: null, success: true }); } }); }); node_ipc_1.default.server.start(); } function prepareMessage(nodeParameters) { var _a, _b, _c, _d, _e, _f, _g; const embedFiles = []; let embed; if (nodeParameters.embed) { embed = new discord_js_1.EmbedBuilder(); if (nodeParameters.title) embed.setTitle(nodeParameters.title); if (nodeParameters.url) embed.setURL(nodeParameters.url); if (nodeParameters.description) embed.setDescription(nodeParameters.description); if (nodeParameters.color) embed.setColor(nodeParameters.color); if (nodeParameters.timestamp) embed.setTimestamp(Date.parse(nodeParameters.timestamp)); if (nodeParameters.footerText) { let iconURL = nodeParameters.footerIconUrl; if (iconURL && iconURL.match(/^data:/)) { const buffer = Buffer.from(iconURL.split(',')[1], 'base64'); const reg = new RegExp(/data:image\/([a-z]+);base64/gi); let mime = (_a = reg.exec(nodeParameters.footerIconUrl)) !== null && _a !== void 0 ? _a : []; const file = new discord_js_1.AttachmentBuilder(buffer, { name: `footer.${mime[1]}` }); embedFiles.push(file); iconURL = `attachment://footer.${mime[1]}`; } embed.setFooter({ text: nodeParameters.footerText, ...(iconURL ? { iconURL } : {}), }); } if (nodeParameters.imageUrl) { if (nodeParameters.imageUrl.match(/^data:/)) { const buffer = Buffer.from(nodeParameters.imageUrl.split(',')[1], 'base64'); const reg = new RegExp(/data:image\/([a-z]+);base64/gi); let mime = (_b = reg.exec(nodeParameters.imageUrl)) !== null && _b !== void 0 ? _b : []; const file = new discord_js_1.AttachmentBuilder(buffer, { name: `image.${mime[1]}` }); embedFiles.push(file); embed.setImage(`attachment://image.${mime[1]}`); } else embed.setImage(nodeParameters.imageUrl); } if (nodeParameters.thumbnailUrl) { if (nodeParameters.thumbnailUrl.match(/^data:/)) { const buffer = Buffer.from(nodeParameters.thumbnailUrl.split(',')[1], 'base64'); const reg = new RegExp(/data:image\/([a-z]+);base64/gi); let mime = (_c = reg.exec(nodeParameters.thumbnailUrl)) !== null && _c !== void 0 ? _c : []; const file = new discord_js_1.AttachmentBuilder(buffer, { name: `thumbnail.${mime[1]}` }); embedFiles.push(file); embed.setThumbnail(`attachment://thumbnail.${mime[1]}`); } else embed.setThumbnail(nodeParameters.thumbnailUrl); } if (nodeParameters.authorName) { let iconURL = nodeParameters.authorIconUrl; if (iconURL && iconURL.match(/^data:/)) { const buffer = Buffer.from(iconURL.split(',')[1], 'base64'); const reg = new RegExp(/data:image\/([a-z]+);base64/gi); let mime = (_d = reg.exec(nodeParameters.authorIconUrl)) !== null && _d !== void 0 ? _d : []; const file = new discord_js_1.AttachmentBuilder(buffer, { name: `author.${mime[1]}` }); embedFiles.push(file); iconURL = `attachment://author.${mime[1]}`; } embed.setAuthor({ name: nodeParameters.authorName, ...(iconURL ? { iconURL } : {}), ...(nodeParameters.authorUrl ? { url: nodeParameters.authorUrl } : {}), }); } if ((_e = nodeParameters.fields) === null || _e === void 0 ? void 0 : _e.field) { nodeParameters.fields.field.forEach((field) => { if (embed && field.name && field.value) embed.addFields({ name: field.name, value: field.value, inline: field.inline, }); else if (embed) embed.addFields({ name: '\u200B', value: '\u200B' }); }); } } let mentions = ''; nodeParameters.mentionRoles.forEach((role) => { mentions += ` <@&${role}>`; }); let content = ''; if (nodeParameters.content) content += nodeParameters.content; if (mentions) content += mentions; let files = []; if ((_f = nodeParameters.files) === null || _f === void 0 ? void 0 : _f.file) { files = (_g = nodeParameters.files) === null || _g === void 0 ? void 0 : _g.file.map((file) => { if (file.url.match(/^data:/)) { return Buffer.from(file.url.split(',')[1], 'base64'); } return file.url; }); } if (embedFiles.length) files = files.concat(embedFiles); const sendObject = { content: content !== null && content !== void 0 ? content : '', ...(embed ? { embeds: [embed] } : {}), ...(files.length ? { files } : {}), }; return sendObject; } //# sourceMappingURL=bot.js.map