본문 바로가기
2024/프로젝트

[WriteMate] 디스코드 봇 만들기

by ye-jji 2024. 3. 12.

Intro

블로그 글 쓰기 스터디를 진행중이다. 일주일에 적어도 한개의 글을 작성해서 공유하는 스터디로 기록의 중요성은 알지만 신경쓰지 않으면 계속 놓치기 때문에 시작하게 되었다. 약간의 강제성을 위해 벌금을 내기로 했다. 그게 효과가 제일 좋을것 같다는 생각에..^^

 

근데 참가자들이 정해진 기간 내에 글을 작성하는 것을 체크하고 벌금을 기록하는 일을 매주 반복하는것이 아주 약간은 귀찮기도 하고 원래 그런건 자동, 반복 같은 키워드가 들어가면 대신해줄 무언가를 개발하는 것에 관심이 가기 마련 아닐까?

 

저런 생각들을 하다가 찾아보니 javascript로 개발이 가능하다는 글을 보았다. 갑자기 흥미가 생기면서 개발해봐야겠다는 생각이 들었다.

 

Step 1 환경 세팅

 일단 이름을 정해야 했다. 이럴 땐 GTP가 추천해 주는 이름이 최고라고 생각한다. 여러가지 후보가 있었지만 WriteMate이 이름이 귀여운 느낌이라서 골랐다. 그리고 이미지도 생성해 달라고 했는데 정말 귀여운 이미지를 만들어주었다.

WriteMate 이미지

 

이제 이걸 디스코드에 등록하면 첫번째 단계는 끝이다.

등록하는 과정은 디스코드 웹 사이트에서 로그인한 뒤 개발자 모드에서 봇 토큰을 발급하면 된다.

 

오른쪽 상단의 버튼을 클릭하면 생성할 수 있다. 디스코드 설정은 다음 블로그를 참고해서 진행했다.

 

https://gonggu09.tistory.com/43

 

[Discord.js] Node.js를 활용해 디스코드 봇을 만들어 보자 (1)

안녕하세요. 디스코드에서 제공하는 API를 기반으로 만든 discord.js 를 이용하여 디스코드 봇을 간단하게 만들어보려 합니다. 첫번째 게시물에서는 node.js를 컴퓨터에 설치하는 법과 개발에 필요한

gonggu09.tistory.com

 

그리고 나서 개발 환경을 세팅해야 한다. 프로젝트 디렉토리를 생성하고 다음 명령어를 입력해 주면 된다.

//폴더 생성 후 터미널 열어서 입력
//자동으로 package.json 생성
npm init -y

//discord Node Package Manager 설치
npm install discord.js

 

STEP 2 개발 시작하기

개발 목표는 디스코드 채널에 메세지를 입력했을 때 콘솔에 나오게 하는 것이다.

그러려면 먼저 index.js 파일을 생성해주고 아까 디스코드 봇을 서버에서 생성할 때 나왔던 토큰을 환경변수나 외부 변수로 설정해주면 된다. 그리고 나서 필요한 것들을 상단에 불러온다.

const { Client, Events } = require('discord.js');
const { token } = require('./config.json');

 

만약 디스코드 봇이 연결이 잘 된다면 봇을 불러온 서버에는 봇이 온라인으로 표시된다. 확실하게 확인하게 위해 node index.js를 실행시키면 준비가 되었다는 콘솔 로그를 띄우는 코드를 작성했다.

client.once(Events.ClientReady, (c) => {
  console.log(`Ready! Logged in as ${c.user.tag}`);
});

client.login(token);

 

대표적인 디스코드 이벤트

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

추가로 확인하려면 이 사이트를 방문해서 공식문서를 확인하면 된다.

https://discord.js.org/docs/packages/discord.js/14.14.1

 

discord.js

discord.js is a powerful Node.js module that allows you to interact with the Discord API very easily. It takes a much more object-oriented approach than most other JS Discord libraries, making your bot's code significantly tidier and easier to comprehend.

discord.js.org

 

그리고 나서 유저가 메세지를 서버 채널에 보낼 때 그 내용을 가져오는 코드를 작성했다. 아래는 전체 코드이다.

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

// `GatewayIntentBits.GuildMessages`를 인텐트에 추가합니다.
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent, // 메시지 내용에 접근하기 위해 필요
  ],
});

client.once(Events.ClientReady, (c) => {
  console.log(`Ready! Logged in as ${c.user.tag}`);
});

// 메시지 생성 이벤트 리스너를 추가합니다.
client.on(Events.MessageCreate, (message) => {
  // 봇이 보낸 메시지는 무시합니다.
  if (message.author.bot) return;

  // 콘솔에 메시지 내용을 출력합니다.
  console.log(`메시지 받음: ${message.content}`);
});

client.login(token);

 

그런데 오류가 발생했다. 그 이유는 디스코드 개발자 페이지에서 봇이 메세지에 접근할 수 있는 권한을 설정하지 않았기 때문이었다.

 

마지막에 있는 MESSAGE CONTENT INTENT를 허용해야 메세지를 받을 수 있다. 그러면 다음과 같이 메세지를 받을 수 있다.

 

오늘은 여기까지!