diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts
index faae6e56a3..a3afff7282 100644
--- a/packages/megalodon/src/misskey.ts
+++ b/packages/megalodon/src/misskey.ts
@@ -1514,19 +1514,35 @@ export default class Misskey implements MegalodonInterface {
if (status.quote != null)
status.quote = await this.addMentionsToStatus(status.quote, cache);
+ const idx = status.account.acct.indexOf('@');
+ const origin = idx < 0 ? null : status.account.acct.substring(idx + 1);
+
status.mentions = (
- await this.getMentions(status.plain_content!, cache)
+ await this.getMentions(status.plain_content!, origin, cache)
).filter((p) => p != null);
for (const m of status.mentions.filter(
(value, index, array) => array.indexOf(value) === index,
)) {
- if (m.acct == m.username)
+ const regexFull = new RegExp(`(?<=^|\\s|>)@${m.acct}(?=[^a-zA-Z0-9]|$)`, 'gi');
+ const regexLocalUser = new RegExp(`(?<=^|\\s|>)@${m.acct}@${this.baseUrlToHost(this.baseUrl)}(?=[^a-zA-Z0-9]|$)`, 'gi');
+ const regexRemoteUser = new RegExp(`(?<=^|\\s|>)@${m.username}(?=[^a-zA-Z0-9@]|$)`, 'gi');
+
+ if (m.acct == m.username) {
status.content = status.content.replace(
- `@${m.acct}@${this.baseUrlToHost(this.baseUrl)}`,
+ regexLocalUser,
`@${m.acct}`,
);
+ }
+
+ else if (!status.content.match(regexFull)) {
+ status.content = status.content.replace(
+ regexRemoteUser,
+ `@${m.acct}`,
+ );
+ }
+
status.content = status.content.replace(
- `@${m.acct}`,
+ regexFull,
`@${m.acct}`,
);
}
@@ -1535,6 +1551,7 @@ export default class Misskey implements MegalodonInterface {
public async getMentions(
text: string,
+ origin: string | null,
cache: AccountCache,
): Promise {
const mentions: Entity.Mention[] = [];
@@ -1542,7 +1559,7 @@ export default class Misskey implements MegalodonInterface {
if (text == undefined) return mentions;
const mentionMatch = text.matchAll(
- /(?<=^|\s)@(?.*?)(?:@(?.*?)|)(?=\s|$)/g,
+ /(?<=^|\s)@(?[a-zA-Z0-9_]+)(?:@(?[a-zA-Z0-9-.]+\.[a-zA-Z0-9-]+)|)(?=[^a-zA-Z0-9]|$)/g,
);
for (const m of mentionMatch) {
@@ -1551,7 +1568,7 @@ export default class Misskey implements MegalodonInterface {
const account = await this.getAccountByNameCached(
m.groups.user,
- m.groups.host,
+ m.groups.host ?? origin,
cache,
);
@@ -2963,7 +2980,7 @@ export default class Misskey implements MegalodonInterface {
}
try {
- const match = q.match(/^@(?.*?)(?:@(?.*?)|)$/);
+ const match = q.match(/^@(?[a-zA-Z0-9_]+)(?:@(?[a-zA-Z0-9-.]+\.[a-zA-Z0-9-]+)|)$/);
if (match) {
const lookupQuery = {
username: match.groups?.user,