휴가를 하고 있는 스탭에게 slack로 mention했을 때에 가르쳐 주는 bot를 만들었다

저희 회사는 직원들이 외부를 날아 다니는 경우가 많으며 다른 직원의 휴일 인식이 조금 어렵습니다. 물론 Google 캘린더를 열면 알겠지만, 그 나름의 인원수가 되면 당인의 캘린더를 본다는 것도 현실적이지 않습니다.
그렇다고 쉬는 날인데 아침 slack에 한마디 넣어야 한다는 것도 넌센스라고 생각합니다.

그래서 Google 캘린더(다른 출퇴근 관리 시스템에서도 당연히 좋다고 생각합니다)에서 데이터를 당겨 오는 것으로 휴일 판정을 실시해, 휴일이면 가르쳐 주는 기능을 bot에 붙여 보았습니다.

bot의 기능



bot는 botkit을 사용하여 node.js에서 실행 중입니다.
bot 본체의 js 자체는 간단합니다. @ 누군가의 ID로 멘션했을 때, 그 사람이 휴일이면 응답을 돌려줍니다.
코드는 일반적인 샘플과 동일합니다.

holidaybot.js
var Botkit = require('botkit');
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: 'botのトークン'
}).startRTM(function(err,bot,payload) {
  if (err) {
    throw new Error('Could not connect to Slack');
  }
});
//ここから個人判定部分
controller.hears(['ここに休日な人のslackID'],['ambient','direct_message','direct_mention','mention'],function(bot,message) {
  bot.reply(message,  '山田 花子 は本日お休みです');
});
//ここまで個人判定部分
//以下、休みの人数分コードを記述する

SlackID는 여기에서 확인할 수 있습니다 : htps : // 아피. scck. 코 m/메조 ds/우세 rs.ぃst

bot 운영 방법


forever start holidaybot.jsforever를 사용하여 지속됩니다.
휴일 판정을 하는 것은 하루에 한 번 시업 전입니다.
영속화되면 동적으로 bot 명령을 다시 작성할 수 없으므로 cron을 사용하여 프로세스를 떨어 뜨리고 holidaybot.js를 다시 작성하고 다시 시작하는 프로세스로 만듭니다.
$ crontab -e
`# 毎朝7時にファイル書き換え用のスクリプトが起動します。今回はPHPで実装します
0 7 * * * /usr/bin/forever stop 2 && /usr/bin/php /path to phpfile/makeHolidayBotJS.php>> /path to log/makeHolidayBotJS.log 2>&1
`# 上記処理が終わったら、生成されたjsファイルをstartします
3 7 * * * /usr/bin/forever start /path to js/holidaybot.js >> /path to log/holidaybot.log 2>&1

js 다시 쓰기 용 PHP



makeHolidayBotJS.php
<?php
  $file_name = 'holidaybot.js';
  $dels = 'rm -f /path to js/' + $file_name;
  echo unlink($dels);//稼働中のファイルを削除:ログファイル記録用にecho
  // jsファイルの作成
  touch( '/path to js/' + $file_name );

  // Googleカレンダーや勤怠管理システムから休みのスタッフを判定してリストに突っ込む
  // GoogleカレンダーAPIはこちらのコードを参照:https://developers.google.com/calendar/quickstart/php
  // カレンダー情報の取得と、上述したslackIDをセットにしたCSVを作って読み込んでいます
  // Email,名前,slackID
  $file = new SplFileObject('/path to csv/staffList.csv');
  $file->setFlags(SplFileObject::READ_CSV);
  // CSV内の情報を一行ずつ処理していく
  $uid = 0;
  date_default_timezone_set('Asia/Tokyo'); //タイムゾーンを日本にする
  $today = date('Y-m-d');//今日の日付を取得
  $timeMin = $today.'T00:00:00+09:00';//日本の場合
  $timeMax = $today.'T23:59:59+09:00';//時差がある場合は+9の部分を変更する

  $slackIDs = [];//休日スタッフのslackIDを入れる
  $userNames;//休日スタッフの名前を入れる

  foreach ($file as $line) {
    $records[] = $line;
    $calendarId = $records[$uid][0];
    $calendarName = $records[$uid][1];
    $slackID = $records[$uid][2];

    if ($calendarId) {
    //カレンダーID(メアド)を使ってその日の予定を取得する処理
      $optParams = array(
        'maxResults' => 20,//一日に20件以上入っている人は見たこと無い
        'orderBy' => 'startTime',
        'singleEvents' => true,
        'timeMin' => $timeMin,//取得開始時間
        'timeMax' => $timeMax,//取得終了時間
      );

    //イベント取得
    $results = $service->events->listEvents($calendarId, $optParams);

    //処理開始
    $holidayFlag = false;//初期化
    if (count($results->getItems()) == 0) { //イベントがない場合
       print "本日の予定は有りません\n";//ログ出力用なのでなくても良い
    } else {
       foreach ($results->getItems() as $event) {
         if (strpos($event->getSummary(), '振替休日') !== false or strpos($event->getSummary(), '休暇') !== false or strpos($event->getSummary(), '休み') !== false or strpos($event->getSummary(), 'off') !== false) { // 休みの人が入れているキーワードを設定してるので要調整
           $holidayFlag = true;//フラグを立てる
           $holidayName = $event->getSummary();//何休暇なのかを書き出す場合はこれも使う
         }
     }
    //全イベント処理終了
    if( $holidayFlag == true ) {
      array_push($slackIDs , $slackID);//あとでループで使う
      $userNames[$slackID] = $calendarName;//あとで呼び出すのでslackIDをキーにした連想配列に入れる
    }
    //uidのインクリメント
    ++$uid;
  }
 //CSVファイル一行(ユーザ単位)ずつ実行ここまで
}


//最後にholidaybot.jsを生成する
$input1 = <<<EOT
var Botkit = require('botkit');
var controller = Botkit.slackbot();
var bot = controller.spawn({
  token: 'your bot token'
}).startRTM(function(err,bot,payload) {
  if (err) {
    throw new Error('Could not connect to Slack');
  }
});

EOT; // 最初のbotのtoken使う部分をまとめる

$inputs = [];//プログラム一行ずつを配列にして格納する

//休みスタッフのslackIDsでループ処理
foreach ( $slackIDs as $id){
  array_push($inputs ,"controller.hears(['$id'],['ambient','direct_message','direct_mention','mention'],function(bot,message) {");
  array_push($inputs ,"bot.reply(message,  '$userNames[$id] は本日お休みです');";
  array_push($inputs ,"});";
}
$input2 = implode("\n",$inputs);//配列に入ってる文字列を改行して全部結合
$output = $input1.$input2; //最終的に上部と下部を結合
//ファイルに書き込み
var_dump( file_put_contents( '/path to js/holidaybot.js' , $output));


여기까지 쓰면 cron을 기동해 매일 아침 처리시키면, 간단하게 쉬는 사람을 알 수 있습니다.

좋은 웹페이지 즐겨찾기