import Parser from 'rss-parser';
import sanitizeHtml from 'sanitize-html';
import type { Route } from '@/types';
import { ViewType } from '@/types';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
const parser = new Parser();
export const route: Route = {
path: '/activity/:user',
name: 'User Activities',
maintainers: ['hyoban'],
example: '/github/activity/DIYgod',
categories: ['programming'],
view: ViewType.Notifications,
parameters: {
user: 'GitHub username',
},
description: 'Get the activities of a user on GitHub, based on the GitHub official RSS feed',
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['github.com/:user'],
target: '/activity/:user',
},
],
handler: async (ctx) => {
const { user } = ctx.req.param();
const response = (await ofetch(`https://github.com/${user}.atom`)) as Blob;
const raw = await response.text();
//
const image = raw.match(/ ({
title: item.title ?? '',
link: item.link,
description: sanitizeHtml(item.content?.replaceAll(/href="\/(.+?)"/g, 'href="https://github.com/$1"') ?? '', { allowedTags: [...sanitizeHtml.defaults.allowedTags, 'img'] }),
pubDate: item.pubDate ? parseDate(item.pubDate) : undefined,
author: item.author,
guid: item.id,
image,
})),
allowEmpty: true,
};
},
};