forked from FoundKeyGang/FoundKey
move extractEmojis to models/tags
This commit is contained in:
parent
d74b7d2eec
commit
eb971de3a7
2 changed files with 66 additions and 62 deletions
|
@ -7,8 +7,8 @@ import { unique, toArray, toSingle } from '@/prelude/array.js';
|
||||||
import { vote } from '@/services/note/polls/vote.js';
|
import { vote } from '@/services/note/polls/vote.js';
|
||||||
import { DriveFile } from '@/models/entities/drive-file.js';
|
import { DriveFile } from '@/models/entities/drive-file.js';
|
||||||
import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
|
import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
|
||||||
import { extractDbHost, toPuny } from '@/misc/convert-host.js';
|
import { extractDbHost } from '@/misc/convert-host.js';
|
||||||
import { Emojis, Polls, MessagingMessages } from '@/models/index.js';
|
import { Polls, MessagingMessages } from '@/models/index.js';
|
||||||
import { Note } from '@/models/entities/note.js';
|
import { Note } from '@/models/entities/note.js';
|
||||||
import { Emoji } from '@/models/entities/emoji.js';
|
import { Emoji } from '@/models/entities/emoji.js';
|
||||||
import { genId } from '@/misc/gen-id.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 { shouldBlockInstance } from '@/misc/should-block-instance.js';
|
||||||
import { Resolver } from '@/remote/activitypub/resolver.js';
|
import { Resolver } from '@/remote/activitypub/resolver.js';
|
||||||
import { parseAudience } from '../audience.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 { DbResolver } from '../db-resolver.js';
|
||||||
import { apLogger } from '../logger.js';
|
import { apLogger } from '../logger.js';
|
||||||
import { resolvePerson } from './person.js';
|
import { resolvePerson } from './person.js';
|
||||||
import { resolveImage } from './image.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 { extractPollFromQuestion } from './question.js';
|
||||||
import { extractApMentions } from './mention.js';
|
import { extractApMentions } from './mention.js';
|
||||||
|
|
||||||
|
@ -324,59 +324,3 @@ export async function resolveNote(value: string | IObject, resolver: Resolver):
|
||||||
unlock();
|
unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function extractEmojis(tags: IObject | IObject[], idnHost: string): Promise<Emoji[]> {
|
|
||||||
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<Emoji>).then(x => Emojis.findOneByOrFail(x.identifiers[0]));
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
import { toArray } from '@/prelude/array.js';
|
import { toArray, toSingle } from '@/prelude/array.js';
|
||||||
import { IObject, isHashtag, IApHashtag, isLink, ILink } from '../type.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[] {
|
export function extractApHashtags(tags: IObject | IObject[] | null | undefined): string[] {
|
||||||
if (tags == null) return [];
|
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.
|
// If there is more than one quote, we just pick the first/a random one.
|
||||||
else return quotes[0].href;
|
else return quotes[0].href;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function extractEmojis(tags: IObject | IObject[], idnHost: string): Promise<Emoji[]> {
|
||||||
|
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<Emoji>).then(x => Emojis.findOneByOrFail(x.identifiers[0]));
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue