summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/models/note.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/remote/activitypub/models/note.ts')
-rw-r--r--src/remote/activitypub/models/note.ts39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index d49cf53079..be6c1bcd18 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -10,6 +10,9 @@ import { resolvePerson, updatePerson } from './person';
import { resolveImage } from './image';
import { IRemoteUser, IUser } from '../../../models/user';
import htmlToMFM from '../../../mfm/html-to-mfm';
+import Emoji from '../../../models/emoji';
+import { ITag } from './tag';
+import { toUnicode } from 'punycode';
const log = debug('misskey:activitypub');
@@ -93,6 +96,10 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
// テキストのパース
const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content);
+ await extractEmojis(note.tag, actor.host).catch(e => {
+ console.log(`extractEmojis: ${e}`);
+ });
+
// ユーザーの情報が古かったらついでに更新しておく
if (actor.updatedAt == null || Date.now() - actor.updatedAt.getTime() > 1000 * 60 * 60 * 24) {
updatePerson(note.attributedTo);
@@ -135,3 +142,35 @@ export async function resolveNote(value: string | IObject, resolver?: Resolver):
// 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。
return await createNote(uri, resolver);
}
+
+async function extractEmojis(tags: ITag[], host_: string) {
+ const host = toUnicode(host_.toLowerCase());
+
+ if (!tags) return [];
+
+ const eomjiTags = tags.filter(tag => tag.type === 'Emoji' && tag.icon && tag.icon.url);
+
+ return await Promise.all(
+ eomjiTags.map(async tag => {
+ const name = tag.name.replace(/^:/, '').replace(/:$/, '');
+
+ const exists = await Emoji.findOne({
+ host,
+ name
+ });
+
+ if (exists) {
+ return exists;
+ }
+
+ log(`register emoji host=${host}, name=${name}`);
+
+ return await Emoji.insert({
+ host,
+ name,
+ url: tag.icon.url,
+ aliases: [],
+ });
+ })
+ );
+}