3.0 KiB
3.0 KiB
2026-03-27 작업 내역: 임시 음성 채널 기능 구현
체인지로그 (Changelog)
- 2026-03-27: Kord 봇 음성 채널 제어 시스템 스펙 기획 및 전체 로직 구현 완료
본문 (Body)
1. 🎯 주요 목표 (Objective)
사용자가 봇 서버의 특정한 '생성용 채널(Generator)'에 입장하면, 유저 본인 소유의 '임시 전용 채널'을 만들어 주고, 빈 방이 되었을 때 삭제하여 채널 환경을 깔끔하게 유지하는 자동화 시스템 및 티어 기반 한도 제어 시스템을 구축.
2. 📝 진행 내역 (Work Done)
- DB 스키마(Prisma) 설계 및 반영:
SubscriptionTier(FREE, STANDARD, PRO, PREMIUM) 추가.UserSubscription,GuildOwnership모델 생성하여 관리자 티어에 따른 리소스 상속 체계 마련.VoiceGenerator,TempVoiceChannel,UserVoiceProfile모델 반영.
- 백엔드 리소스 개발:
src/commands/voiceSetup.ts: 특정 채널을 생성용(Generator)으로 지정하는 슬래시 커맨드.src/events/voiceStateUpdate.ts,src/services/VoiceService.ts: 유저 접속 및 퇴장 이벤트를 감지하여 데이터베이스 검증을 거친 후 동적으로 채널을 생성/삭제하는 핵심 로직 구현.
- 인터랙션/UI 개발:
src/events/interactionCreate.ts: 생성된 임시 채널 채팅창에 띄워진 조작 패널(버튼 5종)에 대응하는 Modal 및 Select Menu 핸들러 추가. (이름 변경, 인원수 제한, Lock/Unlock, Kick, Ban)
3. 🤔 주요 의사결정 (Decisions Made)
- 차단(Ban) 동작 정의: 특정 인터랙션에서 유저 밴 기능을 수행할 경우, 음성 채널 설정(Overwrite) API를 사용하여 해당 유저의
Connect,ViewChannel권한을 모두 박탈함으로써 채널 텍스트 캐시 및 접속을 완전히 보이지 않게(투명화) 설계함. - 티어 권한 소유 구조: 서버 단위가 주체가 되는 것이 아니라, 봇을 초대한 '사용자 단위'가 주체가 되도록
GuildOwnership과UserSubscription을 연결. 추후 다양한 서비스에 재활용 가능하도록 기반 구축. (Docs/Decisions/subscription_tiers.md참고)
4. 🛠️ 트러블슈팅 (Troubleshooting)
- TypeScript 타입 캐스팅 관련 이슈:
- 문제:
interactionCreate에서interaction.member.voice에 접근 시APIInteractionGuildMember타입과의 충돌로 컴파일(yarn build) 에러 발생. - 해결:
interaction.member as GuildMember명시적 타입 캐스팅을 통해voice.channel객체 보장 및 에러 해결 완료.
- 문제:
- 런타임 초기화 - 디스코드 권한(Intents) 충돌:
- 문제: 로컬 구동 테스트 중
Error: Used disallowed intents발생. - 원인:
KordClient부팅 시GuildMembers,MessageContent,Presence세 가지 Privileged Gateway Intent를 요구하나 디스코드 온라인 설정상 비활성화되어 있음. - 해결: 개발 과정에선 소스 오류가 아님을 확인 후, 사용자에게 디스코드 포털에서의 활성화 작업 요청 조치.
- 문제: 로컬 구동 테스트 중