aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Data/AniList/lastActivity.ts
blob: 49daa8fdeab874c68903eed4e9f05d4a99d7e2b4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import type { AniListAuthorisation, UserIdentity } from "./identity";

interface ActivityHistoryOptions {
	stats: {
		activityHistory: {
			date: number;
		}[];
	};
	options: {
		timezone: string;
	};
}

interface LastActivity {
	date: Date;
	timezone: string;
}

const convertToTimezoneOffset = (timeStr: string) => {
	const [hours, minutes] = timeStr.split(":");
	let totalMinutes = parseInt(hours, 10) * 60 + parseInt(minutes, 10);

	totalMinutes = -totalMinutes;

	return totalMinutes;
};

const activityHistoryOptions = async (
	userIdentity: UserIdentity,
	authorisation: AniListAuthorisation,
): Promise<ActivityHistoryOptions> =>
	(
		await (
			await fetch("https://graphql.anilist.co", {
				method: "POST",
				headers: {
					"Content-Type": "application/json",
					Accept: "application/json",
					Authorization: `${authorisation.tokenType} ${authorisation.accessToken}`,
				},
				body: JSON.stringify({
					query: `{ User(id: ${userIdentity.id}) {
					stats { activityHistory { date } }
					options { timezone }
        } }`,
				}),
			})
		).json()
	).data.User;

export const lastActivityDate = async (
	userIdentity: UserIdentity,
	authorisation: AniListAuthorisation,
): Promise<LastActivity> => {
	if (userIdentity.id === -1 || userIdentity.id === -2)
		return { date: new Date(8640000000000000), timezone: "" };

	const history = await activityHistoryOptions(userIdentity, authorisation);
	const date = new Date(
		Number(
			history.stats.activityHistory[history.stats.activityHistory.length - 1]
				.date,
		) *
			1000 +
			convertToTimezoneOffset(history.options.timezone),
	);

	date.setDate(date.getDate() + 1);

	return { date, timezone: history.options.timezone };
};