Colubrina/backend/lib/resolveEmbeds.js

98 lines
3 KiB
JavaScript

const { Message } = require("../models")
const axios = require("axios")
const ogs = require("open-graph-scraper")
const cryptoRandomString = require("crypto-random-string")
const blacklist = require("./blacklist.json")
module.exports = async function (message) {
return new Promise(async (resolve, reject) => {
try {
if (message.content) {
const regex = /(https?:\/\/\S+)/g
let links = message.content.match(regex)
if (links) {
if (links.length > 3) links = links.slice(0, 3)
const promises = links.map(async (embedLink, i) => {
let embed = {}
const linkURL = new URL(embedLink)
if (blacklist.includes(linkURL.hostname)) {
console.log(`Blacklisted link ${linkURL.hostname}`)
return {
embedLink,
openGraph: {
ogDescription:
"This link cannot be mediaproxied at this time.",
ogTitle: "Blacklisted link"
},
type: "openGraph"
}
}
await ogs({
headers: {
"user-agent": "Googlebot/2.1 (+http://www.google.com/bot.html)"
},
url: embedLink
})
.then((result) => {
if (result?.result) {
embed = {
embedLink,
openGraph: result.result,
type: "openGraph"
}
}
})
.catch(async () => {
await axios
.get(embedLink, {
headers: {
"user-agent":
"Googlebot/2.1 (+http://www.google.com/bot.html)"
}
})
.then((res) => {
// If content type is image
if (res.headers["content-type"].startsWith("image/")) {
const securityToken = cryptoRandomString({ length: 32 })
embed = {
type: "image",
link: embedLink,
securityToken,
mediaProxyLink:
"/api/v1/mediaproxy/" +
message.id +
"/" +
i +
"/" +
securityToken
}
}
})
.catch((e) => {
console.log(e)
})
})
return embed
})
const embeds = await Promise.all(promises)
await Message.update(
{
embeds
},
{
where: {
id: message.id
}
}
)
resolve(embeds)
} else {
reject()
}
} else {
reject()
}
} catch (e) {
console.log(e)
}
})
}