GongGu Blog
article thumbnail

저번 포스팅에서는 디스코드 봇을 만들기 위해 필요한 환경 구성을 진행하였습니다. 이번에는 프로젝트 디렉토리를 만들어서 본격적인 개발을 시작해보려 합니다.

우선 제일 먼저 개발 할 디렉토리를 생성해 주도록 하겠습니다. 원하는 경로에 본인이 개발하고자 하는 봇의 이름으로 폴더를 생성합니다. 포스팅을 위해 만드므로 저는 "TestDiscordBot"으로 지어 주도록 하겠습니다. 그러면 이제 해당 폴더로 들어가서 제일 베이직 한 프로젝트 생성 작업을 해보겠습니다.

먼저 첫번째 포스팅에서 설치한 Visual Studio Code를 열어 먼저 폴더 경로를 열어 보겠습니다. 상단의 File 에서 Open Folder... 를 눌러 생성한 폴더를 선택해주면 해당 경로에 맞추어 새창을 생성해줍니다.하지만 폴더에 아무것도 없어 파일 목록이 보이지 않습니다. 이제 기본적인 nodejs를 사용하기 위해 package.json 파일을 설치하고 node-modules 폴더를 만들어 패키지를 설치해야 하는데 직접 파일을 만들기는 번거로우니 npm 에서 제공하는 프로젝트 기본 설정 명령어를 통해 만들어 보려합니다.

우선 Visual Studio Code에서 터미널 창을 이용해 명령어를 실행해야 합니다. 상단에 Terminal 탭을 누르고 New Terminal 를 클릭하면 프로그램 하단에 자그마한 창이 생기게 됩니다. 그러고 npm init -y 명령어를 입력하면 원래는 수동으로 설정해주는 것을 스킵하고 폴더 이름으로 자동으로 생성해줍니다.

이제 살펴 보면 폴더에 package.json 파일이 생기게 됩니다. 이 파일은 nodejs에서 프로젝트에 종속성에 관련된 정보를 가지고 있는데 대표적으로 버전이나 설치된 패키지 목록과 버전들을 가지고 있습니다. 이 외에도 다양한 속성과 기능을 부가해서 사용할 수 있으나 지금 디스코드 봇을 만드는데 중요하지는 않으니 다음에 상세하게 설명할 기회가 되면 설명해보도록 하겠습니다.

이제 이 코드는 이 디스코드 봇 프로젝트의 메인 파일이라고 생각 하면 됩니다. 저희는 discord.js 를 이용하여 디스코드 봇을 만들거이기 때문에 다시 terminal에서 다음과 같은 명령어를 입력하여 설치해보도록 하겠습니다.

npm install discord.js 이 명령어는 NPM이라고 하는 Node Package Manager 로써 다양한 라이브러리 패키지를 설치하고 관리하는 툴이라고 보면 된다. 이 명령어를 수행하면 node-modules 폴더가 생성되고 해당 패키지에 필요한 소스 코드들이 안에 폴더별로 생성이 됩니다. 그리고 pacakge.json 파일에 설치한 라이브러리의 버전이 추가 되는 것을 볼 수 있습니다.

Visual Studio Code로 돌아와 좌측에 위치한 탐색기에 빈곳을 누르고 New File 을 눌러 새로운 파일을 생성하겠습니다. 이름은 app.js 혹은 index.js 를 많이 사용하는데 저는 index.js 라 이름으로 만들어 보겠습니다.

그다음 첫번째 게시물에서 생성한 우리의 토큰을 기억하실 겁니다. 형상관리 등을 통해서 오픈된 공간에 코드를 관리할 경우에는 문제가 될 수 있으니 따로 config 파일을 만들어서 해당 파일에 토큰을 입력하고 가져와서 사용하도록 하겠습니다.

그러기 위해서는 우리는 새로운 설정파일을 만들어야 하는데 아까와 동일하게 파일을 생성하고 이름을 config.json으로 만들어 주도록 하겠습니다.

주의 점
토큰은 처음 봇을 생성할 때만 볼 수 있으므로 만약 까먹었거나 적어놓지 않았다면 다시 봇 https://discord.com/developers/applications/ 사이트에 접속해 Bot 탭에서 Token을 리셋하여 확인한 후 복사하도록 해야합니다.

그러면 봇을 시작하기 위한 최소한의 준비가 완료 되었으므로 이제 index.js 파일에 다음과 같은 코드를 작성합니다.

// Require the necessary discord.js classes
const { Client, Events, GatewayIntentBits } = require('discord.js');
const { token } = require('./config.json');

// Create a new client instance
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

// When the client is ready, run this code (only once)
// We use 'c' for the event parameter to keep it separate from the already defined 'client'
client.once(Events.ClientReady, c => {
    console.log(`Ready! Logged in as ${c.user.tag}`);
});

// Log in to Discord with your client's token
client.login(token);

이제 봇을 온라인 상태로 만들 준비가 되었습니다. 간단하게 코드를 설명해 보자면 맨위에 2줄은 discord.js에서 사용하는 클래스들을 import 하고 우리가 만든 config.json 파일에서 token이라는 이름으로 값을 가져오는 선언 역할을 한다고 볼 수 있습니다.

그다음 client에서 intent 값을 설정해줍니다. 디스코드에는 여러 intent가 생겼고, 인증되지 않은 봇과 보안등의 문제로 도입된 개념입니다. 샘플코드에서 사용하는 Guilds는 현재 봇이 속해있는 디스코드 채널을 의미한다고 보면됩니다.

그다음 이벤트 중에 ClientReady 이벤트가 발생했을 때 콘솔에 로그메세지를 띄우도록 설정합니다. 대표적인 이벤트는 다음과 같습니다.

이벤트 (Events)

디스코드에서 발생하는 다양한 이벤트를 정의 해놨습니다. 대표적으로 많이 사용하는 것을 소개하고 더 많은 이벤트 내용은 (https://discord.js.org/#/docs/discord.js/main/typedef/Events) 에서 자세하게 확인 할 수 있습니다.

  • ClientReady : 디스코드 봇이 온라인이 되었을 때 발생하는 이벤트로 준비완료 상태
  • InteractionCreate : 상호작용이 생성 되었을 때 발생하며, SlashCommand을 실행하거나 버튼을 누른다거나 할 때 발생한다.
  • MessageCreate : 새로운 메세지가 생성되면 발생한다.
  • VoiceStateUpdate : 음성채널에 변화가 생기면 발생한다.
  • PresenceUpdate : 멤버의 상태의 변화가 있으면 발생한다. 예를 들면 로그인 로그아웃을 하거나 활동이 변경될 때

마지막으로 우리가 발급받은 토큰을 기준으로 login을 시도합니다. 만약 여기서 에러가 발생하였다면 토큰이 잘못 되었거나 코드를 잘못 입력하였거나 token을 가지고 있는 파일의 경로나 이름이 다를 수 있으니 꼭 체크해보도록 합니다.

그리고 나서 다시 Terminal로 돌아와서 다음과 같이 node index.js를 입력하고 스크립트를 실행 시킨 후 디스코드로 돌아와 보면 우리가 만든 봇이 온라인으로 변경된 것을 확인할 수 있습니다.

profile on loading

Loading...