diff options
| author | Fuwn <[email protected]> | 2025-09-06 16:51:26 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-09-06 16:51:26 -0700 |
| commit | b625aff7160c593646efaf080163f96f69aa6391 (patch) | |
| tree | 163d5096e3145bcb0b0bf8feba5ab35ef12c9f62 /src/reddit.js | |
| download | umabotdiscord-b625aff7160c593646efaf080163f96f69aa6391.tar.xz umabotdiscord-b625aff7160c593646efaf080163f96f69aa6391.zip | |
feat: Initial commit
Diffstat (limited to 'src/reddit.js')
| -rw-r--r-- | src/reddit.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/reddit.js b/src/reddit.js new file mode 100644 index 0000000..36cb154 --- /dev/null +++ b/src/reddit.js @@ -0,0 +1,77 @@ +async function fetchRedditPosts() { + const response = await fetch(redditURL, { + headers: { + 'User-Agent': 'UmaBot/0.1.0', + }, + }); + + if (!response.ok) { + let errorText = `Error fetching ${response.url}: ${response.status} ${response.statusText}`; + + try { + const error = await response.text(); + + if (error) errorText = `${errorText} \n\n ${error}`; + } catch { + // + } + + throw new Error(errorText); + } + + const data = await response.json(); + + return data.data.children.map((post) => post.data); +} + +function filterPostsByFlair(posts, excludedFlairs = [], includedFlairs = []) { + return posts.filter((post) => { + if (post.is_gallery) return false; + + const hasMedia = + post.media?.reddit_video?.fallback_url || + post.secure_media?.reddit_video?.fallback_url || + post.url; + + if (!hasMedia) return false; + + if (post.over_18 || post.link_flair_text?.toLowerCase().includes('nsfw')) + return false; + + const postFlair = post.link_flair_text?.toLowerCase() || ''; + + if (includedFlairs.length > 0) + return includedFlairs.some((flair) => + postFlair.includes(flair.toLowerCase()), + ); + + if (excludedFlairs.length > 0) + return !excludedFlairs.some((flair) => + postFlair.includes(flair.toLowerCase()), + ); + + return true; + }); +} + +function getRandomPost(posts) { + const randomIndex = Math.floor(Math.random() * posts.length); + + return posts[randomIndex]; +} + +export async function getCutePost() { + const posts = await fetchRedditPosts(); + const filteredPosts = filterPostsByFlair(posts, ['roleplay', 'announcement']); + + return getRandomPost(filteredPosts); +} + +export async function getRoleplayPost() { + const posts = await fetchRedditPosts(); + const filteredPosts = filterPostsByFlair(posts, [], ['roleplay']); + + return getRandomPost(filteredPosts); +} + +export const redditURL = 'https://www.reddit.com/r/okbuddyumamusume/hot.json'; |