summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/commands.js6
-rw-r--r--src/reddit.js23
-rw-r--r--src/register.js4
-rw-r--r--src/server.js92
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: