n8n-nodes-discord-trigger
Version:
A node that triggers a workflow whenever a message from discord is sent.
199 lines • 7.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ipcRequest = exports.checkWorkflowStatus = exports.getRoles = exports.getGuilds = exports.getChannels = exports.connection = void 0;
const node_ipc_1 = __importDefault(require("node-ipc"));
const axios_1 = __importDefault(require("axios"));
const connection = (credentials) => {
return new Promise((resolve, reject) => {
if (!credentials || !credentials.token || !credentials.clientId) {
reject('credentials missing');
return;
}
const timeout = setTimeout(() => reject('timeout'), 15000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('credentials', credentials);
node_ipc_1.default.of.bot.on('credentials', (data) => {
clearTimeout(timeout);
if (data === 'error')
reject('Invalid credentials');
else if (data === 'missing')
reject('Token or clientId missing');
else if (data === 'login')
reject('Already logging in');
else if (data === 'different')
resolve('Already logging in with different credentials');
else
resolve(data);
});
});
});
};
exports.connection = connection;
const getChannels = async (that, guildIds) => {
const endMessage = ' - Close and reopen this node modal once you have made changes.';
const credentials = await that.getCredentials('discordBotTriggerApi').catch((e) => e);
const res = await (0, exports.connection)(credentials).catch((e) => e);
if (!['ready', 'already'].includes(res)) {
return [
{
name: res + endMessage,
value: 'false',
},
];
}
const channelsRequest = () => new Promise((resolve) => {
const timeout = setTimeout(() => resolve(''), 15000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('list:channels', { guildIds: guildIds, token: credentials.token });
node_ipc_1.default.of.bot.on('list:channels', (data) => {
clearTimeout(timeout);
resolve(data);
});
});
});
const channels = await channelsRequest().catch((e) => e);
let message = 'Unexpected error';
if (channels) {
if (Array.isArray(channels) && channels.length)
return channels;
else
message =
'Your Discord server has no text channels, please add at least one text channel' +
endMessage;
}
return [
{
name: message,
value: 'false',
},
];
};
exports.getChannels = getChannels;
const getGuilds = async (that) => {
const endMessage = ' - Close and reopen this node modal once you have made changes.';
const credentials = await that.getCredentials('discordBotTriggerApi').catch((e) => e);
const res = await (0, exports.connection)(credentials).catch((e) => e);
if (!['ready', 'already'].includes(res)) {
return [
{
name: res + endMessage,
value: 'false',
},
];
}
const guildsRequest = () => new Promise((resolve) => {
const timeout = setTimeout(() => resolve(''), 15000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('list:guilds', { token: credentials.token });
node_ipc_1.default.of.bot.on('list:guilds', (data) => {
clearTimeout(timeout);
resolve(data);
});
});
});
const guilds = await guildsRequest().catch((e) => e);
let message = 'Unexpected error';
if (guilds) {
if (Array.isArray(guilds) && guilds.length)
return guilds;
else
message =
'Your bot is not part of any guilds. Please add the bot to at least one guild.' +
endMessage;
}
return [
{
name: message,
value: 'false',
},
];
};
exports.getGuilds = getGuilds;
const getRoles = async (that, selectedGuildIds) => {
const endMessage = ' - Close and reopen this node modal once you have made changes.';
const credentials = await that.getCredentials('discordBotTriggerApi').catch((e) => e);
const res = await (0, exports.connection)(credentials).catch((e) => e);
if (!['ready', 'already'].includes(res)) {
return [
{
name: res + endMessage,
value: 'false',
},
];
}
const rolesRequest = () => new Promise((resolve) => {
const timeout = setTimeout(() => resolve(''), 15000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('list:roles', { guildIds: selectedGuildIds, token: credentials.token });
node_ipc_1.default.of.bot.on('list:roles', (data) => {
clearTimeout(timeout);
resolve(data);
});
});
});
const roles = await rolesRequest().catch((e) => e);
let message = 'Unexpected error';
if (roles) {
if (Array.isArray(roles)) {
const filtered = roles.filter((r) => r.name !== '@everyone');
if (filtered.length)
return filtered;
else
message =
'Your Discord server has no roles, please add at least one if you want to restrict the trigger to specific users' +
endMessage;
}
else
message = 'Something went wrong' + endMessage;
}
return [
{
name: message,
value: 'false',
},
];
};
exports.getRoles = getRoles;
const checkWorkflowStatus = async (n8nApiUrl, apiToken, workflowId) => {
const apiUrl = `${removeTrailingSlash(n8nApiUrl)}/workflows/${workflowId}`;
return new Promise((resolve, reject) => {
axios_1.default.get(apiUrl, {
headers: {
'X-N8N-API-KEY': `${apiToken}`,
},
}).then(response => {
resolve(response.data.active);
}).catch(e => {
console.error('Error checking workflow status:', e.message);
reject(e);
});
});
};
exports.checkWorkflowStatus = checkWorkflowStatus;
const ipcRequest = (type, parameters) => {
return new Promise((resolve) => {
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.on(`callback:${type}`, (data) => {
console.log("response fired", data);
resolve(data);
});
node_ipc_1.default.of.bot.emit(type, parameters);
});
});
};
exports.ipcRequest = ipcRequest;
function removeTrailingSlash(url) {
if (url.endsWith('/')) {
return url.slice(0, -1);
}
return url;
}
//# sourceMappingURL=helper.js.map