他のMisskeyインスタンスにリアクション情報を伝えるように

This commit is contained in:
syuilo 2018-04-23 15:27:01 +09:00
parent 0b99483ccb
commit 02bb99ac02
6 changed files with 31 additions and 15 deletions

View File

@ -1,4 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import $ from 'cafy';
import deepcopy = require('deepcopy'); import deepcopy = require('deepcopy');
import db from '../db/mongodb'; import db from '../db/mongodb';
import Reaction from './note-reaction'; import Reaction from './note-reaction';
@ -16,6 +17,18 @@ export interface INoteReaction {
reaction: string; reaction: string;
} }
export const validateReaction = $().string().or([
'like',
'love',
'laugh',
'hmm',
'surprise',
'congrats',
'angry',
'confused',
'pudding'
]);
/** /**
* NoteReactionを物理削除します * NoteReactionを物理削除します
*/ */

View File

@ -3,6 +3,7 @@ import Note from '../../../models/note';
import { IRemoteUser } from '../../../models/user'; import { IRemoteUser } from '../../../models/user';
import { ILike } from '../type'; import { ILike } from '../type';
import create from '../../../services/note/reaction/create'; import create from '../../../services/note/reaction/create';
import { validateReaction } from '../../../models/note-reaction';
export default async (actor: IRemoteUser, activity: ILike) => { export default async (actor: IRemoteUser, activity: ILike) => {
const id = typeof activity.object == 'string' ? activity.object : activity.object.id; const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
@ -17,5 +18,14 @@ export default async (actor: IRemoteUser, activity: ILike) => {
throw new Error(); throw new Error();
} }
await create(actor, note, 'pudding'); let reaction = 'pudding';
// 他のMisskeyインスタンスからのリアクション
if (activity._misskey_reaction) {
if (validateReaction.ok(activity._misskey_reaction)) {
reaction = activity._misskey_reaction;
}
}
await create(actor, note, reaction);
}; };

View File

@ -1,8 +1,9 @@
import config from '../../../config'; import config from '../../../config';
import { ILocalUser } from '../../../models/user'; import { ILocalUser } from '../../../models/user';
export default (user: ILocalUser, note) => ({ export default (user: ILocalUser, note, reaction: string) => ({
type: 'Like', type: 'Like',
actor: `${config.url}/users/${user._id}`, actor: `${config.url}/users/${user._id}`,
object: note.uri ? note.uri : `${config.url}/notes/${note._id}` object: note.uri ? note.uri : `${config.url}/notes/${note._id}`,
_misskey_reaction: reaction
}); });

View File

@ -82,6 +82,7 @@ export interface IAccept extends IActivity {
export interface ILike extends IActivity { export interface ILike extends IActivity {
type: 'Like'; type: 'Like';
_misskey_reaction: string;
} }
export interface IAnnounce extends IActivity { export interface IAnnounce extends IActivity {

View File

@ -4,6 +4,7 @@
import $ from 'cafy'; import $ from 'cafy';
import Note from '../../../../../models/note'; import Note from '../../../../../models/note';
import create from '../../../../../services/note/reaction/create'; import create from '../../../../../services/note/reaction/create';
import { validateReaction } from '../../../../../models/note-reaction';
/** /**
* React to a note * React to a note
@ -14,17 +15,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
if (noteIdErr) return rej('invalid noteId param'); if (noteIdErr) return rej('invalid noteId param');
// Get 'reaction' parameter // Get 'reaction' parameter
const [reaction, reactionErr] = $(params.reaction).string().or([ const [reaction, reactionErr] = $(params.reaction).string().pipe(validateReaction.ok).$;
'like',
'love',
'laugh',
'hmm',
'surprise',
'congrats',
'angry',
'confused',
'pudding'
]).$;
if (reactionErr) return rej('invalid reaction param'); if (reactionErr) return rej('invalid reaction param');
// Fetch reactee // Fetch reactee

View File

@ -87,7 +87,7 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise
//#region 配信 //#region 配信
// リアクターがローカルユーザーかつリアクション対象がリモートユーザーの投稿なら配送 // リアクターがローカルユーザーかつリアクション対象がリモートユーザーの投稿なら配送
if (isLocalUser(user) && isRemoteUser(note._user)) { if (isLocalUser(user) && isRemoteUser(note._user)) {
const content = pack(renderLike(user, note)); const content = pack(renderLike(user, note, reaction));
deliver(user, content, note._user.inbox); deliver(user, content, note._user.inbox);
} }
//#endregion //#endregion