diff options
author | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2022-07-24 22:06:32 +1000 |
---|---|---|
committer | Madeline <46743919+MaddyUnderStars@users.noreply.github.com> | 2022-07-24 22:13:06 +1000 |
commit | 2ef970a2f0f5b5391e941bfe949044a018535b3c (patch) | |
tree | 7a4b6f0ccfcb0df5ac511164414008daf6195bc1 | |
parent | Silently resize images back to max height/width (diff) | |
download | server-2ef970a2f0f5b5391e941bfe949044a018535b3c.tar.xz |
Test embeding image/png etc responses
-rw-r--r-- | api/src/util/handlers/Message.ts | 106 | ||||
-rw-r--r-- | bundle/tsconfig.json | 3 |
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. */, |