summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/models
diff options
context:
space:
mode:
Diffstat (limited to 'src/remote/activitypub/models')
-rw-r--r--src/remote/activitypub/models/note.ts17
-rw-r--r--src/remote/activitypub/models/question.ts19
2 files changed, 36 insertions, 0 deletions
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index bee2d943a0..dd0083340c 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -14,6 +14,8 @@ import Emoji, { IEmoji } from '../../../models/emoji';
import { ITag } from './tag';
import { toUnicode } from 'punycode';
import { unique, concat, difference } from '../../../prelude/array';
+import { extractPollFromQuestion } from './question';
+import vote from '../../../services/note/polls/vote';
const log = debug('misskey:activitypub');
@@ -110,6 +112,16 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
// テキストのパース
const text = note._misskey_content ? note._misskey_content : htmlToMFM(note.content);
+ // vote
+ if (reply && reply.poll && text != null) {
+ const m = text.match(/([0-9])$/);
+ if (m) {
+ log(`vote from AP: actor=${actor.username}@${actor.host}, note=${note.id}, choice=${m[0]}`);
+ await vote(actor, reply, Number(m[1]));
+ return null;
+ }
+ }
+
const emojis = await extractEmojis(note.tag, actor.host).catch(e => {
console.log(`extractEmojis: ${e}`);
return [] as IEmoji[];
@@ -117,6 +129,9 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
const apEmojis = emojis.map(emoji => emoji.name);
+ const questionUri = note._misskey_question;
+ const poll = questionUri ? await extractPollFromQuestion(questionUri).catch(() => undefined) : undefined;
+
// ユーザーの情報が古かったらついでに更新しておく
if (actor.lastFetchedAt == null || Date.now() - actor.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
updatePerson(note.attributedTo);
@@ -137,6 +152,8 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
apMentions,
apHashtags,
apEmojis,
+ questionUri,
+ poll,
uri: note.id
}, silent);
}
diff --git a/src/remote/activitypub/models/question.ts b/src/remote/activitypub/models/question.ts
new file mode 100644
index 0000000000..53892a409e
--- /dev/null
+++ b/src/remote/activitypub/models/question.ts
@@ -0,0 +1,19 @@
+import { IChoice, IPoll } from '../../../models/note';
+import Resolver from '../resolver';
+
+export async function extractPollFromQuestion(questionUri: string): Promise<IPoll> {
+ const resolver = new Resolver();
+ const question = await resolver.resolve(questionUri) as any;
+
+ const choices: IChoice[] = question.oneOf.map((x: any, i: number) => {
+ return {
+ id: i,
+ text: x.name,
+ votes: x._misskey_votes || 0,
+ } as IChoice;
+ });
+
+ return {
+ choices
+ };
+}