디스코드 봇 특화 설정
슬래시 명령어 개발 및 등록
구식 접두사 문자 명령어에서 디스코드 공식 표준인 애플리케이션 슬래시 명령어(/) 등록법과 즉시 반영 팁을 안내합니다.
과거에 많이 사용하던 문장 감지형 명령어(예: !도움말)는 디스코드 보안 정책 및 API 최적화 정책에 의해 점차 사용이 제한되고 있으며, 현재는 시스템 통합 슬래시 명령어(예: /도움말) 사용이 필수화되었습니다.
글로벌 명령어 vs 특정 서버(Guild) 명령어
슬래시 명령어를 디스코드 서버에 대여 등록할 때, 등록 대상 범위에 따라 반영 속도의 큰 차이가 발생합니다:
- 글로벌 명령어 (Global Commands):
- 봇이 들어가 있는 전 세계 모든 서버에 일괄 적용되는 명령어입니다.
- 디스코드 본사 서버의 전역 분산 캐싱 정책 때문에, 등록 스크립트 실행 후 실제 일반 사용자 클라이언트에 명령 아이콘이 활성화되기까지 최대 1시간 내외의 지연 시간이 발생합니다.
- 길드 명령어 (Guild Commands):
- 개발 중인 특정 디스코드 테스트 서버(Guild ID 지정) 한정으로만 배포하는 명령어입니다.
- 스크립트 호출 즉시 0.1초 만에 클라이언트에 즉시 갱신되어 반영됩니다.
- 추천: 개발 단계나 로컬 테스트 중에는 무조건 특정 길드 명령어 배포 방식으로 개발하고, 최종 서비스 런칭 시 글로벌 등록으로 전환하는 것이 쾌적합니다.
Node.js (discord.js v14) 등록 예시 스크립트
프로젝트 폴더 내에 별도의 배포용 파일(deploy-commands.js)을 두고 등록을 처리하는 구조입니다.
const { REST, Routes, SlashCommandBuilder } = require('discord.js');
require('dotenv').config();
// 등록할 명령어 목록 정의
const commands = [
new SlashCommandBuilder()
.setName('핑')
.setDescription('봇의 반응 속도를 테스트합니다.'),
new SlashCommandBuilder()
.setName('정보')
.setDescription('디스호스트 컨테이너 정보 출력.')
].map(command => command.toJSON());
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
(async () => {
try {
console.log('Log: 슬래시 명령어 갱신 배포를 시작합니다...');
// 테스트 서버 Guild ID를 환경변수나 하드코딩으로 입력받아 즉각 등록합니다.
await rest.put(
Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
{ body: commands }
);
console.log('Log: 특정 테스트 서버에 명령어가 즉시 배포되었습니다!');
} catch (error) {
console.error(error);
}
})();Python (discord.py v2) 등록 예시 코드
discord.py에서는 봇 메인 루프 시퀀스 안에서 커맨드 트리 동기화(sync()) 명령을 주입하여 가동 단계에서 바로 등록할 수 있습니다.
import discord
from discord.ext import commands
class MyBot(commands.Bot):
def __init__(self):
intents = discord.Intents.default()
super().__init__(command_prefix="!", intents=intents)
async def setup_hook(self):
# 봇 구동 시 특정 테스트 길드를 대상으로 트리거 동기화를 수행합니다.
guild = discord.Object(id=123456789012345) # 본인의 테스트 서버 ID 기입
self.tree.copy_global_to(guild=guild)
await self.tree.sync(guild=guild)
print("Log: 테스트 서버 대상 슬래시 명령어 동기화 완료!")
bot = MyBot()
@bot.tree.command(name="ping", description="반응 속도 체크")
async def ping(interaction: discord.Interaction):
await interaction.response.send_message("pong!")
bot.run("DISCORD_TOKEN")