n8n-nodes-discord
Version:
nodes to trigger workflows from Discord or send interactive messages. Uses the components API which allows to create dialogs (e.g. attach buttons and wait for the user to click on them)
262 lines • 11 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.placeholderLoading = exports.execution = exports.pollingPromptData = exports.ipcRequest = exports.addLog = exports.triggerWorkflow = exports.getRoles = exports.getChannels = exports.connection = void 0;
const node_ipc_1 = __importDefault(require("node-ipc"));
const axios_1 = __importDefault(require("axios"));
const state_1 = __importDefault(require("./state"));
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) => {
const endMessage = ' - Close and reopen this node modal once you have made changes.';
console.log('credentials');
const credentials = await that.getCredentials('discordApi').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(''), 5000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('list:channels');
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 getRoles = async (that) => {
const endMessage = ' - Close and reopen this node modal once you have made changes.';
const credentials = await that.getCredentials('discordApi').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(''), 5000);
node_ipc_1.default.config.retry = 1500;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('list:roles');
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 triggerWorkflow = async (webhookId, message, placeholderId, baseUrl, user, channelId, presence, addedRoles, removedRoles, interactionMessageId, interactionValues, userRoles) => {
var _a, _b, _c, _d;
const headers = {
accept: 'application/json',
};
const res = await axios_1.default
.post(`${baseUrl}/webhook${state_1.default.testMode ? '-test' : ''}/${webhookId}/webhook`, {
content: message === null || message === void 0 ? void 0 : message.content,
channelId: (_a = message === null || message === void 0 ? void 0 : message.channelId) !== null && _a !== void 0 ? _a : channelId,
placeholderId,
userId: (_b = message === null || message === void 0 ? void 0 : message.author.id) !== null && _b !== void 0 ? _b : user === null || user === void 0 ? void 0 : user.id,
userName: (_c = message === null || message === void 0 ? void 0 : message.author.username) !== null && _c !== void 0 ? _c : user === null || user === void 0 ? void 0 : user.username,
userTag: (_d = message === null || message === void 0 ? void 0 : message.author.tag) !== null && _d !== void 0 ? _d : user === null || user === void 0 ? void 0 : user.tag,
messageId: message === null || message === void 0 ? void 0 : message.id,
attachments: message === null || message === void 0 ? void 0 : message.attachments,
presence,
addedRoles,
removedRoles,
interactionMessageId,
interactionValues,
userRoles,
}, { headers })
.catch((e) => {
console.log(e);
if (state_1.default.triggers[webhookId] && !state_1.default.testMode) {
state_1.default.triggers[webhookId].active = false;
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('trigger', Object.assign(Object.assign({}, state_1.default.triggers[webhookId]), { baseUrl: state_1.default.baseUrl }));
});
}
});
if (res)
return true;
return false;
};
exports.triggerWorkflow = triggerWorkflow;
const addLog = (message, client) => {
console.log(message);
if (state_1.default.logs.length > 99)
state_1.default.logs.shift();
const log = `${new Date().toISOString()} - ${message}`;
state_1.default.logs.push(log);
if (state_1.default.ready && state_1.default.autoLogs) {
const channel = client.channels.cache.get(state_1.default.autoLogsChannelId);
if (channel)
channel.send('**' + log + '**');
}
};
exports.addLog = addLog;
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.emit(type, parameters);
if (parameters.botCustomization && parameters.botActivity)
node_ipc_1.default.of.bot.emit('bot:status', parameters);
node_ipc_1.default.of.bot.on(type, (data) => {
resolve(data);
});
});
});
};
exports.ipcRequest = ipcRequest;
const pollingPromptData = (message, content, seconds, client) => {
return new Promise((resolve) => {
let i = 1;
const waiting = async () => {
var _a, _b, _c;
if (((_a = state_1.default.promptData[message.id]) === null || _a === void 0 ? void 0 : _a.value) || (seconds && i > seconds)) {
if (!((_b = state_1.default.promptData[message.id]) === null || _b === void 0 ? void 0 : _b.value)) {
await message.edit({ content: content, components: [] }).catch((e) => e);
const channel = client.channels.cache.get(message.channelId);
if (channel)
await channel.send('Timeout reached').catch((e) => e);
}
resolve(true);
return;
}
else if (seconds && !((_c = state_1.default.promptData[message.id]) === null || _c === void 0 ? void 0 : _c.value)) {
await message.edit({ content: content + ` (${seconds - i}s)` }).catch((e) => e);
}
i++;
setTimeout(() => waiting(), 1000);
};
waiting();
});
};
exports.pollingPromptData = pollingPromptData;
const execution = async (executionId, placeholderId, channelId, apiKey, baseUrl, userId) => {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject('timeout'), 15000);
node_ipc_1.default.connectTo('bot', () => {
node_ipc_1.default.of.bot.emit('execution', {
executionId,
placeholderId,
channelId,
apiKey,
baseUrl,
userId,
});
node_ipc_1.default.of.bot.on('execution', () => {
clearTimeout(timeout);
resolve(true);
});
});
});
};
exports.execution = execution;
const placeholderLoading = async (placeholder, placeholderMatchingId, txt) => {
state_1.default.placeholderMatching[placeholderMatchingId] = placeholder.id;
state_1.default.placeholderWaiting[placeholderMatchingId] = true;
let i = 0;
const waiting = async () => {
i++;
if (i > 3)
i = 0;
let content = txt + '';
for (let j = 0; j < i; j++)
content += '.';
if (!state_1.default.placeholderMatching[placeholderMatchingId]) {
await placeholder.edit(txt).catch((e) => e);
delete state_1.default.placeholderWaiting[placeholderMatchingId];
return;
}
await placeholder.edit(content).catch((e) => e);
setTimeout(async () => {
if (state_1.default.placeholderMatching[placeholderMatchingId])
waiting();
else {
await placeholder.edit(txt).catch((e) => e);
delete state_1.default.placeholderWaiting[placeholderMatchingId];
}
}, 800);
};
waiting();
};
exports.placeholderLoading = placeholderLoading;
//# sourceMappingURL=helpers.js.map