Skip to content

Instantly share code, notes, and snippets.

@ilumos
Last active December 26, 2017 14:30
Show Gist options
  • Save ilumos/487b566202803c81792ec1993e5a7f13 to your computer and use it in GitHub Desktop.
Save ilumos/487b566202803c81792ec1993e5a7f13 to your computer and use it in GitHub Desktop.
asana-to-discord
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