1
0

More than 1 year has passed since last update.

Webの勉強はじめてみた その21 〜Slack上で動くbot作成1〜

Posted at

N予備校の「プログラミング入門Webアプリ」を受講しています。
今回は第3章7〜9節です。
講義内ではTODOのbotでしたが、復習も兼ねて自分で作りました。

学んだ用語

CRUD クラッド

ソフトウェアが情報の永続化をしようとしたときに出てくる操作、Create, Read, Update, Deleteの頭文字をとったもの。

リファクタリング

ソースコードを見易くする。可読性の向上。

テスト駆動開発

実装や修正よりも先にテストを用意し、テストに適合するようにリファクタリングを繰り返すことでコードの品質を高めていく開発手法

とにかくほめてくれるbotを作る

要件

  1. 「ほめて」 : あらかじめ用意された配列からランダムで発言
  2. 「もっと ~」 : ~という内容を配列に登録。
  3. 「ほめないで ~」 : ~(インデックス)番のメッセージを削除
  4. 「見せて」 : 登録されているメッセージを一覧で表示

手順

praise-bot-testディレクトリを作成
1. yeomanのインストール(Dockerfileに記述)
2. yarn initで package.json を作成
3. index.js(モジュールを記述するファイル)とtest.js(テストを実行するファイル)
4. モジュールの実装
5. リファクタリング
praise-botディレクトリ作成
1. yeomanのインストール(Dockerfile)
2. cp -rpraise-bot-testをコピー
3. yo hubot --adapter=slack でbot作成
4. scriptsディレクトリに実行ファイル(index.js)を作成
5. 実装
6. slack上でhubotの作成
7. コンソール上で環境変数の指定と実行

Docker

FROM --platform=linux/x86_64 node:14.15.4

RUN apt-get update
RUN apt-get install -y locales
RUN locale-gen ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP
ENV LANG ja_JP.UTF-8
ENV TZ Asia/Tokyo
RUN yarn global add yo@3.0.0
RUN yarn global add generator-hubot@1.1.0
RUN yarn global add coffeescript@1.12.7
RUN useradd praise-bot -m
USER praise-bot
WORKDIR /home/praise-bot
version: '3'
services:
  app:
    build: .
    tty: true
    volumes:
      - .:/home/praise-bot

モジュール

'use strict';
/**
 * slack上で欲しい言葉をくれるボット
 */
const praiseWords = [
    {index:1, msg:"今日はよくがんばりました。すごいです。"},
    {index:2, msg:"生きていてくれて嬉しいです。ありがとう。"},
    {index:3, msg:"あなたの頑張りは私だけが知っています。お疲れ様でした。"},
    {index:4, msg:"あなたの優しさはきっと届いています。"},
    {index:5, msg:"今のあなたはイケてます。すごくいい感じです。"},
    {index:6, msg:"たくさんがんばりましたね。今日もお疲れ様でした。"},        
];
/**
 * インデックスの最大値にプラス1をする
 * @returns 最大値
 */
 function maxIndex(){
    let newInt = 1;
    //配列のindexのみ取得
    const maxArray = praiseWords.map(m => m.index);
    //最大値
    for(let max of maxArray){
        if(max >= newInt){
            newInt = max + 1;
        }
    }
    return newInt;
}
/**
 * メッセージの追加
 * @param {integer} index  
 * @param {string} msg  メンションするメッセージ
 */
function addPraise(msg){
    //indexの最大値取得
    const newIndex = maxIndex();
    praiseWords.push({index:newIndex, msg:msg});
}
/**
 * 指定したインデックスでメッセージの削除
 * @param {integer} index 
 */
function delPraise(index){
    //指定されたインデックスの存在チェック
    const indx = praiseWords.findIndex(p => p.index === index);
    if(indx !== -1){
        praiseWords.splice(indx, 1);
    }
}
/**
 * 一覧を表示
 * @returns index : メッセージ
 */
function listPraise(){
    return praiseWords.map(w => w.index + " : " + w.msg);            
}
/**
 * ランダムにメッセージを返す
 * @returns {string} メッセージ
 */
function praise(){
    if(praiseWords.length > 0){
        //ランダムな添字の取得
        const randomIndex = Math.floor(Math.random() * praiseWords.length);
        return praiseWords[randomIndex].msg;
    }else{
        return "ほめてもらいたい言葉が見つかりませんでした";
    }
}
module.exports = {
    praise,
    add:addPraise, 
    del:delPraise, 
    list:listPraise
}
'use strict';
// Description
//  「ほめて」というとほめてくれるbot
// Commands:
//   ほめて                        - 登録された言葉をランダムに発言する
//   もっと メッセージ内容           - ほめて欲しい言葉を登録する
//   ほめないで index番号           - 指定された番号の言葉を削除する
//   見せて                        - 登録されている言葉を一覧表示
const praise = require('praise-bot');

module.exports = robot =>{
    robot.hear(/ほめて/i, msg =>{
        const words = praise.praise();
        msg.send(words);
    });
    robot.hear(/もっと (.+)/i, msg =>{
        const words = msg.match[1].trim();
        praise.add(words);
        msg.send("登録しました。もっとほめますね♪");
    });
    robot.hear(/ほめないで (.+)/i, msg =>{
        const index = msg.match[1].trim();
        praise.del(parseInt(index));
        msg.send("削除しました。他の言葉でほめますね。");
    });
    robot.hear(/見せて/i, msg =>{
        const words = praise.list().join('\n');
        if(words.length === 0){
            msg.send("登録されているメッセージがありません。")
        }else{
            msg.send(words);
        }
    });
}

コンソール上で実行するとき、APIトークンだけではうまくいかなかった

HUBOT_SLACK_RTM_CLIENT_OPTS='{"dataStore":"false","useRtmConnect":"true"}'

これを一緒に実行すると大丈夫みたい。
HubotのRTM?ちょっと詳しいことはわからないけれど後で調べたい。
最終的に下で実行するとよい。

env HUBOT_SLACK_TOKEN=xoxb-xxxxxxx HUBOT_SLACK_RTM_CLIENT_OPTS='{"dataStore":"false","useRtmConnect":"true"}' bin/hubot --adapter slack

まとめ

実際に自分で考えて作って、ようやく全体の流れみたいなものが理解できた。作業量が増えてきてるので難しい。
次はbotの永続化とのことなので、とにかくほめるbotも引き続き改良したい。入力チェックも特にしてない状態なので。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0