wip #6140
This commit is contained in:
		
							parent
							
								
									49a5b4eb14
								
							
						
					
					
						commit
						917726fecc
					
				
					 16 changed files with 96 additions and 105 deletions
				
			
		| 
						 | 
				
			
			@ -1,13 +1,11 @@
 | 
			
		|||
const dateTimeIntervals = {
 | 
			
		||||
	'day': 86400000,
 | 
			
		||||
	'hour': 3600000,
 | 
			
		||||
	'ms': 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export function DateUTC(time: number[]): Date {
 | 
			
		||||
	const r = new Date(0);
 | 
			
		||||
	r.setUTCFullYear(time[0], time[1], time[2]);
 | 
			
		||||
	if (time[3]) r.setUTCHours(time[3], ...time.slice(4));
 | 
			
		||||
	return r;
 | 
			
		||||
export function dateUTC(time: number[]): Date {
 | 
			
		||||
	return new Date(Date.UTC(...time));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function isTimeSame(a: Date, b: Date): boolean {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,10 +20,10 @@ export function isTimeAfter(a: Date, b: Date): boolean {
 | 
			
		|||
	return (a.getTime() - b.getTime()) > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function addTimespan(x: Date, value: number, span: keyof typeof dateTimeIntervals): Date {
 | 
			
		||||
export function addTime(x: Date, value: number, span: keyof typeof dateTimeIntervals = 'ms'): Date {
 | 
			
		||||
	return new Date(x.getTime() + (value * dateTimeIntervals[span]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function subtractTimespan(x: Date, value: number, span: keyof typeof dateTimeIntervals): Date {
 | 
			
		||||
export function subtractTime(x: Date, value: number, span: keyof typeof dateTimeIntervals = 'ms'): Date {
 | 
			
		||||
	return new Date(x.getTime() - (value * dateTimeIntervals[span]));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await activeUsersChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await activeUsersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await driveChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await driveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await federationChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await federationChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		tag: {
 | 
			
		||||
| 
						 | 
				
			
			@ -43,5 +43,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.tag);
 | 
			
		||||
	return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.tag);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		host: {
 | 
			
		||||
| 
						 | 
				
			
			@ -44,5 +44,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await instanceChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.host);
 | 
			
		||||
	return await instanceChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.host);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await networkChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await notesChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await notesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		userId: {
 | 
			
		||||
| 
						 | 
				
			
			@ -45,5 +45,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
 | 
			
		||||
	return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		userId: {
 | 
			
		||||
| 
						 | 
				
			
			@ -45,5 +45,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
 | 
			
		||||
	return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		userId: {
 | 
			
		||||
| 
						 | 
				
			
			@ -45,5 +45,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
 | 
			
		||||
	return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,8 +28,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		userId: {
 | 
			
		||||
| 
						 | 
				
			
			@ -45,5 +45,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.offset!, ps.userId);
 | 
			
		||||
	return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null, ps.userId);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,8 +27,8 @@ export const meta = {
 | 
			
		|||
		},
 | 
			
		||||
 | 
			
		||||
		offset: {
 | 
			
		||||
			validator: $.optional.num,
 | 
			
		||||
			default: 0,
 | 
			
		||||
			validator: $.optional.nullable.num,
 | 
			
		||||
			default: null,
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,5 +36,5 @@ export const meta = {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
export default define(meta, async (ps) => {
 | 
			
		||||
	return await usersChart.getChart(ps.span as any, ps.limit!, ps.offset!);
 | 
			
		||||
	return await usersChart.getChart(ps.span as any, ps.limit!, ps.offset ? new Date(ps.offset) : null);
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,9 +60,9 @@ export default define(meta, async () => {
 | 
			
		|||
		Notes.count({ where: { userHost: null }, cache: 3600000 }),
 | 
			
		||||
		Users.count({ cache: 3600000 }),
 | 
			
		||||
		Users.count({ where: { host: null }, cache: 3600000 }),
 | 
			
		||||
		federationChart.getChart('hour', 1, 0).then(chart => chart.instance.total[0]),
 | 
			
		||||
		driveChart.getChart('hour', 1, 0).then(chart => chart.local.totalSize[0]),
 | 
			
		||||
		driveChart.getChart('hour', 1, 0).then(chart => chart.remote.totalSize[0]),
 | 
			
		||||
		federationChart.getChart('hour', 1, null).then(chart => chart.instance.total[0]),
 | 
			
		||||
		driveChart.getChart('hour', 1, null).then(chart => chart.local.totalSize[0]),
 | 
			
		||||
		driveChart.getChart('hour', 1, null).then(chart => chart.remote.totalSize[0]),
 | 
			
		||||
	]);
 | 
			
		||||
 | 
			
		||||
	return {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,8 +8,8 @@ import * as nestedProperty from 'nested-property';
 | 
			
		|||
import autobind from 'autobind-decorator';
 | 
			
		||||
import Logger from '../logger';
 | 
			
		||||
import { Schema } from '../../misc/schema';
 | 
			
		||||
import { EntitySchema, getRepository, Repository, LessThan, MoreThanOrEqual, Between } from 'typeorm';
 | 
			
		||||
import { DateUTC, isTimeSame, isTimeBefore, subtractTimespan } from '../../prelude/time';
 | 
			
		||||
import { EntitySchema, getRepository, Repository, LessThan, Between } from 'typeorm';
 | 
			
		||||
import { dateUTC, isTimeSame, isTimeBefore, subtractTime, addTime } from '../../prelude/time';
 | 
			
		||||
import { getChartInsertLock } from '../../misc/app-lock';
 | 
			
		||||
 | 
			
		||||
const logger = new Logger('chart', 'white', process.env.NODE_ENV !== 'test');
 | 
			
		||||
| 
						 | 
				
			
			@ -134,18 +134,21 @@ export default abstract class Chart<T extends Record<string, any>> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private static dateToYMDH(date: Date): [number, number, number, number] {
 | 
			
		||||
	private static parseDate(date: Date): [number, number, number, number, number, number, number] {
 | 
			
		||||
		const y = date.getUTCFullYear();
 | 
			
		||||
		const m = date.getUTCMonth();
 | 
			
		||||
		const d = date.getUTCDate();
 | 
			
		||||
		const h = date.getUTCHours();
 | 
			
		||||
		const _m = date.getUTCMinutes();
 | 
			
		||||
		const _s = date.getUTCSeconds();
 | 
			
		||||
		const _ms = date.getUTCMilliseconds();
 | 
			
		||||
 | 
			
		||||
		return [y, m, d, h];
 | 
			
		||||
		return [y, m, d, h, _m, _s, _ms];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	private static getCurrentDate(): [number, number, number, number] {
 | 
			
		||||
		return Chart.dateToYMDH(new Date());
 | 
			
		||||
	private static getCurrentDate() {
 | 
			
		||||
		return Chart.parseDate(new Date());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
| 
						 | 
				
			
			@ -243,8 +246,8 @@ export default abstract class Chart<T extends Record<string, any>> {
 | 
			
		|||
		const [y, m, d, h] = Chart.getCurrentDate();
 | 
			
		||||
 | 
			
		||||
		const current =
 | 
			
		||||
			span == 'day' ? DateUTC([y, m, d]) :
 | 
			
		||||
			span == 'hour' ? DateUTC([y, m, d, h]) :
 | 
			
		||||
			span == 'day' ? dateUTC([y, m, d, 0]) :
 | 
			
		||||
			span == 'hour' ? dateUTC([y, m, d, h]) :
 | 
			
		||||
			null as never;
 | 
			
		||||
 | 
			
		||||
		// 現在(今日または今のHour)のログ
 | 
			
		||||
| 
						 | 
				
			
			@ -381,23 +384,15 @@ export default abstract class Chart<T extends Record<string, any>> {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	@autobind
 | 
			
		||||
	public async getChart(span: Span, amount: number, offset: number, group: string | null = null): Promise<ArrayValue<T>> {
 | 
			
		||||
		let [y, m, d, h] = Chart.getCurrentDate();
 | 
			
		||||
	public async getChart(span: Span, amount: number, begin: Date | null, group: string | null = null): Promise<ArrayValue<T>> {
 | 
			
		||||
		const [y, m, d, h, _m, _s, _ms] = begin ? Chart.parseDate(subtractTime(addTime(begin, 1, span), 1)) : Chart.getCurrentDate();
 | 
			
		||||
		const [y2, m2, d2, h2] = begin ? Chart.parseDate(addTime(begin, 1, span)) : [] as never;
 | 
			
		||||
 | 
			
		||||
		let lt: Date = null as never;
 | 
			
		||||
 | 
			
		||||
		if (offset > 0) {
 | 
			
		||||
			[y, m, d, h] = Chart.dateToYMDH(subtractTimespan(DateUTC([y, m, d, h]), offset, span));
 | 
			
		||||
 | 
			
		||||
			lt =
 | 
			
		||||
				span === 'day' ? DateUTC([y, m, d]) :
 | 
			
		||||
				span === 'hour' ? DateUTC([y, m, d, h]) :
 | 
			
		||||
				null as never;
 | 
			
		||||
		}
 | 
			
		||||
		const lt = dateUTC([y, m, d, h, _m, _s, _ms]);
 | 
			
		||||
 | 
			
		||||
		const gt =
 | 
			
		||||
			span === 'day' ? subtractTimespan(DateUTC([y, m, d]), amount - 1, 'day') :
 | 
			
		||||
			span === 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), amount - 1, 'hour') :
 | 
			
		||||
			span === 'day' ? subtractTime(begin ? dateUTC([y2, m2, d2, 0]) : dateUTC([y, m, d, 0]), amount - 1, 'day') :
 | 
			
		||||
			span === 'hour' ? subtractTime(begin ? dateUTC([y2, m2, d2, h2]) : dateUTC([y, m, d, h]), amount - 1, 'hour') :
 | 
			
		||||
			null as never;
 | 
			
		||||
 | 
			
		||||
		// ログ取得
 | 
			
		||||
| 
						 | 
				
			
			@ -405,9 +400,7 @@ export default abstract class Chart<T extends Record<string, any>> {
 | 
			
		|||
			where: {
 | 
			
		||||
				group: group,
 | 
			
		||||
				span: span,
 | 
			
		||||
				date: offset === 0
 | 
			
		||||
					? MoreThanOrEqual(Chart.dateToTimestamp(gt))
 | 
			
		||||
					: Between(Chart.dateToTimestamp(gt), Chart.dateToTimestamp(lt))
 | 
			
		||||
				date: Between(Chart.dateToTimestamp(gt), Chart.dateToTimestamp(lt))
 | 
			
		||||
			},
 | 
			
		||||
			order: {
 | 
			
		||||
				date: -1
 | 
			
		||||
| 
						 | 
				
			
			@ -455,8 +448,8 @@ export default abstract class Chart<T extends Record<string, any>> {
 | 
			
		|||
		// 整形
 | 
			
		||||
		for (let i = (amount - 1); i >= 0; i--) {
 | 
			
		||||
			const current =
 | 
			
		||||
				span == 'day' ? subtractTimespan(DateUTC([y, m, d]), i, 'day') :
 | 
			
		||||
				span == 'hour' ? subtractTimespan(DateUTC([y, m, d, h]), i, 'hour') :
 | 
			
		||||
				span === 'day' ? subtractTime(dateUTC([y, m, d, 0]), i, 'day') :
 | 
			
		||||
				span === 'hour' ? subtractTime(dateUTC([y, m, d, h]), i, 'hour') :
 | 
			
		||||
				null as never;
 | 
			
		||||
 | 
			
		||||
			const log = logs.find(l => isTimeSame(new Date(l.date * 1000), current));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue