diff --git a/src/lib/guildSettings.js b/src/lib/guildSettings.js index 0b69408..fa26f80 100644 --- a/src/lib/guildSettings.js +++ b/src/lib/guildSettings.js @@ -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) { diff --git a/src/modules/fedimbed.js b/src/modules/fedimbed.js index 5edb4ad..61fa6bb 100644 --- a/src/modules/fedimbed.js +++ b/src/modules/fedimbed.js @@ -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 {