プログラミング奮闘記

難しいと評判!初心者がN予備校でプログラミングを学んだ感想と備忘録!
No.21:Slackで動作させるボットプログラム作成

N予備校 プログラミングコース 第21回

あなたは2019年の目標って立てましたか?
どんな目標を立てたか覚えていますか?

私は2018年末に2019年の目標を立てました。
その一つにプログラミングを学び仕事として使えるようにすることをあげました。
そして、思い立ったが吉日と「N予備校のプログラミングコース」を申し込みました。

そして受講と同時に自身の振替と、これから始めようと考えている人の参考になればとブログを書き始めました。
今回ブログの移設にともない、再度そのブログを読み返しながら、今思うことを加えて記載していきたいと思います。

また私が受講したのは【2018年度】で、現在公開されている【2019年度】との違いについても書いていきたいと思います。

このブログは、初心者が学びながら書いているため、間違っている場合があります。
分かり次第修正していくつもりです。

そのあたりも含め楽しんでいただければと思います。 

最後に進めていてわからなかったところや気になったところをまとめています。

プログラミング入門 webアプリコース 第21回

前回、ボットプログラムとそのプログラムを動作させるためのプログラムを作成しました。
今回は、ボットプログラムをSlackで動作させることができるようにします。

  • 今回の内容まとめ(第3章 08)
    ・Slackとボットプログラムの連携について
     

  • 今回の目標
    Slackで動作させるボットプログラムを作成します。

  • 今回新しく扱っているコマンド等
    ・espond関数
    ・match関数
    ・trim関数
    ・join関数

Slackとボットプログラムの連携について

Slackでボットを動作させるためのプログラムを作成します。

前回学んだGRUDの概念から、今回は以下のようにプログラムを作成します。

C(create):TODOを作成
R(Read):TODOの一覧表示
R(Read):完了したTODOの一覧表示
U(update):TODOを完了にする
D(delete):TODOを消す

todoコマンドの実装

今回作成するのに使用する関数が、respond関数、match関数、trim関数です。respond関数はhear関数とは異なり、ボットの名前が一緒に呼び出された時のみ反応する関数です。

trim関数

文字列の両端の空白を取り除いた文字列を取得する関数で、今回はそれをtaskという名前に設定しています。

robot.respond(/todo (.+)/i, (msg) => {
const task = msg.match.trim();
todo.todo(task);
msg.send(‘追加しました: ‘ + task);

1行目の「/todo (.+)/i」の部分では 、todoで始まりその後に1つのスペースを置いてなんらかの文字列が記述されたときに応答するように設定しています。
ここで、「 . 」は改行以外のどの1文字でもいいという意味で、「+」は直前の文字の1回以上の繰り返しを認識するという意味です。
これにより、「aaa」でも「あいうえお」でも認識します。また「/i」 を加えることで、大文字でも小文字でも認識してくれるようになります。
以上で、「todo ○○を買う」などにも反応するようになります。

2行目の、matchでは、1番目の文字、ここでは先ほど設定した「.+」の部分を文字列として呼び出しています。
0番目にすると、文字列全体が呼び出されます。

例えば、「Hubot-todo todo ○○を買う」と話しかけた場合、1では「○○を買う」、0では「Hubot-todo todo ○○を買う」を呼び出します。

さらに、trim関数により文字列の両端の空白を取り除いた文字列を取得します。
今回は、その内容をtaskという変数にしています。

3行目で、todo関数の変数にtaskを適用し

4行目で、send関数を使って「追加しました: task」と発言させています。

これでTODOの設計が完了します。

TODOの動作確認

TODOが正常に動くかをボットを起動して確認します。

まず、以下のコマンドでボットを起動します。
bin/hubot

続いて、TODOが動作するかを確認します。

○○ todo ××を買う(○○にはボットの名前が入ります)
上記のようにコマンドを打ち込むと、次のように表示されれば成功です。

○○> 追加しました: ××を買う

doneコマンドとdelコマンドの実装

todoコマンドと同じように、doneコマンドとdelコマンドを作成します。

robot.respond(/done (.+)/i, (msg) => {
const task =msg.match.trim();
todo.done(task);
msg.send(‘完了にしました: ‘ + task);
});
robot.respond(/del (.+)/i, (msg) => {
const task = msg.match.trim();
todo.del(task);
msg.send(‘削除しました: ‘ + task);
});

1行目、6行目の「/done (.+)/i」「/del (.+)/i」の部分では 、それぞれdoneまたはdelで始まりその後に1つのスペースを置いてなんらかの文字列が記述されたときに応答するように設定しています。

2行目、7行目のmatchでは、1番目の文字、ここでは先ほど設定した「.+」の部分を文字列として呼び出しています。
さらに、trim関数により文字列の両端の空白を取り除いた文字列を取得します。

3行目、8行目で、done関数またはdel関数のの変数にtaskを適用し

4行目、9行目で、send関数を使って「完了しました: task」「削除しました:task」と発言させています。

 

donelistコマンドとlistコマンドの実装

続いて、donelistとlistを実装します。ここで新たに出てくるのがjoin関数です。

join関数

配列のすべての要素を与えられた文字列でつないで一つの文字列にする関数

この関数を用いて、作成したdonelistとlistが以下になります。

robot.respond(/list/i, (msg) => {
msg.send(todo.list().join(‘\n’));
});
robot.respond(/donelist/i, (msg) => {
msg.send(todo.donelist().join(‘\n’));
});
2、5行目で、join関数を用いて今回は改行を表す\nを加えることで、TODOの一覧が改行されて表示されます。

以上で作成したプログラムをslackで動作させると、

○○ todo ××を買う
○○ todo △△を買う 
○○ list
○○ done △△を買う
○○ donelist
○○ del △△を買う
○○ donelist
以上のようにボットに話しかけると

追加しました: ××を買う 
追加しました: △△を買う
××を買う
△△を買う
完了にしました: △△を買う
△△を買う
削除しました: △△を買う 
donelist
のようにボットが返答してくれます。


今回はSlackで動作させるボットプログラムを作成しました。

次回はボットを再起動した際にタスクが失われないような設定について学びます。

 

ABOUT ME
GoodAmbition
オンライン塾経営者(大阪大学工学部出身の元開発技術者) 自身も家庭教師や塾講師として働きつつ、後輩の育成やオンライン塾を経営しています。 私自身も約10年にわたり家庭教師や塾講師として100人以上の受験生と向き合ってきました。 色々な学生、保護者の方とかかわる中でよく質問される内容や、受験に必要な内容について書いています。 独学で頑張っている人たちへ勉強計画や悩み相談なども受け付けていますので気軽にお問い合わせください。 就職活動や資格の勉強などで悩んでいる方もご連絡ください。 教育・就活、書籍、食べ歩きに関するお話がメインです。 最近取り組んでいること プログラミング、筋トレ、マラソン、ライティングスキル向上etc. 苦手なことを克服しようと頑張っています。