Test embeding image/png etc responses
This commit is contained in:
parent
9a3286b605
commit
2ef970a2f0
@ -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;
|
||||
}
|
||||
|
@ -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. */,
|
||||
|
Loading…
x
Reference in New Issue
Block a user