Test embeding image/png etc responses

This commit is contained in:
Madeline 2022-07-24 22:06:32 +10:00
parent 9a3286b605
commit 2ef970a2f0
2 changed files with 65 additions and 42 deletions

View File

@ -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);
let embed: Embed;
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) {
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;
}

View File

@ -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. */,