backlogの課題が追加&更新された時に、hubotを通じてslackのチャンネルに投稿できるようにしました。
個人通知出来るように、slackAPIのuser.list(https://api.slack.com/methods/users.list/test)を使用し、backlogから取得した通知相手の名前を元にユーザーIDをslackに投稿し個人通知出来るようにしたのですが、backlogを更新すると通知相手がずれて通知されてしまいます。
例
1回目
山田さんに対してbacklog更新→slackに通知されない
2回目
山田さんに対してbacklog更新→山田さんに対してslackに通知される
3回目
佐藤さんに対してbacklog更新→山田さんに対してslackに通知される
4回目
山田さんに対してbacklog更新→佐藤さんに対してslackに通知される
5回目
鈴木さんに対してbacklog更新→山田さんに対してslackに通知される
下記の部分を消すとズレが無くなるので、slackAPIの部分の記述が原因だと考えています。
1回目のslackに通知されない時に、エラーログを見ると「ReferenceError: memberid is not defined」と書かれていました。
message += "<@" + memberid + ">"; //ここを消すとズレが直る
backlogからユーザー名の取得とユーザー名を元にslackAPIからslackのユーザーIDを取得する箇所です。
if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); message += "<@" + memberid + ">"; //ここを消すとズレが直る } }
全体のコード
var backlogUrl, request; backlogUrl = 'https://backlog.jp/'; request = require('request'); module.exports = (function(_this) { return function(robot) { return robot.router.post("/slackroom/:room", function(req, res) { var a, body, error, i, label, len, message, username, ref, ref1, ref2, room, url,memberid; room = req.params.room; body = req.body; console.log('body type = ' + body.type); console.log('room = ' + room); try { switch (body.type) { case 1: label = '課題の追加'; break; case 2: case 3: label = '課題の更新'; break; default: return; } url = backlogUrl + "view/" + body.project.projectKey + "-" + body.content.key_id; if (((ref = body.content.comment) !== null ? ref.id : void 0) !== null) { url += "#comment-" + body.content.comment.id; } message = "*Backlog " + label + "*\n"; if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); message += "<@" + memberid + ">"; } } message += "\n[" + body.project.projectKey + "-" + body.content.key_id + "] - "; message += body.content.summary + " _by" + body.createdUser.name + "_\n>>> "; if (((ref2 = body.content.comment) !== null ? ref2.content : void 0) !== null) { message += body.content.comment.content + "\n"; } message += "" + url; console.log('message = ' + message); if (message !== null) { robot.messageRoom(room, message); return res.end("OK"); } else { robot.messageRoom(room, "Backlog integration error."); return res.end("Error"); } } catch (_error) { error = _error; console.log(error); return robot.send; } }); }; })(this);
コールバック関数を使用した記述
if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); } function execCallback (callback) { request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); callback(); } var myCallback = function () { message += "<@" + memberid + ">"; }; execCallback(myCallback); }
回答1件
あなたの回答
tips
プレビュー