Allow multiple attachments in messages

This commit is contained in:
Madeline 2022-07-09 14:15:15 +10:00
parent d75eefe7cd
commit 402d9ecc7b
2 changed files with 1366 additions and 11 deletions

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@ import {
} from "@fosscord/util"; } from "@fosscord/util";
import { HTTPError } from "lambert-server"; import { HTTPError } from "lambert-server";
import { handleMessage, postHandleMessage, route } from "@fosscord/api"; import { handleMessage, postHandleMessage, route } from "@fosscord/api";
import multer from "multer"; import multer, { Multer } from "multer";
import { FindManyOptions, LessThan, MoreThan } from "typeorm"; import { FindManyOptions, LessThan, MoreThan } from "typeorm";
import { URL } from "url"; import { URL } from "url";
@ -50,8 +50,10 @@ export function isTextChannel(type: ChannelType): boolean {
} }
export interface MessageCreateSchema { export interface MessageCreateSchema {
type?: number;
content?: string; content?: string;
nonce?: string; nonce?: string;
channel_id?: string;
tts?: boolean; tts?: boolean;
flags?: string; flags?: string;
embeds?: Embed[]; embeds?: Embed[];
@ -161,7 +163,7 @@ const messageUpload = multer({
limits: { limits: {
fileSize: 1024 * 1024 * 100, fileSize: 1024 * 1024 * 100,
fields: 10, fields: 10,
files: 1 // files: 1
}, },
storage: multer.memoryStorage() storage: multer.memoryStorage()
}); // max upload 50 mb }); // max upload 50 mb
@ -176,7 +178,7 @@ const messageUpload = multer({
// Send message // Send message
router.post( router.post(
"/", "/",
messageUpload.single("file"), messageUpload.any(),
async (req, res, next) => { async (req, res, next) => {
if (req.body.payload_json) { if (req.body.payload_json) {
req.body = JSON.parse(req.body.payload_json); req.body = JSON.parse(req.body.payload_json);
@ -190,19 +192,22 @@ router.post(
var body = req.body as MessageCreateSchema; var body = req.body as MessageCreateSchema;
const attachments: Attachment[] = []; const attachments: Attachment[] = [];
if (req.file) {
try {
const file = await uploadFile(`/attachments/${req.params.channel_id}`, req.file);
attachments.push({ ...file, proxy_url: file.url });
} catch (error) {
return res.status(400).json(error);
}
}
const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients", "recipients.user"] }); const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients", "recipients.user"] });
if (!channel.isWritable()) { if (!channel.isWritable()) {
throw new HTTPError(`Cannot send messages to channel of type ${channel.type}`, 400) throw new HTTPError(`Cannot send messages to channel of type ${channel.type}`, 400)
} }
const files = req.files as Express.Multer.File[] ?? [];
for (var currFile of files) {
try {
const file = await uploadFile(`/attachments/${channel.id}`, currFile);
attachments.push({ ...file, proxy_url: file.url });
}
catch (error) {
return res.status(400).json(error);
}
}
const embeds = body.embeds || []; const embeds = body.embeds || [];
if (body.embed) embeds.push(body.embed); if (body.embed) embeds.push(body.embed);
let message = await handleMessage({ let message = await handleMessage({