7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

日報強制Botを作った話

Last updated at Posted at 2017-05-08

###はじめに
こんにちはT2です

最近は開発ディレクターという職種をやっています。
開発ディレクターとはざっと言うとプランナー、デザイナー、エンジニアなど
様々な職種を取りまとめて円滑に開発を進めていく役割になります。

他職種間でのコミニュケーションは自然のままにしておくとなかなか進まないどころか、
『あいつ何もしてない』とか『こちらのことを何も考えてくれない』だとか、憶測による対立を生みがちです。

そこで、Slackのチャンネルを用意して全職種を混ぜ込んだSlack日報
*Slackはpostに対するReaction
が非常に取りやすく、最近導入されたThreadや、絵文字のおかげでコミニュケーションツールとしてはかなりよろしいのではないかと思います。

を施工しようとしたのですが、その中で一点メンバーから要求がありました。
それは
”全員が必ず出すようにしてほしい”
というもの。

確かに日報というものは書く人は書くけど書かない人はとことん書かないもの。
あまりやりたくはなかったのですが、不公平感を減らすためにツールを使って一工夫してみました

*ちなみにnode.jsをやってみたかったのでnode製です。
*公開許可を取っていないので概念だけの説明になります。

##メイン部分


//休みの日ならばスルー
if (isHoriday() == true)
{
  console.log("isHoriday end");
  process.exit(1);
}

//メイン処理
async.series([

//チャンネルに参加しているユーザを取得
(next) => {
  getUsers(()=>{

    next();
  });
},
//ヒストリから12時間以内に発言した人を取得
(next) => {
  getHistory(()=>{

    next();
  });
},

//発言しない人をとってslackにPost
(next) => {

 var unpubMembers = _.difference(channelMembers, publishedMembers);

  postSlack(unpubMembers);

  next();
}
], (err) =>{
});

基本の流れはこちらです
チャンネル参加者を取って
12時間以内の発言者を取って
差し引きして発言していない人を特定してSlackにPost

なお、非同期処理を同期的に扱うためにオススメされた
neo-asyncを使っています
https://github.com/suguru03/neo-async

###ヒストリの取得

発言ヒストリですが、
https://api.slack.com/methods/channels.history
にあるように


  //ヒストリーの取得
  var date = new Date() ;
  var unixTimeNow = date.getTime() / 1000 ;
  //12時間前
  var oldest = unixTimeNow - 60 * 60 * 12;

  const URL = `https://slack.com/api/channels.history?token=${token}&channel=${channel}&oldest=${oldest}`;

こんな感じでアクセスするとjsonが帰ってくるので

  var memberList = [];
  var messages = json['messages']

  messages.forEach(function(member) {
    memberList.push(member['user']);
  });

  //重複削除
  memberList = memberList.filter(function(x, i, self) {
            return self.indexOf(x) === i;
        });
  publishedMembers = memberList;

jsonをparseすれば取得できます

###Slackポスト

  var post = pattern[patternIndex]["text"];
  unPostMemberNameList.forEach(function(name) {
    post += `<@${name}> `
  });

  post += " (お休みの人は非対応ですm(_ _)m)"
  var encodedpost = encodeURI(post);
  var post_name = encodeURI(pattern[patternIndex]["name"]);
  var icon_url = pattern[patternIndex]["icon"];
  
  var url = `https://slack.com/api/chat.postMessage?token=${token}&channel=${channel}&text=${encodedpost}&icon_url=${icon_url}&link_names=true&username=${post_name}&pretty=1`;
  https.get(url, (res) => {
  }).on('error', (e) => {
    console.log(e.message); 
  });

SlackへのPostは上記のように、chat.postMessageAPIに
日報を出していない人の名前を練りこんでgetアクセスすればOKです

###できたもの
こちらをjenkinsに上げて時限実行すれば(cronサーバを持っていないのです...

パターン1
dnogare.png

パターン2
hsuzu.png

誰からのメッセージだと日報提出率が上がるか検証していきたいですね!

7
8
0

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
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?