Eris로 Discord Bot 작성(Slash Commands Edition)
29057 단어 tutorialerisdiscordjavascript
Eris를 사용하여 슬래시 명령으로 Discord 봇 작성
소개
네, 제목이 모든 것을 말해줍니다. 나는 Eris를 사용하여 슬래시 명령으로 Discord 봇을 작성하는 방법을 보여주는 서면 가이드가 없기 때문에 이것을 하기로 결정했습니다.
어쨌든 시작합시다! 먼저 다음 몇 가지가 필요합니다.
이제 필요한 종속성을 설치합니다.
yarn add eris dotenv eslint consola
# or using NPM
npm i eris dotenv eslint consola
또한 ESLint을 사용하여 더 나은 콘솔 메시지를 위해 코드 스타일과 consola를 적용할 것입니다.
마지막으로 다음 스크립트를
package.json
에 추가합니다."scripts": {
"start": "node index.js",
"lint": "eslint ."
}
또한
type
파일에서 module
를 package.json
로 설정해야 합니다.코드 작성
이제
index.js
라는 파일을 만들고 다음 코드를 추가합니다.import Eris, { Constants, Collection, CommandInteraction } from 'eris';
import fs from 'fs';
import console from 'consola';
import * as dotenv from 'dotenv';
dotenv.config();
기본
Eris
모듈인 Constants
및 Collection
인 Eris에서 fs
, consola
및 dotenv
를 가져오고 있습니다.잊어버리기 전에
.env
파일을 만들고 봇의 토큰을 추가해야 합니다.TOKEN=your-bot-token
이제 클라이언트를 생성해 보겠습니다.
const client = new Eris(`${process.env.TOKEN}`, {
intents: [
Constants.Intents.guilds,
Constants.Intents.guildMessages,
Constants.Intents.guildMessageReactions,
Constants.Intents.directMessages,
Constants.Intents.directMessageReactions,
],
});
명령 등록
이제 명령어를 등록해 봅시다. 먼저
commands
라는 폴더를 만들고 그 아래에 ping.js
라는 파일을 추가합니다. 그런 다음 다음 코드를 추가합니다.export default {
name: 'ping',
description: 'Ping!',
execute: (i) => {
i.createMessage('Pong.');
},
};
우리는 기본적으로 나중에 사용하기 위해 명령이 사용될 때 실행할 명령 정보 및 함수와 함께 개체를 내보냅니다.
index.js
에서 ready
이벤트 리스너를 추가합니다.client.on('ready', async () => {
console.info(`Logged in as ${client.user.username}#${client.user.discriminator}`);
console.info('Loading commands...');
});
ready
이벤트 리스너 내에서 명령을 로드합니다.client.on('ready', async () => {
// ...
// first create a collection to store commands
client.commands = new Collection();
// load all the js files under ./commands
const commandFiles = fs.readdirSync('./src/commands').filter(file => file.endsWith('.js'));
});
이제 파일 이름 배열이 있으므로 이를 반복하고 등록할 수 있습니다.
client.on('ready', async () => {
// ...
for (const file of commandFiles) {
const command = (await import(`./commands/${file}`)).default;
client.commands.set(command.name, command);
client.createCommand({
name: command.name,
description: command.description,
options: command.options ?? [],
type: Constants.ApplicationCommandTypes.CHAT_INPUT,
});
}
console.info('Commands loaded!');
});
import
는 최상위 수준에서만 사용할 수 있고 import ... from 'xxx'
는 ESM에서 사용할 수 없으므로 동적require()
을 사용했습니다. 동적import
은 파일에서 내보낸 객체인 default
속성을 가진 객체를 반환합니다. 이것이 끝에 있는 .default
의 이유입니다.client.createCommand
는 기본적으로 명령어를 등록하고, 명령어 정보로 오브젝트를 받아들인다. 이에 대한 자세한 내용을 읽을 수 있습니다here.명령 처리
이제 명령 처리기를 위해! 먼저
interactionCreate
이벤트 리스너를 만듭니다.client.on('interactionCreate', async (i) => {
});
또한 상호 작용이 명령 상호 작용인지 여부와 존재 여부를 확인해야 합니다.
client.on('interactionCreate', async (i) => {
if (i instanceof CommandInteraction) {
if (!client.commands.has(i.data.name)) return i.createMessage('This command does not exist.');
}
});
i instanceof CommandInteraction
는 기본적으로 i
가 CommandInteraction
객체인지 확인합니다. 그렇다면 명령이 존재하는지 확인하고, 없으면 명령이 아직 구현되지 않았다는 메시지를 보냅니다. 아직 존재하지 않는 명령을 등록할 가능성이 없기 때문에 이런 일이 발생할 가능성은 없지만 등록하는 경우(테스트 또는 자리 표시자와 같은 특정 이유로) 이를 처리하는 좋은 방법입니다.이전에 만든 컬렉션을 기억하십니까? 지금 사용하겠습니다.
client.on('interactionCreate', async (i) => {
if (i instanceof CommandInteraction) {
if (!client.commands.has(i.data.name)) return i.createMessage('This command does not exist.');
try {
await client.commands.get(i.data.name).execute(i);
}
catch (error) {
console.error(error);
await i.createMessage('There was an error while executing this command!');
}
}
});
컬렉션에서 명령을 가져와서 실행하고, 오류가 있으면 기록하고 사용자에게 메시지를 보냅니다.
마지막으로 클라이언트 연결을 잊지 마세요!
// ...
client.connect();
이제
npm run dev
를 실행하고 봇을 테스트할 수 있습니다!결론
그게 다야! 이제 슬래시 명령을 처리할 수 있는 봇이 있습니다.
commands
폴더 아래에 더 많은 파일을 추가하여 더 많은 명령을 추가할 수 있습니다. slash commands 및 Eris 에 대한 자세한 내용을 읽을 수도 있습니다.최종 코드
index.js
:import Eris, { Constants, Collection, CommandInteraction } from 'eris';
import fs from 'fs';
import console from 'consola';
import * as dotenv from 'dotenv';
dotenv.config();
const client = new Eris(`${process.env.TOKEN}`, {
intents: [
Constants.Intents.guilds,
Constants.Intents.guildMessages,
Constants.Intents.guildMessageReactions,
Constants.Intents.directMessages,
Constants.Intents.directMessageReactions,
],
});
client.on('ready', async () => {
console.info(`Logged in as ${client.user.username}#${client.user.discriminator}`);
console.info('Loading commands...');
client.commands = new Collection();
const commandFiles = fs.readdirSync('./src/commands').filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
const command = (await import(`./commands/${file}`)).default;
client.commands.set(command.name, command);
client.createCommand({
name: command.name,
description: command.description,
options: command.options ?? [],
type: Constants.ApplicationCommandTypes.CHAT_INPUT,
});
}
console.info('Commands loaded!');
});
client.on('error', (err) => {
console.error(err); // or your preferred logger
});
client.on('interactionCreate', async (i) => {
if (i instanceof CommandInteraction) {
if (!client.commands.has(i.data.name)) return i.createMessage('This command does not exist.');
try {
await client.commands.get(i.data.name).execute(i);
}
catch (error) {
console.error(error);
await i.createMessage('There was an error while executing this command!');
}
}
});
client.connect();
commands/ping.js
:export default {
name: 'ping',
description: 'Pong!',
execute: (i) => {
await i.createMessage('Pong!');
},
};
오류가 있는 경우 Discord(𝓐𝓭𝓶𝓲𝓻ρ𝓵 𝓒laud𝓷ela𝓻𝓲𝓼#0340)를 통해 저에게 질문하실 수 있습니다.
Reference
이 문제에 관하여(Eris로 Discord Bot 작성(Slash Commands Edition)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/canaris/writing-a-discord-bot-with-eris-slash-commands-edition-5cci텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)