Published on

Slack Bot 개발기 (with hubot)

서로에게 칭찬하는 문화를 만들기 위해 Hey! Taco와 같은 역할을 하는 Slack Bot을 개발하게 되었다.

GitHub : https://github.com/minsgiman/hubot-cookie

Hubot 만들기

Slack채널에서 발생하는 이벤트를 listen하기 위해서는 Slack채널에 Bot을 설치해야 한다.
그 중에 Hubot을 통해 개발하였다.

Hubot을 만드는 방법은 다음과 같다.

  1. https://line-enterprise.slack.com/apps/A0F7XDU93-hubot 에서 Add to Slack을 누르고, Hubot 이름을 설정한다.
  1. 발급받은 Hubot의 토큰과 이름을 확인한다.
  1. Slack채널에서 Integrations - Add apps 를 눌러서 위에서 만든 Hubot이름을 확인하여 채널에 설치한다.

Hubot 실행

설치 & 실행

Hubot 설치 & 실행은 https://slack.dev/hubot-slack/ 를 참고한다.

먼저 yo, generator-hubot 으로 기본 세팅을 할 수 있다.

npm install -g yo generator-hubot

mkdir my-awesome-hubot && cd my-awesome-hubot
yo hubot --adapter=slack

그리고 다음과 같이 hubot을 실행한다.

HUBOT_SLACK_TOKEN=... ./bin/hubot --adapter slack

다른 Hubot 실행 옵션들은 다음 문서를 통해 확인할 수 있다.
https://slack.dev/hubot-slack/advanced_usage

Scripts

Scripts는 https://hubot.github.com/docs/scripting 를 참고한다.

다음과 같이 package-root/scripts 내부의 coffee 파일과 js 파일이 자동으로 실행되며 robot이 주입된다.

module.exports = (robot) ->
  # your code here

Slack event Listen

Hubot 실행시 script로 주입된 robot을 통해 이벤트를 listen 한다.

this.robot.hear(/(.*):cookie:(.*)/i, (res) => {
  this.sendMessageToWorker(res.message, MSG_TYPE.COOKIE_MESSAGE);
});

this.robot.hearReaction(async (res) => {
  if (res.message.type === 'added' && res.message.reaction === 'cookie') {
    this.sendMessageToWorker(res.message, MSG_TYPE.COOKIE_REACTION);
  }
});

Slack 이벤트 listen은 Hubot 내부적으로 WebSocket 기반의 RTM Client를 통해서 가능하다.

The Real Time Messaging (RTM) API is a WebSocket-based API that allows you to receive events from Slack in real time and send messages as users.


Slack API 호출

Slack Web API를 호출하여 여러가지 정보들을 조회하거나 슬랙 메시지를 보낼 수도 있다.
다음의 API들을 사용하였다.


Scale up

같은 토큰을 사용하는 Hubot을 여러 개 띄우게 되면 모든 Hubot으로 발생한 슬랙 이벤트가 전송되기 때문에, Hubot은 하나밖에 띄울 수 없다.
Hubot을 하나 띄우는 대신, Hubot 프로세스(아래에서 Master)가 직접 메시지를 처리하지 않고 Worker 프로세스들에게 메시지 처리를 맡기도록 하여 Scale up이 가능한 구조를 만들었다.

  • Master Process
    • Hubot 을 가지고 있음
    • Hubot rtm client를 통하여 slack event listen하여 worker로 전달
    • pm2로 master, worker process 생성
  • Worker Process
    • master로부터 받은 slack event message 처리 담당
    • mongodb에 데이터 저장
  • Logger Process
    • 파일에 로깅 (logs/yyyy-mm-dd.log)

그 밖에..

개발하면서 위에서 언급한 내용 외 참고한 부분들

기능 구현은 슬랙 메시지로 멘션과 함께 :cookie: 이모지를 붙이면 Bot이 Cookie 선물 메시지를 전송하고 그 와 동시에 전달한 cookie 기록은 MongoDB에 저장되도록 하였는데 이 후에 이를 활용하여 Leaderboard 를 만들 수도 있고 활용 방안을 고민 중이다.


참조