개요
2년 전부터 재미로 만들어서 여러 서버에 잘 사용하고 있는 봇이 있다.
그 봇은 나의 NodeJS 기술력을 융합하여 만들어낸 특별한 프로그램이다.
먼지 쌓인 서버 안에서도 24시간 2년 내내 열일하고 있는 봇의 모습을 보며, 나 혼자만 갖고 있긴 아쉬운 녀석이라고 생각했다.
따라서 오늘부터 천천히 디스코드봇 개발에 관심 있는 자들을 위한 튜토리얼을 시작하고자 한다.
게시글 제목을 10분 만에 제작한다고는 했지만, PC사양이나 환경에 따라서 실제로는 5분 또는 20분이 걸릴 수 있다.
구성
진행하기 앞서, 내가 사용한 Tool을 미리 열거해 두도록 하겠다.
- Windows10
- NodeJS
- DiscordJS
- Javascript
- VisualStudio Code
진행
1. 툴 설명
특별히 복잡한 툴을 사용하지 않는다.
간단히 내가 참여하고 있는 서버에서 만족할만한 프로그램을 만드는 일이니깐.
NodeJS는 DiscordJS라는 라이브러리를 실행해 주기 위한 일종의 Javascript 실행기이다. 그러니 당연히 사용하는 언어도 Javascript이다.
원래 DiscordJS는 디스코드에서 공식적으로 지원해 주는 라이브러리가 아니다.
다양한 오픈소스 개발자들이 각자 자신 있는 언어로 구현한 것이 디스코드 봇 라이브러리들이다.
따라서 원한다면 파이썬으로 구동되는 Discord.py 나 C#등 다른 언어에서도 사용이 가능하다.
하지만 Javascript와 NodeJS의 시장이 어마어마하게 크고 Discord.js 커뮤니티도 다른 라이브러리들에 비해 가장 활발하기 때문에 Javascript기반 Discord.js를 택하기로 했다.
2. 디스코드 개발자 계정 세팅하기
디스코드 봇을 작동시키기 위해서는 이 봇이 누구의 소유인지 정하는 과정이 필요하다.
보통 봇에 Token을 입력하게 되는데 Token을 얻기 위해서는 디스코드 개발자포털에서 발급하는 과정이 필요하다.
아래 사이트에 접속하도록 한다.
https://discord.com/developers/applications
여기서 내가 가지고 있는 디스코드 계정으로 로그인을 하도록 한다.
그러면 아래와 같은 화면이 뜨게 된다.
여기서 오른쪽 상단에 New Application을 클릭하도록 한다.
이름은 내가 대충 좋아하는 발사믹식초에서 따온 이름으로 지었다.
예쁘게 이름을 지어줬으면 정책 체크를 한 뒤 Create를 누르도록 한다.
그러면 대시보드가 뜨게 되는데, 왼쪽에 Bot탭을 클릭 후
Refresh Token 버튼을 클릭한다.
Yes를 클릭 후 내 디스코드 비밀번호를 입력하면 아래의 사진처럼 새로운 시크릿 키가 발행된다.
발급된 키는 소중하게 복사해서 절대 다른 사람이 보지 못하는 곳에 보관하도록 하자.
그리고 마지막으로 중요!!!
해당 봇이 상태 변화를 감지하도록 할 것인가?
서버 멤버들의 활동을 감지하도록 할 것인가?
봇이 메시지를 읽을 수 있게 할 것인가?
등을 허가해 주고 Save Changes를 눌러야 한다.
이 과정을 마치면 개발자 계정 세팅은 완료된 것이다.
3. 개발환경 세팅하기
DiscordJS 봇은 Javascript코드에 의해 동작한다.
근데 우리는 Javascript를 실행시키기 위한 머신(Machine) 이 필요하다.
이런 꿈을 실현시키기 위한 머신(Machine)은 정말 유명한 NodeJS이다.
아래의 사이트에서 NodeJS를 다운로드하도록 하자.
내가 권장하는 버전은 20.17.0인데 어차피 DiscordJS가 지속적인 업데이트가 되다 보니 호환이 잘 될 것이므로 그냥 LTS(Long term support : 오랫동안 지원해 주는 버전)로 다운받으면 된다.
계속 Next를 누르다 보면 설치가 완료될 것이다.
설치가 잘 됐는지 확인하려면 CMD(명령프롬프트)를 켠 다음 `node -v` 를 입력하면 버전이 뜨는데,
내가 설치한 NodeJS 버전이 보이면 제대로 설치가 된 것이다.
그다음은 DiscordJS의 코드를 작성하기 위한 편집기(IDE : Intergrated Development Environment)가 필요하다.
우리가 사용하게 될 편집기는 VisualStudio Code이다. 본인이 좋아하는 다른 IDE가 있다면 이 과정은 생략해도 된다.
아래의 주소에서 다운받아 설치하도록 하자.
https://code.visualstudio.com/
여기까지 진행했다면 기본적인 개발환경 세팅은 끝났다.
이제부터는 본격적으로 프로젝트를 만들어 보자.
4. 디스코드 봇 프로젝트 생성하기
디스코드 봇 소스코드를 넣어두고 실행시킬 폴더를 생성하도록 하자.
내가 만들어둔 경로는 `C:\Users\dev\discordbot`이다.
귀찮으면 바탕화면에 만들어둬도 된다.
이번엔 방금 설치했던 Visual Studio Code를 열어보도록 하자.
이러한 화면이 뜨게 되는데 여기서 Open Folder를 눌러준다.
그리고 방금 생성한 봇 전용 폴더를 열어준다.
터미널 창을 실행시켜야 하는데 Terminal 탭 > New Terminal로 열어준다. 사진에 표시된 단축키로도 열 수 있다.
그러면 하단에 터미널 장이 뜨게 되는데, 이걸로 NodeJS 프로젝트를 생성해 줄 것이다.
커맨드 창에 아래와 같이 입력해 준다.
<입력>
npm init
<출력>
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (discordbot)
순서대로 패키지명, 버전, 설명, 시작파일, 테스트커맨드 등을 입력하라고 나오는데, 이 부분은 수정할 부분은 수정해도 되고 귀찮으면 엔터만 연타하면 된다.
완료되면 이렇게 package.json이라는 파일이 생기게 된다.
해당 파일은 NodeJS가 이 프로젝트에서 사용하는 커맨드, 모듈, 버전들을 확인하는 용도로 사용하기 때문에 없어서는 안 되는 파일이다.
package.js 안에 "main" 항목이 "index.js"로 세팅이 되어있기 때문에 해당 파일을 메인 실행파일로 두겠다는 의미이다.
따라서 새 파일 추가 버튼을 클릭하고 index.js를 만들어준다.
그다음 config.json이라는 파일을 추가해 사진처럼 Token에 아까 복사해 둔 봇의 Token을 붙여 넣자. 여기서 중요한 것은 절대로 config.json 파일이 외부로 유출되면 안 된다는 것이다. Token 들어 있으니 깃 버전 관리툴을 사용할 때도 config.json을 .gitignore에 반드시 명시해 두자.
이제 discord.js 패키지 설치를 위해 터미널에 아래와 같이 입력해 준다.
npm install discord.js
그러면 이렇게 dependencies 안에 discord.js 패키지가 추가되고, 이제 디스코드 봇을 만들기 위한 모든 준비는 끝났다.
5. 봇 코드 작성하기
이제 index.js 파일 안에 아래와 같이 코드를 작성하도록 한다.
<index.js>
// 1. 주요 클래스 가져오기
const { Client, Events, GatewayIntentBits } = require('discord.js');
const { token } = require('./config.json');
// 2. 클라이언트 객체 생성 (Guilds관련, 메시지관련 인텐트 추가)
const client = new Client({ intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
]});
// 3. 봇이 준비됐을때 한번만(once) 표시할 메시지
client.once(Events.ClientReady, readyClient => {
console.log(`Ready! Logged in as ${readyClient.user.tag}`);
});
// 4. 누군가 ping을 작성하면 pong으로 답장한다.
client.on('messageCreate', (message) => {
if(message.content == 'ping'){
message.reply('pong');
}
})
// 5. 시크릿키(토큰)을 통해 봇 로그인 실행
client.login(token);
DiscordJS는 이벤트 기반 라이브러리이다.
따라서 위의 코드처럼 순서대로 실행이 된 후 3번 같이 특정 이벤트가 발생하면 원하는 명령어를 수행할 수 있다.
1. 주요 클래스들을 가져와 사용한다고 선언한다. 또한 token변수를 생성하고 방금 만들어둔 config.json 파일로부터 token값을 가져온다.
2. client 객체를 만들 때 Guilds 인텐트를 가져오는데 인텐트가 존재하는 이유는 만약 디스코드 채널 내에서 사용자가 남기는 메시지, 활동, 로그인 로그아웃 등 모든 활동을 이벤트로 받게 되면 필요 없는 자원 낭비로 이어지게 된다. 따라서 듣고자 하는 이벤트 묶음만 정해주도록 해야 한다.
3. once는 해당 이벤트가 발생할 때 딱 한 번만 실행한다는 뜻이다
4. on은 해당 이벤트가 발생할 때마다 실행한다는 뜻이다.
5. 모든 준비가 완료되면 봇도 디스코드에 로그인시켜 준다.
이제 터미널 창에
node index.js
를 입력하고 엔터를 눌러보면 Ready! Logged in as `봇이름#태그` 가 표기될 것이다.
6. 봇 초대하기
봇을 초대하기 위해서 초대 링크를 생성해야 한다.
Discord developer portal 사이트로 다시 들어가 OAuth2 탭을 클릭하도록 한다.
그리고 여기서 bot 체크를 해주고 아래로 내린다.
![[Pasted image 20240905103426.png]]
나는 개발용으로 사용할 것이기 때문에 Administrator 권한을 줬는데 나중에 정식 릴리즈를 할 경우 사용할 권한만 주는 것이 맞다. (서버에 참여한 봇이 어쩌다 토큰을 탈취당했을 때, 제삼자에 의해 서버 자체가 파괴되는 수준에 이를 수도 있기 때문이다.)
이렇게 링크가 생성된 후 해당 링크로 접속을 하면
이렇게 뜰 것이다. 여기서 내가 관리 중인 서버를 선택하고 계속하기를 누르면 된다.
만약 다른 서버에 추가하고 싶다면 서버 방장에게 해당 링크를 주면 된다.
서버에 초대하고 테스트를 해본모습이다.
결론
디스코드와 코딩 자체를 처음 입문해 보는 초보 개발자 분들을 위해 설치부터 코드까지 최대한 상세하게 설명하려 하다 보니 글이 길어지게 되었다.
discordjs 문서가 정말 잘 되어있다 보니 더 자세한 내용은 아래 사이트에서 확인하면 될 것 같다.
'⚙️ Node.js' 카테고리의 다른 글
[NodeJS] 엑셀의 차트, 함수, 그래프 유지하며 저장하기 with xlsx-populate (0) | 2024.10.04 |
---|---|
[NodeJS] 아주 쉽게 타입스크립트 적용하기 (1) | 2024.09.05 |
[NestJS] Async, 비동기로 인한 프로세스 중단 방지 (0) | 2024.08.21 |
[Javascript 심화] 함수 1 (0) | 2024.01.28 |
[Javascript 심화] 배열 (0) | 2024.01.28 |