diff options
Diffstat (limited to 'src/server/api')
| -rw-r--r-- | src/server/api/endpoints/admin/update-meta.ts | 11 | ||||
| -rw-r--r-- | src/server/api/endpoints/charts/active-users.ts | 34 | ||||
| -rw-r--r-- | src/server/api/endpoints/meta.ts | 2 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/global-timeline.ts | 8 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/hybrid-timeline.ts | 9 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/local-timeline.ts | 13 | ||||
| -rw-r--r-- | src/server/api/endpoints/notes/timeline.ts | 3 | ||||
| -rw-r--r-- | src/server/api/stream/channels/global-timeline.ts | 6 | ||||
| -rw-r--r-- | src/server/api/stream/channels/hybrid-timeline.ts | 4 | ||||
| -rw-r--r-- | src/server/api/stream/channels/local-timeline.ts | 6 |
10 files changed, 96 insertions, 0 deletions
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index cf117ebd71..13663243a2 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -32,6 +32,13 @@ export const meta = { } }, + disableGlobalTimeline: { + validator: $.bool.optional.nullable, + desc: { + 'ja-JP': 'グローバルタイムラインを無効にするか否か' + } + }, + hidedTags: { validator: $.arr($.str).optional.nullable, desc: { @@ -331,6 +338,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => { set.disableLocalTimeline = ps.disableLocalTimeline; } + if (typeof ps.disableGlobalTimeline === 'boolean') { + set.disableGlobalTimeline = ps.disableGlobalTimeline; + } + if (Array.isArray(ps.hidedTags)) { set.hidedTags = ps.hidedTags; } diff --git a/src/server/api/endpoints/charts/active-users.ts b/src/server/api/endpoints/charts/active-users.ts new file mode 100644 index 0000000000..5187e5b353 --- /dev/null +++ b/src/server/api/endpoints/charts/active-users.ts @@ -0,0 +1,34 @@ +import $ from 'cafy'; +import define from '../../define'; +import activeUsersChart from '../../../../chart/active-users'; + +export const meta = { + stability: 'stable', + + desc: { + 'ja-JP': 'アクティブユーザーのチャートを取得します。' + }, + + params: { + span: { + validator: $.str.or(['day', 'hour']), + desc: { + 'ja-JP': '集計のスパン (day または hour)' + } + }, + + limit: { + validator: $.num.optional.range(1, 500), + default: 30, + desc: { + 'ja-JP': '最大数。例えば 30 を指定したとすると、スパンが"day"の場合は30日分のデータが、スパンが"hour"の場合は30時間分のデータが返ります。' + } + }, + } +}; + +export default define(meta, (ps) => new Promise(async (res, rej) => { + const stats = await activeUsersChart.getChart(ps.span as any, ps.limit); + + res(stats); +})); diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts index fa933513b7..3b2a49dbb0 100644 --- a/src/server/api/endpoints/meta.ts +++ b/src/server/api/endpoints/meta.ts @@ -59,6 +59,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => { broadcasts: instance.broadcasts || [], disableRegistration: instance.disableRegistration, disableLocalTimeline: instance.disableLocalTimeline, + disableGlobalTimeline: instance.disableGlobalTimeline, driveCapacityPerLocalUserMb: instance.localDriveCapacityMb, driveCapacityPerRemoteUserMb: instance.remoteDriveCapacityMb, cacheRemoteFiles: instance.cacheRemoteFiles, @@ -81,6 +82,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => { response.features = { registration: !instance.disableRegistration, localTimeLine: !instance.disableLocalTimeline, + globalTimeLine: !instance.disableGlobalTimeline, elasticsearch: config.elasticsearch ? true : false, recaptcha: instance.enableRecaptcha, objectStorage: config.drive && config.drive.storage === 'minio', diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts index b7f765f27d..f0d052ff98 100644 --- a/src/server/api/endpoints/notes/global-timeline.ts +++ b/src/server/api/endpoints/notes/global-timeline.ts @@ -4,6 +4,7 @@ import Mute from '../../../../models/mute'; import { packMany } from '../../../../models/note'; import define from '../../define'; import { countIf } from '../../../../prelude/array'; +import fetchMeta from '../../../../misc/fetch-meta'; export const meta = { desc: { @@ -51,6 +52,13 @@ export const meta = { }; export default define(meta, (ps, user) => new Promise(async (res, rej) => { + const meta = await fetchMeta(); + if (meta.disableGlobalTimeline) { + if (user == null || (!user.isAdmin && !user.isModerator)) { + return rej('global timeline disabled'); + } + } + // Check if only one of sinceId, untilId, sinceDate, untilDate specified if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified'); diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts index 7cf05cb9a8..919b0662aa 100644 --- a/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -5,6 +5,8 @@ import { getFriends } from '../../common/get-friends'; import { packMany } from '../../../../models/note'; import define from '../../define'; import { countIf } from '../../../../prelude/array'; +import fetchMeta from '../../../../misc/fetch-meta'; +import activeUsersChart from '../../../../chart/active-users'; export const meta = { desc: { @@ -91,6 +93,11 @@ export const meta = { }; export default define(meta, (ps, user) => new Promise(async (res, rej) => { + const meta = await fetchMeta(); + if (meta.disableLocalTimeline && !user.isAdmin && !user.isModerator) { + return rej('local timeline disabled'); + } + // Check if only one of sinceId, untilId, sinceDate, untilDate specified if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified'); @@ -266,4 +273,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { }); res(await packMany(timeline, user)); + + activeUsersChart.update(user); })); diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts index 4446f52cdc..fd624c10e6 100644 --- a/src/server/api/endpoints/notes/local-timeline.ts +++ b/src/server/api/endpoints/notes/local-timeline.ts @@ -4,6 +4,8 @@ import Mute from '../../../../models/mute'; import { packMany } from '../../../../models/note'; import define from '../../define'; import { countIf } from '../../../../prelude/array'; +import fetchMeta from '../../../../misc/fetch-meta'; +import activeUsersChart from '../../../../chart/active-users'; export const meta = { desc: { @@ -66,6 +68,13 @@ export const meta = { }; export default define(meta, (ps, user) => new Promise(async (res, rej) => { + const meta = await fetchMeta(); + if (meta.disableLocalTimeline) { + if (user == null || (!user.isAdmin && !user.isModerator)) { + return rej('local timeline disabled'); + } + } + // Check if only one of sinceId, untilId, sinceDate, untilDate specified if (countIf(x => x != null, [ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate]) > 1) { return rej('only one of sinceId, untilId, sinceDate, untilDate can be specified'); @@ -153,4 +162,8 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { }); res(await packMany(timeline, user)); + + if (user) { + activeUsersChart.update(user); + } })); diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts index 5604cf291b..24ed222e9a 100644 --- a/src/server/api/endpoints/notes/timeline.ts +++ b/src/server/api/endpoints/notes/timeline.ts @@ -5,6 +5,7 @@ import { getFriends } from '../../common/get-friends'; import { packMany } from '../../../../models/note'; import define from '../../define'; import { countIf } from '../../../../prelude/array'; +import activeUsersChart from '../../../../chart/active-users'; export const meta = { desc: { @@ -266,4 +267,6 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { // Serialize res(await packMany(timeline, user)); + + activeUsersChart.update(user); })); diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts index c5499801ed..b09035daee 100644 --- a/src/server/api/stream/channels/global-timeline.ts +++ b/src/server/api/stream/channels/global-timeline.ts @@ -3,6 +3,7 @@ import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; import Channel from '../channel'; +import fetchMeta from '../../../../misc/fetch-meta'; export default class extends Channel { public readonly chName = 'globalTimeline'; @@ -13,6 +14,11 @@ export default class extends Channel { @autobind public async init(params: any) { + const meta = await fetchMeta(); + if (meta.disableGlobalTimeline) { + if (this.user == null || (!this.user.isAdmin && !this.user.isModerator)) return; + } + // Subscribe events this.subscriber.on('globalTimeline', this.onNote); diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts index 15a516b0c0..e573d27ee8 100644 --- a/src/server/api/stream/channels/hybrid-timeline.ts +++ b/src/server/api/stream/channels/hybrid-timeline.ts @@ -3,6 +3,7 @@ import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; import Channel from '../channel'; +import fetchMeta from '../../../../misc/fetch-meta'; export default class extends Channel { public readonly chName = 'hybridTimeline'; @@ -13,6 +14,9 @@ export default class extends Channel { @autobind public async init(params: any) { + const meta = await fetchMeta(); + if (meta.disableLocalTimeline && !this.user.isAdmin && !this.user.isModerator) return; + // Subscribe events this.subscriber.on('hybridTimeline', this.onNewNote); this.subscriber.on(`hybridTimeline:${this.user._id}`, this.onNewNote); diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts index a26f71af8e..8e490677d3 100644 --- a/src/server/api/stream/channels/local-timeline.ts +++ b/src/server/api/stream/channels/local-timeline.ts @@ -3,6 +3,7 @@ import Mute from '../../../../models/mute'; import { pack } from '../../../../models/note'; import shouldMuteThisNote from '../../../../misc/should-mute-this-note'; import Channel from '../channel'; +import fetchMeta from '../../../../misc/fetch-meta'; export default class extends Channel { public readonly chName = 'localTimeline'; @@ -13,6 +14,11 @@ export default class extends Channel { @autobind public async init(params: any) { + const meta = await fetchMeta(); + if (meta.disableLocalTimeline) { + if (this.user == null || (!this.user.isAdmin && !this.user.isModerator)) return; + } + // Subscribe events this.subscriber.on('localTimeline', this.onNote); |