Skip to content
Daegeun Kim edited this page Jun 17, 2013 · 9 revisions

콜백서버 (Receiver)

봇 계정으로 오는 메세지를 받기위해서는 마이피플 봇 관리 페이지에서 콜백서버를 등록해야합니다. 이 모듈로 아래와 같은 방법으로 띄울 수 있습니다.

var Receiver = require('mypeople').Receiver;
var receiver = new Receiver('KEY');
receiver.addListener('message', function(m) {
  console.log(m);
});
receiver.start();

FAQ로 문서를 정리합니다.

기본적으로 동작 방식은 어떻게 됩니까?

NodeJS에서는 EventEmitter라는 특별한 기능을 제공합니다. 이를 이용해서 event를 emit하고 addListener를 통해 특정 이벤트만을 수신할 수 있는 구조를 가집니다.

메세지는 어떻게 받을 수 있나요?

위에서 언급했듯이 그룹내에서 발생한 메세지 또는 봇과 개인간에서 발생한 메세지는 모든 message 라는 이벤트를 통해서 받을 수 있습니다.

var Receiver = require('mypeople').Receiver;
var receiver = new Receiver('KEY');
receiver.addListener('message', function(m) {
  console.log("메세지가 도착했습니다.");
  console.log(m);
});
receiver.start();

예제 코드에 receiver.addListener('message', ...) 는 무엇을 의미하나요?

addListener에서 첫 번째 인자인 message는 node-mypeople에서 관리하는 이벤트명 중 하나입니다. message는 메세지가 도착했음을 의미하는 이벤트입니다. 그룹 내에서 개인간에 발생한 혹은 1:1 대화에서 발생한 메세지를 수신했을 때 발생하는 event 입니다.

웁스! 다음DNA에서는 action 명이 sendFromMessage, sendFromGroup 이라고 되어있는데 message로 이름을 바꾼 이유가 뭔가요?

음. 그건 개인적인 취향으로 인해 발생한 문제입니다. 전 그 액션명이 싫어요. (퍽퍽) 죄송합니다. 여러분의 취향을 존중하겠습니다. (이미 늦었..)

아직 늦지 않았습니다. 대응해주시죠!?

알겠습니다. 대응하도록 하겠습니다. 다음 방법으로 만족해주시죠? (뭐? 덜 맞았... 퍽퍽) 0.3.0 부터 됩니다.

var Receiver = require('mypeople').Receiver;
var receiver = new Receiver('KEY');
receiver.addListener('sendFromMessage', function(m) {
  console.log("1:1 대화 메세지가 도착했습니다.");
  console.log(m);
});
receiver.addListener('sendFromGroup', function(m) {
  console.log("대화그룹에서 발생한 메세지가 도착했습니다.");
  console.log(m);
});
receiver.addListener('addBuddy', function(m) {
  console.log("누군가 친구를 추가했습니다.");
  console.log(m);
});
receiver.addListener('[email protected]', function(m) { // @whdvl 님이 컨트리뷰션한 버전 입니다.
  console.log("누군가 친구를 추가했습니다.");
  console.log(m);
});
receiver.start();

메세지 형태는 다음에서 보낸 알림콜백 형태를 그대로 유지했습니다.

굳이 다음에서 보내는 알림콜백을 쓰지 않고 자체적인 메세지 이벤트를 만들어서 쓰는 이유는 무엇인가요?

제가 클라이언트 만드는데 이유가 있어야 하나요? (퍽퍽.) 일단 내가 만들고 싶은데로 만들겠다는데.. (퍽퍽.) 헛소리 고만하고 이유를 들면,

  • message (sendFromMessage, sendFromGroup), new invite (createGroup, inviteToGroup), need help (helpFromMessage, helpFromGroup) 처럼 비슷한 용도의 액션이 두개씩 나뉠 필요가 없다고 생각
  • 다음 마이피플의 알림콜백의 형태는 제가 원하는 구조가 아닙니다.
  • isBot 값이 Y|N 처럼 보내거나
  • createGroup/inviteToGroup 중 content 값이 string 이어서 (array값이 json형태로 또 담았다거나.)
  • 제가 좋아하는 네이밍이 아니라서

그래서 어떻게 바꿨나요?

이벤트의 종류는 크게 6가지 입니다. 대응하는 액션명은 우측에 기록합니다.

  • message : sendFromMessage / sendFromGroup
  • new invite : createGroup / inviteToGroup
  • left user : exitFromGroup
  • need help : helpFromMessage / helpFromGroup
  • kick : exitGroup
  • new friend : addBuddy

기본적인 event에 담아서 보내는 값은 다음 형태를 가집니다. 아래 표현식은 대충 감이 오실꺼예요.

object {
  object {
    string id;
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id;
  } group;
}

설명하면, 형태는 object 형태이고 nested objects 가 두개 있는데 각각 id 값을 가지는 user와 group 이 있다는 의미입니다. 이제부터 이 표기법으로 설명합니다. JSON형태로 표기하면 위 표현식을 아래 형태를 띕니다.

{
  "user": {
    "id": "BU_"
  },
  "group": {
    "id": "XX"
  }
}
Event: message
object {
  object {
    string id; // BU_xxxx
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id?; 
  } group?;

  string message;
}

물음표(?)는 optional 의미를 담습니다. message event가 왔을 때 위의 값을 emit 합니다. group이 있다면 그룹대화를 의미합니다.

Event: new invite

새롭게 초대되었을 때 받는 알림콜백입니다.

object {
  object {
    string id;
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id?;
    array {
      object {
        string id;
        string name;
        string photoId;
        boolean isBot;
      }
    } members?;
  } group;
}

array라는 표기법이 추가되었지만 이해하기 어렵지 않을 듯 합니다. 일단 초대시에는 group 값 안에 members가 추가됩니다. 그룹대화 참여자 정보입니다. 각 사용자별로 id, name, photoId, isBot 값을 가집니다.

Event: need help

도움말 요청할 때 받는 이벤트입니다.

object {
  object {
    string id;
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id?;
  } group?;
Event: left user

그룹대화 중 사용자가 나갔을 경우 발생하는 이벤트입니다.

object {
  object {
    string id;
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id;
  } group;
}

별반 다르지 않습니다.

Event: kick

본인 봇 계정이 그룹대화에서 쫒겨났을 때 받는 이벤트입니다.

object {
  object {
    string id; // 누가 했을까?
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.

  object {
    string id; // 어디서 그런거니?
  } group;
}

별반 다르지 않습니다.

Event: new friend

누군가 친구를 추가했을 때 발생하는 이벤트입니다.

object {
  object {
    string id;
    string name;
    string photoId;
    boolean isBot;
  } user; // 0.3.1 부터 friend 에서 user로 바뀝니다. 물론 0.3.x 버전에서는 호환성을 위해 friend 값도 같이 채워서 보냅니다.
}

누가 추가했는지 내용을 채워서 줍니다.

0.3.3 부터 추가된 Receiver의 execute 함수는 무엇인가요?

Receiver 내부에도 client가 존재합니다. 그래서 굳이 이중으로 선언해서 사용할 필요 없이 이용할 수 있도록 하는 기능입니다. 예제 코드는 아래와 같습니다. 추가로 Receiver에는 sendMessage와 sendGroupMessage 함수가 존재합니다. 기존에는 이 두 함수 말고는 호출할 수 없는 구조였는데 이 기능을 추가했기때문에 이 버전부터는 사용이 가능합니다.

receiver.addListener('message', function(m) {
  receiver.execute(function(client) {
    client.sendMessage(m.user.id, "Echo: " + m.message);
    // 그 외에 client 함수들 호출 가능
  });
});