diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index c09391c6c..70123bb4d 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -7,8 +7,8 @@ import { unique, toArray, toSingle } from '@/prelude/array.js'; import { vote } from '@/services/note/polls/vote.js'; import { DriveFile } from '@/models/entities/drive-file.js'; import { deliverQuestionUpdate } from '@/services/note/polls/update.js'; -import { extractDbHost, toPuny } from '@/misc/convert-host.js'; -import { Emojis, Polls, MessagingMessages } from '@/models/index.js'; +import { extractDbHost } from '@/misc/convert-host.js'; +import { Polls, MessagingMessages } from '@/models/index.js'; import { Note } from '@/models/entities/note.js'; import { Emoji } from '@/models/entities/emoji.js'; import { genId } from '@/misc/gen-id.js'; @@ -19,12 +19,12 @@ import { fromHtml } from '@/mfm/from-html.js'; import { shouldBlockInstance } from '@/misc/should-block-instance.js'; import { Resolver } from '@/remote/activitypub/resolver.js'; import { parseAudience } from '../audience.js'; -import { IObject, getOneApId, getApId, getOneApHrefNullable, isPost, IPost, isEmoji, getApType } from '../type.js'; +import { IObject, getOneApId, getApId, getOneApHrefNullable, isPost, IPost, getApType } from '../type.js'; import { DbResolver } from '../db-resolver.js'; import { apLogger } from '../logger.js'; import { resolvePerson } from './person.js'; import { resolveImage } from './image.js'; -import { extractApHashtags, extractQuoteUrl } from './tag.js'; +import { extractApHashtags, extractQuoteUrl, extractEmojis } from './tag.js'; import { extractPollFromQuestion } from './question.js'; import { extractApMentions } from './mention.js'; @@ -324,59 +324,3 @@ export async function resolveNote(value: string | IObject, resolver: Resolver): unlock(); } } - -export async function extractEmojis(tags: IObject | IObject[], idnHost: string): Promise { - const host = toPuny(idnHost); - - if (!tags) return []; - - const eomjiTags = toArray(tags).filter(isEmoji); - - return await Promise.all(eomjiTags.map(async tag => { - const name = tag.name!.replace(/^:/, '').replace(/:$/, ''); - tag.icon = toSingle(tag.icon); - - const exists = await Emojis.findOneBy({ - host, - name, - }); - - if (exists) { - if ((tag.updated != null && exists.updatedAt == null) - || (tag.id != null && exists.uri == null) - || (tag.updated != null && exists.updatedAt != null && new Date(tag.updated) > exists.updatedAt) - || (tag.icon!.url !== exists.originalUrl) - ) { - await Emojis.update({ - host, - name, - }, { - uri: tag.id, - originalUrl: tag.icon!.url, - publicUrl: tag.icon!.url, - updatedAt: new Date(), - }); - - return await Emojis.findOneBy({ - host, - name, - }) as Emoji; - } - - return exists; - } - - apLogger.info(`register emoji host=${host}, name=${name}`); - - return await Emojis.insert({ - id: genId(), - host, - name, - uri: tag.id, - originalUrl: tag.icon!.url, - publicUrl: tag.icon!.url, - updatedAt: new Date(), - aliases: [], - } as Partial).then(x => Emojis.findOneByOrFail(x.identifiers[0])); - })); -} diff --git a/packages/backend/src/remote/activitypub/models/tag.ts b/packages/backend/src/remote/activitypub/models/tag.ts index 6950cc1aa..00322bfd2 100644 --- a/packages/backend/src/remote/activitypub/models/tag.ts +++ b/packages/backend/src/remote/activitypub/models/tag.ts @@ -1,5 +1,9 @@ -import { toArray } from '@/prelude/array.js'; -import { IObject, isHashtag, IApHashtag, isLink, ILink } from '../type.js'; +import { toArray, toSingle } from '@/prelude/array.js'; +import { IObject, isHashtag, IApHashtag, isLink, ILink, isEmoji } from '../type.js'; +import { toPuny } from '@/misc/convert-host.js'; +import { Emojis } from '@/models/index.js'; +import { Emoji } from '@/models/entities/emoji.js'; +import { apLogger } from '@/remote/activitypub/logger.js'; export function extractApHashtags(tags: IObject | IObject[] | null | undefined): string[] { if (tags == null) return []; @@ -47,3 +51,59 @@ export function extractQuoteUrl(tags: IObject | IObject[] | null | undefined): s // If there is more than one quote, we just pick the first/a random one. else return quotes[0].href; } + +export async function extractEmojis(tags: IObject | IObject[], idnHost: string): Promise { + const host = toPuny(idnHost); + + if (!tags) return []; + + const eomjiTags = toArray(tags).filter(isEmoji); + + return await Promise.all(eomjiTags.map(async tag => { + const name = tag.name!.replace(/^:/, '').replace(/:$/, ''); + tag.icon = toSingle(tag.icon); + + const exists = await Emojis.findOneBy({ + host, + name, + }); + + if (exists) { + if ((tag.updated != null && exists.updatedAt == null) + || (tag.id != null && exists.uri == null) + || (tag.updated != null && exists.updatedAt != null && new Date(tag.updated) > exists.updatedAt) + || (tag.icon!.url !== exists.originalUrl) + ) { + await Emojis.update({ + host, + name, + }, { + uri: tag.id, + originalUrl: tag.icon!.url, + publicUrl: tag.icon!.url, + updatedAt: new Date(), + }); + + return await Emojis.findOneBy({ + host, + name, + }) as Emoji; + } + + return exists; + } + + apLogger.info(`register emoji host=${host}, name=${name}`); + + return await Emojis.insert({ + id: genId(), + host, + name, + uri: tag.id, + originalUrl: tag.icon!.url, + publicUrl: tag.icon!.url, + updatedAt: new Date(), + aliases: [], + } as Partial).then(x => Emojis.findOneByOrFail(x.identifiers[0])); + })); +}