summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/commands.js40
-rw-r--r--src/reddit.js18
-rw-r--r--src/register.js14
-rw-r--r--src/server.js37
4 files changed, 99 insertions, 10 deletions
diff --git a/src/commands.js b/src/commands.js
index 4680ff7..c2faac5 100644
--- a/src/commands.js
+++ b/src/commands.js
@@ -13,3 +13,43 @@ export const NSFW_COMMAND = {
description:
'Fetch a random NSFW post from r/okbuddyumamusume (NSFW channels only)',
};
+
+export const TOP_COMMAND = {
+ name: 'top',
+ description:
+ 'Fetch a random top post from r/okbuddyumamusume (defaults to today)',
+ options: [
+ {
+ type: 3,
+ name: 'time',
+ description: 'Time period for top posts (defaults to today)',
+ required: false,
+ choices: [
+ {
+ name: 'Now',
+ value: 'hour',
+ },
+ {
+ name: 'Today',
+ value: 'day',
+ },
+ {
+ name: 'This Week',
+ value: 'week',
+ },
+ {
+ name: 'This Month',
+ value: 'month',
+ },
+ {
+ name: 'This Year',
+ value: 'year',
+ },
+ {
+ name: 'All Time',
+ value: 'all',
+ },
+ ],
+ },
+ ],
+};
diff --git a/src/reddit.js b/src/reddit.js
index 183faca..543e6ff 100644
--- a/src/reddit.js
+++ b/src/reddit.js
@@ -1,5 +1,6 @@
-async function fetchRedditPosts() {
- const response = await fetch(redditURL, {
+async function fetchRedditPosts(sort = 'hot', time = 'day') {
+ const url = `https://www.reddit.com/r/okbuddyumamusume/${sort}.json${sort === 'top' ? `?t=${time}` : ''}`;
+ const response = await fetch(url, {
headers: {
'User-Agent': 'UmaBot/0.1.0',
},
@@ -71,24 +72,29 @@ function getRandomPost(posts) {
}
export async function getCutePost() {
- const posts = await fetchRedditPosts();
+ const posts = await fetchRedditPosts('hot');
const filteredPosts = filterPostsByFlair(posts, ['roleplay', 'announcement']);
return getRandomPost(filteredPosts);
}
export async function getRoleplayPost() {
- const posts = await fetchRedditPosts();
+ const posts = await fetchRedditPosts('hot');
const filteredPosts = filterPostsByFlair(posts, [], ['roleplay']);
return getRandomPost(filteredPosts);
}
export async function getNSFWPost() {
- const posts = await fetchRedditPosts();
+ const posts = await fetchRedditPosts('hot');
const filteredPosts = filterPostsByFlair(posts, [], ['nsfw']);
return getRandomPost(filteredPosts);
}
-export const redditURL = 'https://www.reddit.com/r/okbuddyumamusume/hot.json';
+export async function getTopPost(time = 'day') {
+ const posts = await fetchRedditPosts('top', time);
+ const filteredPosts = filterPostsByFlair(posts, ['roleplay', 'announcement']);
+
+ return getRandomPost(filteredPosts);
+}
diff --git a/src/register.js b/src/register.js
index 1167dcb..5b374d1 100644
--- a/src/register.js
+++ b/src/register.js
@@ -1,4 +1,9 @@
-import { HOT_COMMAND, NSFW_COMMAND, ROLEPLAY_COMMAND } from './commands.js';
+import {
+ HOT_COMMAND,
+ NSFW_COMMAND,
+ ROLEPLAY_COMMAND,
+ TOP_COMMAND,
+} from './commands.js';
import dotenv from 'dotenv';
import process from 'node:process';
@@ -23,7 +28,12 @@ const response = await fetch(url, {
Authorization: `Bot ${token}`,
},
method: 'PUT',
- body: JSON.stringify([HOT_COMMAND, ROLEPLAY_COMMAND, NSFW_COMMAND]),
+ body: JSON.stringify([
+ HOT_COMMAND,
+ ROLEPLAY_COMMAND,
+ NSFW_COMMAND,
+ TOP_COMMAND,
+ ]),
});
if (response.ok) {
diff --git a/src/server.js b/src/server.js
index 5695344..22b754c 100644
--- a/src/server.js
+++ b/src/server.js
@@ -4,8 +4,18 @@ import {
InteractionType,
verifyKey,
} from 'discord-interactions';
-import { HOT_COMMAND, ROLEPLAY_COMMAND, NSFW_COMMAND } from './commands.js';
-import { getCutePost, getRoleplayPost, getNSFWPost } from './reddit.js';
+import {
+ HOT_COMMAND,
+ ROLEPLAY_COMMAND,
+ NSFW_COMMAND,
+ TOP_COMMAND,
+} from './commands.js';
+import {
+ getCutePost,
+ getRoleplayPost,
+ getNSFWPost,
+ getTopPost,
+} from './reddit.js';
class JSONResponse extends Response {
constructor(body, init) {
@@ -165,6 +175,29 @@ router.post('/', async (request, environment) => {
}
}
+ case TOP_COMMAND.name.toLowerCase(): {
+ try {
+ const time = interaction.data.options?.[0]?.value || 'day';
+ const post = await getTopPost(time);
+ 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 top posts found. Try again later!',
+ flags: 64,
+ },
+ });
+ }
+ }
+
default:
return new JSONResponse({ error: 'Unknown Type' }, { status: 400 });
}