···
const githubFeed = await parseFeedToActivity('https://github.com/90-008.atom');
const codebergFeed = await parseFeedToActivity('https://codeberg.org/90-008.atom');
+
const tangledFeed = await fetchTangledActivity();
+
const mergedFeed = sortActivities(
+
githubFeed.concat(codebergFeed).concat(tangledFeed)
lastCommits.set(mergedFeed);
console.log('could not fetch git activity: ', why);
···
+
const toHex = (bytes: number[]): string => {
+
return bytes.map((b) => b.toString(16).padStart(2, '0')).join('');
+
const fetchTangledActivity = async (): Promise<Activity[]> => {
+
const did = 'did:plc:dfl62fgb7wtjj3fcbb72naae';
+
const pds = 'https://gaze.systems';
+
const knot = 'https://knot.gaze.systems';
+
const activities: Activity[] = [];
+
const listRes = await fetch(
+
`${pds}/xrpc/com.atproto.repo.listRecords?repo=${did}&collection=sh.tangled.repo`
+
if (!listRes.ok) return [];
+
const listData = await listRes.json();
+
for (const record of listData.records || []) {
+
const repoName = record.value.name;
+
if (!repoName) continue;
+
const logRes = await fetch(
+
`${knot}/xrpc/sh.tangled.repo.log?repo=${did}/${repoName}`
+
if (!logRes.ok) continue;
+
const logData = await logRes.json();
+
const commits = logData.commits || [];
+
for (const commit of commits) {
+
const hash = commit.Hash ? toHex(commit.Hash) : '';
+
const message = commit.Message || '';
+
const dateStr = commit.Author?.When;
+
source: 'knot.gaze.systems',
+
link: `https://tangled.sh/${did}/${repoName}/commit/${hash}`,
+
date: dateStr ? new Date(dateStr) : null
+
console.log(`could not fetch tangled log for ${repoName}:`, err);
+
console.log('could not fetch tangled repos:', err);
const parseFeedToActivity = async (url: string) => {