Discord 베스트 포스트 추천 봇 만들기 시리즈

Description: Discord 봇을 만드는 과정, 실제 프로덕션 서비스에서의 트러블슈팅, 24시간 서비스 운영, 시크릿 삭제를 위한 커밋삭제등 전체적인 프로젝트 일대기를 담은 시리즈입니다.

#300#Applications#330#Backend#330.20#Discord_AI_Bot_Development_Best_Post_Recommendation#330.20 a#Discord_베스트_포스트_추천_봇_만들기_시리즈

Discord 베스트 포스트 추천 봇 만들기 시리즈

README 기반 프로젝트 설명

소스 링크 https://github.com/murphybread/discordbot-bestpost

구현 목적

디스코드의 쓰레드(포스트) 기반으로 해당 쓰레드에 추가된 서브 메시지와 이모지의 수를 측정하여 best 쓰레드를 선정하는 프로그램입니다
우아한테크코스 프리코스 커뮤니티의 경우 열정이 많은 다양한 사람들이 정보를 주고받는 만큼 그 정보가 다른사람에게 잘전파되면 좋겠다 생각하였고 이를 디스코드 추천봇형태로 만들면 어떨까 생각하게 됐습니다. 그렇다면 글을 쓰는 사람들 입장에서 더 힘이나고, 찾아보기 어려웠던 사람들이 좋은 데이터를 얻게 되면서 쓰는 사람, 읽는 사람 모두에게 도움이 될거라 생각했기 때문입니다.
추가적으로 이런 시기가 아니면 불가능한 데이터들이기에 이번 기회에 해보자라고 생각했습니다.

설치 방법
소스 다운로드
gie clone https://github.com/murphybread/discordbot-bestpost.git

필요한 라이브러리 다운
npm install

시크릿 설정

.env

DISCORD_TOKEN=<BOT TOKEN>
CHANNEL_ID_1=<19digit numbers>
CHANNEL_ID_2=<19digit numbers>
CHANNEL_ID_3=<19digit numbers>
USER_ID=<18digit numbers>

최소 해당 기능을 가진 디스코드 봇이 채널에 오프라인상태로 존재
discord scope
    [✓] bot
    [✓] applications.commands

discord bot권한
     [✓] Send Messages
     [✓] Embed Links
     [✓] Read Messages/View Channels
     [✓] Use Slash Commands

실행 방법

기본적으로 수집을원하는 서버와 채널들에 오프라인 상태로 해당 봇이 존재해야함

  1. node main.js를 통해 디스코드 봇을 로그인합니다.
    로그인 성공 예시 터미널
발견된 커맨드 파일들: [ 'dailyrecommend.js', 'weeklyRecommend.js' ]
로딩된 커맨드: 오늘의추천
로딩된 커맨드: 이번주추천
Discord 클라이언트 로그인 완료
봇이 준비되었습니다! 로그인: botname#0000
등록된 커맨드들: [ '오늘의추천', '이번주추천' ]

  1. node getmetadata.js를 통해 각 채널의 정보들을 저장합니다. 처음 하는 경우에는 모든 데이터가 잘 저장되늕지 화면을 확인해주세요. 각 채널이 정상저장되면 channels 디렉터리 밑에 채널이름 디렉터리가 생성되고 그 밑에 채널이름.json 이 저장되고, 모든 채널이 저장되면 data 디렉터밑에 currentThreadData.json파일이 생성됩니다.
    예시 성공터미널
Fetched channel: �│채널이름 (ID: 120000000), Type: 15
Successfully fetched 63 active threads in forum channel.

Processing thread: 해당 쓰레드이름 (ID: 13000000000000000)
1번째 쓰레드 총 63

threadCreatedAt: Sun Nov 03 2024 12:33:45 GMT+0900 (대한민국 표준시)
weekNumber: 3
messages.size : 2

Processing thread: 해당 쓰레드이름 (ID: 13000000000000000)
2번째 쓰레드 총 63

  1. node comparemetadata.js명령어를 통해 주간 besst5포스트를 위한 데이터를 따로 생성합니다. 생성 성공시 다음과 같이 2개의 파일이 각 주차별 디렉터리에 생성됩니다
  1. 해당 채널에서 슬래쉬(/)를 입력후 필수 옵션인 채널이름과 주차를 선택하여 명령을 수행합니다.
    명령어 입력

오늘의 추천 결과

이번주 추천 결과

프로그램 구조

├── README.md
├── channels
│   ├── channel_📚│함께-나누기
│   ├── channel_📝│토론하기
│   └── channel_🔸│다시-돌아보기
├── commands
│   ├── dailyrecommend.js
│   └── weeklyRecommend.js
├── comparemetadata.js
├── data
│   └── currentThreadData.json
├── deploy-commands.js
├── getmetadata.js
├── main.js
├── package-lock.json
├── package.json
├── savemetadata.js
└── temp

디스코드 봇 기능 수행

main.js: 디스코드 봇 로그인
deploy-commands.js: commands 아래의 파일들에 대해 커맨드 등록
commands 디렉토리: 각 커맨드 등록 파일

파일 수집
getmetadata.js: 입려된 채널ID를 바탕으로 각 채널의 쓰레드를 수집하고 해당 쓰레드의 정보 수집

수집항목

        channelId: thread.parentId,
        channelName: thread.parent.name,
        threadId: thread.id,
        threadName: thread.name,
        threadLink: `https://discord.com/channels/${thread.guild.id}/${thread.id}`,
        creationDate: threadCreatedAtKST,
        weekNumber,
        mainPostReactions,
        totalReactions,
        messageCount: messages.size,
        author: authorName,

파일 저장

savemetadata.js: 쓰레드 정보를 파일로 저장. 여러 저장 메소드 사용

best5 쓰레드 포맷팅

comparemetadata.js : 각 주의 데이터중에서 총 리액션 + 총 서브메시지수 합 5개를 따로 저장 이후 이번주추천에서 사용

포맷팅된 파일은 출력용 다음의 정보만 저장

            threadName: post.threadName,
            totalReactions: post.totalReactions,
            messageCount: post.messageCount,
            threadLink: post.threadLink,
            author: post.author,
            creationDate: post.creationDate

필요한 파일
.env

DISCORD_TOKEN
CHANNEL_ID_1
CHANNEL_ID_2
CHANNEL_ID_3
USER_ID

discord scope
    [✓] bot
    [✓] applications.commands

discord bot권한
     [✓] Send Messages
     [✓] Embed Links
     [✓] Read Messages/View Channels
     [✓] Use Slash Commands