分12今回は,Hubotのスクリプトが動く仕組みについて説明し,基本的な機能であるチャットでの受け答えを実装する方法を説明した後に,その他の機能について紹介します。スクリプトの基本Hubotがスクリプトを読み込み実行する仕組みを説明するために,“⁠hello⁠”と挨拶するとHubotが“⁠hi⁠”と返事する単純なスクリプトのサンプルを示します。'hi'このサンプルコードの一番外側を見ると,module.exportsに関数を代入しています。このmodule.exportsは,Node.jsでモジュールを作るための仕組みです。Hubotのスクリプトとは,引数を1つとる1つの関数を提供するNode.jsのモジュールということになります。サンプルコードでは,関数の中で引数robotのhearメソッドを呼び出してコールバック関数を登録しています。このrobotは,Hubotの本体とも言えるRobotクラスのインスタンスです。このように,基本的なHubotのスクリプトでは,Robotオブジェクトのメソッドを通じてコールバック関数を登録することで,「⁠チャット上で誰かが特定のキーワードを発言したとき」や「チャットルームに誰かが新たに参加したとき」など様々な状況ごとにHubotの振る舞いを定義していきます。Node.jsのモジュールの詳しい仕組みは,Node.jsのドキュメントをご確認ください。スクリプトの読み込みでは,作成したモジュール,つまりHubotのスクリプトはいつどのように読み込まれ実行されるのでしょうか。external-scripts.json,HUBOT_SCRIPTSで指定したpathからNode.jsのモジュールを探し,requireすると同時にmodule.exportsに代入された関数をRobotオブジェクトを引数にして呼び出します。Hubot(Robotオブジェクト)が特定のスクリプトファイルを読み込むコードの例を次に抜粋します。process.exit(1)引用元:執筆時点のRobotクラスのloadFileメソッド216行目で,読み込み対象のモジュールをrequireしつつexportされた関数を自分自身を引数として呼び出していることがわかります。まとめスクリプトの登録から呼び出しまでの流れを図1に示します。イベントリスナの登録と実行まとめると,まずHubotが起動してAdapterがチャットツールに接続したときに作成したスクリプトが読み込まれ実行されます。次に,実行されたスクリプトは引数で受け取ったRobotオブジェクトにコールバック関数を登録します。最後に,コールバック関数を登録するときに指定した条件を満たすと登録したコールバック関数が呼び出される,という流れになります。ここからは,Hubotの基本的な動作をどのように定義するかについて説明します。チャットでの発言に反応するhearとrespondHubotは,チャット用のbotですから,チャットで誰かが特定のキーワードを発言したときに何らかの処理を実行すると言うのが基本的な使い方だと思います。このような場合には,Robotクラスのメソッドhearとrespondを使用します。hearとrespondを使ったコードのサンプルを次に示します。"fuga"respondとhearの使い方について説明します。hear書式を以下に記します。正規表現にマッチしたときに呼び出されるコールバック関数)hearメソッドは,第一引数で渡した正規表現にマッチする発言がチャット上にポストされた場合に第二引数で渡したコールバック関数を実行します。上記のサンプルコードの場合は,/foo/iにマッチする発言があった場合にコールバック関数が呼び出され,Hubotが"bar"と発言します。デプロイ処理と言ったコードを書くと,会話の流れで“⁠deploy⁠”という単語が出ただけでデプロイプロセスが走ってしまうといった問題が発生する可能性があります。そのため,hearメソッドは,たとえば「誰かがURLがポストするとページを取得してタイトルをポストする」といった無差別にマッチしても問題無い用途で使用すると良いと思います。respond書式を以下に記します。正規表現にマッチしたときに呼び出されるコールバック関数)respondも,正規表現にマッチする発言がチャット上にポストされるとコールバック関数が実行されるという点ではhearと同じです。respondの場合はHUBOT_NAMEかそのエイリアスが「発言文字列の先頭」に存在するかどうかのチェックが入るという点が異なります。hoge⁠”などHUBOT_NAMEもしくはHUBOT_ALIASが文頭に存在していた場合にのみマッチするということです。respondのイメージrespondは,hearとは逆に,おもにHubotに対して特定の命令を実行させたい場合に使います。hoge⁠”といった異なった形式も使用できます。注意点として,respondメソッドは,渡された正規表現を分解して“⁠文頭にHUBOT_NAMEが存在するか⁠”という条件を元々の正規表現の先頭に追加した形で正規表現を再構築するため,^を使用しても動作しないといった問題に遭遇することがあります。チャットに発言を投稿するsendとreplyhearとrespondと同様にHubotにチャットで発言させる方法にもsendとreplyの2種類があります。sendとreplyを使ったコードのサンプルを次に示します。"fuga"これまで書いてきたコールバック関数は,すべてmsgという仮引数を持ちますが,この引数にはResponseクラスのインスタンスが渡されます。Hubotのスクリプトでは,このResponseオブジェクトを通じてイベントが発生したときの状況を取得したり,チャットツールに対して様々なアクションを取ることができます。チャットに発言するには,Responseクラスのメソッドsendもしくはreplyを使用します。send書式を以下に記します。(発言内容...)sendメソッドにHubotに発言させたい文字列を渡すことでHubotに発言させることができます。引数は可変長となっており,複数の文字列を渡すことで複数の発言を同時に送ることもできます。sendのイメージreply書式を以下に記します。(発言内容...)replyメソッドを呼び出すと,sendメソッドと同様にHubotが発言しますが,sendメソッドとは「イベントが発生した元となった発言者に対しての返答」という形で発言する点が異なります。この「返答」の定義はチャットツールやAdapterによって異なります。hubot-ircでは元の発言者名をHubotの発言の文頭に付与します。CoffeeScript著者プロフィール大谷和史(おおたにかずふみ)色々な物を動かして試してみることが好きなWeb開発者。現在は,メドピア(株)で日本の医療を良くするために働いています。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。