import { USER_AGENT } from "./constants"; import type { FollowRecord, MiniDoc, Post } from "./types"; // https://stackoverflow.com/questions/3224834/get-difference-between-2-dates-in-javascript export function getDateDifferenceInDays(start: Date, end: Date) { const MS_PER_DAY = 1000 * 60 * 60 * 24; const startUTCDate = Date.UTC( start.getFullYear(), start.getMonth(), start.getDate(), ); const endUTCDate = Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()); return Math.floor((endUTCDate - startUTCDate) / MS_PER_DAY); } export async function resolveIdentity(indentifier: string): Promise { try { const response = await fetch( `https://slingshot.microcosm.blue/xrpc/com.bad-example.identity.resolveMiniDoc?identifier=${indentifier}`, { headers: { "User-Agent": USER_AGENT, }, }, ); if (!response.ok) { // throw new Error(`Failed to fetch minidoc for ${indentifier}. Status - ${response.status}`) console.error( `Failed to fetch minidoc for ${indentifier}. Status - ${response.status}`, ); } const data = (await response.json()) as MiniDoc; return data; } catch (error) { if (error instanceof Error) { console.error(error.message); } throw error; } } export async function getRecentPost(doc: MiniDoc) { try { console.info( `${doc.pds}/xrpc/com.atproto.repo.listRecords?repo=${doc.did}&collection=app.bsky.feed.post&limit=1`, ); if (typeof doc.pds === "undefined") { console.info("could not get pds info, skipping"); return; } const response = await fetch( `${doc.pds}/xrpc/com.atproto.repo.listRecords?repo=${doc.did}&collection=app.bsky.feed.post&limit=1`, { headers: { "User-Agent": USER_AGENT, }, }, ); if (!response.ok) { console.error( `There was an error fetching posts for ${doc.handle}. Status - ${response.status}`, ); } const data = (await response.json()) as { records: Post[] }; return data; } catch (error) { if (error instanceof Error) { console.error(error.message); } throw error; } } export async function getFollowRecords(doc: MiniDoc, cursor?: string) { try { const response = await fetch( `${doc.pds}/xrpc/com.atproto.repo.listRecords?repo=${doc.did}&collection=app.bsky.graph.follow&limit=100&cursor=${cursor}`, { headers: { "User-Agent": USER_AGENT, }, }, ); if (!response.ok) { console.error("There was an error fetching follow records"); } const data = (await response.json()) as { cursor: string; records: FollowRecord[]; }; return { cursor: data?.cursor, follows: data?.records, }; } catch (error) { if (error instanceof Error) { console.error(error.message); } throw error; } }