mizzkey/src/remote/activitypub/kernel/announce/note.ts

73 lines
1.8 KiB
TypeScript
Raw Normal View History

2018-04-07 23:55:26 +02:00
import * as debug from 'debug';
import Resolver from '../../resolver';
import post from '../../../../services/note/create';
2018-06-18 07:28:43 +02:00
import { IRemoteUser, IUser } from '../../../../models/user';
2018-04-07 23:55:26 +02:00
import { IAnnounce, INote } from '../../type';
2018-04-17 09:05:50 +02:00
import { fetchNote, resolveNote } from '../../models/note';
2018-04-28 21:44:58 +02:00
import { resolvePerson } from '../../models/person';
2018-04-07 23:55:26 +02:00
const log = debug('misskey:activitypub');
/**
*
*/
export default async function(resolver: Resolver, actor: IRemoteUser, activity: IAnnounce, note: INote): Promise<void> {
const uri = activity.id || activity;
2018-06-12 22:15:26 +02:00
// アナウンサーが凍結されていたらスキップ
if (actor.isSuspended) {
return;
}
2018-04-07 23:55:26 +02:00
if (typeof uri !== 'string') {
throw new Error('invalid announce');
}
// 既に同じURIを持つものが登録されていないかチェック
2018-04-08 21:08:56 +02:00
const exist = await fetchNote(uri);
2018-04-07 23:55:26 +02:00
if (exist) {
return;
}
2018-04-08 21:08:56 +02:00
const renote = await resolveNote(note);
2018-04-07 23:55:26 +02:00
log(`Creating the (Re)Note: ${uri}`);
//#region Visibility
2018-11-16 19:25:48 +01:00
const visibility = getVisibility(activity.to, activity.cc, actor);
2018-06-18 07:28:43 +02:00
let visibleUsers: IUser[] = [];
2018-11-16 19:25:48 +01:00
if (visibility == 'specified') {
visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri)));
2018-08-16 23:40:08 +02:00
}
2018-04-07 23:55:26 +02:00
//#endergion
await post(actor, {
createdAt: new Date(activity.published),
renote,
visibility,
2018-04-28 21:44:58 +02:00
visibleUsers,
2018-04-07 23:55:26 +02:00
uri
});
}
2018-11-16 19:25:48 +01:00
2018-12-28 18:55:46 +01:00
type visibility = 'public' | 'home' | 'followers' | 'specified';
2018-11-16 19:25:48 +01:00
function getVisibility(to: string[], cc: string[], actor: IRemoteUser): visibility {
const PUBLIC = 'https://www.w3.org/ns/activitystreams#Public';
to = to || [];
cc = cc || [];
if (to.includes(PUBLIC)) {
return 'public';
} else if (cc.includes(PUBLIC)) {
return 'home';
} else if (to.includes(`${actor.uri}/followers`)) {
return 'followers';
} else {
return 'specified';
}
}