summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2018-08-25 08:41:16 +0900
committerGitHub <noreply@github.com>2018-08-25 08:41:16 +0900
commit8a207d8311e8606e734193fc5b949defd4d45460 (patch)
tree9907455a9b289e1d5cf9beacab57731e069379b3 /src
parentMerge pull request #2455 from mei23/mei-0824-apattchobj (diff)
parent8.9.0 (diff)
downloadmisskey-8a207d8311e8606e734193fc5b949defd4d45460.tar.gz
misskey-8a207d8311e8606e734193fc5b949defd4d45460.tar.bz2
misskey-8a207d8311e8606e734193fc5b949defd4d45460.zip
Merge pull request #2461 from syuilo/develop
8.9.0
Diffstat (limited to 'src')
-rw-r--r--src/client/app/desktop/script.ts2
-rw-r--r--src/client/app/desktop/views/pages/admin/admin.chart.vue206
-rw-r--r--src/models/stats.ts106
-rw-r--r--src/remote/activitypub/models/note.ts4
-rw-r--r--src/server/api/endpoints/chart.ts77
-rw-r--r--src/services/update-chart.ts88
6 files changed, 378 insertions, 105 deletions
diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts
index 8dc0482191..7f4a2d0b00 100644
--- a/src/client/app/desktop/script.ts
+++ b/src/client/app/desktop/script.ts
@@ -94,7 +94,7 @@ init(async (launch) => {
/**
* Init Notification
*/
- if ('Notification' in window) {
+ if ('Notification' in window && os.store.getters.isSignedIn) {
// 許可を得ていなかったらリクエスト
if ((Notification as any).permission == 'default') {
await Notification.requestPermission();
diff --git a/src/client/app/desktop/views/pages/admin/admin.chart.vue b/src/client/app/desktop/views/pages/admin/admin.chart.vue
index 89e61d4c74..4310ce03d6 100644
--- a/src/client/app/desktop/views/pages/admin/admin.chart.vue
+++ b/src/client/app/desktop/views/pages/admin/admin.chart.vue
@@ -55,10 +55,10 @@ export default Vue.extend({
case 'local-notes': return this.notesChart('local');
case 'remote-notes': return this.notesChart('remote');
case 'notes-total': return this.notesTotalChart();
- case 'drive': return this.driveChart(false);
- case 'drive-total': return this.driveChart(true);
- case 'drive-files': return this.driveFilesChart(false);
- case 'drive-files-total': return this.driveFilesChart(true);
+ case 'drive': return this.driveChart();
+ case 'drive-total': return this.driveTotalChart();
+ case 'drive-files': return this.driveFilesChart();
+ case 'drive-files-total': return this.driveFilesTotalChart();
}
},
stats(): any[] {
@@ -81,7 +81,7 @@ export default Vue.extend({
normal: type == 'local' ? x.notes.local.diffs.normal : type == 'remote' ? x.notes.remote.diffs.normal : x.notes.local.diffs.normal + x.notes.remote.diffs.normal,
reply: type == 'local' ? x.notes.local.diffs.reply : type == 'remote' ? x.notes.remote.diffs.reply : x.notes.local.diffs.reply + x.notes.remote.diffs.reply,
renote: type == 'local' ? x.notes.local.diffs.renote : type == 'remote' ? x.notes.remote.diffs.renote : x.notes.local.diffs.renote + x.notes.remote.diffs.renote,
- all: type == 'local' ? x.notes.local.diff : type == 'remote' ? x.notes.remote.diff : x.notes.local.diff + x.notes.remote.diff
+ all: type == 'local' ? (x.notes.local.inc + -x.notes.local.dec) : type == 'remote' ? (x.notes.remote.inc + -x.notes.remote.dec) : (x.notes.local.inc + -x.notes.local.dec) + (x.notes.remote.inc + -x.notes.remote.dec)
}));
return [{
@@ -152,7 +152,7 @@ export default Vue.extend({
return [{
datasets: [{
- label: 'Notes',
+ label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
@@ -161,7 +161,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
}, {
- label: 'Remote Notes',
+ label: 'Remote',
fill: true,
backgroundColor: 'rgba(65, 221, 222, 0.1)',
borderColor: '#41ddde',
@@ -170,7 +170,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}, {
- label: 'Local Notes',
+ label: 'Local',
fill: true,
backgroundColor: 'rgba(246, 88, 79, 0.1)',
borderColor: '#f6584f',
@@ -203,13 +203,13 @@ export default Vue.extend({
usersChart(total: boolean): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
- localCount: total ? x.users.local.total : x.users.local.diff,
- remoteCount: total ? x.users.remote.total : x.users.remote.diff
+ localCount: total ? x.users.local.total : (x.users.local.inc + -x.users.local.dec),
+ remoteCount: total ? x.users.remote.total : (x.users.remote.inc + -x.users.remote.dec)
}));
return [{
datasets: [{
- label: 'Users',
+ label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
@@ -218,7 +218,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
}, {
- label: 'Remote Users',
+ label: 'Remote',
fill: true,
backgroundColor: 'rgba(65, 221, 222, 0.1)',
borderColor: '#41ddde',
@@ -227,7 +227,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}, {
- label: 'Local Users',
+ label: 'Local',
fill: true,
backgroundColor: 'rgba(246, 88, 79, 0.1)',
borderColor: '#f6584f',
@@ -257,16 +257,93 @@ export default Vue.extend({
}];
},
- driveChart(total: boolean): any {
+ driveChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
- localSize: total ? x.drive.local.totalSize : x.drive.local.diffSize,
- remoteSize: total ? x.drive.remote.totalSize : x.drive.remote.diffSize
+ localInc: x.drive.local.incSize,
+ localDec: -x.drive.local.decSize,
+ remoteInc: x.drive.remote.incSize,
+ remoteDec: -x.drive.remote.decSize,
}));
return [{
datasets: [{
- label: 'Drive Usage',
+ label: 'All',
+ fill: false,
+ borderColor: '#555',
+ borderWidth: 2,
+ borderDash: [4, 4],
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
+ }, {
+ label: 'Remote +',
+ fill: true,
+ backgroundColor: 'rgba(65, 221, 222, 0.1)',
+ borderColor: '#41ddde',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.remoteInc }))
+ }, {
+ label: 'Remote -',
+ fill: true,
+ backgroundColor: 'rgba(65, 221, 222, 0.1)',
+ borderColor: '#41ddde',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.remoteDec }))
+ }, {
+ label: 'Local +',
+ fill: true,
+ backgroundColor: 'rgba(246, 88, 79, 0.1)',
+ borderColor: '#f6584f',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localInc }))
+ }, {
+ label: 'Local -',
+ fill: true,
+ backgroundColor: 'rgba(246, 88, 79, 0.1)',
+ borderColor: '#f6584f',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localDec }))
+ }]
+ }, {
+ scales: {
+ yAxes: [{
+ ticks: {
+ callback: value => {
+ return Vue.filter('bytes')(value);
+ }
+ }
+ }]
+ },
+ tooltips: {
+ callbacks: {
+ label: (tooltipItem, data) => {
+ const label = data.datasets[tooltipItem.datasetIndex].label || '';
+ return `${label}: ${Vue.filter('bytes')(tooltipItem.yLabel)}`;
+ }
+ }
+ }
+ }];
+ },
+
+ driveTotalChart(): any {
+ const data = this.stats.slice().reverse().map(x => ({
+ date: new Date(x.date),
+ localSize: x.drive.local.totalSize,
+ remoteSize: x.drive.remote.totalSize
+ }));
+
+ return [{
+ datasets: [{
+ label: 'Combined',
fill: false,
borderColor: '#555',
borderWidth: 2,
@@ -275,7 +352,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteSize + x.localSize }))
}, {
- label: 'Remote Drive Usage',
+ label: 'Remote',
fill: true,
backgroundColor: 'rgba(65, 221, 222, 0.1)',
borderColor: '#41ddde',
@@ -284,7 +361,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteSize }))
}, {
- label: 'Local Drive Usage',
+ label: 'Local',
fill: true,
backgroundColor: 'rgba(246, 88, 79, 0.1)',
borderColor: '#f6584f',
@@ -314,25 +391,102 @@ export default Vue.extend({
}];
},
- driveFilesChart(total: boolean): any {
+ driveFilesChart(): any {
const data = this.stats.slice().reverse().map(x => ({
date: new Date(x.date),
- localCount: total ? x.drive.local.totalCount : x.drive.local.diffCount,
- remoteCount: total ? x.drive.remote.totalCount : x.drive.remote.diffCount
+ localInc: x.drive.local.incCount,
+ localDec: -x.drive.local.decCount,
+ remoteInc: x.drive.remote.incCount,
+ remoteDec: -x.drive.remote.decCount
}));
return [{
datasets: [{
- label: 'Drive Files',
+ label: 'All',
fill: false,
borderColor: '#555',
borderWidth: 2,
borderDash: [4, 4],
pointBackgroundColor: '#fff',
lineTension: 0,
- data: data.map(x => ({ t: x.date, y: x.remoteCount + x.localCount }))
+ data: data.map(x => ({ t: x.date, y: x.localInc + x.localDec + x.remoteInc + x.remoteDec }))
+ }, {
+ label: 'Remote +',
+ fill: true,
+ backgroundColor: 'rgba(65, 221, 222, 0.1)',
+ borderColor: '#41ddde',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.remoteInc }))
+ }, {
+ label: 'Remote -',
+ fill: true,
+ backgroundColor: 'rgba(65, 221, 222, 0.1)',
+ borderColor: '#41ddde',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.remoteDec }))
+ }, {
+ label: 'Local +',
+ fill: true,
+ backgroundColor: 'rgba(246, 88, 79, 0.1)',
+ borderColor: '#f6584f',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localInc }))
+ }, {
+ label: 'Local -',
+ fill: true,
+ backgroundColor: 'rgba(246, 88, 79, 0.1)',
+ borderColor: '#f6584f',
+ borderWidth: 2,
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localDec }))
+ }]
+ }, {
+ scales: {
+ yAxes: [{
+ ticks: {
+ callback: value => {
+ return Vue.filter('number')(value);
+ }
+ }
+ }]
+ },
+ tooltips: {
+ callbacks: {
+ label: (tooltipItem, data) => {
+ const label = data.datasets[tooltipItem.datasetIndex].label || '';
+ return `${label}: ${Vue.filter('number')(tooltipItem.yLabel)}`;
+ }
+ }
+ }
+ }];
+ },
+
+ driveFilesTotalChart(): any {
+ const data = this.stats.slice().reverse().map(x => ({
+ date: new Date(x.date),
+ localCount: x.drive.local.totalCount,
+ remoteCount: x.drive.remote.totalCount,
+ }));
+
+ return [{
+ datasets: [{
+ label: 'Combined',
+ fill: false,
+ borderColor: '#555',
+ borderWidth: 2,
+ borderDash: [4, 4],
+ pointBackgroundColor: '#fff',
+ lineTension: 0,
+ data: data.map(x => ({ t: x.date, y: x.localCount + x.remoteCount }))
}, {
- label: 'Remote Drive Files',
+ label: 'Remote',
fill: true,
backgroundColor: 'rgba(65, 221, 222, 0.1)',
borderColor: '#41ddde',
@@ -341,7 +495,7 @@ export default Vue.extend({
lineTension: 0,
data: data.map(x => ({ t: x.date, y: x.remoteCount }))
}, {
- label: 'Local Drive Files',
+ label: 'Local',
fill: true,
backgroundColor: 'rgba(246, 88, 79, 0.1)',
borderColor: '#f6584f',
diff --git a/src/models/stats.ts b/src/models/stats.ts
index c481c3196e..3041d3852b 100644
--- a/src/models/stats.ts
+++ b/src/models/stats.ts
@@ -8,8 +8,14 @@ export default Stats;
export interface IStats {
_id: mongo.ObjectID;
+ /**
+ * 集計日時
+ */
date: Date;
+ /**
+ * 集計期間
+ */
span: 'day' | 'hour';
/**
@@ -18,26 +24,36 @@ export interface IStats {
users: {
local: {
/**
- * この日時点での、ローカルのユーザーの総計
+ * 集計期間時点での、全ユーザー数 (ローカル)
*/
total: number;
/**
- * ローカルのユーザー数の前日比
+ * 増加したユーザー数 (ローカル)
+ */
+ inc: number;
+
+ /**
+ * 減少したユーザー数 (ローカル)
*/
- diff: number;
+ dec: number;
};
remote: {
/**
- * この日時点での、リモートのユーザーの総計
+ * 集計期間時点での、全ユーザー数 (リモート)
*/
total: number;
/**
- * リモートのユーザー数の前日比
+ * 増加したユーザー数 (リモート)
*/
- diff: number;
+ inc: number;
+
+ /**
+ * 減少したユーザー数 (リモート)
+ */
+ dec: number;
};
};
@@ -47,28 +63,33 @@ export interface IStats {
notes: {
local: {
/**
- * この日時点での、ローカルの投稿の総計
+ * 集計期間時点での、全投稿数 (ローカル)
*/
total: number;
/**
- * ローカルの投稿数の前日比
+ * 増加した投稿数 (ローカル)
*/
- diff: number;
+ inc: number;
+
+ /**
+ * 減少した投稿数 (ローカル)
+ */
+ dec: number;
diffs: {
/**
- * ローカルの通常の投稿数の前日比
+ * 通常の投稿数の差分 (ローカル)
*/
normal: number;
/**
- * ローカルのリプライの投稿数の前日比
+ * リプライの投稿数の差分 (ローカル)
*/
reply: number;
/**
- * ローカルのRenoteの投稿数の前日比
+ * Renoteの投稿数の差分 (ローカル)
*/
renote: number;
};
@@ -76,28 +97,33 @@ export interface IStats {
remote: {
/**
- * この日時点での、リモートの投稿の総計
+ * 集計期間時点での、全投稿数 (リモート)
*/
total: number;
/**
- * リモートの投稿数の前日比
+ * 増加した投稿数 (リモート)
+ */
+ inc: number;
+
+ /**
+ * 減少した投稿数 (リモート)
*/
- diff: number;
+ dec: number;
diffs: {
/**
- * リモートの通常の投稿数の前日比
+ * 通常の投稿数の差分 (リモート)
*/
normal: number;
/**
- * リモートのリプライの投稿数の前日比
+ * リプライの投稿数の差分 (リモート)
*/
reply: number;
/**
- * リモートのRenoteの投稿数の前日比
+ * Renoteの投稿数の差分 (リモート)
*/
renote: number;
};
@@ -110,46 +136,66 @@ export interface IStats {
drive: {
local: {
/**
- * この日時点での、ローカルのドライブファイル数の総計
+ * 集計期間時点での、全ドライブファイル数 (ローカル)
*/
totalCount: number;
/**
- * この日時点での、ローカルのドライブファイルサイズの総計
+ * 集計期間時点での、全ドライブファイルの合計サイズ (ローカル)
*/
totalSize: number;
/**
- * ローカルのドライブファイル数の前日比
+ * 増加したドライブファイル数 (ローカル)
+ */
+ incCount: number;
+
+ /**
+ * 増加したドライブ使用量 (ローカル)
+ */
+ incSize: number;
+
+ /**
+ * 減少したドライブファイル数 (ローカル)
*/
- diffCount: number;
+ decCount: number;
/**
- * ローカルのドライブファイルサイズの前日比
+ * 減少したドライブ使用量 (ローカル)
*/
- diffSize: number;
+ decSize: number;
};
remote: {
/**
- * この日時点での、リモートのドライブファイル数の総計
+ * 集計期間時点での、全ドライブファイル数 (リモート)
*/
totalCount: number;
/**
- * この日時点での、リモートのドライブファイルサイズの総計
+ * 集計期間時点での、全ドライブファイルの合計サイズ (リモート)
*/
totalSize: number;
/**
- * リモートのドライブファイル数の前日比
+ * 増加したドライブファイル数 (リモート)
+ */
+ incCount: number;
+
+ /**
+ * 増加したドライブ使用量 (リモート)
+ */
+ incSize: number;
+
+ /**
+ * 減少したドライブファイル数 (リモート)
*/
- diffCount: number;
+ decCount: number;
/**
- * リモートのドライブファイルサイズの前日比
+ * 減少したドライブ使用量 (リモート)
*/
- diffSize: number;
+ decSize: number;
};
};
}
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index 02bce6fec7..1dfeebfdf7 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -131,5 +131,7 @@ export async function resolveNote(value: string | IObject, resolver?: Resolver):
//#endregion
// リモートサーバーからフェッチしてきて登録
- return await createNote(value, resolver);
+ // ここでuriの代わりに添付されてきたNote Objectが指定されていると、サーバーフェッチを経ずにノートが生成されるが
+ // 添付されてきたNote Objectは偽装されている可能性があるため、常にuriを指定してサーバーフェッチを行う。
+ return await createNote(uri, resolver);
}
diff --git a/src/server/api/endpoints/chart.ts b/src/server/api/endpoints/chart.ts
index da3476f067..514bacaa84 100644
--- a/src/server/api/endpoints/chart.ts
+++ b/src/server/api/endpoints/chart.ts
@@ -2,6 +2,31 @@ import Stats, { IStats } from '../../../models/stats';
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
+function migrateStats(stats: IStats[]) {
+ stats.forEach(stat => {
+ const isOldData = stat.users.local.inc == null;
+
+ if (!isOldData) return;
+
+ stat.users.local.inc = (stat as any).users.local.diff;
+ stat.users.local.dec = 0;
+ stat.users.remote.inc = (stat as any).users.remote.diff;
+ stat.users.remote.dec = 0;
+ stat.notes.local.inc = (stat as any).notes.local.diff;
+ stat.notes.local.dec = 0;
+ stat.notes.remote.inc = (stat as any).notes.remote.diff;
+ stat.notes.remote.dec = 0;
+ stat.drive.local.incCount = (stat as any).drive.local.diffCount;
+ stat.drive.local.decCount = 0;
+ stat.drive.local.incSize = (stat as any).drive.local.diffSize;
+ stat.drive.local.decSize = 0;
+ stat.drive.remote.incCount = (stat as any).drive.remote.diffCount;
+ stat.drive.remote.decCount = 0;
+ stat.drive.remote.incSize = (stat as any).drive.remote.diffSize;
+ stat.drive.remote.decSize = 0;
+ });
+}
+
export const meta = {
};
@@ -44,6 +69,10 @@ export default (params: any) => new Promise(async (res, rej) => {
}),
]);
+ // 後方互換性のため
+ migrateStats(statsPerDay);
+ migrateStats(statsPerHour);
+
const format = (src: IStats[], span: 'day' | 'hour') => {
const chart: Array<Omit<Omit<IStats, '_id'>, 'span'>> = [];
@@ -70,17 +99,20 @@ export default (params: any) => new Promise(async (res, rej) => {
users: {
local: {
total: mostRecent.users.local.total,
- diff: 0
+ inc: 0,
+ dec: 0
},
remote: {
total: mostRecent.users.remote.total,
- diff: 0
+ inc: 0,
+ dec: 0
}
},
notes: {
local: {
total: mostRecent.notes.local.total,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -89,7 +121,8 @@ export default (params: any) => new Promise(async (res, rej) => {
},
remote: {
total: mostRecent.notes.remote.total,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -101,14 +134,18 @@ export default (params: any) => new Promise(async (res, rej) => {
local: {
totalCount: mostRecent.drive.local.totalCount,
totalSize: mostRecent.drive.local.totalSize,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
},
remote: {
totalCount: mostRecent.drive.remote.totalCount,
totalSize: mostRecent.drive.remote.totalSize,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
}
}
});
@@ -118,17 +155,20 @@ export default (params: any) => new Promise(async (res, rej) => {
users: {
local: {
total: 0,
- diff: 0
+ inc: 0,
+ dec: 0
},
remote: {
total: 0,
- diff: 0
+ inc: 0,
+ dec: 0
}
},
notes: {
local: {
total: 0,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -137,7 +177,8 @@ export default (params: any) => new Promise(async (res, rej) => {
},
remote: {
total: 0,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -149,14 +190,18 @@ export default (params: any) => new Promise(async (res, rej) => {
local: {
totalCount: 0,
totalSize: 0,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
},
remote: {
totalCount: 0,
totalSize: 0,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
}
}
});
diff --git a/src/services/update-chart.ts b/src/services/update-chart.ts
index 0a0f58bb92..1f8da6be9f 100644
--- a/src/services/update-chart.ts
+++ b/src/services/update-chart.ts
@@ -48,17 +48,20 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
users: {
local: {
total: mostRecentStats.users.local.total,
- diff: 0
+ inc: 0,
+ dec: 0
},
remote: {
total: mostRecentStats.users.remote.total,
- diff: 0
+ inc: 0,
+ dec: 0
}
},
notes: {
local: {
total: mostRecentStats.notes.local.total,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -67,7 +70,8 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
},
remote: {
total: mostRecentStats.notes.remote.total,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -79,14 +83,18 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
local: {
totalCount: mostRecentStats.drive.local.totalCount,
totalSize: mostRecentStats.drive.local.totalSize,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
},
remote: {
totalCount: mostRecentStats.drive.remote.totalCount,
totalSize: mostRecentStats.drive.remote.totalSize,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
}
}
};
@@ -105,17 +113,20 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
users: {
local: {
total: 0,
- diff: 0
+ inc: 0,
+ dec: 0
},
remote: {
total: 0,
- diff: 0
+ inc: 0,
+ dec: 0
}
},
notes: {
local: {
total: 0,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -124,7 +135,8 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
},
remote: {
total: 0,
- diff: 0,
+ inc: 0,
+ dec: 0,
diffs: {
normal: 0,
reply: 0,
@@ -136,14 +148,18 @@ async function getCurrentStats(span: 'day' | 'hour'): Promise<IStats> {
local: {
totalCount: 0,
totalSize: 0,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
},
remote: {
totalCount: 0,
totalSize: 0,
- diffCount: 0,
- diffSize: 0
+ incCount: 0,
+ incSize: 0,
+ decCount: 0,
+ decSize: 0
}
}
};
@@ -174,46 +190,56 @@ function update(inc: any) {
}
export async function updateUserStats(user: IUser, isAdditional: boolean) {
- const amount = isAdditional ? 1 : -1;
const origin = isLocalUser(user) ? 'local' : 'remote';
const inc = {} as any;
- inc[`users.${origin}.total`] = amount;
- inc[`users.${origin}.diff`] = amount;
+ inc[`users.${origin}.total`] = isAdditional ? 1 : -1;
+ if (isAdditional) {
+ inc[`users.${origin}.inc`] = 1;
+ } else {
+ inc[`users.${origin}.dec`] = 1;
+ }
await update(inc);
}
export async function updateNoteStats(note: INote, isAdditional: boolean) {
- const amount = isAdditional ? 1 : -1;
const origin = isLocalUser(note._user) ? 'local' : 'remote';
const inc = {} as any;
- inc[`notes.${origin}.total`] = amount;
- inc[`notes.${origin}.diff`] = amount;
+ inc[`notes.${origin}.total`] = isAdditional ? 1 : -1;
+
+ if (isAdditional) {
+ inc[`notes.${origin}.inc`] = 1;
+ } else {
+ inc[`notes.${origin}.dec`] = 1;
+ }
if (note.replyId != null) {
- inc[`notes.${origin}.diffs.reply`] = amount;
+ inc[`notes.${origin}.diffs.reply`] = isAdditional ? 1 : -1;
} else if (note.renoteId != null) {
- inc[`notes.${origin}.diffs.renote`] = amount;
+ inc[`notes.${origin}.diffs.renote`] = isAdditional ? 1 : -1;
} else {
- inc[`notes.${origin}.diffs.normal`] = amount;
+ inc[`notes.${origin}.diffs.normal`] = isAdditional ? 1 : -1;
}
await update(inc);
}
export async function updateDriveStats(file: IDriveFile, isAdditional: boolean) {
- const amount = isAdditional ? 1 : -1;
- const size = isAdditional ? file.length : -file.length;
const origin = isLocalUser(file.metadata._user) ? 'local' : 'remote';
const inc = {} as any;
- inc[`drive.${origin}.totalCount`] = amount;
- inc[`drive.${origin}.diffCount`] = amount;
- inc[`drive.${origin}.totalSize`] = size;
- inc[`drive.${origin}.diffSize`] = size;
+ inc[`drive.${origin}.totalCount`] = isAdditional ? 1 : -1;
+ inc[`drive.${origin}.totalSize`] = isAdditional ? file.length : -file.length;
+ if (isAdditional) {
+ inc[`drive.${origin}.incCount`] = 1;
+ inc[`drive.${origin}.incSize`] = file.length;
+ } else {
+ inc[`drive.${origin}.decCount`] = 1;
+ inc[`drive.${origin}.decSize`] = file.length;
+ }
await update(inc);
}