From 5b684c6deb50e0f642b71bf354cacaf871b514e4 Mon Sep 17 00:00:00 2001
From: MeiMei <30769358+mei23@users.noreply.github.com>
Date: Fri, 9 Nov 2018 08:44:19 +0900
Subject: [PATCH]  On remote notes, not use content for detecting mentions
 (#3170)

* On remote note, detect mentioned users from to/cc

* fix
---
 src/remote/activitypub/models/note.ts | 21 +++++++++++++++++++++
 src/services/note/create.ts           |  3 ++-
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index be6c1bcd18..f9380eb4f4 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -13,6 +13,7 @@ import htmlToMFM from '../../../mfm/html-to-mfm';
 import Emoji from '../../../models/emoji';
 import { ITag } from './tag';
 import { toUnicode } from 'punycode';
+import { unique } from '../../../prelude/array';
 
 const log = debug('misskey:activitypub');
 
@@ -81,6 +82,8 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 	}
 	//#endergion
 
+	const apMentions = await extractMentionedUsers(actor, note.to, note.cc, resolver);
+
 	// 添付ファイル
 	// TODO: attachmentは必ずしもImageではない
 	// TODO: attachmentは必ずしも配列ではない
@@ -116,6 +119,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 		geo: undefined,
 		visibility,
 		visibleUsers,
+		apMentions,
 		uri: note.id
 	}, silent);
 }
@@ -174,3 +178,20 @@ async function extractEmojis(tags: ITag[], host_: string) {
 		})
 	);
 }
+
+async function extractMentionedUsers(actor: IRemoteUser, to: string[], cc: string[], resolver: Resolver ) {
+	let uris = [] as string[];
+
+	if (to) uris.concat(to);
+	if (cc) uris.concat(cc);
+
+	uris = uris.filter(x => x !== 'https://www.w3.org/ns/activitystreams#Public');
+	uris = uris.filter(x => x !== `${actor.uri}/followers`);
+	uris = unique(uris);
+
+	const users = await Promise.all(
+		uris.map(async uri => await resolvePerson(uri, null, resolver).catch(() => null))
+	);
+
+	return users.filter(x => x != null);
+}
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index b3a3e83d4c..bd38605fda 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -98,6 +98,7 @@ type Option = {
 	cw?: string;
 	visibility?: string;
 	visibleUsers?: IUser[];
+	apMentions?: IUser[];
 	uri?: string;
 	app?: IApp;
 };
@@ -149,7 +150,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
 
 	const emojis = extractEmojis(tokens);
 
-	const mentionedUsers = await extractMentionedUsers(tokens);
+	const mentionedUsers = data.apMentions || await extractMentionedUsers(tokens);
 
 	if (data.reply && !user._id.equals(data.reply.userId) && !mentionedUsers.some(u => u._id.equals(data.reply.userId))) {
 		mentionedUsers.push(await User.findOne({ _id: data.reply.userId }));