aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/AniList/activity.ts25
-rw-r--r--src/lib/AniList/forum.ts16
-rw-r--r--src/lib/Tools/InputTemplate.svelte9
-rw-r--r--src/lib/Tools/Likes.svelte46
-rw-r--r--src/lib/Tools/Picker.svelte1
-rw-r--r--src/lib/Tools/tools.ts5
-rw-r--r--src/routes/tools/[tool]/+page.svelte3
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}