Last active
December 26, 2017 14:30
-
-
Save ilumos/487b566202803c81792ec1993e5a7f13 to your computer and use it in GitHub Desktop.
asana-to-discord
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module['exports'] = function asanaToDiscord(hook, callback) { | |
var discordApiUrl = 'https://discordapp.com/api/webhooks/' + hook.params.discord_webhook_id + '/' + hook.params.discord_webhook_token; | |
var discordAvatarUrl = "https://pbs.twimg.com/profile_images/852570851400482820/zGCC6jNZ_400x400.jpg"; | |
var asanaApiUrl = "https://app.asana.com/api/1.0/"; | |
var asanaPersonalAccessToken = hook.params.asana_personal_access_token; | |
var request = require('request'); | |
function getTask(eventId, taskId) { | |
return new Promise(function(resolve, reject) { | |
request.get(asanaApiUrl + 'tasks/' + taskId, { | |
'auth': { | |
'bearer': asanaPersonalAccessToken | |
}, | |
'callback': function(error, response, body) { | |
if (error) { return reject(error); } | |
var task = JSON.parse(body).data; | |
return resolve({ | |
"eventId": eventId, | |
"taskId": taskId, | |
"projectId": task.memberships[0].project.id, | |
"name": task.name, | |
"completed": task.completed | |
}); | |
} | |
}); | |
}); | |
} | |
function getTaskUser(eventId, userId) { | |
return new Promise(function(resolve, reject) { | |
request.get(asanaApiUrl + 'users/' + userId, { | |
'auth': { | |
'bearer': asanaPersonalAccessToken | |
}, | |
'callback': function(error, response, body) { | |
if (error) { return reject(error); } | |
return resolve({ | |
"eventId": eventId, | |
"user": JSON.parse(body).data.name | |
}); | |
} | |
}); | |
}); | |
} | |
function postCompletedTasksToDiscord(completedTasks) { | |
var discordApiPromises = []; | |
for (var i in completedTasks) { | |
var url = 'https://app.asana.com/0/' + completedTasks[i].projectId + '/' + completedTasks[i].taskId; | |
var message = | |
'Task **' + completedTasks[i].name + '** has just been completed by **' + completedTasks[i].user + '** ' + url; | |
discordApiPromises.push(postMessageToDiscord(message)); | |
}; | |
return Promise.all(discordApiPromises); | |
} | |
function postMessageToDiscord(message) { | |
return new Promise(function(resolve, reject) { | |
request.post(discordApiUrl, { | |
form: { | |
username: 'Asana', | |
avatar_url: discordAvatarUrl, | |
content: message | |
}, | |
'callback': function(error, response, body) { | |
if (error) { return reject(error); } | |
return resolve(); | |
} | |
}); | |
}); | |
} | |
// If the webhook is being created for the first time | |
// Asana will send this header, and expect it in the response | |
// See: http://resthooks.org/docs/security/ | |
if (hook.req.headers['x-hook-secret']) { | |
hook.res.setHeader('X-Hook-Secret', hook.req.headers['x-hook-secret']); | |
console.log("New subscription created"); | |
hook.res.end(); | |
} | |
var eventsAboutChangedTasks = hook.params.events.filter(function (event) { | |
return event.type == "task" && | |
event.action == "changed"; | |
}); | |
console.log("Received events from Asana's webhook"); | |
console.log(eventsAboutChangedTasks); | |
var asanaApiPromises = []; | |
// Loop through received events and queue | |
// API calls to get the task and user info | |
for (var i in eventsAboutChangedTasks) { | |
asanaApiPromises.push(getTask(i, eventsAboutChangedTasks[i].resource)); | |
asanaApiPromises.push(getTaskUser(i, eventsAboutChangedTasks[i].user)); | |
} | |
// Process Asana API call promises | |
Promise.all(asanaApiPromises) | |
.then(function(asanaApiResponses) { | |
var changedTasks = []; | |
asanaApiResponses.forEach(function(item, i, array) | |
{ | |
if("taskId" in item) | |
{ | |
if(changedTasks[item.eventId] == undefined) { | |
changedTasks[item.eventId] = { taskId: item.taskId}; | |
} else { | |
changedTasks[item.eventId]["taskId"] = item.taskId; | |
}; | |
} | |
if("projectId" in item) | |
{ | |
if(changedTasks[item.eventId] == undefined) { | |
changedTasks[item.eventId] = { projectId: item.projectId}; | |
} else { | |
changedTasks[item.eventId]["projectId"] = item.projectId; | |
}; | |
} | |
if("name" in item) | |
{ | |
if(changedTasks[item.eventId] == undefined) { | |
changedTasks[item.eventId] = { name: item.name}; | |
} else { | |
changedTasks[item.eventId]["name"] = item.name; | |
} | |
} | |
if("user" in item) | |
{ | |
if(changedTasks[item.eventId] == undefined) { | |
changedTasks[item.eventId] = { user: item.user}; | |
} else { | |
changedTasks[item.eventId]["user"] = item.user; | |
}; | |
} | |
if("completed" in item) | |
{ | |
if(changedTasks[item.eventId] == undefined) { | |
changedTasks[item.eventId] = { completed: item.completed}; | |
} else { | |
changedTasks[item.eventId]["completed"] = item.completed; | |
}; | |
} | |
}); | |
return changedTasks; | |
}) | |
.then(function(changedTasks) { | |
// Filter out all tasks except completed ones | |
var completedTasks = changedTasks.filter(function (task) { | |
return task.completed; | |
}); | |
return postCompletedTasksToDiscord(completedTasks); | |
}).then(function(){ | |
hook.res.end(); | |
}); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment