From 34ce39697a8961ad7efef97f1b8ce912ef446fe7 Mon Sep 17 00:00:00 2001 From: ayntee Date: Thu, 28 Jan 2021 20:27:47 +0400 Subject: [PATCH] feat(rest/request_manager): support for multiple attachments (#484) * feat(rest/request_manager): support for multiple attachments Closes #483 * Use .map() instead of forEach() --- src/rest/request_manager.ts | 17 +++++++++++++++-- src/types/channel.ts | 7 ++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/rest/request_manager.ts b/src/rest/request_manager.ts index 4eacb42bf..63c481964 100644 --- a/src/rest/request_manager.ts +++ b/src/rest/request_manager.ts @@ -1,5 +1,10 @@ import { authorization, eventHandlers } from "../bot.ts"; -import { Errors, HttpResponseCode, RequestMethods } from "../types/mod.ts"; +import { + Errors, + FileContent, + HttpResponseCode, + RequestMethods, +} from "../types/mod.ts"; import { API_VERSION, BASE_URL, @@ -155,8 +160,16 @@ function createRequestBody(body: any, method: RequestMethods) { } if (body?.file) { + if (!Array.isArray(body.file)) body.file = [body.file]; + const form = new FormData(); - form.append("file", body.file.blob, body.file.name); + // form.append("file", body.file.blob, body.file.name); + + body.file.map((file: FileContent, index: number) => + // The key of the form data item must be unique; otherwise, Discordeno only considers the first item in the form data with the same names. + form.append(`file${index + 1}`, file.blob, file.name) + ); + form.append("payload_json", JSON.stringify({ ...body, file: undefined })); body.file = form; } else if ( diff --git a/src/types/channel.ts b/src/types/channel.ts index fa1f03785..fbf6c41fa 100644 --- a/src/types/channel.ts +++ b/src/types/channel.ts @@ -111,7 +111,7 @@ export interface MessageContent { /** Whether this is a TextToSpeech message */ tts?: boolean; /** The contents of the file being sent */ - file?: { blob: unknown; name: string }; + file?: FileContent | FileContent[]; /** Embed object */ embed?: Embed; /** JSON encoded body of any additional request fields. */ @@ -120,6 +120,11 @@ export interface MessageContent { replyMessageID?: string; } +export interface FileContent { + blob: Blob; + name: string; +} + export interface AllowedMentions { /** An array of allowed mention types to parse from the content. */ parse: ("roles" | "users" | "everyone")[];