Files
ditto/src/cron.ts
2024-06-02 16:59:11 -05:00

113 lines
3.2 KiB
TypeScript

import { Stickynotes } from '@soapbox/stickynotes';
import { Conf } from '@/config.ts';
import { DittoDB } from '@/db/DittoDB.ts';
import { handleEvent } from '@/pipeline.ts';
import { AdminSigner } from '@/signers/AdminSigner.ts';
import { getTrendingEvents } from '@/trends/trending-events.ts';
import { getTrendingTagValues } from '@/trends/trending-tag-values.ts';
import { Time } from '@/utils/time.ts';
const console = new Stickynotes('ditto:trends');
async function updateTrendingNotes() {
console.info('Updating trending notes...');
const kysely = await DittoDB.getInstance();
const signal = AbortSignal.timeout(1000);
const yesterday = Math.floor((Date.now() - Time.days(1)) / 1000);
const now = Math.floor(Date.now() / 1000);
const events = await getTrendingEvents(kysely, {
kinds: [1],
since: yesterday,
until: now,
limit: 40,
});
const signer = new AdminSigner();
const label = await signer.signEvent({
kind: 1985,
content: '',
tags: [
['L', 'pub.ditto.trends'],
['l', 'notes', 'pub.ditto.trends'],
...events.map(({ id }) => ['e', id, Conf.relay]),
],
created_at: Math.floor(Date.now() / 1000),
});
await handleEvent(label, signal);
console.info('Trending notes updated.');
}
async function updateTrendingHashtags() {
console.info('Updating trending hashtags...');
const kysely = await DittoDB.getInstance();
const signal = AbortSignal.timeout(1000);
const yesterday = Math.floor((Date.now() - Time.days(1)) / 1000);
const now = Math.floor(Date.now() / 1000);
const hashtags = await getTrendingTagValues(kysely, 't', {
since: yesterday,
until: now,
limit: 20,
});
const signer = new AdminSigner();
const label = await signer.signEvent({
kind: 1985,
content: '',
tags: [
['L', 'pub.ditto.trends'],
['l', '#t', 'pub.ditto.trends'],
...hashtags.map(({ value, authors, uses }) => ['t', value, authors.toString(), uses.toString()]),
],
created_at: Math.floor(Date.now() / 1000),
});
await handleEvent(label, signal);
console.info('Trending hashtags updated.');
}
async function updateTrendingLinks() {
console.info('Updating trending links...');
const kysely = await DittoDB.getInstance();
const signal = AbortSignal.timeout(1000);
const yesterday = Math.floor((Date.now() - Time.days(1)) / 1000);
const now = Math.floor(Date.now() / 1000);
const links = await getTrendingTagValues(kysely, 'r', {
since: yesterday,
until: now,
limit: 20,
});
const signer = new AdminSigner();
const label = await signer.signEvent({
kind: 1985,
content: '',
tags: [
['L', 'pub.ditto.trends'],
['l', '#r', 'pub.ditto.trends'],
...links.map(({ value, authors, uses }) => ['r', value, authors.toString(), uses.toString()]),
],
created_at: Math.floor(Date.now() / 1000),
});
await handleEvent(label, signal);
console.info('Trending links updated.');
}
/** Start cron jobs for the application. */
export function cron() {
Deno.cron('update trending notes', '15 * * * *', updateTrendingNotes);
Deno.cron('update trending hashtags', '30 * * * *', updateTrendingHashtags);
Deno.cron('update trending links', '45 * * * *', updateTrendingLinks);
}