diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/commands.js | 6 | ||||
| -rw-r--r-- | src/reddit.js | 23 | ||||
| -rw-r--r-- | src/register.js | 4 | ||||
| -rw-r--r-- | src/server.js | 92 |
4 files changed, 100 insertions, 25 deletions
diff --git a/src/commands.js b/src/commands.js index 5445644..4680ff7 100644 --- a/src/commands.js +++ b/src/commands.js @@ -7,3 +7,9 @@ export const ROLEPLAY_COMMAND = { name: 'roleplay', description: 'Fetch a random hot roleplay post from r/okbuddyumamusume', }; + +export const NSFW_COMMAND = { + name: 'nsfw', + description: + 'Fetch a random NSFW post from r/okbuddyumamusume (NSFW channels only)', +}; diff --git a/src/reddit.js b/src/reddit.js index 36cb154..183faca 100644 --- a/src/reddit.js +++ b/src/reddit.js @@ -35,10 +35,17 @@ function filterPostsByFlair(posts, excludedFlairs = [], includedFlairs = []) { if (!hasMedia) return false; - if (post.over_18 || post.link_flair_text?.toLowerCase().includes('nsfw')) - return false; - const postFlair = post.link_flair_text?.toLowerCase() || ''; + const isNSFW = post.over_18 || postFlair.includes('nsfw'); + + if ( + includedFlairs.length > 0 && + includedFlairs.some((flair) => flair.toLowerCase() === 'nsfw') + ) + if (includedFlairs.some((flair) => flair.toLowerCase() === 'nsfw')) + return isNSFW; + + if (isNSFW) return false; if (includedFlairs.length > 0) return includedFlairs.some((flair) => @@ -55,6 +62,9 @@ function filterPostsByFlair(posts, excludedFlairs = [], includedFlairs = []) { } function getRandomPost(posts) { + if (posts.length === 0) + throw new Error('No posts found matching the criteria'); + const randomIndex = Math.floor(Math.random() * posts.length); return posts[randomIndex]; @@ -74,4 +84,11 @@ export async function getRoleplayPost() { return getRandomPost(filteredPosts); } +export async function getNSFWPost() { + const posts = await fetchRedditPosts(); + const filteredPosts = filterPostsByFlair(posts, [], ['nsfw']); + + return getRandomPost(filteredPosts); +} + export const redditURL = 'https://www.reddit.com/r/okbuddyumamusume/hot.json'; diff --git a/src/register.js b/src/register.js index a9a5deb..1167dcb 100644 --- a/src/register.js +++ b/src/register.js @@ -1,4 +1,4 @@ -import { HOT_COMMAND, ROLEPLAY_COMMAND } from './commands.js'; +import { HOT_COMMAND, NSFW_COMMAND, ROLEPLAY_COMMAND } from './commands.js'; import dotenv from 'dotenv'; import process from 'node:process'; @@ -23,7 +23,7 @@ const response = await fetch(url, { Authorization: `Bot ${token}`, }, method: 'PUT', - body: JSON.stringify([HOT_COMMAND, ROLEPLAY_COMMAND]), + body: JSON.stringify([HOT_COMMAND, ROLEPLAY_COMMAND, NSFW_COMMAND]), }); if (response.ok) { diff --git a/src/server.js b/src/server.js index b505f31..5695344 100644 --- a/src/server.js +++ b/src/server.js @@ -4,8 +4,8 @@ import { InteractionType, verifyKey, } from 'discord-interactions'; -import { HOT_COMMAND, ROLEPLAY_COMMAND } from './commands.js'; -import { getCutePost, getRoleplayPost } from './reddit.js'; +import { HOT_COMMAND, ROLEPLAY_COMMAND, NSFW_COMMAND } from './commands.js'; +import { getCutePost, getRoleplayPost, getNSFWPost } from './reddit.js'; class JSONResponse extends Response { constructor(body, init) { @@ -90,27 +90,79 @@ router.post('/', async (request, environment) => { if (interaction.type === InteractionType.APPLICATION_COMMAND) { switch (interaction.data.name.toLowerCase()) { case HOT_COMMAND.name.toLowerCase(): { - const post = await getCutePost(); - const embed = createPostEmbed(post); - - return new JSONResponse({ - type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, - data: { - embeds: [embed], - }, - }); + try { + const post = await getCutePost(); + const embed = createPostEmbed(post); + + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + embeds: [embed], + }, + }); + } catch { + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + content: '❌ No posts found. Try again later!', + flags: 64, + }, + }); + } } case ROLEPLAY_COMMAND.name.toLowerCase(): { - const post = await getRoleplayPost(); - const embed = createPostEmbed(post); - - return new JSONResponse({ - type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, - data: { - embeds: [embed], - }, - }); + try { + const post = await getRoleplayPost(); + const embed = createPostEmbed(post); + + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + embeds: [embed], + }, + }); + } catch { + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + content: '❌ No roleplay posts found. Try again later!', + flags: 64, + }, + }); + } + } + + case NSFW_COMMAND.name.toLowerCase(): { + if (!interaction.channel_id || !interaction.channel?.nsfw) { + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + content: '❌ This command can only be used in NSFW channels.', + flags: 64, + }, + }); + } + + try { + const post = await getNSFWPost(); + const embed = createPostEmbed(post); + + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + embeds: [embed], + }, + }); + } catch { + return new JSONResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + content: '❌ No NSFW posts found. Try again later!', + flags: 64, + }, + }); + } } default: |