diff options
| -rw-r--r-- | src/commands.js | 40 | ||||
| -rw-r--r-- | src/reddit.js | 18 | ||||
| -rw-r--r-- | src/register.js | 14 | ||||
| -rw-r--r-- | src/server.js | 37 |
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 }); } |