리스트
지난 포스트에서는 디스코드 채널에서 발생하는 채팅 이벤트를 봇이 잡아내는 것을 알아봤다. 하지만 이런 경우 불필요한 정보까지 받아오기 때문에 내가 원하는 명령어를 받아올 수 있게 설정할 예정이다.
재시작 계속하기 싫음!
index.js파일을 수정하면 계속 봇을 재시작해야하는 귀찮은 작업이 있다. 이를 해소하기 nodemon을 설치하면 쉽게 해결할 수 있다.
$ npm i -D nodemon
그리고 package.json > script > start를 다음과 같이 수정한다.
... | |
"script": { | |
"start": "nodemon ./index.js" | |
} | |
... |
그리고 봇을 실행하고 index.js 파일을 수정하고 저장만 해도 봇은 재실행된다.
특정 채팅만 명령어로 인식하기.
이제 간단하게 사용자가 !ping이라는 채팅을 치면 이것을 명령어라고 판단하여 봇이 Pong.이라고 답변하는 코드를 작성해보자.
const { Client, Intents } = require("discord.js"); | |
const { discord_token } = require("./config.json"); | |
const client = new Client({ intents: [Intents.FLAGS.GUILDS] }); | |
client.once("ready", () => { | |
console.log("Ready!"); | |
}); | |
client.on('message', message => { | |
if(message.content === '!ping') { | |
message.channel.send('Pong.') | |
} | |
}) | |
client.login(discord_token); |
11-13번째 줄처럼 모든 채팅을 판단하여 만약 !ping 채팅이라면 Pong.이라고 답변하게 만들었다.
명령어 추가하기
명령어는 다음과 같이 추가할 수 있다.
...
if( message.content === '!ping') {
message.channel.send('Pong.')
} else if (message.content === '!beep') {
message.channel.send('Boop.')
}
...
...
이렇게 추가 할 수 있지만. config.json 파일에서 설정한 prefix를 통해 원하는 문자 + 명령어를 설정 할 수 있다.
const { prefix, discord_token } = require('./config.json')
...
client.on('message', message => {
if( message.content === `${prefix}ping`) { // use backtick
message.channel.send('Pong.')
} else if (message.content === prefix + 'beep') { // normal
message.channel.send('Boop.')
}
...
...
서버 관련 명령어
봇을 만드는 과정에 많은 데이터가 필요 할 수 있다. 예를들어 명령어를 호출한 유저 정보, 채널 정보, 채팅 정보 등이 필요한 경우 해당 데이터를 가져오는 방법은 다음과 같다.
const { prefix, _ } = require('./config.json') | |
client.on('message', message => { | |
if(message.content === `${prefix}ping`) { | |
message.channel.send('Pong.') | |
} else if(message.content === `${prefix}beep`) { | |
message.channel.send('Boop.') | |
} else if(message.content === `${prefix}server`) { | |
message.channel.send(`This server's name is: ${message.guild.name}`) | |
} | |
}); |
현재 서버에 있는 멤버 수를 확인하려면 다음과 같이 입력하면 된다.
const { prefix, _ } = require('./config.json') | |
client.on('message', message => { | |
if(message.content === `${prefix}ping`) { | |
message.channel.send('Pong.') | |
} else if(message.content === `${prefix}beep`) { | |
message.channel.send('Boop.') | |
} else if(message.content === `${prefix}server`) { | |
message.channel.send(`This server's name is: ${message.guild.name}\nTotal Members: ${message.guild.memberCounts}`) | |
} | |
}); |
유저 정보 명령어
이번엔 유저 정보를 가져오는 명령어를 테스트해보자.
const { prefix, _ } = require('./config.json') | |
client.on('message', message => { | |
if(...) { | |
... | |
} else if (message.content === `${prefix}user-info`) { | |
message.channel.send(`Your username: ${message.author.username}\nYour ID: ${message.author.id}`); | |
} | |
}); |
마치며
오늘은 봇에게 명령어를 추가하는 법을 배워보았다. 특정 명령어에 추가 정보를 더 받아야 하는 경우 어떻게 처리하는지와 봇이 명령어를 7~8개 미만으로 사용한다면 문제가 없지만 그 이상일 경우와 외부 라이브러리를 활용해야할 경우 if/else if
를 사용할 때 코드가 길어지고 보기 싫은 경우가 많다. 다음 포스팅에서는 코드를 파일로 나누어 사용하는 법을 알아보도록 하자.