時事ネタです。
元ネタ
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)
環境変数
シングルクリック(そろそろ抜け出したい時に)
ダブルクリック(すぐに抜け出したい時に)
長押し(抜け出せなくなったorまだ会議に参加し続けることにした時に)
今後?
確かに、自動で電話かかってくるとかできるといいなー。