This commit is contained in:
syuilo 2018-10-24 06:17:55 +09:00
parent daa22d68fa
commit a136715111
No known key found for this signature in database
GPG Key ID: BDC4C49D06AB9D69
5 changed files with 153 additions and 0 deletions

65
src/chart/federation.ts Normal file
View File

@ -0,0 +1,65 @@
import autobind from 'autobind-decorator';
import Chart, { Obj } from '.';
/**
*
*/
type FederationLog = {
instance: {
/**
*
*/
total: number;
/**
*
*/
inc: number;
/**
*
*/
dec: number;
};
};
class FederationChart extends Chart<FederationLog> {
constructor() {
super('federation');
}
@autobind
protected async getTemplate(init: boolean, latest?: FederationLog): Promise<FederationLog> {
const [total] = init ? await Promise.all([
Instance.count({})
]) : [
latest ? latest.instance.total : 0
];
return {
instance: {
total: total,
inc: 0,
dec: 0
}
};
}
@autobind
public async update(isAdditional: boolean) {
const update: Obj = {};
update.total = isAdditional ? 1 : -1;
if (isAdditional) {
update.inc = 1;
} else {
update.dec = 1;
}
await this.inc({
instance: update
});
}
}
export default new FederationChart();

35
src/models/instance.ts Normal file
View File

@ -0,0 +1,35 @@
import * as mongo from 'mongodb';
import db from '../db/mongodb';
const Instance = db.get<IInstance>('instances');
Instance.createIndex('host', { unique: true });
export default Instance;
export interface IInstance {
_id: mongo.ObjectID;
/**
*
*/
host: string;
/**
*
*/
caughtAt: Date;
/**
* (MastodonとかMisskeyとかPleromaとか)
*/
system: string;
/**
*
*/
usersCount: number;
/**
* 稿
*/
notesCount: number;
}

View File

@ -13,6 +13,8 @@ import htmlToMFM from '../../../mfm/html-to-mfm';
import usersChart from '../../../chart/users';
import { URL } from 'url';
import { resolveNote } from './note';
import registerInstance from '../../../services/register-instance';
import Instance from '../../../models/instance';
const log = debug('misskey:activitypub');
@ -173,6 +175,18 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
throw e;
}
// Register host
registerInstance(host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
usersCount: 1
}
});
// TODO
//perInstanceChart.newUser();
});
//#region Increment users count
Meta.update({}, {
$inc: {
@ -214,6 +228,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
//#endregion
await updateFeatured(user._id).catch(err => console.log(err));
return user;
}

View File

@ -28,6 +28,8 @@ import perUserNotesChart from '../../chart/per-user-notes';
import { erase, unique } from '../../prelude/array';
import insertNoteUnread from './unread';
import registerInstance from '../register-instance';
import Instance from '../../models/instance';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@ -170,6 +172,20 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
notesChart.update(note, true);
perUserNotesChart.update(user, note, true);
// Register host
if (isRemoteUser(user)) {
registerInstance(user.host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
notesCount: 1
}
});
// TODO
//perInstanceChart.newNote();
});
}
// ハッシュタグ登録
tags.map(tag => registerHashtag(user, tag));

View File

@ -0,0 +1,22 @@
import Instance, { IInstance } from '../models/instance';
import federationChart from '../chart/federation';
export default async function(host: string): Promise<IInstance> {
if (host == null) return null;
const index = await Instance.findOne({ host });
if (index == null) {
const i = await Instance.insert({
host,
caughtAt: new Date(),
system: null // TODO
});
federationChart.update(true);
return i;
} else {
return index;
}
}