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 => ( 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 => { 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 }; };