diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/AniList/activity.ts | 25 | ||||
| -rw-r--r-- | src/lib/AniList/forum.ts | 16 | ||||
| -rw-r--r-- | src/lib/Tools/InputTemplate.svelte | 9 | ||||
| -rw-r--r-- | src/lib/Tools/Likes.svelte | 46 | ||||
| -rw-r--r-- | src/lib/Tools/Picker.svelte | 1 | ||||
| -rw-r--r-- | src/lib/Tools/tools.ts | 5 | ||||
| -rw-r--r-- | src/routes/tools/[tool]/+page.svelte | 3 |
7 files changed, 105 insertions, 0 deletions
diff --git a/src/lib/AniList/activity.ts b/src/lib/AniList/activity.ts index 926e8fe6..5eafcf2c 100644 --- a/src/lib/AniList/activity.ts +++ b/src/lib/AniList/activity.ts @@ -1,4 +1,5 @@ import { database } from '$lib/Database/activities'; +import type { User } from './follow'; import type { AniListAuthorisation, UserIdentity } from './identity'; export interface ActivityHistoryEntry { @@ -251,3 +252,27 @@ export const fullActivityHistory = async ( return fullLocalActivityHistory; }; + +export const activityLikes = async (id: number): Promise<Partial<User>[]> => { + const activityResponse = await ( + await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify({ + query: `{ + Activity(id: ${id}) { + __typename + ... on TextActivity { likes { name } } + ... on ListActivity { likes { name } } + ... on MessageActivity { likes { name } } + } + }` + }) + }) + ).json(); + + return activityResponse['data']['Activity']['likes']; +}; diff --git a/src/lib/AniList/forum.ts b/src/lib/AniList/forum.ts index e13528b5..46d569b4 100644 --- a/src/lib/AniList/forum.ts +++ b/src/lib/AniList/forum.ts @@ -1,3 +1,4 @@ +import type { User } from './follow'; import { user } from './user'; export interface Thread { @@ -57,3 +58,18 @@ export const threads = async (username: string): Promise<Thread[]> => { return allThreads; }; + +export const threadLikes = async (id: number): Promise<Partial<User>[]> => { + const activityResponse = await ( + await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify({ query: `{ Thread(id: ${id}) { likes { name } } }` }) + }) + ).json(); + + return activityResponse['data']['Thread']['likes']; +}; diff --git a/src/lib/Tools/InputTemplate.svelte b/src/lib/Tools/InputTemplate.svelte index d0e37f98..42eb695d 100644 --- a/src/lib/Tools/InputTemplate.svelte +++ b/src/lib/Tools/InputTemplate.svelte @@ -1,6 +1,7 @@ <script lang="ts"> import { clearAllParameters } from '$lib/Utility/parameters'; import { onMount } from 'svelte'; + import SettingHint from '$lib/Settings/SettingHint.svelte'; export let field: string; export let submission: string; @@ -11,6 +12,7 @@ return; }; export let prompt = `Enter a ${field.toLowerCase()} to search for to continue.`; + export let hint: string | undefined = undefined; let input = ''; @@ -47,6 +49,13 @@ > {submitText} </button> + + {#if hint !== undefined} + <br /> + <div style="margin-top: .25rem;"> + <SettingHint>{hint}</SettingHint> + </div> + {/if} </p> {#if submission !== ''} diff --git a/src/lib/Tools/Likes.svelte b/src/lib/Tools/Likes.svelte new file mode 100644 index 00000000..e54923bb --- /dev/null +++ b/src/lib/Tools/Likes.svelte @@ -0,0 +1,46 @@ +<script lang="ts"> + import { activityLikes } from '$lib/AniList/activity'; + import { threadLikes } from '$lib/AniList/forum'; + import RateLimited from '$lib/Error/RateLimited.svelte'; + import InputTemplate from './InputTemplate.svelte'; + + let submission = ''; + + $: normalisedSubmission = submission.replace(/.*\/(activity|thread)\/(\d+).*/, '$2'); + $: submissionType = submission.replace(/.*\/(activity|thread)\/(\d+).*/, '$1'); + $: likesPromise = + submissionType === 'activity' + ? activityLikes(Number(normalisedSubmission)) + : threadLikes(Number(normalisedSubmission)); +</script> + +<InputTemplate + field="Activity or Thread URL" + bind:submission + event="Get All Likes" + submitText="Get All Likes" +> + {#if submission.match(/https:\/\/anilist.co\/(activity|forum\/thread)\/\d+/)} + {#await likesPromise} + Loading {submissionType} ... 50% + {:then likes} + {#if likes && likes.length > 0} + <ul> + {#each likes as like} + <li> + <a href={`https://anilist.co/user/${like.name}`} target="_blank"> + {like.name} + </a> + </li> + {/each} + </ul> + {:else} + No likes were found for that {submissionType}. + {/if} + {:catch} + <RateLimited type="Likes" list={false} /> + {/await} + {:else} + Please enter a valid Activity or Thread URL. + {/if} +</InputTemplate> diff --git a/src/lib/Tools/Picker.svelte b/src/lib/Tools/Picker.svelte index 6ead9624..5276e023 100644 --- a/src/lib/Tools/Picker.svelte +++ b/src/lib/Tools/Picker.svelte @@ -19,6 +19,7 @@ <option value="discussions">Episode Discussion Collector</option> <option value="random_follower">Random Follower Finder</option> <option value="dump_profile">Dump Profile</option> + <option value="likes">Likes</option> <option value="activity_history">Activity History Analyser</option> </select> </blockquote> diff --git a/src/lib/Tools/tools.ts b/src/lib/Tools/tools.ts index c0e499b2..96aaeb47 100644 --- a/src/lib/Tools/tools.ts +++ b/src/lib/Tools/tools.ts @@ -31,6 +31,11 @@ export const tools: { [key: string]: { name: string; description?: string; id: s description: 'Find a random follower of any given user', id: 'random_follower' }, + likes: { + name: 'Likes', + description: 'Get All Likes of an Activity or Forum Thread', + id: 'likes' + }, dump_profile: { name: 'Dump Profile', description: "Dump a user's profile to JSON", diff --git a/src/routes/tools/[tool]/+page.svelte b/src/routes/tools/[tool]/+page.svelte index 967283c1..adcd6442 100644 --- a/src/routes/tools/[tool]/+page.svelte +++ b/src/routes/tools/[tool]/+page.svelte @@ -12,6 +12,7 @@ import { onMount } from 'svelte'; import { goto } from '$app/navigation'; import Picker from '$lib/Tools/Picker.svelte'; + import Likes from '$lib/Tools/Likes.svelte'; export let data; @@ -59,5 +60,7 @@ <RandomFollower /> {:else if tool === 'dump_profile'} <DumpProfile /> + {:else if tool === 'likes'} + <Likes /> {/if} {/if} |