Discord.js V13으로 슬래시 명령 봇을 만드는 방법

18193 단어 djsbottutorialdiscord
따라서 Discord는 2022년 초부터 API에 상당히 큰 변화를 구현하여 메시지 콘텐츠를 권한 있는 의도로 만들고 확인된 봇이 해당 의도를 추가로 요청해야 합니다.

그래서 작동이 멈추지 않도록 봇을 완전히 슬래시 명령으로 마이그레이션하는 방법을 공유하려고 합니다.

시작하기 전에 커뮤니티와 어울리고 싶다면 여기에서 Discord 서버에 가입할 수 있습니다: DevHQ

결과 코드를 보기 위해 여기에 있는 경우 여기에서 리포지토리를 찾을 수 있습니다. Repository



시작하자.

슬래시 명령을 등록하는 데 필요한 application.commands의 업데이트된 범위로 봇을 초대해야 합니다.



먼저, npm보다 훨씬 낫기 때문에 항상 yarn을 사용하는 것이 좋습니다. 따라서 다음을 사용하여 설치할 수 있습니다.
npm -g install yarn
봇을 위한 새 디렉터리를 만들고 cd하고 다음을 사용하여 초기화합니다.
yarn init --yes
Discord.js 및 기타 종속성을 설치해 보겠습니다.

yarn add discord.js @discordjs/rest discord-api-types/v9 @discordjs/builders


index.js 파일을 만들고 다음 항목을 가져올 시간입니다.

const fs = require('fs');
const {
    REST
} = require('@discordjs/rest');
const {
    Routes
} = require('discord-api-types/v9');
// Require the necessary discord.js classes
const {
    Client,
    Intents,
    Collection
} = require('discord.js');

// Create a new client instance
const client = new Client({
    intents: [Intents.FLAGS.GUILDS]
});


이제 슬래시 명령에 응답하는 데 필요한 길드 의도만 사용하는 클라이언트 인스턴스를 만들었습니다. Discord 전체에서 모든 단일 메시지를 처리하는 것보다 메모리 집약도가 훨씬 낮습니다.

이제 봇에 대한 동적 명령 구조를 만들 것이므로 명령이라는 디렉터리를 만들고 이를 index.js 파일에 추가합니다.

// Loading commands from the commands folder
const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));


이제 토큰을 사용할 때입니다. 토큰을 GitHub에 푸시하는 것은 권장되지 않으므로 env 파일을 사용하여 토큰을 안전하게 저장해야 합니다.
yarn add dotenv
.env 파일을 만들고 여기에 토큰과 테스트 길드/서버 ID를 추가하세요. 나중에 테스트 서버에 대해 이야기하겠습니다.

TOKEN=YOUR_TOKEN_HERE
TEST_GUILD_ID=YOUR_GUILD_ID_HERE


이렇게 길드 아이디를 복사할 수 있습니다.


.gitignore 파일을 만들고 파일에 다음을 추가합니다.

.env


색인 파일에서 구성할 시간:

// Loading the token from .env file
const dotenv = require('dotenv');
dotenv.config();
const TOKEN = process.env['TOKEN'];


드디어 토큰을 받았으니 이제 Test Guild ID에 대해 이야기할 시간입니다. 따라서 Discord의 슬래시 명령을 사용하려면 먼저 등록해야 하며 개발 단계에서 매번 전역적으로 등록할 수 없습니다. 그렇지 않으면 평가를 받게 될 것입니다. 한동안 API 액세스가 제한되고 잠재적으로 금지됩니다.

이것은 개발 단계에서만 필요하며 프로덕션 환경에서 봇을 배포할 때는 이 작업을 수행할 필요가 없습니다. 따라서 명령을 전역적으로 사용할 수 있도록 하려면 테스트 길드 ID를 추가하지 마십시오. 이제 색인 파일에 길드 ID를 추가해 보겠습니다.

const TEST_GUILD_ID = process.env['TEST_GUILD_ID'];


이제 명령을 등록할 시간입니다. Test Guild ID를 사용할 수 있는지 여부에 따라 글로벌 등록과 개발 등록 간에 자동으로 전환되는 조건을 만들 것입니다.

const commands = [];

// Creating a collection for commands in client
client.commands = new Collection();

for (const file of commandFiles) {
    const command = require(`./commands/${file}`);
    commands.push(command.data.toJSON());
    client.commands.set(command.data.name, command);
}

// When the client is ready, this only runs once
client.once('ready', () => {
    console.log('Ready!');
    // Registering the commands in the client
    const CLIENT_ID = client.user.id;
    const rest = new REST({
        version: '9'
    }).setToken(TOKEN);
    (async () => {
        try {
            if (!TEST_GUILD_ID) {
                await rest.put(
                    Routes.applicationCommands(CLIENT_ID), {
                        body: commands
                    },
                );
                console.log('Successfully registered application commands globally');
            } else {
                await rest.put(
                    Routes.applicationGuildCommands(CLIENT_ID, TEST_GUILD_ID), {
                        body: commands
                    },
                );
                console.log('Successfully registered application commands for development guild');
            }
        } catch (error) {
            if (error) console.error(error);
        }
    })();
});


Discord에 명령을 등록했으므로 명령을 듣고 응답할 차례입니다.

client.on('interactionCreate', async interaction => {
    if (!interaction.isCommand()) return;
    const command = client.commands.get(interaction.commandName);
    if (!command) return;
    try {
        await command.execute(interaction);
    } catch (error) {
        if (error) console.error(error);
        await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
    }
});


마지막으로 인덱스 파일의 경우 봇에 로그인해야 합니다.

// Login to Discord with your client's token
client.login(TOKEN);


이제 명령 하위 디렉터리로 이동할 수 있으며 다음 코드를 사용하여 ping.js 파일을 만들어 보겠습니다.

const { SlashCommandBuilder } = require('@discordjs/builders');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('ping')
        .setDescription('Replies with pong'),
    async execute(interaction) {
        interaction.reply({ content: 'Pong' })
    }
};


이제 Discord.js V13에서 작동하는 탁구 봇을 성공적으로 만들었습니다. 이제 ping 명령과 동일한 형식을 따라 봇에 대해 원하는 만큼 많은 명령을 생성할 수 있습니다. 포함 코드는 동일하며 여기에서 다루지 않은 버튼 및 선택 메뉴와 같은 많은 새로운 기능이 있습니다. 임베드를 보내려면 다음을 수행하면 됩니다.

interaction.reply({ embeds: [embed] })


이 짧은 튜토리얼이 마음에 드셨기를 바라며 Twitter에서 저를 팔로우해 주세요.

무료 배포 플랫폼:


  • Railway
  • Qovery
  • OpeNode
  • Heroku

  • 다음 편에서 뵙길 바랍니다 :)

    좋은 웹페이지 즐겨찾기