당신에게 꽃을

[디스코드 챗봇] 단지 정기적 알람을 보낼뿐인 node.js 봇 만들기 본문

Game development

[디스코드 챗봇] 단지 정기적 알람을 보낼뿐인 node.js 봇 만들기

이지안 2024. 2. 5. 19:16

발단 - 숙제를 독촉하는 알리미가 필요했다.

 

준비물부터 소개합니다.

- 디스코드 계정 (사용자 설정 -> 고급 -> 개발자 모드 on)

- AWS Lambda, Amazon EventBridge

- Node.js (20.x 버전 사용), discord.js

 

1. 디스코드에 새로운 봇을 생성하고, 액세스 토큰을 얻어옵니다.

discord.js의 공식 문서 링크로 설명을 대체합니다.

디스코드 어플리케이션(봇)을 생성하는 방법

디스코드 서버에 봇을 등록하는 방법

 

2. AWS Lambda 대시보드에 접속합니다.

현재 연결된 리전을 확인합니다. 엄청난 영향은 없지만 되도록 물리적으로 가까운 지역을 선택합니다.

저는 실수해서 미국 리전에 만들었는데, 테스트해보니 메시지 전송에 딜레이가 있긴 했습니다.

 

3. 새로운 함수를 생성합니다.

주황색 <함수 생성> 버튼 클릭
새로 작성

저는 런타임으로 Node.js 20을 골랐습니다.

 

4. 로컬에서 빈 폴더를 생성합니다.

로컬에 Node.js 20이 설치 된 상태여야 합니다.

생성한 폴더에서 터미널을 실행합니다.

<윈도우 컴퓨터 -> 생성한 폴더 내에서 우클릭 -> 터미널에서 열기>를 하시면 해당 폴더로 경로가 지정된 터미널이 열립니다.

터미널에 다음 명령어를 순서대로 쳐 주세요.

npm init -y
npm install discord.js

 

기다리신 후에, 아래와 같은 폴더 상태가 되면 됩니다.

node_modules 폴더가 중요합니다.

 

5. 아무 폴더에나 nodejs 라는 이름으로 폴더를 생성한 후, 방금 만들어진 node_modules 폴더를 하위로 옮겨넣습니다.

그리고 nodejs 폴더를 .zip 파일로 압축합니다.

이런 압축 파일을 만드시면 됩니다.

 

갑자기 이런 짓을 하는 이유는 AWS Lambda 함수에서 discord.js 패키지를 사용하기 위함입니다.

만들어진 nodejs.zip 파일을 이용해서 AWS Lambda 함수의 레이어(계층)을 설정해 줄 겁니다.

자세한 내용은 Deploy Node.js Lambda functions with .zip file archives에 나와있습니다.

 

6. AWS Lambda 대시보드에서 계층을 추가합니다.

<계층 생성> 버튼을 클릭합니다.

이름/런타임을 지정해 준 후, (5)번에서 만들었던 <nodejs.zip>파일을 올립니다.

하단의 생성 버튼을 누르시면 됩니다.

 

7. (3)번에서 생성했던 AWS Lambda 함수의 대시보드에 들어가서 쭉 스크롤을 내립니다.

<Add a layer> 버튼을 클릭합니다.

 

<사용자 지정 계층>을 선택 한 후, 방금 생성한 레이어를 선택합니다. <추가> 버튼을 누릅니다.

 

8. 패키지가 성공적으로 임포트 되었는지 확인합니다.

코드 최상단에 패키지 import 구문을 한 줄 써주고, 파란색 <Test> 버튼을 누릅니다.

수정 후 적용할때 <Deploy> 버튼이 활성화 되어있다면, <Deploy> 버튼을 눌러 준 후 <Test> 버튼을 눌러주세요.

 

<간접 호출> 버튼을 누릅니다.

 

성공하면 별다른 에러 메시지 없이 실행이 되고, 우측 상단의 Status가 Succeeded로 표시됩니다.

뭔가 잘못되었다면 error message가 응답됩니다.

 

9. 이제 코드를 칩니다.

저는 정말 단순하게, 특정 채널에 이미 지정된 메시지를 보낼겁니다.

 

엄청나게 짧은 코드
파란색 <Test> 버튼을 누르고 기다려보면 잘 갑니다

import { Client, GatewayIntentBits } from 'discord.js';
const client = new Client({ intents: [GatewayIntentBits.Guilds] })

// export const handler를 지우시면 동작하지 않습니다. 핸들러를 지정해야합니다.
export const handler = async (event) => {
  await client.on('ready', () => {
    const channel = client.channels.cache.get('디스코드 서버 채널 ID');
    channel.send('보낼 메시지를 입력하세요');
  });

  await client.login('당신의 디스코드 봇 액세스 토큰을 여기에 넣으세요');
};

디스코드 채널 ID는 <디스코드 앱 -> 봇이 적용된 서버 -> 봇이 메시지를 보낼 채널 이름에 커서를 대고 우클릭 -> 채널 ID 복사하기>를 누르시면 됩니다. 개발자 옵션이 켜져 있어야 해당 메뉴가 보여요.

 

여기까지 하셨으면 진짜 거의 다 하셨습니다!

 

9. 이벤트 트리거를 만듭니다.

<트리거 추가> 버튼을 눌러주세요.

 

EventBridge를 검색하고 선택합니다.

 

선택하시면 아래 추가 정보를 입력해야합니다.

<Create a new rule>, <Schedule expression>을 선택합니다.

저는 특정 요일마다 메시지를 보내는게 목적이여서, <Schedule expression>을 선택했습니다.

 

cron(30 18 ? * 4 2024-2025) // 24년에서 25년 사이에, 매주 수요일, 18시 30분마다

라는 뜻입니다. 작성법은 Cron expressions reference 문서를 읽어보시면 쉽게 조합할 수 있습니다.

 

룰 이름까지 지어준 후에 <추가> 버튼을 눌러주면 완료!

EventBridge 대시보드에 들어가시면 추가된 이벤트를 확인하실 수 있습니다.

이벤트 일정에 나온 날짜에 따라서 알아서 봇 메시지가 가게 됩니다.

 

딱 한 번만 끝까지 해보면 정말 쉽습니다!

다만 이 방법은 챗봇 서버가 항상 살아있는게 아니기 때문에,

유저와 상호소통하기에는 어려움이 있습니다.

 

단순한 리마인더 용도로 쓰신다면 좋을 듯 합니다.

사실 챗봇 커스텀을 하고 싶은게 아니라면 이미 잘 쓰이고 있는 기존 캘린더봇을 쓰면 됩니다...

 

감사합니다.

Comments