JS로 디스코드 봇, 이삼이를 만들자.

희썽·2024년 2월 5일
17

디스코드 봇

목록 보기
1/2
post-thumbnail

디스코드 봇

나는 디스코드를 접한지 오래 되지 않았다.
교내에서 진행한 여름 헤커톤으로 인해 디스코드를 시작하게 되었다.

또래 친구들에 비해서 늦게 디스코드를 접한 내가, 디스코드 봇을 만들었다고? 나도 믿기지 않는다.

디스코드에는 사용자들이 만든 봇이 많다는 것 정도는 알고 있었다. 어느 날, 나는 친구와의 회의 이 후 디스코드 봇 노래하는 하리보를 접하게 되었다.

!! play 주소

를 입력하니 음성방에서 노래가 흘러나오기 시작했다. 처음 접한 봇이기도 했는데 너무 신기했고, 이 때부터 디스코드 봇에 대해서 관심이 매우 높아졌다.

그리고 이삼이를 만들었다.

봇 생성

봇 생성에 대한 글은 여기를 참고하길 바란다. 개인적으로도 이 자료를 보고 봇을 생성했다.

위 글에도 나와있지만 OAuth2로

코드를 넣어 실행하고, test 서버 (본인이 지정한 서버)에서 계속 적용되기에 개발에 훨씬 유용하다. 꼭 이렇게 하길 바란다.

이삼이

이삼이에 대해서 소개 해야한다. 이삼이는 한국 시간 23시면

커밋하세요

라고 디스코드에 알려주는 봇이였을뻔 했다.
이렇게 말이다.

그런데.

이왕 만들거 나한테 도움되는 걸 만들자

라고 생각을 했다. 한국 시간 23시에 커밋하세요! 라고 메세지를 보내는 것을 처음에 생각한 계기는
이것 이였다. TodoList 앱에 팔로우 되어있던 친구가 타이머까지 설정해놓으며 커밋에 열중하고 있었기에 시도를 했었다. 근데 나한테는 이게 크게 의미가 없었다. 11시라고 시간을 정해놓고 커밋 하는 유형이 아니고, 하루에 공부한 내용을 그때그때 커밋하고 있었기 때문이다.

그렇게 다른 봇을 만들기로 생각하고, 내가 쓴 벨로그 글을 홍보해주는 봇 이삼이를 만들게 되었다.

이삼이의 역할은 @huise0ng 벨로그에 새로운 글이 올라온다면

이렇게 디스코드 방에 알림을 보내준다.

이삼이를 만드는 과정

이삼이를 만들기 위해서는 3가지가 필요하다.

  1. Bot 토큰
  2. 채널 ID
  3. Velog 사용자의 RSS 피드 URL

토큰과 채널 ID의 자료는 구글에 흔하니 찾아보길 바라고, Velog 사용자의 RSS 피드 URL에 대해서 설명하겠다.

RSS 피드 URL에 대해서는 https://velog.io/@nandong1104/RSS 이 글을 보고 알게 되었다.
형식은
https://v2.velog.io/rss/@벨로그 사용자 이름
이다. 나같은 경우 벨로그 사용자 이름이 haehae 라면
htttps://v2.velog.io./rss/@haehae 가 되는 것이다.

위 3가지를 활용해야하는 소스코드는 여기에 있다.

개발을 하면서
처음 코드를 짤 때는 1시간마다 RSS 피드 URL을 조회해 최신 글을 디스코드에 알려주는 방식이였다.

만 1시간을 기다리며 너무 시간이 길다는 것을 느꼈고, 내가 새로 쓴 글이 없으니 1시간 후 똑같은 글이 다시 디스코드에 올라오는 현상이 일어났다.

당시에는 너무 당황했다.

뭐야,ㅠㅠ 왜 똑같은 글이 또 올라와?

지금 생각해보면 당연한 현상이였다. 1시간마다 조회하고, 최신글을 디스코드에 알려준다. 절대 코드에는 똑같은 글은 안알려준다가 없었다.

    console.log(`${client.user.tag}가 디스코드에 연결되었습니다!`);
    checkVelogFeed(); 
    setInterval(checkVelogFeed, 60 * 60 * 1000); // 1시간 마다 조회 ㅠㅠ
});

문제는 단 두가지.

  1. 1시간 조회는 너무 길다.
  2. 최신글이 없다면 똑같은 글이 계속 디스코드에 올라가게 된다.

하나씩 고쳐보았다.
1번은 10분마다 한번씩 조회로 코드를 수정했다.

    console.log(`${client.user.tag}가 디스코드에 연결되었습니다!`); 
    checkVelogFeed(); 
    setInterval(checkVelogFeed, 10 * 60 * 1000); // 10분마다 조회!
});

1번 문제는 간단하게 조회 시간만 바꾸면 되는거라 쉽게 수정했다.

2번을 수정하기 위해서는
만약 10분 후 조회를 했을 때 10분 전과 최근 글이 똑같다면 디스코드에 메세지를 보내지 않는다를 추가해야했다.

async function checkVelogFeed() { // Velog RSS 피드를 확인하고,
    let feed = await parser.parseURL(VELOGBLOG_RSS_URL); // RSS 피드 URL에서 피드를 파싱하고 결과를 feed 변수 저장한다.
    if (feed.items.length > 0) { // 이 부분은 피드에 아이템이 존재한다면 실행된다. 
        const { link, title } = feed.items[0]; // 피드에서 첫 번째(최신 글)와 제목을 추출한다.

        if (link !== lastLink) { // 이 부분은 피드에 첫번째 글이 새롭다면 실행 된다. 
            lastLink = link; // 새 글의 링크를 lastLink 변수에 저장한다.
            const messageChannel = await client.channels.fetch(CHANNEL_ID); // 채널 아이디에 맞는 채널을 가져오고,
            if (messageChannel) {
                messageChannel.send(`희성님의 벨로그에 새 글이 올라왔어요! ${title}\n${link}`); // 채널 아이디와 일치하는 채널에 메세지를 보낸다. 
            }
        }
    }
}

그래도 조금 어려웠지만 해결을 했다.
코드보다도 어려웠던 것은 존재한다면을 어떻게 적용시켜야하는지였다.

여러 디스코드 봇 만들기 글들을 보고, 존재한다면을 적용시키는데 성공했다.

이제는 10분이 지나도 새 글이 아니라면 이삼이도 메세지를 보내지 않는다.

이삼이를 다시 실행시킨 6시 26분에 이삼이가 한번 더 메세지를 보내주었고 (전에 이삼이가 한번 말하고 그후로 아무도 말을 안해서 두 개의 메세지가 붙어 시간이 나오지 않았습니당) 다시 확인한 6시 37분 새로운 글이 없었던 나의 블로그를 보고, 아무런 말도 하지 않았다.

2% 부족.

아직 이삼이는 2% 부족하다. 이유는 나만 쓸 수 있다. 즉, 베포를 하지 못했다. 여러 글을 보며 뭘로 베포를 할지 고민 중이다. 내가 알아본 결과 AWS 또는 Docker로 베포할 것 같은데 더 알아보고, 베포를 시도해볼 예정이다.

이삼이를 만들고 나서?

이삼이를 만들며 정말 흥미가 생긴 디스코드 봇을 만드니 너무 신기했다는 말밖에 안나온다. 아직은 이삼이가 많이 부족하다. 조금 더 내가 많이 다룰 수 있다면 /232 이런식으로 슬러쉬 태그를 써 실시간 조회를 할 수 있도록 까지 해보는게 나의 목표다. 이제는 링크를 복사 붙여넣기 하지 않더라도! 이삼이가 벨로그를 자동으로 홍보해주니 매우 편할따름이다.

저희 이삼이 많이 싸랑해주세요!!!

이삼이는 DELL E가 그려주었습니다ㅏ


이삼이 V2도 많은 관심 가져주세요!!

profile
행복개발러

2개의 댓글

comment-user-thumbnail
2024년 2월 6일

잘 보고 갑니다

1개의 답글