Slackには Pin
という機能があります。
重要なメッセージやファイルなどをチャンネルにピン留めしておくことで
いつでも参照できるという機能です。
先日、新たに参加したメンバーがSlackの使い方をよく理解しておらず、
チャンネル内にピン留されたメッセージなどをすべてはずしてしまうということがありました。
そこで誤ってピンが外れされてしまったとしても、再度自動でピンをしてくれるBotを
botkitを使って作成してみました。
成果物
ピンが外れされたら、外した人へ警告メッセージを送信すると同時に
再度ピン留を行っています。
ピンを外したい場合は特定のキーワードを発言することで、
一定時間のみピンをはずすことができます。
コード
if (!process.env.token) {
console.log('Error: Specify token in environment');
process.exit(1);
}
var Botkit = require('botkit');
var controller = Botkit.slackbot({
debug: false
});
var bot = controller.spawn({
token: process.env.token,
retry: true
}).startRTM(function(error){
if(error){
throw new Error(error);
}
});
let canPinRemoved = false;
controller.hears('ピンはずさせてやー', ['direct_message', 'direct_mention', 'mention'], (bot, message) => {
canPinRemoved = true;
bot.reply(message, '30秒だけ待ったる');
setTimeout((bot, message) => {
canPinRemoved = false;
bot.reply(message, 'ほい時間ぎれー');
}, 10000, bot, message);
});
controller.on('pin_removed', function(bot, message) {
if(canPinRemoved) return;
bot.api.users.info({
user: message.user
}, function(error, result){
if(error) console.log(error);
let userName = result.user.name;
bot.api.pins.add({
channel: message.channel_id,
timestamp: message.item.message.ts
});
bot.say({
text: `ちょっと @${userName} はん。 勝手にピンはずさんといてやー。\nしゃあないからもっかいピンしといたでー`,
link_names: true,
channel: message.channel_id
});
});
});
controller.on で pin_removed
イベントを待機します。
イベントが発生したら message
オブジェクトから必要な値を取得していきます。
ここではイベントを発生したユーザーがIDで渡ってくるので
users.info
API を使用してユーザー名を取得しています。
ピン留は pins.add
APIを使用して行っています。
ここでは timestamp
に対象のメッセージのtimestampを設定することで
メッセージのピン留めを行うことができます。
今回の実装ではファイルなどのピン留めには対応していないため、
また対応できるようにしていきたいです。
コードはこちらにもあげております。