This commit is contained in:
syuilo 2018-06-18 14:28:43 +09:00
parent 80e5645a84
commit e66d7babc5
56 changed files with 115 additions and 112 deletions

View File

@ -1,4 +1,4 @@
import { IUser } from "../models/user"; import { IUser } from '../models/user';
export default (user: IUser) => { export default (user: IUser) => {
return user.host === null ? user.username : `${user.username}@${user.host}`; return user.host === null ? user.username : `${user.username}@${user.host}`;

View File

@ -48,7 +48,7 @@ export default class Replacer {
if (error) { if (error) {
console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`); console.warn(`key '${key}' not found in '${path}' of '${this.lang}'`);
return key; // Fallback return key; // Fallback
} else if (typeof text !== "string") { } else if (typeof text !== 'string') {
console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`); console.warn(`key '${key}' is not string in '${path}' of '${this.lang}'`);
return key; // Fallback return key; // Fallback
} else { } else {

View File

@ -220,7 +220,7 @@ export const pack = async (
hide = false; hide = false;
} else { } else {
// 指定されているかどうか // 指定されているかどうか
const specified = _note.visibleUserIds.some(id => id.equals(meId)); const specified = _note.visibleUserIds.some((id: mongo.ObjectID) => id.equals(meId));
if (specified) { if (specified) {
hide = false; hide = false;
@ -272,7 +272,7 @@ export const pack = async (
} }
// Populate media // Populate media
_note.media = hide ? [] : Promise.all(_note.mediaIds.map(fileId => _note.media = hide ? [] : Promise.all(_note.mediaIds.map((fileId: mongo.ObjectID) =>
packFile(fileId) packFile(fileId)
)); ));

View File

@ -1,6 +1,6 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
const deepcopy = require('deepcopy'); const deepcopy = require('deepcopy');
import sequential = require('promise-sequential'); const sequential = require('promise-sequential');
import rap from '@prezzemolo/rap'; import rap from '@prezzemolo/rap';
import db from '../db/mongodb'; import db from '../db/mongodb';
import Note, { pack as packNote, deleteNote } from './note'; import Note, { pack as packNote, deleteNote } from './note';

View File

@ -1,6 +1,6 @@
import * as nopt from 'nopt'; import * as nopt from 'nopt';
export default (vector, index) => { export default (vector: any, index: any) => {
const parsed = nopt({ const parsed = nopt({
'only-processor': Boolean, 'only-processor': Boolean,
'only-server': Boolean 'only-server': Boolean

View File

@ -11,7 +11,7 @@ if (config.sw) {
config.sw.private_key); config.sw.private_key);
} }
export default async function(userId: mongo.ObjectID | string, type, body?) { export default async function(userId: mongo.ObjectID | string, type: string, body?: any) {
if (!config.sw) return; if (!config.sw) return;
if (typeof userId === 'string') { if (typeof userId === 'string') {
@ -34,7 +34,7 @@ export default async function(userId: mongo.ObjectID | string, type, body?) {
push.sendNotification(pushSubscription, JSON.stringify({ push.sendNotification(pushSubscription, JSON.stringify({
type, body type, body
})).catch(err => { })).catch((err: any) => {
//console.log(err.statusCode); //console.log(err.statusCode);
//console.log(err.headers); //console.log(err.headers);
//console.log(err.body); //console.log(err.body);

View File

@ -12,7 +12,7 @@ const queue = createQueue({
} }
}); });
export function createHttp(data) { export function createHttp(data: any) {
return queue return queue
.create('http', data) .create('http', data)
.removeOnComplete(true) .removeOnComplete(true)
@ -21,7 +21,7 @@ export function createHttp(data) {
.backoff({ delay: 16384, type: 'exponential' }); .backoff({ delay: 16384, type: 'exponential' });
} }
export function deliver(user: ILocalUser, content, to) { export function deliver(user: ILocalUser, content: any, to: any) {
createHttp({ createHttp({
title: 'deliver', title: 'deliver',
type: 'deliver', type: 'deliver',

View File

@ -2,7 +2,7 @@ import * as kue from 'kue';
import request from '../../../remote/activitypub/request'; import request from '../../../remote/activitypub/request';
export default async (job: kue.Job, done): Promise<void> => { export default async (job: kue.Job, done: any): Promise<void> => {
try { try {
await request(job.data.user, job.data.to, job.data.content); await request(job.data.user, job.data.to, job.data.content);
done(); done();

View File

@ -1,12 +1,12 @@
import deliver from './deliver'; import deliver from './deliver';
import processInbox from './process-inbox'; import processInbox from './process-inbox';
const handlers = { const handlers: any = {
deliver, deliver,
processInbox, processInbox,
}; };
export default (job, done) => { export default (job: any, done: any) => {
const handler = handlers[job.data.type]; const handler = handlers[job.data.type];
if (handler) { if (handler) {

View File

@ -10,7 +10,7 @@ import { resolvePerson } from '../../../remote/activitypub/models/person';
const log = debug('misskey:queue:inbox'); const log = debug('misskey:queue:inbox');
// ユーザーのinboxにアクティビティが届いた時の処理 // ユーザーのinboxにアクティビティが届いた時の処理
export default async (job: kue.Job, done): Promise<void> => { export default async (job: kue.Job, done: any): Promise<void> => {
const signature = job.data.signature; const signature = job.data.signature;
const activity = job.data.activity; const activity = job.data.activity;
@ -22,7 +22,7 @@ export default async (job: kue.Job, done): Promise<void> => {
//#endregion //#endregion
const keyIdLower = signature.keyId.toLowerCase(); const keyIdLower = signature.keyId.toLowerCase();
let user; let user: IRemoteUser;
if (keyIdLower.startsWith('acct:')) { if (keyIdLower.startsWith('acct:')) {
const { username, host } = parseAcct(keyIdLower.slice('acct:'.length)); const { username, host } = parseAcct(keyIdLower.slice('acct:'.length));
@ -36,7 +36,7 @@ export default async (job: kue.Job, done): Promise<void> => {
// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
if (user === null) { if (user === null) {
user = await resolvePerson(activity.actor); user = await resolvePerson(activity.actor) as IRemoteUser;
} }
} else { } else {
user = await User.findOne({ user = await User.findOne({
@ -46,7 +46,7 @@ export default async (job: kue.Job, done): Promise<void> => {
// アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する // アクティビティを送信してきたユーザーがまだMisskeyサーバーに登録されていなかったら登録する
if (user === null) { if (user === null) {
user = await resolvePerson(signature.keyId); user = await resolvePerson(signature.keyId) as IRemoteUser;
} }
} }

View File

@ -3,7 +3,7 @@ import * as debug from 'debug';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import acceptFollow from './follow'; import acceptFollow from './follow';
import { IAccept } from '../../type'; import { IAccept, IFollow } from '../../type';
const log = debug('misskey:activitypub'); const log = debug('misskey:activitypub');
@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
switch (object.type) { switch (object.type) {
case 'Follow': case 'Follow':
acceptFollow(actor, object); acceptFollow(actor, object as IFollow);
break; break;
default: default:

View File

@ -3,7 +3,7 @@ import * as debug from 'debug';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import announceNote from './note'; import announceNote from './note';
import { IAnnounce } from '../../type'; import { IAnnounce, INote } from '../../type';
const log = debug('misskey:activitypub'); const log = debug('misskey:activitypub');
@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IAnnounce): Promise<void> =>
switch (object.type) { switch (object.type) {
case 'Note': case 'Note':
announceNote(resolver, actor, activity, object); announceNote(resolver, actor, activity, object as INote);
break; break;
default: default:

View File

@ -2,7 +2,7 @@ import * as debug from 'debug';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
import post from '../../../../services/note/create'; import post from '../../../../services/note/create';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser, IUser } from '../../../../models/user';
import { IAnnounce, INote } from '../../type'; import { IAnnounce, INote } from '../../type';
import { fetchNote, resolveNote } from '../../models/note'; import { fetchNote, resolveNote } from '../../models/note';
import { resolvePerson } from '../../models/person'; import { resolvePerson } from '../../models/person';
@ -36,7 +36,7 @@ export default async function(resolver: Resolver, actor: IRemoteUser, activity:
//#region Visibility //#region Visibility
let visibility = 'public'; let visibility = 'public';
let visibleUsers = []; let visibleUsers: IUser[] = [];
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) { if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) { if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
visibility = 'home'; visibility = 'home';

View File

@ -1,6 +1,6 @@
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import { createImage } from '../../models/image'; import { createImage } from '../../models/image';
export default async function(actor: IRemoteUser, image): Promise<void> { export default async function(actor: IRemoteUser, image: any): Promise<void> {
await createImage(image.url, actor); await createImage(image.url, actor);
} }

View File

@ -5,7 +5,7 @@ import { createNote, fetchNote } from '../../models/note';
/** /**
* 稿 * 稿
*/ */
export default async function(resolver: Resolver, actor: IRemoteUser, note, silent = false): Promise<void> { export default async function(resolver: Resolver, actor: IRemoteUser, note: any, silent = false): Promise<void> {
const exist = await fetchNote(note); const exist = await fetchNote(note);
if (exist == null) { if (exist == null) {
await createNote(note); await createNote(note);

View File

@ -2,11 +2,12 @@ import Resolver from '../../resolver';
import deleteNote from './note'; import deleteNote from './note';
import Note from '../../../../models/note'; import Note from '../../../../models/note';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import { IDelete } from '../../type';
/** /**
* *
*/ */
export default async (actor: IRemoteUser, activity): Promise<void> => { export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => {
if ('actor' in activity && actor.uri !== activity.actor) { if ('actor' in activity && actor.uri !== activity.actor) {
throw new Error('invalid actor'); throw new Error('invalid actor');
} }

View File

@ -3,7 +3,7 @@ import * as debug from 'debug';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import rejectFollow from './follow'; import rejectFollow from './follow';
import { IReject } from '../../type'; import { IReject, IFollow } from '../../type';
const log = debug('misskey:activitypub'); const log = debug('misskey:activitypub');
@ -25,7 +25,7 @@ export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
switch (object.type) { switch (object.type) {
case 'Follow': case 'Follow':
rejectFollow(actor, object); rejectFollow(actor, object as IFollow);
break; break;
default: default:

View File

@ -1,7 +1,7 @@
import * as debug from 'debug'; import * as debug from 'debug';
import { IRemoteUser } from '../../../../models/user'; import { IRemoteUser } from '../../../../models/user';
import { IUndo } from '../../type'; import { IUndo, IFollow } from '../../type';
import unfollow from './follow'; import unfollow from './follow';
import Resolver from '../../resolver'; import Resolver from '../../resolver';
@ -29,7 +29,7 @@ export default async (actor: IRemoteUser, activity: IUndo): Promise<void> => {
switch (object.type) { switch (object.type) {
case 'Follow': case 'Follow':
unfollow(actor, object); unfollow(actor, object as IFollow);
break; break;
} }

View File

@ -1,4 +1,4 @@
import { INote } from "../../../models/note"; import { INote } from '../../../models/note';
import toHtml from '../../../text/html'; import toHtml from '../../../text/html';
import parse from '../../../text/parse'; import parse from '../../../text/parse';
import config from '../../../config'; import config from '../../../config';

View File

@ -10,7 +10,7 @@ const log = debug('misskey:activitypub');
/** /**
* Imageを作成します * Imageを作成します
*/ */
export async function createImage(actor: IRemoteUser, value): Promise<IDriveFile> { export async function createImage(actor: IRemoteUser, value: any): Promise<IDriveFile> {
// 投稿者が凍結されていたらスキップ // 投稿者が凍結されていたらスキップ
if (actor.isSuspended) { if (actor.isSuspended) {
return null; return null;

View File

@ -1,5 +1,5 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import * as parse5 from 'parse5'; const parse5 = require('parse5');
import * as debug from 'debug'; import * as debug from 'debug';
import config from '../../../config'; import config from '../../../config';
@ -9,30 +9,30 @@ import post from '../../../services/note/create';
import { INote as INoteActivityStreamsObject, IObject } from '../type'; import { INote as INoteActivityStreamsObject, IObject } from '../type';
import { resolvePerson, updatePerson } from './person'; import { resolvePerson, updatePerson } from './person';
import { resolveImage } from './image'; import { resolveImage } from './image';
import { IRemoteUser } from '../../../models/user'; import { IRemoteUser, IUser } from '../../../models/user';
const log = debug('misskey:activitypub'); const log = debug('misskey:activitypub');
function parse(html: string): string { function parse(html: string): string {
const dom = parse5.parseFragment(html) as parse5.AST.Default.Document; const dom = parse5.parseFragment(html);
let text = ''; let text = '';
dom.childNodes.forEach(n => analyze(n)); dom.childNodes.forEach((n: any) => analyze(n));
return text.trim(); return text.trim();
function getText(node) { function getText(node: any) {
if (node.nodeName == '#text') return node.value; if (node.nodeName == '#text') return node.value;
if (node.childNodes) { if (node.childNodes) {
return node.childNodes.map(n => getText(n)).join(''); return node.childNodes.map((n: any) => getText(n)).join('');
} }
return ''; return '';
} }
function analyze(node) { function analyze(node: any) {
switch (node.nodeName) { switch (node.nodeName) {
case '#text': case '#text':
text += node.value; text += node.value;
@ -51,7 +51,7 @@ function parse(html: string): string {
if (part.length == 2) { if (part.length == 2) {
//#region ホスト名部分が省略されているので復元する //#region ホスト名部分が省略されているので復元する
const href = new URL(node.attrs.find(x => x.name == 'href').value); const href = new URL(node.attrs.find((x: any) => x.name == 'href').value);
const acct = txt + '@' + href.hostname; const acct = txt + '@' + href.hostname;
text += acct; text += acct;
break; break;
@ -63,20 +63,20 @@ function parse(html: string): string {
} }
if (node.childNodes) { if (node.childNodes) {
node.childNodes.forEach(n => analyze(n)); node.childNodes.forEach((n: any) => analyze(n));
} }
break; break;
case 'p': case 'p':
text += '\n\n'; text += '\n\n';
if (node.childNodes) { if (node.childNodes) {
node.childNodes.forEach(n => analyze(n)); node.childNodes.forEach((n: any) => analyze(n));
} }
break; break;
default: default:
if (node.childNodes) { if (node.childNodes) {
node.childNodes.forEach(n => analyze(n)); node.childNodes.forEach((n: any) => analyze(n));
} }
break; break;
} }
@ -135,7 +135,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
//#region Visibility //#region Visibility
let visibility = 'public'; let visibility = 'public';
let visibleUsers = []; let visibleUsers: IUser[] = [];
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) { if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) { if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
visibility = 'home'; visibility = 'home';

View File

@ -1,4 +1,4 @@
export default object => ({ export default (object: any) => ({
type: 'Accept', type: 'Accept',
object object
}); });

View File

@ -1,4 +1,4 @@
export default object => ({ export default (object: any) => ({
type: 'Announce', type: 'Announce',
object object
}); });

View File

@ -1,4 +1,4 @@
export default object => ({ export default (object: any) => ({
type: 'Create', type: 'Create',
object object
}); });

View File

@ -1,4 +1,4 @@
export default object => ({ export default (object: any) => ({
type: 'Delete', type: 'Delete',
object object
}); });

View File

@ -1,7 +1,8 @@
import config from '../../../config'; import config from '../../../config';
import { IDriveFile } from '../../../models/drive-file';
export default ({ _id, contentType }) => ({ export default (file: IDriveFile) => ({
type: 'Document', type: 'Document',
mediaType: contentType, mediaType: file.contentType,
url: `${config.drive_url}/${_id}` url: `${config.drive_url}/${file._id}`
}); });

View File

@ -1,6 +1,7 @@
import config from '../../../config'; import config from '../../../config';
import { IDriveFile } from '../../../models/drive-file';
export default ({ _id }) => ({ export default (fileId: IDriveFile['_id']) => ({
type: 'Image', type: 'Image',
url: `${config.drive_url}/${_id}` url: `${config.drive_url}/${fileId}`
}); });

View File

@ -1,7 +1,8 @@
import config from '../../../config'; import config from '../../../config';
import { ILocalUser } from '../../../models/user'; import { ILocalUser } from '../../../models/user';
import { INote } from '../../../models/note';
export default (user: ILocalUser, note, reaction: string) => ({ export default (user: ILocalUser, note: INote, 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}`,

View File

@ -1,5 +1,5 @@
import { IUser, isRemoteUser } from "../../../models/user"; import { IUser, isRemoteUser } from '../../../models/user';
import config from "../../../config"; import config from '../../../config';
export default (mention: IUser) => ({ export default (mention: IUser) => ({
type: 'Mention', type: 'Mention',

View File

@ -2,13 +2,13 @@ import renderDocument from './document';
import renderHashtag from './hashtag'; import renderHashtag from './hashtag';
import renderMention from './mention'; import renderMention from './mention';
import config from '../../../config'; import config from '../../../config';
import DriveFile from '../../../models/drive-file'; import DriveFile, { IDriveFile } from '../../../models/drive-file';
import Note, { INote } from '../../../models/note'; import Note, { INote } from '../../../models/note';
import User from '../../../models/user'; import User from '../../../models/user';
import toHtml from '../misc/get-note-html'; import toHtml from '../misc/get-note-html';
export default async function renderNote(note: INote, dive = true) { export default async function renderNote(note: INote, dive = true): Promise<any> {
const promisedFiles = note.mediaIds const promisedFiles: Promise<IDriveFile[]> = note.mediaIds
? DriveFile.find({ _id: { $in: note.mediaIds } }) ? DriveFile.find({ _id: { $in: note.mediaIds } })
: Promise.resolve([]); : Promise.resolve([]);

View File

@ -16,8 +16,8 @@ export default (user: ILocalUser) => {
preferredUsername: user.username, preferredUsername: user.username,
name: user.name, name: user.name,
summary: user.description, summary: user.description,
icon: user.avatarId && renderImage({ _id: user.avatarId }), icon: user.avatarId && renderImage(user.avatarId),
image: user.bannerId && renderImage({ _id: user.bannerId }), image: user.bannerId && renderImage(user.bannerId),
manuallyApprovesFollowers: user.isLocked, manuallyApprovesFollowers: user.isLocked,
publicKey: renderKey(user) publicKey: renderKey(user)
}; };

View File

@ -1,4 +1,4 @@
export default object => ({ export default (object: any) => ({
type: 'Undo', type: 'Undo',
object object
}); });

View File

@ -12,7 +12,7 @@ export default class Resolver {
this.history = new Set(); this.history = new Set();
} }
public async resolveCollection(value) { public async resolveCollection(value: any) {
const collection = typeof value === 'string' const collection = typeof value === 'string'
? await this.resolve(value) ? await this.resolve(value)
: value; : value;
@ -33,7 +33,7 @@ export default class Resolver {
return collection; return collection;
} }
public async resolve(value): Promise<IObject> { public async resolve(value: any): Promise<IObject> {
if (value == null) { if (value == null) {
throw new Error('resolvee is null (or undefined)'); throw new Error('resolvee is null (or undefined)');
} }

View File

@ -4,7 +4,7 @@ import webFinger from './webfinger';
import config from '../config'; import config from '../config';
import { createPerson } from './activitypub/models/person'; import { createPerson } from './activitypub/models/person';
export default async (username, _host, option?): Promise<IUser> => { export default async (username: string, _host: string, option?: any): Promise<IUser> => {
const usernameLower = username.toLowerCase(); const usernameLower = username.toLowerCase();
if (_host == null) { if (_host == null) {

View File

@ -49,13 +49,13 @@ module.exports = (params: any) => new Promise(async (res, rej) => {
} } } }
]); ]);
datas.forEach(data => { datas.forEach((data: any) => {
data.date = data._id; data.date = data._id;
delete data._id; delete data._id;
data.notes = (data.data.filter(x => x.type == 'note')[0] || { count: 0 }).count; data.notes = (data.data.filter((x: any) => x.type == 'note')[0] || { count: 0 }).count;
data.renotes = (data.data.filter(x => x.type == 'renote')[0] || { count: 0 }).count; data.renotes = (data.data.filter((x: any) => x.type == 'renote')[0] || { count: 0 }).count;
data.replies = (data.data.filter(x => x.type == 'reply')[0] || { count: 0 }).count; data.replies = (data.data.filter((x: any) => x.type == 'reply')[0] || { count: 0 }).count;
delete data.data; delete data.data;
}); });
@ -65,7 +65,7 @@ module.exports = (params: any) => new Promise(async (res, rej) => {
for (let i = 0; i < limit; i++) { for (let i = 0; i < limit; i++) {
const day = new Date(new Date().setDate(new Date().getDate() - i)); const day = new Date(new Date().setDate(new Date().getDate() - i));
const data = datas.filter(d => const data = datas.filter((d: any) =>
d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate() d.date.year == day.getFullYear() && d.date.month == day.getMonth() + 1 && d.date.day == day.getDate()
)[0]; )[0];

View File

@ -4,11 +4,12 @@
import $ from 'cafy'; import ID from '../../../../../cafy-id'; import $ from 'cafy'; import ID from '../../../../../cafy-id';
import { pack } from '../../../../../models/drive-file'; import { pack } from '../../../../../models/drive-file';
import uploadFromUrl from '../../../../../services/drive/upload-from-url'; import uploadFromUrl from '../../../../../services/drive/upload-from-url';
import { ILocalUser } from '../../../../../models/user';
/** /**
* Create a file from a URL * Create a file from a URL
*/ */
module.exports = async (params, user): Promise<any> => { module.exports = async (params: any, user: ILocalUser): Promise<any> => {
// Get 'url' parameter // Get 'url' parameter
// TODO: Validate this url // TODO: Validate this url
const [url, urlErr] = $.str.get(params.url); const [url, urlErr] = $.str.get(params.url);

View File

@ -1,13 +1,11 @@
/**
* Module dependencies
*/
import $ from 'cafy'; import ID from '../../../../cafy-id'; import $ from 'cafy'; import ID from '../../../../cafy-id';
import DriveFolder, { pack } from '../../../../models/drive-folder'; import DriveFolder, { pack } from '../../../../models/drive-folder';
import { ILocalUser } from '../../../../models/user';
/** /**
* Get drive folders * Get drive folders
*/ */
module.exports = (params: any, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => { module.exports = (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
// Get 'limit' parameter // Get 'limit' parameter
const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit); const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param'); if (limitErr) return rej('invalid limit param');

View File

@ -1,4 +1,4 @@
import DriveFile, { DriveFileChunk, IDriveFile } from "../../models/drive-file"; import DriveFile, { DriveFileChunk, IDriveFile } from '../../models/drive-file';
import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail';
export default async function(file: IDriveFile, isExpired = false) { export default async function(file: IDriveFile, isExpired = false) {

View File

@ -9,7 +9,7 @@ import { IDriveFile, validateFileName } from '../../models/drive-file';
import create from './add-file'; import create from './add-file';
import config from '../../config'; import config from '../../config';
import { IUser } from '../../models/user'; import { IUser } from '../../models/user';
import * as mongodb from "mongodb"; import * as mongodb from 'mongodb';
const log = debug('misskey:drive:upload-from-url'); const log = debug('misskey:drive:upload-from-url');

View File

@ -1,5 +1,5 @@
import User, { IUser } from "../../../models/user"; import User, { IUser } from '../../../models/user';
import FollowRequest from "../../../models/follow-request"; import FollowRequest from '../../../models/follow-request';
import accept from './accept'; import accept from './accept';
/** /**

View File

@ -1,12 +1,12 @@
import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user';
import FollowRequest from "../../../models/follow-request"; import FollowRequest from '../../../models/follow-request';
import pack from '../../../remote/activitypub/renderer'; import pack from '../../../remote/activitypub/renderer';
import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderFollow from '../../../remote/activitypub/renderer/follow';
import renderAccept from '../../../remote/activitypub/renderer/accept'; import renderAccept from '../../../remote/activitypub/renderer/accept';
import { deliver } from '../../../queue'; import { deliver } from '../../../queue';
import Following from "../../../models/following"; import Following from '../../../models/following';
import FollowingLog from "../../../models/following-log"; import FollowingLog from '../../../models/following-log';
import FollowedLog from "../../../models/followed-log"; import FollowedLog from '../../../models/followed-log';
import event from '../../../publishers/stream'; import event from '../../../publishers/stream';
export default async function(followee: IUser, follower: IUser) { export default async function(followee: IUser, follower: IUser) {

View File

@ -1,5 +1,5 @@
import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from "../../../models/user"; import User, { IUser, isRemoteUser, ILocalUser, pack as packUser } from '../../../models/user';
import FollowRequest from "../../../models/follow-request"; import FollowRequest from '../../../models/follow-request';
import pack from '../../../remote/activitypub/renderer'; import pack from '../../../remote/activitypub/renderer';
import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderFollow from '../../../remote/activitypub/renderer/follow';
import renderUndo from '../../../remote/activitypub/renderer/undo'; import renderUndo from '../../../remote/activitypub/renderer/undo';

View File

@ -1,5 +1,5 @@
import User, { IUser, isRemoteUser, ILocalUser } from "../../../models/user"; import User, { IUser, isRemoteUser, ILocalUser } from '../../../models/user';
import FollowRequest from "../../../models/follow-request"; import FollowRequest from '../../../models/follow-request';
import pack from '../../../remote/activitypub/renderer'; import pack from '../../../remote/activitypub/renderer';
import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderFollow from '../../../remote/activitypub/renderer/follow';
import renderReject from '../../../remote/activitypub/renderer/reject'; import renderReject from '../../../remote/activitypub/renderer/reject';

View File

@ -4,7 +4,7 @@ import config from '../config';
import { INote } from '../models/note'; import { INote } from '../models/note';
import { TextElement } from './parse'; import { TextElement } from './parse';
const handlers: {[key: string]: (window: any, token: any, mentionedRemoteUsers: INote["mentionedRemoteUsers"]) => void} = { const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers: INote['mentionedRemoteUsers']) => void } = {
bold({ document }, { bold }) { bold({ document }, { bold }) {
const b = document.createElement('b'); const b = document.createElement('b');
b.textContent = bold; b.textContent = bold;

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementBold = { export type TextElementBold = {
type: "bold" type: 'bold'
content: string content: string
bold: string bold: string
}; };

View File

@ -5,7 +5,7 @@
import genHtml from '../core/syntax-highlighter'; import genHtml from '../core/syntax-highlighter';
export type TextElementCode = { export type TextElementCode = {
type: "code" type: 'code'
content: string content: string
code: string code: string
html: string html: string

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementEmoji = { export type TextElementEmoji = {
type: "emoji" type: 'emoji'
content: string content: string
emoji: string emoji: string
}; };

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementHashtag = { export type TextElementHashtag = {
type: "hashtag" type: 'hashtag'
content: string content: string
hashtag: string hashtag: string
}; };

View File

@ -5,7 +5,7 @@
import genHtml from '../core/syntax-highlighter'; import genHtml from '../core/syntax-highlighter';
export type TextElementInlineCode = { export type TextElementInlineCode = {
type: "inline-code" type: 'inline-code'
content: string content: string
code: string code: string
html: string html: string

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementLink = { export type TextElementLink = {
type: "link" type: 'link'
content: string content: string
title: string title: string
url: string url: string

View File

@ -4,7 +4,7 @@
import parseAcct from '../../../acct/parse'; import parseAcct from '../../../acct/parse';
export type TextElementMention = { export type TextElementMention = {
type: "mention" type: 'mention'
content: string content: string
username: string username: string
host: string host: string

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementQuote = { export type TextElementQuote = {
type: "quote" type: 'quote'
content: string content: string
quote: string quote: string
}; };

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementSearch = { export type TextElementSearch = {
type: "search" type: 'search'
content: string content: string
query: string query: string
}; };

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementTitle = { export type TextElementTitle = {
type: "title" type: 'title'
content: string content: string
title: string title: string
}; };

View File

@ -3,7 +3,7 @@
*/ */
export type TextElementUrl = { export type TextElementUrl = {
type: "url" type: 'url'
content: string content: string
url: string url: string
}; };

View File

@ -2,17 +2,17 @@
* Misskey Text Analyzer * Misskey Text Analyzer
*/ */
import { TextElementBold } from "./elements/bold"; import { TextElementBold } from './elements/bold';
import { TextElementCode } from "./elements/code"; import { TextElementCode } from './elements/code';
import { TextElementEmoji } from "./elements/emoji"; import { TextElementEmoji } from './elements/emoji';
import { TextElementHashtag } from "./elements/hashtag"; import { TextElementHashtag } from './elements/hashtag';
import { TextElementInlineCode } from "./elements/inline-code"; import { TextElementInlineCode } from './elements/inline-code';
import { TextElementLink } from "./elements/link"; import { TextElementLink } from './elements/link';
import { TextElementMention } from "./elements/mention"; import { TextElementMention } from './elements/mention';
import { TextElementQuote } from "./elements/quote"; import { TextElementQuote } from './elements/quote';
import { TextElementSearch } from "./elements/search"; import { TextElementSearch } from './elements/search';
import { TextElementTitle } from "./elements/title"; import { TextElementTitle } from './elements/title';
import { TextElementUrl } from "./elements/url"; import { TextElementUrl } from './elements/url';
const elements = [ const elements = [
require('./elements/bold'), require('./elements/bold'),
@ -28,7 +28,7 @@ const elements = [
require('./elements/search') require('./elements/search')
].map(element => element.default as TextElementProcessor); ].map(element => element.default as TextElementProcessor);
export type TextElement = {type: "text", content: string} export type TextElement = { type: 'text', content: string }
| TextElementBold | TextElementBold
| TextElementCode | TextElementCode
| TextElementEmoji | TextElementEmoji