Files
NodeBB/src/activitypub/feps.js

81 lines
2.6 KiB
JavaScript

'use strict';
const nconf = require('nconf');
const posts = require('../posts');
const topics = require('../topics');
const utils = require('../utils');
const activitypub = module.parent.exports;
const Feps = module.exports;
Feps.announce = async function announce(id, activity) {
let localId;
if (String(id).startsWith(nconf.get('url'))) {
({ id: localId } = await activitypub.helpers.resolveLocalId(id));
}
/**
* Re-broadcasting occurs on
* - local cids (for all tids), and
* - local tids (posted to remote cids) only
*/
const tid = await posts.getPostField(localId || id, 'tid');
const cid = await topics.getTopicField(tid, 'cid');
const localCid = utils.isNumber(cid) && cid > 0;
const addressed = activitypub.helpers.addressed(cid, activity);
const shouldAnnounce = localCid || (utils.isNumber(tid) && !addressed);
if (!shouldAnnounce) { // inverse conditionals can kiss my ass.
return;
}
let relays = await activitypub.relays.list();
relays = relays.reduce((memo, { state, url }) => {
if (state === 2) {
memo.push(url);
}
return memo;
}, []);
const followers = localCid ? await activitypub.notes.getCategoryFollowers(cid) : [cid];
const targets = relays.concat(followers);
if (!targets.length) {
return;
}
const { actor } = activity;
if (localCid && actor && !actor.startsWith(nconf.get('url'))) {
targets.unshift(actor);
}
const now = Date.now();
const to = [localCid ? `${nconf.get('url')}/category/${cid}/followers` : cid];
const cc = [activitypub._constants.publicAddress];
if (localCid) {
cc.unshift(actor);
}
if (activity.type === 'Create') {
const isMain = await posts.isMain(localId || id);
if (isMain) {
activitypub.helpers.log(`[activitypub/inbox.announce(1b12)] Announcing plain object (${activity.id}) to followers of cid ${cid} and ${relays.length} relays`);
await activitypub.send('cid', localCid ? cid : 0, targets, {
id: `${nconf.get('url')}/post/${encodeURIComponent(id)}#activity/announce/${localCid ? `cid/${cid}` : 'uid/0'}`,
type: 'Announce',
actor: localCid ? `${nconf.get('url')}/category/${cid}` : `${nconf.get('url')}/actor`,
to,
cc,
object: activity.object,
});
}
}
activitypub.helpers.log(`[activitypub/inbox.announce(1b12)] Announcing ${activity.type} (${activity.id}) to followers of cid ${cid} and ${relays.length} relays`);
await activitypub.send('cid', localCid ? cid : 0, targets, {
id: `${nconf.get('url')}/post/${encodeURIComponent(id)}#activity/announce/${now}`,
type: 'Announce',
actor: localCid ? `${nconf.get('url')}/category/${cid}` : `${nconf.get('url')}/actor`,
to,
cc,
object: activity,
});
};