import type { UserIdentity } from './identity'; export interface ActivityHistoryEntry { date: number; amount: number; } export const fillMissingDays = ( inputActivities: ActivityHistoryEntry[], startOfYear = false ): ActivityHistoryEntry[] => { if (inputActivities.length === 0) return startOfYear ? fillDateRange( new Date(new Date().getUTCFullYear(), 0, 1), new Date(new Date().getUTCFullYear() + 1, 0, 1) ) : []; const sortedActivities = [...inputActivities].sort((a, b) => a.date - b.date); const endDate = new Date(sortedActivities[sortedActivities.length - 1].date * 1000); endDate.setUTCDate(endDate.getUTCDate() + 1); return fillDateRange( startOfYear ? new Date(new Date().getUTCFullYear(), 0, 1) : new Date(sortedActivities[0].date * 1000), endDate, sortedActivities ); }; const fillDateRange = ( startDate: Date, endDate: Date, existingActivities: ActivityHistoryEntry[] = [] ): ActivityHistoryEntry[] => { const outputActivities: ActivityHistoryEntry[] = []; for (let dt = new Date(startDate); dt < endDate; dt.setUTCDate(dt.getUTCDate() + 1)) { const dateString = dt.toDateString(); if ( !new Set( existingActivities.map((activity) => new Date(activity.date * 1000).toDateString()) ).has(dateString) ) { outputActivities.push({ date: Math.floor(dt.getTime() / 1000), amount: 0 }); } else { const activity = existingActivities.find( (activity) => new Date(activity.date * 1000).toDateString() === dateString ); if (activity) outputActivities.push(activity); } } return outputActivities; }; export const activityHistory = async ( userIdentity: UserIdentity ): Promise => { return ( await ( await fetch('https://graphql.anilist.co', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ query: `{ User(id: ${userIdentity.id}) { stats { activityHistory { date amount } } } }` }) }) ).json() )['data']['User']['stats']['activityHistory']; }; export const lastActivityDate = async (userIdentity: UserIdentity): Promise => { const history = await activityHistory(userIdentity); const date = new Date( Number(history[history.length - 1]['date']) * 1000 + new Date().getTimezoneOffset() ); date.setDate(date.getDate() + 1); return date; };