Kord/apps/bot/src/services/AutoRoleService.ts

73 lines
2.1 KiB
TypeScript

import { Guild, GuildMember, PermissionFlagsBits } from 'discord.js';
import { prisma } from '../database';
import { logger } from '../utils/logger';
import { auditLogService } from './AuditLogService';
export class AutoRoleService {
/**
* 서버의 자동 역할 설정을 조회합니다.
*/
async getConfig(guildId: string) {
return prisma.autoRoleConfig.findUnique({
where: { guildId },
});
}
/**
* 서버의 자동 역할 설정을 업데이트합니다.
*/
async updateConfig(guildId: string, data: {
userRoleIds?: string[];
botRoleIds?: string[];
isEnabled?: boolean;
botEnabled?: boolean;
}) {
return prisma.autoRoleConfig.upsert({
where: { guildId },
create: {
guildId,
...data,
},
update: data,
});
}
/**
* 자동 역할 부여 기능을 활성/비활성합니다.
*/
async setEnabled(guildId: string, enabled: boolean) {
return this.updateConfig(guildId, { isEnabled: enabled });
}
/**
* 신규 멤버가 입장했을 때 자동으로 역할을 부여합니다.
*/
async handleMemberJoin(member: GuildMember) {
const config = await this.getConfig(member.guild.id);
if (!config) return;
const isBot = member.user.bot;
const isEnabled = isBot ? config.botEnabled : config.isEnabled;
const roleIds = isBot ? config.botRoleIds : config.userRoleIds;
if (!isEnabled || roleIds.length === 0) return;
try {
await member.roles.add(roleIds, 'Kord Auto-Role');
logger.info(`[AutoRole] Added roles to ${member.user.tag} in ${member.guild.name}`);
} catch (error) {
logger.error(`[AutoRole] Failed to add roles to ${member.user.tag} in ${member.guild.name}`, error);
// 권한 문제인 경우 감사 로그에 기록
await auditLogService.log(member.guild, {
category: 'PERMISSION',
severity: 'WARN',
title: 'Auto-Role Failure',
description: `Failed to assign roles to ${member.user.toString()} automatically. Please check the bot's permission and role hierarchy.`
}).catch(() => {});
}
}
}
export const autoRoleService = new AutoRoleService();