summary refs log tree commit diff
diff options
context:
space:
mode:
authorMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-07-24 22:06:32 +1000
committerMadeline <46743919+MaddyUnderStars@users.noreply.github.com>2022-07-24 22:13:06 +1000
commit2ef970a2f0f5b5391e941bfe949044a018535b3c (patch)
tree7a4b6f0ccfcb0df5ac511164414008daf6195bc1
parentSilently resize images back to max height/width (diff)
downloadserver-2ef970a2f0f5b5391e941bfe949044a018535b3c.tar.xz
Test embeding image/png etc responses
-rw-r--r--api/src/util/handlers/Message.ts106
-rw-r--r--bundle/tsconfig.json3
2 files changed, 66 insertions, 43 deletions
diff --git a/api/src/util/handlers/Message.ts b/api/src/util/handlers/Message.ts
index f98bc2a5..a74e57dd 100644
--- a/api/src/util/handlers/Message.ts
+++ b/api/src/util/handlers/Message.ts
@@ -54,26 +54,26 @@ export async function handleMessage(opts: MessageOptions): Promise<Message> {
 		channel_id: opts.channel_id,
 		attachments: opts.attachments || [],
 		embeds: opts.embeds || [],
-		reactions: /*opts.reactions ||*/ [],
+		reactions: /*opts.reactions ||*/[],
 		type: opts.type ?? 0
 	});
 
 	if (message.content && message.content.length > Config.get().limits.message.maxCharacters) {
-		throw new HTTPError("Content length over max character limit")
+		throw new HTTPError("Content length over max character limit");
 	}
 
 	if (opts.author_id) {
 		message.author = await User.getPublicUser(opts.author_id);
 		const rights = await getRights(opts.author_id);
 		rights.hasThrow("SEND_MESSAGES");
-	}	
+	}
 	if (opts.application_id) {
 		message.application = await Application.findOneOrFail({ id: opts.application_id });
 	}
 	if (opts.webhook_id) {
 		message.webhook = await Webhook.findOneOrFail({ id: opts.webhook_id });
 	}
-	
+
 	const permission = await getPermission(opts.author_id, channel.guild_id, opts.channel_id);
 	permission.hasThrow("SEND_MESSAGES");
 	if (permission.cache.member) {
@@ -152,6 +152,8 @@ export async function postHandleMessage(message: Message) {
 
 	links = links.slice(0, 20); // embed max 20 links — TODO: make this configurable with instance policies
 
+	const { endpointPublic, resizeWidthMax, resizeHeightMax } = Config.get().cdn;
+
 	for (const link of links) {
 		try {
 			const request = await fetch(link, {
@@ -159,45 +161,65 @@ export async function postHandleMessage(message: Message) {
 				size: Config.get().limits.message.maxEmbedDownloadSize,
 			});
 
-			const text = await request.text();
-			const $ = cheerio.load(text);
-
-			const title = $('meta[property="og:title"]').attr("content");
-			const provider_name = $('meta[property="og:site_name"]').text();
-			const author_name = $('meta[property="article:author"]').attr("content");
-			const description = $('meta[property="og:description"]').attr("content") || $('meta[property="description"]').attr("content");
-
-			const image = $('meta[property="og:image"]').attr("content");
-			const width = parseInt($('meta[property="og:image:width"]').attr("content") || "") || undefined;
-			const height = parseInt($('meta[property="og:image:height"]').attr("content") || "") || undefined;
-
-			const url = $('meta[property="og:url"]').attr("content");
-			// TODO: color
-			const embed: Embed = {
-				provider: {
-					url: link,
-					name: provider_name
-				}
-			};
-
-			const { endpointPublic, resizeWidthMax, resizeHeightMax } = Config.get().cdn;
-			const resizeWidth = Math.min(resizeWidthMax ?? 1, width ?? 100);
-			const resizeHeight = Math.min(resizeHeightMax ?? 1, height ?? 100);
-			if (author_name) embed.author = { name: author_name };
-			if (image) embed.thumbnail = {
-				proxy_url: `${endpointPublic}/external/resize/${encodeURIComponent(image)}?width=${resizeWidth}&height=${resizeHeight}`,
-				url: image,
-				width: width,
-				height: height
-			};
-			if (title) embed.title = title;
-			if (url) embed.url = url;
-			if (description) embed.description = description;
-
-			if (title || description) {
+			let embed: Embed;
+
+			const type = request.headers.get("content-type");
+			if (type?.indexOf("image") == 0) {
+				embed = {
+					provider: {
+						url: link,
+						name: new URL(link).hostname,
+					},
+					image: {
+						// can't be bothered rn
+						proxy_url: `${endpointPublic}/external/resize/${encodeURIComponent(link)}?width=500&height=400`,
+						url: link,
+						width: 500,
+						height: 400
+					}
+				};
 				data.embeds.push(embed);
 			}
-		} catch (error) {}
+			else {
+				const text = await request.text();
+				const $ = cheerio.load(text);
+
+				const title = $('meta[property="og:title"]').attr("content");
+				const provider_name = $('meta[property="og:site_name"]').text();
+				const author_name = $('meta[property="article:author"]').attr("content");
+				const description = $('meta[property="og:description"]').attr("content") || $('meta[property="description"]').attr("content");
+
+				const image = $('meta[property="og:image"]').attr("content");
+				const width = parseInt($('meta[property="og:image:width"]').attr("content") || "") || undefined;
+				const height = parseInt($('meta[property="og:image:height"]').attr("content") || "") || undefined;
+
+				const url = $('meta[property="og:url"]').attr("content");
+				// TODO: color
+				embed = {
+					provider: {
+						url: link,
+						name: provider_name
+					}
+				};
+
+				const resizeWidth = Math.min(resizeWidthMax ?? 1, width ?? 100);
+				const resizeHeight = Math.min(resizeHeightMax ?? 1, height ?? 100);
+				if (author_name) embed.author = { name: author_name };
+				if (image) embed.thumbnail = {
+					proxy_url: `${endpointPublic}/external/resize/${encodeURIComponent(image)}?width=${resizeWidth}&height=${resizeHeight}`,
+					url: image,
+					width: width,
+					height: height
+				};
+				if (title) embed.title = title;
+				if (url) embed.url = url;
+				if (description) embed.description = description;
+
+				if (title || description) {
+					data.embeds.push(embed);
+				}
+			}
+		} catch (error) { }
 	}
 
 	await Promise.all([
@@ -218,7 +240,7 @@ export async function sendMessage(opts: MessageOptions) {
 		emitEvent({ event: "MESSAGE_CREATE", channel_id: opts.channel_id, data: message.toJSON() } as MessageCreateEvent)
 	]);
 
-	postHandleMessage(message).catch((e) => {}); // no await as it should catch error non-blockingly
+	postHandleMessage(message).catch((e) => { }); // no await as it should catch error non-blockingly
 
 	return message;
 }
diff --git a/bundle/tsconfig.json b/bundle/tsconfig.json
index 563ff444..57fe10ad 100644
--- a/bundle/tsconfig.json
+++ b/bundle/tsconfig.json
@@ -8,7 +8,8 @@
 		"target": "ES6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,

 		"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,

 		"lib": [

-			"ES2021"

+			"ES2021",

+			"DOM"

 		] /* Specify library files to be included in the compilation. */,

 		"allowJs": true /* Allow javascript files to be compiled. */,

 		"checkJs": true /* Report errors in .js files. */,