Jarvis slack bot project 회고

SSO·2022년 5월 11일
0

SSo_Project

목록 보기
3/5

💻 Jarvis Project

Jarvis 프로젝트는 멋쟁이사자처럼 명지대 10기 슬랙봇이다.

개발 기간 : 2022. 04. 04 ~ 2022. 05. 11


🎲 주요기능

  • 익명 봇 메시지
  • 주사위 게임
  • 자비스의 기능 보기
  • 생일 축하 알림
  • 자비스 부르기
  • 점심 메뉴 추천

🛠 Tech Stack

  • Node.js
  • Bolt
  • Typescript
  • sqlite3

💊 회고

처음 슬랙봇 프로젝트를 시작하기 전에 듣기로는 별로 어렵지 않은 난이도의 프로젝트라고 들었었다. 하지만... typescript도 처음 써보고 데이터베이스를 직접 다뤄본 것도 처음이었고 항상 프론트 개발을 많이 해보던 나로써는 백엔드에 가까운 슬랙봇 개발을 처음 해보는 거라 예상보다 시간도 많이 걸렸고 개발을 처음 시작하는 데에서도 많이 해맸다.....


주요 기능으로 여러가지 기능이 있는데 내가 도맡았던 기능은 생일 축하 알림기능이다. 다른 슬랙봇 기능들과는 개발하는 과정이 좀 달랐다.

다른 기능들부터 어떤 식인지 알아보자.

주사위 게임 기능

  • 숫자는 1~100까지의 숫자를 보여주고 이 내에서 범위를 나눠 결과를 반환해준다.
  • 여기서 반환되는 결과에 따라서 각각 id를 부여해주고 id별로 출력할 text를 지정해준다.
  • 슬랙에서 지정된 명령어를 입력받으면(app.message) 랜덤으로 숫자를 뽑아주고 이 값에 따른 범위에 해당하는 textanswer라는 변수에 담아 슬랙에 메시지를 보내(say) 응답해준다.
    Example
app.message(/입력받을 명령어/, async({message, say}) => {
	await say('답변');
}

자비스 부르기 기능

  • app.message로 받을 명령어에 따른 답변(say)을 지정해준다.
  • 몇 시인지 물어보면 시간을 알려주는 기능
    - 내장함수인 getHours()함수를 사용해 현재 시간을 받아오는 변수의 값과 시간 범위에 따른 답변을 지정해둔 후 이를 변수에 넣어주고 시간과 함께 응답을 보낸다.
    example)0-6시 사이라고 하면, `if(h>=0 && h<=6) return '보내고 싶은 텍스트';
  • 뭐할지를 물어볼 경우, 이에 대한 답변을 랜덤으로 3가지 중 하나를 출력할 수 있게 지정해놓고 random함수를 통해 이 중 하나를 뽑아 변수에 넣어주고 해당 변수를 say로 말해주도록 한다.

자비스의 기능 보기

  • 명령어를 입력했을 때(app.message) 마크다운 형식으로 텍스트와 버튼을 먼저 응답(say)해준다.
  • 이후 버튼을 클릭하면 이에 대한 action을 보여준다.
  • app.action기능으로 action_id를 처음 인수로 받는다.
  • 버튼 클릭에 대한 action으로 어떤 기능이 있는지에 대한 텍스트를 응답해준다(say)

이렇게 위의 세 가지의 기능만 보더라도 사용자에게 명령어를 받는 즉시 이에 대한 응답을 보내주는 형식으로 슬랙봇이 작동한다.
하지만 생일 축하 알림의 경우 사람들의 생일 데이터가 있을 때, 현재의 날짜와 생일 데이터를 비교해 보았을 때 생일인 사람이 있을 경우 생일 축하 알림을 보내주는 기능으로 항상 명령어를 보내고 응답을 받는 형식이 아니다!!!

처음에 내가 생각했던 구현 방식은 아래와 같다.

  • node-schedule이라는 모듈을 사용하여 매일 똑같은 시간에 작동하도록 설정해둔다.
  • 실행이 되면 데이터베이스와 현재 날짜를 비교해 일치하는 데이터의 사람 이름을 배열에 추가한다.
  • 그리고 배열이 비어있다면 그 날은 생일자가 없는 것이고, 배열에 값이 있다면 생일자가 있는 날이니 이때 메시지를 보내도록 한다.

하지만 슬랙봇은 명령어를 받고 그때 깨어나서 작동을 하는 것인데 어떻게 명령어를 보낼 지가 문제였다. 그렇다보니 say를 사용하지도 못했다.

그래서 변경한 방법이 아래와 같다!

  • 데이터베이스를 받아오고 생일인 사람의 데이터를 select한다.
  • 선택된 데이터들을 promise 형태로 반환한다.
  • 슬랙에서 제공하는 client.chat.scheduleMessage() 를 사용하면 앞의 문제들이 해결된다.
  • 이 메서드는 쉽게 말해 명령어를 한 번 입력하면 메시지 기능을 예약할 수 있는 기능이라고 생각하면 된다.
  • 이 메서드의 필수 인자로는 channel, post_at, text 이렇게 세 가지가 있다.
    • 여기서 channel은 우리가 이를 사용하는 채널이고 text는 보낼 메시지를 생각하면 된다.
    • post_at은 보내는 시기인데 이게 관건이었다..!!
    • 시기를 생각하면 당연히 날짜와 시간만 생각을 했다. 그리고 여기에 들어가야 하는 값의 타입은 string이거나 number여야 했는데 string 형태로 넣었을 때도 돌아가지 않아서 number 형태로 하기 위해 여러 방법을 시도해 보았는데 공식문서를 보니 를 넣어주어야 했다. 그래서 getTime() 함수를 사용해 1000으로 나눠주는 과정을 거쳐야 했다.
      Ex) new Date(2022, b.month - 1, b.day, 14, 0).getTime() / 1000
    • 또한 client.chat.scheduleMessage()는 너무 먼 미래와 과거의 데이터를 불러와서 실행할 경우 too_past, too_far 이런 에러가 발생하게 된다.
    • 처음에 모든 생일 데이터를 가져왔을 때 발생한 에러이다. 그래서 모든 데이터를 가져오는 것이 아닌 현재 월을 기준으로 다음달의 데이터까지 약 2달 치의 데이터를 불러오니 에러가 발생하지 않았다.
    • 그러다 보니 현재로써는 6월까지의 데이터를 불러왔는데 7월이 되면 7-8월까지의 데이터를 불러와 다시 실행하도록 한 번 더 명령어를 입력해 주어야 한다. 이 이상 기간의 데이터를 불러 올 수 있는 지는 여러 번 고쳐가면서 시도해보면 좋을 거 같다.

바로 오늘 마지막 스크럼을 끝으로 한 달 간의 Jarvis 프로젝트가 끝났다!
큰 기능도 아니고 규모도 작지만 처음으로 해 본 백엔드 프로젝트이자 typescript도 처음 사용해 본 프로젝트라 까먹지 않기 위해 바로 회고록을 작성해보았다:)
원래 처음 개발 시작할 때 사람들의 이름과 숫자를 입력하면 입력한 숫자만큼의 조를 나눠주는 기능도 만들자는 말이 나왔었다.
이를 기세로 앞으로 이 기능도 구현해 보아야겠다🤗

🚀Jarvis Repositories 바로가기 ▶

profile
Github_qkrthdus605

1개의 댓글

comment-user-thumbnail
2022년 5월 23일

멋지네요! 🤗

답글 달기