이 글에서는 디스코드 봇에 로컬 효과음 폴더(funsound)를 만들어 검색/재생 명령을 구현하는 방법과, **호스팅 규칙(음악봇 금지)**을 준수하며 안전하게 운영하는 방법을 정리한다. 구현 샘플 코드와 컨테이너 배포 팁을 포함한다.
증상
호스팅 규칙에 음악봇은 호스팅금지가 명시되어 있어, 로컬에 저장한 짧은 효과음(효과음 파일을 불러와 음성 채널에서 재생하는 기능)이 규칙 위반인지 불확실하다. 현재 계획은 컨테이너에 funsound 폴더를 만들고 /funsound [검색] 명령으로 폴더 내 파일을 검색해 재생하는 기능을 추가하는 것이다.
원인
호스팅 제약은 주로 외부 스트리밍(예: YouTube)이나 저작권 이슈와 관련된다. 호스팅 규칙이 “음악봇”을 금지하면 외부 스트리밍 기반 음악 재생은 문제 소지가 크다. 반면 로컬에 포함된 짧은 효과음은 기술적으로 외부 스트리밍과 다른 방식이므로 구현·배포 관점에서 허용될 가능성이 높다. 다만 최종 판단은 호스팅 제공자의 정책 해석에 따라 달라지므로 규정 확인이 필요하다.
해결 방법
1단계: 로컬 효과음 구현
- 프로젝트 루트에
funsound/폴더 생성하고 재생할 파일을 넣는다. 허용 확장자 예:.mp3,.ogg,.wav. - 의존성 설치:
discord.js,@discordjs/voice,ffmpeg(또는ffmpeg-static),@discordjs/opus등.
예시 Node.js 재생 코드(간단한 검색 + 재생):
// 필요 패키지: discord.js, @discordjs/voice, fs, path
const { join } = require('path');
const fs = require('fs');
const { createAudioPlayer, createAudioResource, joinVoiceChannel, AudioPlayerStatus } = require('@discordjs/voice');
const SOUNDS_DIR = join(__dirname, 'funsound');
function findSound(query) {
const files = fs.readdirSync(SOUNDS_DIR);
const candidates = files.filter(f => /.(mp3|ogg|wav)$/i.test(f));
return candidates.find(f => f.toLowerCase().includes(query.toLowerCase()));
}
async function playSound(interaction, query) {
const file = findSound(query);
if (!file) return interaction.reply('효과음을 찾을 수 없습니다.');
const fullPath = join(SOUNDS_DIR, file);
const connection = joinVoiceChannel({
channelId: interaction.member.voice.channelId,
guildId: interaction.guildId,
adapterCreator: interaction.guild.voiceAdapterCreator,
});
const player = createAudioPlayer();
const resource = createAudioResource(fullPath);
player.play(resource);
connection.subscribe(player);
player.on(AudioPlayerStatus.Idle, () => connection.destroy());
await interaction.reply(`재생: ${file}`);
}
안전 주의사항:
- 파일명/쿼리 입력에 대해 경로 탐색(path traversal) 방지: 절대 경로 조합 시
path.join과 허용 확장자 검사 사용. - 재생 파일 길이 제한, 동시 재생 제한, 명령당 재생 쿼터 적용.
- 음성 채널에 사용자가 존재하는지 확인하고, 필요한 권한(
CONNECT,SPEAK)이 있는지 검사.
2단계: 컨테이너화 및 호스팅 고려사항
- Dockerfile 예시:
funsound폴더를 이미지에 포함하거나 볼륨으로 마운트.
FROM node:18
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
# ffmpeg 설치(간단 예시)
RUN apt-get update && apt-get install -y ffmpeg
COPY . .
# funsound 폴더가 프로젝트에 포함되어 있어야 함
CMD ["node", "index.js"]
- 호스팅 정책 준수 체크리스트:
- 호스팅 규칙에서 외부 스트리밍 기반 음악 차단 여부 확인. 외부 스트리밍을 하지 않도록 구현.
- 포함된 음원 저작권 확인(상업적 사용 여부, 라이선스).
- 서버 자원(대역폭, 동시 연결) 제한 고려.
- 사용자 악용 방지: 과도한 재생 요청, 자동 재생 루프 방지, 권한 기반 접근 제어.
- 로깅 및 모니터링: 재생 이벤트, 오류, 리소스 사용량 기록.
마무리
funsound 폴더를 활용한 로컬 효과음 재생은 기술적으로 구현 가능하며 외부 스트리밍과는 구분된다. 다만 호스팅 규칙과 음원 라이선스를 반드시 확인하고, 파일 검증·권한 체크·자원 한계를 적용해 안전하게 운영하라. 디스코드 봇을 디스호스트에서 호스팅할 경우 규정 준수가 핵심이다.