디스코드 봇 특화 설정

슬래시 명령어 개발 및 등록

구식 접두사 문자 명령어에서 디스코드 공식 표준인 애플리케이션 슬래시 명령어(/) 등록법과 즉시 반영 팁을 안내합니다.

과거에 많이 사용하던 문장 감지형 명령어(예: !도움말)는 디스코드 보안 정책 및 API 최적화 정책에 의해 점차 사용이 제한되고 있으며, 현재는 시스템 통합 슬래시 명령어(예: /도움말) 사용이 필수화되었습니다.


글로벌 명령어 vs 특정 서버(Guild) 명령어

슬래시 명령어를 디스코드 서버에 대여 등록할 때, 등록 대상 범위에 따라 반영 속도의 큰 차이가 발생합니다:

  1. 글로벌 명령어 (Global Commands):
    • 봇이 들어가 있는 전 세계 모든 서버에 일괄 적용되는 명령어입니다.
    • 디스코드 본사 서버의 전역 분산 캐싱 정책 때문에, 등록 스크립트 실행 후 실제 일반 사용자 클라이언트에 명령 아이콘이 활성화되기까지 최대 1시간 내외의 지연 시간이 발생합니다.
  2. 길드 명령어 (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")