MS謹製のbot作成フレームワーク「botbuilder」で遊んでみた！

MSさん(人工知能で話題の)が、Bot開発用のフレームワークをBuild 2016にて発表しました。
[［速報］マイクロソフト、Bot開発用フレームワーク「Microsoft Bot Framework」を公開。Slack、Skype、メール、SMSなど対応。Build 2016 － Publickey](http://www.publickey1.jp/blog/16/micorosoft_bot_framwork.html)

Bot Frameworkというのは「Connector」「Builder SDK」「Directory」の3要素から構成される、とのことです。エコシステムを作るぞ、というMSの気概を感じますね。。
さてbot用SDK・フレームワークというと、hubotがスタンダードかなぁという風に感じていた中で昨年にはSlackの[botkit](https://github.com/howdyai/botkit)もお手軽かわいい感じで話題になったり、その渦中でこのBot Builder。もう本当に大bot時代という感じで。

bot、手軽に組めると色々と仕事や趣味も捗る・・！ので、武器は多いほうが良いですよね。ということで触ってみました。
nodejsです。

この記事では、Slackのbotをとりあえず触りだけ・・という感じで動かしてみましょう。


# 参考リンク
* Github: https://github.com/Microsoft/BotBuilder
* 公式Doc(Get Started): http://docs.botframework.com/builder/node/overview/

## npmプロジェクト作成
### セットアップ
`npm init` でPJを作成→パッケージのインストール。

```sh
npm install --save botbuilder
npm install --save restify
```

### Hello World!
Githubレポジトリには色々なexampleが置かれています。
ここに[Slackのサンプル](https://github.com/Microsoft/BotBuilder/blob/master/Node/examples/hello-SlackBot/app.js)もあるので、参考にしながら下のコードを `slack.js`としてプロジェクトのトップに設置します。

```js

var Botkit = require('botkit');
var builder = require('botbuilder');

var controller = Botkit.slackbot();
var bot = controller.spawn({
     token: process.env.token
});

var slackBot = new builder.SlackBot(controller, bot);
slackBot.add('/', function (session) {
     session.send('Hello World'); 
});

slackBot.listenForMentions();

bot.startRTM(function(err,bot,payload) {
    if (err) {
          throw new Error('Could not connect to Slack');
            }
});
```

保存したら、早速立ち上げてみましょう。
※Slackのbotトークンは予め取得しておいて下さい
https://slack.com/apps/A0F7YS25R-bots
```sh
token=$SLACK_BOT_TOKEN node slack.js
```

起動中に、botアカウントに1度話しかけると「Hellow world!」と返事をしてくるようになります！

### 対話をしてみる！
なるほど動いたぞ、ということでもう少し踏み込んでみます。
※Slackのbotに関する記述はこちら。
http://docs.botframework.com/builder/node/bots/SlackBot/

botということで、最低限(でも)必要となるのは「Aと話しかけたらBと答える」という機能です。
動作イメージはこんな感じ。

![botbuilder.gif](https://qiita-image-store.s3.amazonaws.com/0/941/a9074357-5978-8e9a-9508-17c564e98e9a.gif "botbuilder.gif")


これをどう実現するか？
BotBuilderでは、この「やりとり」のことを「[Dialog](http://docs.botframework.com/builder/node/dialogs/overview/)」という概念で扱っており、全てのBotは「DialogCollection」として振る舞います。

先ほどのHellow Worldを例に挙げるなら、

```js
slackBot.add('/', function (session) {
     session.send('Hello World'); 
});
```
というのが、「`slackBot`に」「`/`というIDで」「`function(){}`というDialogを」「`add`する」ことを意味します。

#### 「呼びかけと返答のパターンが設定されているDialogを、botに持たせる」
非常にシンプルに記述できるので、まずコードから見てみましょう

```js
var Botkit = require('botkit');
var builder = require('botbuilder');
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: process.env.token
});

var slackBot = new builder.SlackBot(controller, bot);
var dialog = new builder.CommandDialog();

dialog.matches(['Hi', 'Hello', 'こんにちは'], function (session) {
  session.send('こんにちは');
});
dialog.matches('how are you', function (session) {
  session.send('im fine thank you.')
});
dialog.onDefault(function (session) {
  session.send('もう1度言って下さい')
});

slackBot.add('/', dialog);

slackBot.listen(['mention', 'direct_mention']);
bot.startRTM(function(err,bot,payload) {
  if (err) {
    throw new Error('Could not connect to Slack');
  }
});
```

* `dialog.matches()`の第1引数に入力パターンを文字列もしくは文字列のリストで
* 同じく第2引数にコールバックを
* どのパターンにもマッチしなかった時の振る舞いとして`onDefault()`にコールバックを

記述します。
そして出来上がったDialogを`/`に登録している、という訳です。
※ `slackBot.listen()`の対象を`mention`のみにすると、直接のメンション(先頭がユーザー名になっているメンション)は拾ってくれないことに注意して下さい



思ったより長くなってきたので、この記事はここまでにします・・
次は「簡単なやりとり(会話)をする」、というものを書いてみようと思います。

## 感想
なるほどシンプルに扱えるな！という感じです。
この程度の単純さだと実用性もないですが、書いてみた感じだと「hubotやbotkitと同じくらいシンプル」。
ただ、それらと違うのはBotFrameworkに関しては「単一のbotを手早く作る」という地平に収まっていない・・！という点です。その意味では、ここに書かれた内容はその魅力の数%にも満たないな、という理解。
まだまだ情報も少ないので、「ライバルたちはもう始めている！！」という状況にならないよう、サービス周辺の情報にアンテナを張りつつ、実装に関しても今のうちに色々と遊んでおきたいな〜という感想です！
2016年はbot世紀の始まりを予感させますね！