This commit is contained in:
mei23 2019-01-20 13:15:03 +09:00
parent 08524feb03
commit b7a6699c35
6 changed files with 35 additions and 6 deletions

View File

@ -38,9 +38,7 @@ export type INote = {
fileIds: mongo.ObjectID[];
replyId: mongo.ObjectID;
renoteId: mongo.ObjectID;
poll: {
choices: IChoice[]
};
poll: IPoll;
text: string;
tags: string[];
tagsLower: string[];
@ -100,6 +98,10 @@ export type INote = {
_files?: IDriveFile[];
};
export type IPoll = {
choices: IChoice[]
};
export type IChoice = {
id: number;
text: string;

View File

@ -14,6 +14,7 @@ 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';
const log = debug('misskey:activitypub');
@ -117,6 +118,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 +141,8 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
apMentions,
apHashtags,
apEmojis,
questionUri,
poll,
uri: note.id
}, silent);
}

View File

@ -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
};
}

View File

@ -94,14 +94,14 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
let text = note.text;
const questions = [];
let question: string;
if (note.poll != null) {
if (text == null) text = '';
const url = `${config.url}/notes/${note._id}`;
// TODO: i18n
text += `\n\n[投票を見る](${url})`;
questions.push(await renderQuestion(user as ILocalUser, note));
question = `${config.url}/questions/${note._id}`;
}
let apText = text;
@ -124,7 +124,6 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
...hashtagTags,
...mentionTags,
...apemojis,
...questions,
];
return {
@ -135,6 +134,7 @@ export default async function renderNote(note: INote, dive = true): Promise<any>
content,
_misskey_content: text,
_misskey_quote: quote,
_misskey_question: question,
published: note.createdAt.toISOString(),
to,
cc,

View File

@ -42,6 +42,7 @@ export interface INote extends IObject {
type: 'Note';
_misskey_content: string;
_misskey_quote: string;
_misskey_question: string;
}
export interface IPerson extends IObject {

View File

@ -102,6 +102,7 @@ type Option = {
apMentions?: IUser[];
apHashtags?: string[];
apEmojis?: string[];
questionUri?: string;
uri?: string;
app?: IApp;
};