diff --git a/packages/nodes-base/nodes/Discord/Discord.node.ts b/packages/nodes-base/nodes/Discord/Discord.node.ts new file mode 100644 index 000000000..fcd701f27 --- /dev/null +++ b/packages/nodes-base/nodes/Discord/Discord.node.ts @@ -0,0 +1,105 @@ +import { get } from 'lodash'; +import { IExecuteFunctions } from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, +} from 'n8n-workflow'; + +export class Discord implements INodeType { + description: INodeTypeDescription = { + displayName: 'Discord', + name: 'discord', + icon: 'file:discord.png', + group: ['output'], + version: 1, + description: 'Sends data to Discord', + defaults: { + name: 'Discord', + color: '#7289da', + }, + inputs: ['main'], + outputs: ['main'], + properties: [ + { + displayName: 'Webhook URL', + name: 'webhookUri', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'The webhook url.', + }, + { + displayName: 'Text', + name: 'text', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'The text to send.', + } + ], + }; + + + + async execute(this: IExecuteFunctions): Promise { + const items = this.getInputData(); + const returnData: IDataObject[] = []; + + const requestMethod = 'POST'; + + // For Post + let body: IDataObject; + + for (let i = 0; i < items.length; i++) { + const webhookUri = this.getNodeParameter('webhookUri', i) as string; + body = {}; + + body.content = this.getNodeParameter('text', i) as string; + + const options = { + method: requestMethod, + body, + uri: `${webhookUri}`, + headers: { + 'content-type': 'application/json; charset=utf-8' + }, + json: true + }; + + let maxTries = 5; + do { + try { + await this.helpers.request(options); + break; + } catch (error) { + if (error.statusCode === 429) { + // Waiting rating limit + await new Promise((resolve) => { + setTimeout(async () => { + resolve(); + }, get(error, 'response.body.retry_after', 150)); + }); + } else { + // If it's another error code then return the JSON response + throw error; + } + } + + } while (--maxTries); + + if (maxTries <= 0) { + throw new Error('Could not send message. Max. amount of rate-limit retries got reached.'); + } + + returnData.push({success: true}); + } + + return [this.helpers.returnJsonArray(returnData)]; + } +} diff --git a/packages/nodes-base/nodes/Discord/discord.png b/packages/nodes-base/nodes/Discord/discord.png new file mode 100644 index 000000000..f42e5500f Binary files /dev/null and b/packages/nodes-base/nodes/Discord/discord.png differ diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 559b53dad..2ca1c92d2 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -67,6 +67,7 @@ "dist/nodes/Chargebee/ChargebeeTrigger.node.js", "dist/nodes/Cron.node.js", "dist/nodes/Dropbox/Dropbox.node.js", + "dist/nodes/Discord/Discord.node.js", "dist/nodes/EditImage.node.js", "dist/nodes/EmailReadImap.node.js", "dist/nodes/EmailSend.node.js",