Skip to content

Commit 3ab953b

Browse files
committed
feat: 運営のアクティビティが一定期間ない場合は通知+招待制に移行した際に通知
1 parent a2cd6a7 commit 3ab953b

File tree

15 files changed

+486
-37
lines changed

15 files changed

+486
-37
lines changed

locales/index.d.ts

+20
Original file line numberDiff line numberDiff line change
@@ -9326,6 +9326,18 @@ export interface Locale extends ILocale {
93269326
* ログインがありました
93279327
*/
93289328
"login": string;
9329+
/**
9330+
* システムからの通知
9331+
*/
9332+
"fromSystem": string;
9333+
/**
9334+
* モデレーターが一定期間非アクティブになっています。{timeVariant}まで非アクティブな状態が続くと招待制に切り替わります。
9335+
*/
9336+
"adminInactiveModeratorsWarning": ParameterizedString<"timeVariant">;
9337+
/**
9338+
* モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されました。
9339+
*/
9340+
"adminInactiveModeratorsInvitationOnlyChanged": string;
93299341
"_types": {
93309342
/**
93319343
* すべて
@@ -9633,6 +9645,14 @@ export interface Locale extends ILocale {
96339645
* ユーザーが作成されたとき
96349646
*/
96359647
"userCreated": string;
9648+
/**
9649+
* モデレーターが一定期間非アクティブになったとき
9650+
*/
9651+
"inactiveModeratorsWarning": string;
9652+
/**
9653+
* モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されたとき
9654+
*/
9655+
"inactiveModeratorsInvitationOnlyChanged": string;
96369656
};
96379657
/**
96389658
* Webhookを削除しますか?

locales/ja-JP.yml

+5
Original file line numberDiff line numberDiff line change
@@ -2462,6 +2462,9 @@ _notification:
24622462
flushNotification: "通知の履歴をリセットする"
24632463
exportOfXCompleted: "{x}のエクスポートが完了しました"
24642464
login: "ログインがありました"
2465+
fromSystem: "システムからの通知"
2466+
adminInactiveModeratorsWarning: "モデレーターが一定期間非アクティブになっています。{timeVariant}まで非アクティブな状態が続くと招待制に切り替わります。"
2467+
adminInactiveModeratorsInvitationOnlyChanged: "モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されました。"
24652468

24662469
_types:
24672470
all: "すべて"
@@ -2552,6 +2555,8 @@ _webhookSettings:
25522555
abuseReport: "ユーザーから通報があったとき"
25532556
abuseReportResolved: "ユーザーからの通報を処理したとき"
25542557
userCreated: "ユーザーが作成されたとき"
2558+
inactiveModeratorsWarning: "モデレーターが一定期間非アクティブになったとき"
2559+
inactiveModeratorsInvitationOnlyChanged: "モデレーターが一定期間非アクティブだったため、システムにより招待制へと変更されたとき"
25552560
deleteConfirm: "Webhookを削除しますか?"
25562561
testRemarks: "スイッチの右にあるボタンをクリックするとダミーのデータを使用したテスト用Webhookを送信できます。"
25572562

packages/backend/src/core/WebhookTestService.ts

+17
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Packed } from '@/misc/json-schema.js';
1212
import { type WebhookEventTypes } from '@/models/Webhook.js';
1313
import { UserWebhookService } from '@/core/UserWebhookService.js';
1414
import { QueueService } from '@/core/QueueService.js';
15+
import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
1516

1617
const oneDayMillis = 24 * 60 * 60 * 1000;
1718

@@ -446,6 +447,22 @@ export class WebhookTestService {
446447
send(toPackedUserLite(dummyUser1));
447448
break;
448449
}
450+
case 'inactiveModeratorsWarning': {
451+
const dummyTime: ModeratorInactivityRemainingTime = {
452+
time: 100000,
453+
asDays: 1,
454+
asHours: 24,
455+
};
456+
457+
send({
458+
remainingTime: dummyTime,
459+
});
460+
break;
461+
}
462+
case 'inactiveModeratorsInvitationOnlyChanged': {
463+
send({});
464+
break;
465+
}
449466
}
450467
}
451468
}

packages/backend/src/core/entities/NotificationEntityService.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class NotificationEntityService implements OnModuleInit {
5959
async #packInternal <T extends MiNotification | MiGroupedNotification> (
6060
src: T,
6161
meId: MiUser['id'],
62-
62+
6363
options: {
6464
checkValidNotifier?: boolean;
6565
},
@@ -174,6 +174,9 @@ export class NotificationEntityService implements OnModuleInit {
174174
header: notification.customHeader,
175175
icon: notification.customIcon,
176176
} : {}),
177+
...(notification.type === 'adminInactiveModeratorsWarning' ? {
178+
remainingTime: notification.remainingTime,
179+
} : {}),
177180
});
178181
}
179182

@@ -236,7 +239,7 @@ export class NotificationEntityService implements OnModuleInit {
236239
public async pack(
237240
src: MiNotification | MiGroupedNotification,
238241
meId: MiUser['id'],
239-
242+
240243
options: {
241244
checkValidNotifier?: boolean;
242245
},

packages/backend/src/models/Notification.ts

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import { userExportableEntities } from '@/types.js';
7+
import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
78
import { MiUser } from './User.js';
89
import { MiNote } from './Note.js';
910
import { MiAccessToken } from './AccessToken.js';
@@ -116,6 +117,15 @@ export type MiNotification = {
116117
* アプリ通知のアプリ(のトークン)
117118
*/
118119
appAccessTokenId: MiAccessToken['id'] | null;
120+
} | {
121+
type: 'adminInactiveModeratorsWarning';
122+
id: string;
123+
createdAt: string;
124+
remainingTime: ModeratorInactivityRemainingTime;
125+
} | {
126+
type: 'adminInactiveModeratorsInvitationOnlyChanged';
127+
id: string;
128+
createdAt: string;
119129
} | {
120130
type: 'test';
121131
id: string;

packages/backend/src/models/SystemWebhook.ts

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ export const systemWebhookEventTypes = [
1414
'abuseReportResolved',
1515
// ユーザが作成された時
1616
'userCreated',
17+
// モデレータが一定期間不在である警告
18+
'inactiveModeratorsWarning',
19+
// モデレータが一定期間不在のためシステムにより招待制へと変更された
20+
'inactiveModeratorsInvitationOnlyChanged',
1721
] as const;
1822
export type SystemWebhookEventType = typeof systemWebhookEventTypes[number];
1923

packages/backend/src/models/json-schema/notification.ts

+37
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,43 @@ export const packedNotificationSchema = {
412412
},
413413
},
414414
},
415+
}, {
416+
type: 'object',
417+
properties: {
418+
...baseSchema.properties,
419+
type: {
420+
type: 'string',
421+
optional: false, nullable: false,
422+
enum: ['adminInactiveModeratorsWarning'],
423+
},
424+
remainingTime: {
425+
type: 'object',
426+
properties: {
427+
time: {
428+
type: 'number',
429+
optional: false, nullable: false,
430+
},
431+
asDays: {
432+
type: 'number',
433+
optional: false, nullable: false,
434+
},
435+
asHours: {
436+
type: 'number',
437+
optional: false, nullable: false,
438+
},
439+
},
440+
},
441+
},
442+
}, {
443+
type: 'object',
444+
properties: {
445+
...baseSchema.properties,
446+
type: {
447+
type: 'string',
448+
optional: false, nullable: false,
449+
enum: ['adminInactiveModeratorsInvitationOnlyChanged'],
450+
},
451+
},
415452
}, {
416453
type: 'object',
417454
properties: {

0 commit comments

Comments
 (0)