fedimbed: split bluesky into its own option and add quote only option

This commit is contained in:
Cynthia Foxwell 2024-11-21 13:49:34 -07:00
parent 6a5259b2b6
commit 2a2acdf6ad
2 changed files with 18 additions and 4 deletions

View file

@ -4,6 +4,8 @@ const flags = Object.freeze({
codePreviews: 1 << 0,
replyToBots: 1 << 1,
fedimbed: 1 << 2,
bskyEmbeds: 1 << 3,
bskyQuoteOnly: 1 << 4,
});
async function getFlags(guildId) {

View file

@ -284,6 +284,8 @@ async function blueskyQuoteEmbed(quote) {
}
async function bluesky(msg, url, spoiler = false) {
const quoteOnly = hasFlag(msg.guildID, "bskyQuoteOnly");
const urlObj = new URL(url);
urlObj.hostname = "bsky.app";
url = urlObj.toString();
@ -312,6 +314,7 @@ async function bluesky(msg, url, spoiler = false) {
throw new Error(`Did not get a valid Bluesky thread`);
const {post} = data.thread;
let hasQuote;
const guild = msg.guildID && hf.bot.guilds.has(msg.guildID) ? hf.bot.guilds.get(msg.guildID) : null;
const channel = guild ? guild.channels.get(msg.channel.id) : msg.channel;
@ -392,6 +395,7 @@ async function bluesky(msg, url, spoiler = false) {
break;
}
case "app.bsky.embed.record#view": {
hasQuote = true;
const quote = post.embed.record;
const quoteData = await blueskyQuoteEmbed(quote);
@ -407,6 +411,8 @@ async function bluesky(msg, url, spoiler = false) {
break;
}
case "app.bsky.embed.recordWithMedia#view": {
hasQuote = true;
if (post.embed.media.$type === "app.bsky.embed.images#view") {
embeds.push(...post.embed.media.images.map((image) => ({...mainEmbed, image: {url: image.fullsize}})));
} else if (post.embed.media.$type === "app.bsky.embed.video#view") {
@ -495,6 +501,8 @@ async function bluesky(msg, url, spoiler = false) {
}
}
if (quoteOnly && !hasQuote) return {};
return {
response: {
content: `${warnings.length > 0 ? warnings.join("\n") + "\n" : ""}${spoiler ? `|| ${url} ||` : ""}`,
@ -511,7 +519,10 @@ async function bluesky(msg, url, spoiler = false) {
};
}
async function processUrl(msg, url, spoiler = false) {
async function processUrl(msg, url, spoiler = false, command = false) {
const canFedi = command || hasFlag(msg.guildID, "fedimbed");
const canBsky = command || hasFlag(msg.guildID, "bskyEmbeds");
let invalidUrl = false;
let urlObj;
try {
@ -522,7 +533,8 @@ async function processUrl(msg, url, spoiler = false) {
if (invalidUrl) return {};
if (BSKY_DOMAINS.includes(urlObj.hostname.toLowerCase())) return await bluesky(msg, url, spoiler);
if (canBsky && BSKY_DOMAINS.includes(urlObj.hostname.toLowerCase())) return await bluesky(msg, url, spoiler);
if (!canFedi) return {};
// some lemmy instances have old reddit frontend subdomains
// but these frontends are just frontends and dont actually expose the API
@ -1290,7 +1302,7 @@ async function processUrl(msg, url, spoiler = false) {
events.add("messageCreate", "fedimbed", async function (msg) {
if (msg.author.id == hf.bot.user.id) return;
if (!msg.guildID) return;
if (!(await hasFlag(msg.guildID, "fedimbed"))) return;
if (!((await hasFlag(msg.guildID, "fedimbed")) || (await hasFlag(msg.guildID, "bskyEmbeds")))) return;
if (!msg.content || msg.content == "") return;
if (URLS_REGEX.test(msg.content)) {
@ -1384,7 +1396,7 @@ fedimbedCommand.callback = async function (interaction) {
if (hasService) {
try {
const {response} = await processUrl(interaction, url, spoiler);
const {response} = await processUrl(interaction, url, spoiler, true);
if (!response)
return {