Try it out
Apps
Blog
About
Contact
Developers
Docs
Login
Developers
slack@obindo.com
Written by
Alex
Post the contents of a message, and any attached files, to a Slack channel.
/************************** Documentation Links/Description: OAuth2 Docs: https://api.slack.com/docs/oauth API Ref Root: https://api.slack.com/ Message Post: https://api.slack.com/methods/chat.postMessage **************************/ var oauth2Credentials = {}; //#region PRIVATE set my oauth2 credentials var requestUrl = 'https://slack.com/oauth/authorize?'; var scopes = 'post client'; var apiRoot = 'https://slack.com/api/'; var maxLength = 5000; oauth2.getAuthRedirectUrl = function () { var args = { scope: scopes, state: tokens.getId(), client_id: oauth2Credentials.clientID, redirect_uri: oauth2.getCallbackUrl(true) }; return requestUrl + util.getQueryArgsFromObject(args); } oauth2.onAuthResponse = function (q) { var qArgs = util.getObjectFromQueryArgs(q); var args = { client_id: oauth2Credentials.clientID, client_secret: oauth2Credentials.clientSecret, redirect_uri: oauth2.getCallbackUrl(true), code: qArgs.code }; var response = post({ url: apiRoot + 'oauth.access', args: args }); tokens.loadFromId(qArgs.state); tokens.accessToken = util.jsonify(response.text); } function getMessageText() { if (validText(message.strippedText)) return message.strippedText; if (validText(message.text)) return message.text; if (validText(message.subject)) return message.subject; return " "; function validText(s) { return (s && s.length > 0); } } function getUsername(token) { var body = { token: token, pretty: 1 }; var response = get({ url: apiRoot + 'auth.test?' + util.getQueryArgsFromObject(body) }); return util.jsonify(response.text).user; } function getUserId(token) { var body = { token: token, pretty: 1 }; var response = get({ url: apiRoot + 'auth.test?' + util.getQueryArgsFromObject(body) }); return util.jsonify(response.text).user_id; } // Conversation names can only contain lowercase letters, numbers, hyphens, and underscores, and must be 80 characters or less. function formatChannel(channel) { var formattedChannel = (channel[0] == '#' ? channel.substring(1) : channel) .replace(/\s/g, "-") .toLowerCase() .match("[a-z0-9_-]*")[0] .substring(0, 80); return formattedChannel; } function truncateText(s) { if (s.length <= maxLength) return s; var i = s.lastIndexOf(' ', maxLength); return ((i > 0) ? s.substring(0, i) : s.substring(0, maxLength)) + '...'; } function sendErrorEmail(channel, error) { var text = ''; var subject = ''; if (error == 'no_subject') { subject = "I need a channel"; text = "I'm sorry, but I couldn't figure out into what channel you would like to post that. " + "Please try again with the channel in the email subject."; } else if (error == 'channel_not_found') { subject = "I couldn't find that"; text = "I'm sorry, but I couldn't find a channel named " + channel + " in your Slack account. " + "Please sign into Slack, create that channel, and then try again."; } else { subject = "Something happened"; text = "I'm sorry, that didn't work for some reason (" + error + "). " + "Please try again."; } sendEmail(message.from.emailAddress, subject, text); } function uploadFile(file, channel, token) { var body = { token: token, channels: channel, file: file, filetype: file.contentType, filename: file.name }; var response = post({ url: apiRoot + 'files.upload', args: body }); var j = util.jsonify(response.text); if (j.error) sendErrorEmail(channel, j.error); } function isErrorResponse(response) { return response.error; } function isChannelNotFoundError(response) { return isErrorResponse(response) && response.error == "channel_not_found"; } function postMessage(text, channel, token) { try { var blocks = [ { "type": "section", "text": { "type": "mrkdwn", "text": text } } ]; var blocksJson = "["; for (var i = 0; i < blocks.length; i++) { blocksJson += util.stringify(blocks[i]); if (i != blocks.length - 1) { blocksJson += "," } else { blocksJson += "]" }; } var body = { "channel": channel, "blocks": blocksJson, "username": "Obindo", "icon_url": "http://connect.obindo.com/images/slacktopus%20110.png", "pretty": 1 } var response = post({ url: apiRoot + 'chat.postMessage', args: body, header: { "Authorization": "Bearer " + token } }); return util.jsonify(response.text); } catch (ex) { reply("Slack Script Error", "Sorry, somehing went very wrong with the Slack integration script."); } } function createChannel(channel, token) { var response = post({ url: apiRoot + "conversations.create?name=" + channel, header: { "Authorization": "Bearer " + token } }) return util.jsonify(response.text); } function postMessageWithChannelCreation(text, channel, token) { var slackMessageResp = postMessage(text, channel, token); if (isErrorResponse(slackMessageResp)) { if (isChannelNotFoundError(slackMessageResp)) { var slackChannelResp = createChannel(channel, token); if (isErrorResponse(slackChannelResp)) { reply("Slack Error", "Sorry, we could not create the necessary slack channel #" + channel + ". Please change the name or try creating it manually."); } else { slackMessageResp = postMessage(text, channel, token); } } if (isErrorResponse(slackMessageResp)) { reply("Slack Error", "Sorry, we could not post the requested message to channel #" + channel + " due to the following slack error: " + slackMessageResp.error + "."); } } } function main(message) { var channel = formatChannel(message.subject); if (channel == "") { sendErrorEmail('', 'no_subject'); return; } var token = tokens.accessToken.access_token; if (message.text) { var text = truncateText(getMessageText()); postMessageWithChannelCreation(text, channel, token); } if (message.files && message.files.length > 0) { for (var i = 0; i < message.files.length; i++) { uploadFile(message.files[i], channel, token); } } } $(function () { main(message); });