Node.js로 Slack 회의록봇 만들기. - 회의 내용 처리 및 저장

2016-05-27

nodejs slack bot json node-filesystem

저번 포스팅에 이어, 이번 포스팅에서는 대화 내용을 JSON 형식으로 처리하여 저장하는 부분을 다뤄보겠습니다.

메시지 저장할 배열 생성

메시지를 저장할 배열을 하나 생성합시다.

var array = [];

메시지 내용에 따라 꼬리표 붙여서 저장하기

메시지의 내용에 따라 꼬리표 같은 것을 붙여서 저장합시다. 제가 작업한 회의록봇의 경우 메시지 시작 단어에 따라, 안건, 메모, 대화(나머지) 정도로 분류했습니다.

...
if(message.text.startsWith("안건 :")){
  // 안건으로 분류하여 처리
}else if(message.text.startsWith("메모 :")){
  // 메모로 분류하여 처리
}else {
  // 기타 - 회의 대화 내용으로 처리
}

여기에서 메모와 안건의 경우는 앞에 메모 :, 안건 : 이 붙어있는 메시지를 분류하는데, 저장 할 때 여전히 메모 :, 안건 : 이 붙어 있는 경우 잘 정돈된 느낌이 나지 않으니 때고 저장합시다. 그리고 JSON 객체 형태로 아까 만든 배열에 저장합시다.

먼저 앞에 붙은 안건 :, 메모 : 를 때고.

...
if(message.text.startsWith("안건 :")){
  // 안건으로 분류하여 처리
  var subject = message.text.replace("안건 :","");
}else if(message.text.startsWith("메모 :")){
  var memo = message.text.replace("메모 :","");
  // 메모로 분류하여 처리
}else {
  // 기타 - 회의 대화 내용으로 처리
}

JSON 객체로 만들어서 아까 만든 베열에 넣어 줍시다. 저의 경우에는 다음과 같은 형태의 JSON 객체를 만들어 배열에 넣어 주었습니다.

array.push({"type":"subject", // type 속성으로 메모/안건/대화 분류
          "time": moment().utcOffset(timezone).format(timeformat), // time - 기록 시간 속성 - moment.js 이용하여 현제시각 기록
          "text": subject}); // text - 대화 내용 텍스트

그럼 이제 아래와 같은 방식으로 코드를 작성할 수 있습니다.

...
if(message.text.startsWith("안건 :")){
  // 안건으로 분류하여 처리
  var subject = message.text.replace("안건 :","");
  data.push({"type":"subject  ", "time": moment().utcOffset(timezone).format(timeformat), "text": subject});
}else if(message.text.startsWith("메모 :")){
  var memo = message.text.replace("메모 :","");
  data.push({"type":"memo", "time": moment().utcOffset(timezone).format(timeformat), "text": memo});
  // 메모로 분류하여 처리
}else {
  // 기타 - 회의 대화 내용으로 처리
  data.push({"type":"talk", "time": moment().utcOffset(timezone).format(timeformat), "text": message.text});
}

대화 내용의 경우, 해당 메시지를 작성한 사람의 이름을 포함하여 저장해 봅시다. 이전 포스트에서 우리가 메시지 수신 이벤트를 통해 받은 messageuser 속성을 포함하고 있는데. 이 속성의 값은 메시지롤 보낸 사람의 고유값 입니다. 그대로 사용하면 나중에 누가 한 말인지 알기 어려우므로, 고유값을 이용해 말 한 사람의 이름을 찾아서 대화 내용에 넣어 줍시다.

rtm.getUserById("사용자ID값") 을 통해 사용자 객체를 얻을 수 있고. 이 객체의 name 속성으로 사용자 이름을 얻을 수 있습니다.

var user = rtm.getUserById(message.user).name;

그러면 아래와 같이 작성하여 사용자 이름을 넣어 저장할 수 있습니다.

...
var user = rtm.getUserById(message.user).name;
data.push({"type":"talk",
"time": moment().utcOffset(timezone).format(timeformat),
 "text": user + " : " + message.text});
...

마크다운 문법으로 정리하여 *.md 파일로 저장하기

배열에 저장한 것을 하나씩 꺼내서, 아래와 같은 형식의 마크다운 문서로 작성하도록 코드를 작성해 봅시다.

## 회의 정보
- Slack 팀 이름 :
- 회의 시작/종료인 :
- 회의 시작 시각 :
- 회의 종료 시각 :

## 안건
- 안건 0

## 메모
- 메모 0

## 회의 내용
- A : 회의 내용 0[기록시각]

###회의 정보 부분 처리하기

회의 정보 부분은 배열의 가장 첫 요소와 가장 마지막 요소, 그리고 앞서 메시지 수신 이벤트로 받은 message 객체를 이용합니다. 팀 이름 은, 앞서 사용자 이름을 얻는 방법과 비슷 합니다. rtm.getTeamById("팀ID값") 로 팀 객체를 얻고, 이 객체의 name 속성으로 팀 이름을 얻습니다. 팀 ID 값은, message 객체의 team 속성에서 얻을 수 있습니다. 회의 시작/종료인 의 경우, 배열의 가장 첫 요소에 있는 사용자 이름을 사용할 수도 있고, 회의 기록 시작 처리할때, 해당 메시지를 보낸 사용자 이름을 별도로 변수를 하나 만들어 보관 해 두고 이를 사용할 수도 있습니다. 회의 시작 시각과 종료 시각 은 배열의 가장 첫 요소와 가장 마지막 요소를 이용합니다.

이를 종합하면, 아래와 같은 방식으로 코드를 작성 할 수 있습니다.

...
var username;
...
//회의 시작 처리시 사용자 이름 저장
username = rtm.dataStore.getTeamById(msg.user).name + "("+msg.user+")";
...
var mdData = "";//마크다운 문법으로 처리한 데이터를 저장 해 둘 변수
//팀 이름 얻기
var teamname = rtm.dataStore.getTeamById(msg.team).name + "("+msg.team+")";

// 회의 정보 부분 처리
mdData += "\n## 회의 정보\n";
mdData += "- Slack 팀 이름 : " + teamname +"\n";
// mdData += "- Slack 채널 이름 : " + channelname +"\n";
mdData += "- 회의 시작 및 종료한 사용자 : " + username +"\n";
mdData += "- 회의 시작 시각 : " + data[0].time +"\n";
mdData += "- 회의 종료 시각 : " + data[data.length - 1].time +"\n";

안건, 메모, 회의 내용 부분 처리하기.

앞서 배열에 넣을 때, 구분을 위해 각 객체마다 type 속성을 넣어 두었기 때문에, 이 속성의 값에 따라 처리하면 됩니다. 아래 코드 처럼 반복문 내부에 조건문을 넣어 처리 할 수 있습니다.

// 안건 부분 처리
 mdData += "\n\n## 안건\n";
 for(var i=0; i<data.length; i++){
   if(data[i].type=="subject"){ //type 속성 값이 subject 이면 문서에서 안건 부분 쪽에 넣기
     mdData += "- "+data[i].text + "[" + data[i].time + "]" + "\n";
   }
 }

파일로 저장

fs 모듈을 이용하여 마크다운 문법으로 정리한 것을 저장할 수 있습니다. 파일 쓰기를 해야 하므로, writeFile()를 이용합니다. 파일 저장 처리에 대한 콜백을 받고 싶지 않다면, writeFileSync() 를 이용하는 방법도 있습니다.

var fs = require('fs');
...
//writeFile(파일이름, 쓰기 작업할 데이터, 인코딩, 콜백);
fs.writeFile(teamname+"@"+jsonData[0].time+'.md', mdData, 'utf8',
 function(){
    //파일 쓰기 작업 완료 후 실행할 작업을 여기에 기술합니다.
  });
}

이제 마크다운 문법으로 회의 내용을 정리하여 파일로 저장까지 했습니다. 그럼 이제 클라우드에 업로드를 해야 겠죠? 다음 포스팅 에서는 Node.js 에서 구글 드라이브에 파일을 업로드 하는 방법에 대해 포스팅 하겠습니다.

참고문헌

광고 차단 소프트웨어를 사용하고 계신 것 같습니다. 혹시 글이 마음에 들었다면, 광고 차단을 해제해 주시거나 후원을 해 주시는 것은 어떤가요?

It seems like you're using ad block software, If you like the post, Would you like to disable that or donate me a bit?

Shoes

Node.js로 Slack 회의록봇 만들기. - 메시지 받아 처리하기

2016-05-24

저번 주 즈음에(?) 활동하던 소모임에서 운영진이 되었고, Slack을 통해서 소모임 운영 얘기를 하게 되었습니다. 그러다 보니 Slack 에서 회의를 하게 되는 경우도 생겼는데, …

Shoes

라즈베리파이에 Node.js 설치하기

2015-07-16

라즈베리파이에 Node.js 를 설치해 봅시다. Node.js 로 작성한 앱을 실행하려면 필요하니, 설치해 봅시다. 직접 컴파일 하여 설치 하는 법과, 미리 빌드된 패키지를 사용하 …