summaryrefslogtreecommitdiff
path: root/src/reddit.js
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-09-06 16:51:26 -0700
committerFuwn <[email protected]>2025-09-06 16:51:26 -0700
commitb625aff7160c593646efaf080163f96f69aa6391 (patch)
tree163d5096e3145bcb0b0bf8feba5ab35ef12c9f62 /src/reddit.js
downloadumabotdiscord-b625aff7160c593646efaf080163f96f69aa6391.tar.xz
umabotdiscord-b625aff7160c593646efaf080163f96f69aa6391.zip
feat: Initial commit
Diffstat (limited to 'src/reddit.js')
-rw-r--r--src/reddit.js77
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';