あのボタンで呼び出しボタンを作って見た

時事ネタです。

---- 

# 元ネタ
[https://twitter.com/JICRochelle/status/1062842367105884162](https://twitter.com/JICRochelle/status/1062842367105884162)

リツイートしてなかったな(今はした)

これ見た時から、SORACOM IoT Buttonでできるなーと思って、作って見ました。

# 仕組み
Slackのチャネルにメンション飛ばして、ヒトに呼び出してもらいます。(すみません。ラストワンマイルはヒトです)

＃ ソース
ソース自体は、前回作ったのとほぼ同じ。

```index.js
'use strict'
const request = require('request');
const AWS = require('aws-sdk');
AWS.config.update({ region: 'ap-northeast-1' });
const kms = new AWS.KMS();

const encryptedSlackWebHookUrl = process.env['SLACK_WEBHOOK_URL'];
let decryptedSlackWebHookUrl;
/**
 * 初期化
 * @param  {[type]} event   [description]
 * @param  {[type]} context [description]
 * @return {[type]}         [description]
 */
const initialize = (event, context) => {
  return new Promise((resolve) => {
    let message = ''
    if (event.deviceEvent.buttonClicked.clickType == "SINGLE") {
        message = process.env['CALLING_MESSAGE_SINGLE'];
    } else if (event.deviceEvent.buttonClicked.clickType == "DOUBLE") {
        message = process.env['CALLING_MESSAGE_DOUBLE'];
    } else  {
        message = process.env['CALLING_MESSAGE_LONG'];
    }
    const stash = {
      clickType: event.deviceEvent.buttonClicked.clickType,
      message,
    };
    console.log(stash);
    resolve(stash);
  });
};
/**
 * Slack WebHook URL情報復号処理
 * @param  {[type]} stash [description]
 * @return {[type]}       [description]
 */
const decryptedUrl = (stash) => {
  return new Promise((resolve, reject) => {
      if (!decryptedSlackWebHookUrl) {

        kms.decrypt({ CiphertextBlob: new Buffer(encryptedSlackWebHookUrl, 'base64') }, (err, data) => {
            if (err) {
                console.log('Decrypt error:', err);
                reject(err);
            }
            decryptedSlackWebHookUrl = data.Plaintext.toString('ascii');
            resolve(stash);
        });
      } else {
        resolve(stash);
      }
  });
};
/**
 * Slack POST
 * @param  {[type]} stash [description]
 * @return {[type]}       [description]
 */
const postSlackMessage = (stash) => {
  return new Promise((resolve, reject) => {
      console.log('slack Call');

      // リクエスト設定
      const options = {
        url: decryptedSlackWebHookUrl,
        headers: {
          'Content-type': 'application/json'
        },
        body: {
          "text": stash.message
        },
        json: true
      };

      // メッセージ送信
      request.post(options, function(error, response, body) {
        if (!error && response.statusCode == 200) {
          resolve(stash);
        } else {
          if (error) {
              console.log('Slack API Error: ' + error);
              reject(error);
          } else {
            console.log('Slack API Error: ' + response.statusCode);
            const err = {
              'statusCode': response.statusCode
            }
            reject(err);
          }
        }
      });
  });
};
/**
 * Main処理
 * @param  {[type]}   event    [description]
 * @param  {[type]}   context  [description]
 * @param  {Function} callback [description]
 * @return {[type]}            [description]
 */
exports.handler = (event, context, callback) => {

  initialize(event, context)
    .then(decryptedUrl)
    .then(postSlackMessage)
    .then(callback.bind(null, null))
    .catch(callback);
};
```
メッセージは、ボタンのタイプごとに、環境変数に設定してます。
(Lambdaの環境変数、日本語はいるんですね。普通に入れて見たけど、普通に入ったw)
### 環境変数
<img width="957" alt="lambda-env.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/db985a57-4c06-20b4-72c0-0f3cb88ef59d.png">

### シングルクリック（そろそろ抜け出したい時に）
<img width="330" alt="button-single.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/c3bc5708-6e6b-d787-f4d2-3e094cd7e35b.png">

### ダブルクリック（すぐに抜け出したい時に）
<img width="279" alt="button-double.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/c5fa403f-d327-df3d-e4a4-e90dc54b1892.png">

### 長押し（抜け出せなくなったorまだ会議に参加し続けることにした時に）
<img width="279" alt="button-long.png" src="https://qiita-image-store.s3.amazonaws.com/0/72752/91fdb115-6288-a65e-c5e4-9ed7e3c39582.png">



# 今後？

確かに、自動で電話かかってくるとかできるといいなー。

# 参考
[SlackのIncoming Webhooksでメンションを飛ばす方法](https://qiita.com/ryo-yamaoka/items/7677ee4486cf395ce9bc)