From db17b25a759bde3ebca2b282d1bc45cd51a78840 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 2 Jan 2024 15:21:59 -0800 Subject: feat(tools): random follower finder --- src/lib/AniList/following.ts | 56 +++++++++++++++++++++++++++++++++++ src/lib/Error/RateLimited.svelte | 59 +++++++++++++++++++++++++------------ src/lib/Tools/RandomFollower.svelte | 56 +++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 19 deletions(-) create mode 100644 src/lib/AniList/following.ts create mode 100644 src/lib/Tools/RandomFollower.svelte (limited to 'src/lib') diff --git a/src/lib/AniList/following.ts b/src/lib/AniList/following.ts new file mode 100644 index 00000000..1bba66b9 --- /dev/null +++ b/src/lib/AniList/following.ts @@ -0,0 +1,56 @@ +import { user, type User } from './user'; + +export interface FollowingPage { + data: { + Page: { + pageInfo: { + hasNextPage: boolean; + }; + following: Partial[]; + }; + }; +} + +const followingPage = async (page: number, id: number): Promise => + await ( + await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify({ + query: `{ + Page(page: ${page}) { + pageInfo { hasNextPage } + following(userId: ${id}) { name id } + } + }` + }) + }) + ).json(); + +export const followers = async (name: string): Promise[]> => { + const activities = []; + let page = 1; + const id = (await user(name)).id; + let currentPage = await followingPage(page, id); + + for (const activity of currentPage.data.Page.following) activities.push(activity); + + while (currentPage['data']['Page']['pageInfo']['hasNextPage']) { + for (const activity of currentPage.data.Page.following) activities.push(activity); + + page += 1; + currentPage = await followingPage(page, id); + } + + for (const activity of currentPage.data.Page.following) activities.push(activity); + + for (let i = activities.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [activities[i], activities[j]] = [activities[j], activities[i]]; + } + + return activities; +}; diff --git a/src/lib/Error/RateLimited.svelte b/src/lib/Error/RateLimited.svelte index 59de182d..ce5afdba 100644 --- a/src/lib/Error/RateLimited.svelte +++ b/src/lib/Error/RateLimited.svelte @@ -2,26 +2,47 @@ export let type = 'Media'; export let loginSessionError = true; export let contact = true; + export let list = true; -
    -
  • -

    - {type} could not be loaded. You might have been - rate limited. -

    - {#if loginSessionError} -

    - Your login session may have expired. Try logging out and logging back in, or try again in a - few minutes. -

    - {/if} - - {#if contact} +{#if list} +
      +
    • - If the problem persists, please contact - @fuwn on AniList. + {type} could not be loaded. You might have been + rate limited.

      - {/if} -
    • -
    + {#if loginSessionError} +

    + Your login session may have expired. Try logging out and logging back in, or try again in + a few minutes. +

    + {/if} + + {#if contact} +

    + If the problem persists, please contact + @fuwn on AniList. +

    + {/if} +
  • +
+{:else} +

+ {type} could not be loaded. You might have been + rate limited. +

+ {#if loginSessionError} +

+ Your login session may have expired. Try logging out and logging back in, or try again in a + few minutes. +

+ {/if} + + {#if contact} +

+ If the problem persists, please contact + @fuwn on AniList. +

+ {/if} +{/if} diff --git a/src/lib/Tools/RandomFollower.svelte b/src/lib/Tools/RandomFollower.svelte new file mode 100644 index 00000000..e52d4e86 --- /dev/null +++ b/src/lib/Tools/RandomFollower.svelte @@ -0,0 +1,56 @@ + + +

+ + { + if (e.key === 'Enter') { + submit = input; + randomSeed = Math.random(); + + // eslint-disable-next-line no-undef + umami.track('Random Follower'); + } + }} + /> + (submit = input) && (randomSeed = Math.random())} + title="Or click your Enter key" + data-umami-event="Random Follower" + > + Generate + +

+ +{#if submit !== ''} + {#await followers(submit)} + Loading followers ... 50% + {:then users} + {@const user = users[Math.floor(randomSeed * users.length)]} + +

+ + {user.name} + +

+ {:catch} + + {/await} +{:else} +

Enter a username to search for to continue.

+{/if} -- cgit v1.2.3