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 };
};
|