LoginSignup
2
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-16

時事ネタです。


元ネタ

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)

環境変数

lambda-env.png

シングルクリック(そろそろ抜け出したい時に)

button-single.png

ダブルクリック(すぐに抜け出したい時に)

button-double.png

長押し(抜け出せなくなったorまだ会議に参加し続けることにした時に)

button-long.png

今後?

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

参考

SlackのIncoming Webhooksでメンションを飛ばす方法

2
0
1

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
2
0