diff --git a/src/mfm/toHtml.ts b/src/mfm/toHtml.ts index 8289288d3..a44e70830 100644 --- a/src/mfm/toHtml.ts +++ b/src/mfm/toHtml.ts @@ -135,7 +135,7 @@ export function toHtml(tokens: MfmForest | null, mentionedRemoteUsers: IMentione break; default: const remoteUserInfo = mentionedRemoteUsers.find(remoteUser => remoteUser.username === username && remoteUser.host === host); - a.href = remoteUserInfo ? remoteUserInfo.uri : `${config.url}/${acct}`; + a.href = remoteUserInfo ? (remoteUserInfo.url ? remoteUserInfo.url : remoteUserInfo.uri) : `${config.url}/${acct}`; a.className = 'u-url mention'; break; } diff --git a/src/models/entities/note.ts b/src/models/entities/note.ts index 33a6d2bc2..d67faae82 100644 --- a/src/models/entities/note.ts +++ b/src/models/entities/note.ts @@ -228,6 +228,7 @@ export class Note { export type IMentionedRemoteUsers = { uri: string; + url?: string; username: string; host: string; }[]; diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 9d5c0a58d..5d9492e6a 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -16,11 +16,11 @@ import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc'; import extractMentions from '../../misc/extract-mentions'; import extractEmojis from '../../misc/extract-emojis'; import extractHashtags from '../../misc/extract-hashtags'; -import { Note } from '../../models/entities/note'; +import { Note, IMentionedRemoteUsers } from '../../models/entities/note'; import { Mutings, Users, NoteWatchings, Followings, Notes, Instances, UserProfiles } from '../../models'; import { DriveFile } from '../../models/entities/drive-file'; import { App } from '../../models/entities/app'; -import { Not, getConnection } from 'typeorm'; +import { Not, getConnection, In } from 'typeorm'; import { User, ILocalUser, IRemoteUser } from '../../models/entities/user'; import { genId } from '../../misc/gen-id'; import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '../chart'; @@ -383,11 +383,17 @@ async function insertNote(user: User, data: Option, tags: string[], emojis: stri // Append mentions data if (mentionedUsers.length > 0) { insert.mentions = mentionedUsers.map(u => u.id); - insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => ({ - uri: (u as IRemoteUser).uri, - username: u.username, - host: u.host - }))); + const profiles = await UserProfiles.find({ userId: In(insert.mentions) }); + insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => { + const profile = profiles.find(p => p.userId == u.id); + const url = profile != null ? profile.url : null; + return { + uri: u.uri, + url: url == null ? undefined : url, + username: u.username, + host: u.host + } as IMentionedRemoteUsers[0]; + })); } // 投稿を作成