From 0ccbbf9d31def8d2900347db0787e3db46c8992d Mon Sep 17 00:00:00 2001 From: artbiit Date: Fri, 27 Mar 2026 17:53:00 +0900 Subject: [PATCH] feat: Introduce and separate `BOOT` audit log category from `SYSTEM`, defaulting both to disabled. --- .../migration.sql | 2 + .../migration.sql | 2 + prisma/schema.prisma | 2 +- src/commands/auditChannel.ts | 3 +- src/events/ready.ts | 2 +- src/i18n/locales/en.ts | 1 + src/i18n/locales/ko.ts | 1 + src/i18n/types.ts | 1 + src/services/AuditLogService.ts | 9 +++- src/services/SetupWizardRenderer.ts | 4 +- yarn.lock | 44 +++++++++---------- 11 files changed, 42 insertions(+), 29 deletions(-) create mode 100644 prisma/migrations/20260327084021_default_disable_system_audit_logs/migration.sql create mode 100644 prisma/migrations/20260327084229_separate_boot_audit_category/migration.sql diff --git a/prisma/migrations/20260327084021_default_disable_system_audit_logs/migration.sql b/prisma/migrations/20260327084021_default_disable_system_audit_logs/migration.sql new file mode 100644 index 0000000..eb6e55c --- /dev/null +++ b/prisma/migrations/20260327084021_default_disable_system_audit_logs/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "AuditChannel" ALTER COLUMN "disabledCategories" SET DEFAULT ARRAY['SYSTEM']::TEXT[]; diff --git a/prisma/migrations/20260327084229_separate_boot_audit_category/migration.sql b/prisma/migrations/20260327084229_separate_boot_audit_category/migration.sql new file mode 100644 index 0000000..0fcc710 --- /dev/null +++ b/prisma/migrations/20260327084229_separate_boot_audit_category/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "AuditChannel" ALTER COLUMN "disabledCategories" SET DEFAULT ARRAY['BOOT', 'SYSTEM']::TEXT[]; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 458b6e2..87abba4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -98,7 +98,7 @@ enum DeleteCondition { model AuditChannel { guildId String @id channelId String - disabledCategories String[] @default([]) + disabledCategories String[] @default(["BOOT", "SYSTEM"]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } diff --git a/src/commands/auditChannel.ts b/src/commands/auditChannel.ts index 885d873..daad2eb 100644 --- a/src/commands/auditChannel.ts +++ b/src/commands/auditChannel.ts @@ -56,7 +56,8 @@ export default { .setDescriptionLocalizations({ ko: '설정할 카테고리' }) .setRequired(true) .addChoices( - { name: 'SYSTEM (Boot, Generic Errors)', value: 'SYSTEM' }, + { name: 'SYSTEM (System Errors)', value: 'SYSTEM' }, + { name: 'BOOT (Bot Online Notifications)', value: 'BOOT' }, { name: 'VOICE (Voice Channels)', value: 'VOICE' }, { name: 'PERMISSION (Permission Issues)', value: 'PERMISSION' }, { name: 'INVITE (Invite Tracking)', value: 'INVITE' }, diff --git a/src/events/ready.ts b/src/events/ready.ts index a15248f..5342873 100644 --- a/src/events/ready.ts +++ b/src/events/ready.ts @@ -25,7 +25,7 @@ export default { client.guilds.cache.forEach(guild => { auditLogService.log(guild, { - category: 'SYSTEM', + category: 'BOOT', severity: 'INFO', title: 'Bot Online', description: `Kord has successfully started or reconnected.` diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index 76fa5a1..4482ca5 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -215,6 +215,7 @@ export const en: TranslationSchema = { defaultGeneratorName: '➕ Create Channel', auditCategories: { SYSTEM: 'System', + BOOT: 'Boot', VOICE: 'Voice', PERMISSION: 'Permission', INVITE: 'Invite', diff --git a/src/i18n/locales/ko.ts b/src/i18n/locales/ko.ts index 486d5c8..8c28a56 100644 --- a/src/i18n/locales/ko.ts +++ b/src/i18n/locales/ko.ts @@ -215,6 +215,7 @@ export const ko: TranslationSchema = { defaultGeneratorName: '➕ 채널 생성하기', auditCategories: { SYSTEM: '시스템', + BOOT: '부팅', VOICE: '음성', PERMISSION: '권한', INVITE: '초대', diff --git a/src/i18n/types.ts b/src/i18n/types.ts index fdcc10d..c3eab65 100644 --- a/src/i18n/types.ts +++ b/src/i18n/types.ts @@ -132,6 +132,7 @@ export interface TranslationSchema { defaultGeneratorName: string; auditCategories: { SYSTEM: string; + BOOT: string; VOICE: string; PERMISSION: string; INVITE: string; diff --git a/src/services/AuditLogService.ts b/src/services/AuditLogService.ts index bb0270d..79c258e 100644 --- a/src/services/AuditLogService.ts +++ b/src/services/AuditLogService.ts @@ -2,7 +2,7 @@ import { Guild, EmbedBuilder, TextChannel, Colors } from 'discord.js'; import { prisma } from '../database'; export type AuditSeverity = 'INFO' | 'WARN' | 'ERROR'; -export type AuditCategory = 'SYSTEM' | 'VOICE' | 'PERMISSION' | 'INVITE' | 'MIMIC'; +export type AuditCategory = 'SYSTEM' | 'BOOT' | 'VOICE' | 'PERMISSION' | 'INVITE' | 'MIMIC'; export interface AuditLogPayload { category: AuditCategory; @@ -70,7 +70,12 @@ export class AuditLogService { async setChannel(guildId: string, channelId: string): Promise { await prisma.auditChannel.upsert({ where: { guildId }, - create: { guildId, channelId }, + create: { + guildId, + channelId, + // 기본적으로 부팅 로그(BOOT)와 시스템 로그(SYSTEM)는 받지 않도록 설정 + disabledCategories: ['BOOT', 'SYSTEM'] + }, update: { channelId }, }); } diff --git a/src/services/SetupWizardRenderer.ts b/src/services/SetupWizardRenderer.ts index 0d0b1a3..f55bd34 100644 --- a/src/services/SetupWizardRenderer.ts +++ b/src/services/SetupWizardRenderer.ts @@ -130,7 +130,7 @@ export class SetupWizardRenderer { embed.setTitle(t(locale, 'commands.setup.step4.title')) .setDescription(t(locale, 'commands.setup.step4.desc')); - const categories: ('SYSTEM' | 'VOICE' | 'PERMISSION' | 'INVITE')[] = ['SYSTEM', 'VOICE', 'PERMISSION', 'INVITE']; + const categories: ('BOOT' | 'SYSTEM' | 'VOICE' | 'PERMISSION' | 'INVITE')[] = ['BOOT', 'SYSTEM', 'VOICE', 'PERMISSION', 'INVITE']; const row1 = new ActionRowBuilder(); categories.forEach(cat => { @@ -200,7 +200,7 @@ export class SetupWizardRenderer { // 감사 로그 카테고리 요약 let catStr = 'None'; if (audit?.channelId) { - const allCats: ('SYSTEM' | 'VOICE' | 'PERMISSION' | 'INVITE')[] = ['SYSTEM', 'VOICE', 'PERMISSION', 'INVITE']; + const allCats: ('BOOT' | 'SYSTEM' | 'VOICE' | 'PERMISSION' | 'INVITE')[] = ['BOOT', 'SYSTEM', 'VOICE', 'PERMISSION', 'INVITE']; const enabled = allCats.filter(c => !audit.disabledCategories.includes(c)); catStr = enabled.map(c => t(locale, `commands.setup.auditCategories.${c}`)).join(', '); } diff --git a/yarn.lock b/yarn.lock index ba88482..e9c7535 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1734,28 +1734,6 @@ __metadata: languageName: node linkType: hard -"Kord@workspace:.": - version: 0.0.0-use.local - resolution: "Kord@workspace:." - dependencies: - "@prisma/client": "npm:6.4.1" - "@types/jest": "npm:^30.0.0" - "@types/node": "npm:^25.5.0" - "@typescript-eslint/eslint-plugin": "npm:^8.57.2" - "@typescript-eslint/parser": "npm:^8.57.2" - discord.js: "npm:^14.25.1" - dotenv: "npm:^17.3.1" - eslint: "npm:^10.1.0" - ioredis: "npm:^5.10.1" - jest: "npm:^30.3.0" - prettier: "npm:^3.8.1" - prisma: "npm:6.4.1" - ts-jest: "npm:^29.4.6" - tsx: "npm:^4.21.0" - typescript: "npm:^6.0.2" - languageName: unknown - linkType: soft - "abbrev@npm:^4.0.0": version: 4.0.0 resolution: "abbrev@npm:4.0.0" @@ -3627,6 +3605,28 @@ __metadata: languageName: node linkType: hard +"kord@workspace:.": + version: 0.0.0-use.local + resolution: "kord@workspace:." + dependencies: + "@prisma/client": "npm:6.4.1" + "@types/jest": "npm:^30.0.0" + "@types/node": "npm:^25.5.0" + "@typescript-eslint/eslint-plugin": "npm:^8.57.2" + "@typescript-eslint/parser": "npm:^8.57.2" + discord.js: "npm:^14.25.1" + dotenv: "npm:^17.3.1" + eslint: "npm:^10.1.0" + ioredis: "npm:^5.10.1" + jest: "npm:^30.3.0" + prettier: "npm:^3.8.1" + prisma: "npm:6.4.1" + ts-jest: "npm:^29.4.6" + tsx: "npm:^4.21.0" + typescript: "npm:^6.0.2" + languageName: unknown + linkType: soft + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0"