├── .gitignore ├── LICENSE ├── README.md ├── bower.json ├── build ├── ng-deg.slackapi.js └── ng-deg.slackapi.min.js └── src ├── deg.slackapi.module.js └── deg.slackapi.services.js /.gitignore: -------------------------------------------------------------------------------- 1 | ### WebStorm ### 2 | *.iml 3 | .idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Nick Aranzamendi nickaranz@gmail.com 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # slackapi-angularjs 2 | AngularJS module wrapper for the Slack Web API and oAuth helpers for token authentication. 3 | 4 | ## Install 5 | `bower install --save-dev slackapi-angularjs` 6 | 7 | or 8 | 9 | Download build and reference: 10 | `` 11 | 12 | ## Usage 13 | Most methods documented here https://api.slack.com/methods are wrapped in an angular service. 14 | So far, only `im `, and `group` calls are not supported yet. 15 | For a quick POC, you can manually set a default token on `deg.slackapi.module.js` - Get a token here: https://api.slack.com/web 16 | 17 | ``` 18 | slackApi.value("slackConfig", { 19 | ... 20 | DefaultToken: "" 21 | ... 22 | }); 23 | 24 | ``` 25 | 26 | ### Load Module 27 | `angular.module("app", ['Deg.SlackApi']);` 28 | 29 | ### Inject slackSvc Service 30 | `angular.module("app").controller('myCtrl', ['$scope', 'slackSvc', function ($scope, slackSvc) { }]);` 31 | 32 | ##### Example 33 | ``` 34 | angular.module("app").controller('myCtrl', ['$scope', 'slackSvc', function ($scope, slackSvc) { 35 | 36 | slackSvc.search.files($scope.query, function(response){ 37 | if(response.ok){ 38 | // your code here 39 | } 40 | }); 41 | }]); 42 | ``` 43 | 44 | ##### Authentication 45 | First, register your application with Slack here https://api.slack.com/applications/new 46 | 47 | * Authorize 48 | 49 | Learn more here: https://api.slack.com/docs/oauth 50 | 51 | ``` 52 | var config = { 53 | client: "", 54 | authParms { 55 | state: "", 56 | redirect_uri: "" 57 | ... 58 | }; 59 | } 60 | slackSvc.authorize(config.client, config.authParams); 61 | ``` 62 | 63 | * After redirect, Check `state` and `code` values then call 64 | 65 | ``` 66 | slackSvc.oauth.access(clientId, clientSecret, code, function (response) { 67 | if(response.ok){ 68 | //optional : preload you token for further requests 69 | slackSvc.InitToken(response.access_token); 70 | } 71 | }); 72 | ``` 73 | 74 | ##### Manual method call 75 | Most slackSvc methods only take required values as parameters. To call a missing endpoint or to pass more parameters use: 76 | 77 | ``` 78 | var params{ 79 | token: "", 80 | channel: "", 81 | inclusive : 0 82 | } 83 | slackSvc.ExecuteApiMethod("groups.history", params, function(response){ 84 | // your code here 85 | }); 86 | ``` 87 | 88 | ### Feedback 89 | 90 | Questions, bugs, I am in Twitter [@nickaranz](http://twitter.com/nickaranz) 91 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slackapi-angularjs", 3 | "version": "0.1.0", 4 | "homepage": "https://github.com/nickaranz/slackapi-angularjs", 5 | "authors": [ 6 | "https://github.com/nickaranz" 7 | ], 8 | "description": "AngularJS module wrapper for the Slack Web API", 9 | "main": "build/ng-deg.slackapi.js", 10 | "moduleType": [], 11 | "keywords": [ 12 | "slack", 13 | "angularjs", 14 | "api", 15 | "web" 16 | ], 17 | "license": "MIT", 18 | "private": false, 19 | "ignore": [ 20 | "**/.*", 21 | "node_modules", 22 | "bower_components", 23 | "test", 24 | "tests" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /build/ng-deg.slackapi.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * ng-deg.slackapi JavaScript Library v1.0 3 | * https://github.com/nickaranz/slackapi-angularjs 4 | * 5 | * Copyright (c) 2015 Nick Aranzamendi nickaranz@gmail.com 6 | * Released under the MIT license 7 | */ 8 | 9 | 'use strict'; 10 | 11 | (function (angular) { 12 | 13 | var slackApi = angular.module("Deg.SlackApi", []); 14 | slackApi.value("slackConfig", { 15 | OAuthUrl: "https://slack.com/oauth/authorize", 16 | ApiUrl: "https://slack.com/api/", 17 | DefaultToken: "" 18 | }); 19 | 20 | }(angular)); 21 | 22 | (function (angular) { 23 | 24 | angular.module("Deg.SlackApi").service('slackSvc', ['$http', '$log', 'slackConfig', function ($http, $log, slackConfig) { 25 | 26 | return { 27 | //auth 28 | authorize: authorizeApp, 29 | auth: { 30 | test: authTest 31 | }, 32 | oauth: { 33 | access: getAccessToken 34 | }, 35 | 36 | //channels 37 | channels: { 38 | archive: archiveChannel, 39 | create: createChannel, 40 | history: channelHistory, 41 | info: getChannel, 42 | invite: channelInvite, 43 | join: channelJoin, 44 | kick: channelKick, 45 | leave: channelleave, 46 | list: getChannelList, 47 | mark: channelMark, 48 | rename: channelRename, 49 | setPurpose: channelSetPurpose, 50 | setTopic: channelSetTopic, 51 | unarchive: channelUnarchive 52 | }, 53 | 54 | //chat 55 | chat: { 56 | delete: deleteMessage, 57 | postMessage: postMessage, 58 | update: updateMessage 59 | }, 60 | 61 | //files 62 | files: { 63 | delete: deleteFile, 64 | info: getFileInfo, 65 | list: listfiles, 66 | upload: uploadFile 67 | }, 68 | 69 | //rtm 70 | rtm: { 71 | start: startRtm 72 | }, 73 | 74 | //search 75 | search: { 76 | all: searchAll, 77 | files: searchFiles, 78 | messages: searchMessages 79 | }, 80 | 81 | //stars 82 | stars: { 83 | list: starsList 84 | }, 85 | 86 | //team 87 | team: { 88 | accessLogs: teamLogs, 89 | info: getTeamInfo 90 | }, 91 | 92 | //users 93 | users: { 94 | getPresence: getUserPresence, 95 | info: getUserinfo, 96 | list: getUserslist, 97 | setActive: setUserActive, 98 | setPresence: setUserPresence 99 | }, 100 | 101 | //Helpers 102 | InitToken: initToken, 103 | ExecuteApiMethod: executeApiCall, 104 | 105 | //groups 106 | groups: { 107 | archive: notImplemented, 108 | close: notImplemented, 109 | create: notImplemented, 110 | createChild: notImplemented, 111 | history: notImplemented, 112 | invite: notImplemented, 113 | kick: notImplemented, 114 | leave: notImplemented, 115 | list: notImplemented, 116 | mark: notImplemented, 117 | open: notImplemented, 118 | rename: notImplemented, 119 | setPurpose: notImplemented, 120 | setTopic: notImplemented, 121 | unarchive: notImplemented 122 | }, 123 | 124 | //im 125 | im: { 126 | close: notImplemented, 127 | history: notImplemented, 128 | list: notImplemented, 129 | mark: notImplemented, 130 | open: notImplemented 131 | }, 132 | }; 133 | 134 | // USERS 135 | function getUserPresence(userId, callback, token) { 136 | var params = { 137 | token: token || slackConfig.DefaultToken, 138 | user: userId 139 | }; 140 | executeApiCall("users.getPresence", params, callback); 141 | } 142 | function getUserinfo(userId, callback, token) { 143 | var params = { 144 | token: token || slackConfig.DefaultToken, 145 | user: userId 146 | }; 147 | executeApiCall("users.info", params, callback); 148 | } 149 | function getUserslist(callback, token) { 150 | var params = { 151 | token: token || slackConfig.DefaultToken 152 | }; 153 | executeApiCall("users.list", params, callback); 154 | } 155 | function setUserActive(callback, token) { 156 | var params = { 157 | token: token || slackConfig.DefaultToken 158 | }; 159 | executeApiCall("users.setActive", params, callback); 160 | } 161 | function setUserPresence(status, callback, token) { 162 | var params = { 163 | token: token || slackConfig.DefaultToken, 164 | presence: status 165 | }; 166 | executeApiCall("users.setPresence", params, callback); 167 | } 168 | 169 | 170 | function startRtm(token) { 171 | var params = { 172 | token: token || slackConfig.DefaultToken 173 | }; 174 | executeApiCall("auth.test", params); 175 | } 176 | 177 | //AUTH 178 | function authorizeApp(clientId, params) { 179 | var qs = "&" + toQueryString(params); 180 | var url = slackConfig.OAuthUrl + "?client_id=" + clientId + qs; 181 | window.location.replace(url); 182 | } 183 | function initToken(token, callback) { 184 | slackConfig.DefaultToken = token; 185 | authTest(callback); 186 | } 187 | function getAccessToken(client, secret, code, callback) { 188 | var params = { 189 | client_id: client, 190 | client_secret: secret, 191 | code: code 192 | }; 193 | executeApiCall("oauth.access", params, callback); 194 | } 195 | function authTest(callback, token) { 196 | var params = { 197 | token: token || slackConfig.DefaultToken 198 | }; 199 | executeApiCall("auth.test", params, callback); 200 | } 201 | // CHANNELS 202 | function archiveChannel(channeId, callback, token) { 203 | var params = { 204 | token: token || slackConfig.DefaultToken, 205 | channel: channeId 206 | }; 207 | executeApiCall("channels.archive", params, callback); 208 | } 209 | function channelUnarchive(channeId, callback, token) { 210 | var params = { 211 | token: token || slackConfig.DefaultToken, 212 | channel: channeId 213 | }; 214 | executeApiCall("channels.unarchive", params, callback); 215 | } 216 | function channelHistory(channeId, callback, token) { 217 | var params = { 218 | token: token || slackConfig.DefaultToken, 219 | channel: channeId 220 | }; 221 | executeApiCall("channels.history", params, callback); 222 | } 223 | function channelInvite(channeId, userId, callback, token) { 224 | var params = { 225 | token: token || slackConfig.DefaultToken, 226 | channel: channeId, 227 | user: userId 228 | }; 229 | executeApiCall("channels.invite", params, callback); 230 | } 231 | function channelJoin(channeName, callback, token) { 232 | var params = { 233 | token: token || slackConfig.DefaultToken, 234 | channel: channeName 235 | }; 236 | executeApiCall("channels.join", params, callback); 237 | } 238 | function channelKick(channelId, userId, callback, token) { 239 | var params = { 240 | token: token || slackConfig.DefaultToken, 241 | channel: channelId, 242 | user: userId 243 | }; 244 | executeApiCall("channels.kick", params, callback); 245 | } 246 | function channelleave(channelId, callback, token) { 247 | var params = { 248 | token: token || slackConfig.DefaultToken, 249 | channel: channelId 250 | }; 251 | executeApiCall("channels.leave", params, callback); 252 | } 253 | function channelMark(channelId, timeStamp, callback, token) { 254 | var params = { 255 | token: token || slackConfig.DefaultToken, 256 | channel: channelId, 257 | ts: timeStamp 258 | }; 259 | executeApiCall("channels.mark", params, callback); 260 | } 261 | function channelRename(channelId, callback, token) { 262 | var params = { 263 | token: token || slackConfig.DefaultToken, 264 | channel: channelId 265 | }; 266 | executeApiCall("channels.rename", params, callback); 267 | } 268 | 269 | function channelSetPurpose(channelId, text, callback, token) { 270 | var params = { 271 | token: token || slackConfig.DefaultToken, 272 | channel: channelId, 273 | purpose: text 274 | }; 275 | executeApiCall("channels.setPurpose", params, callback); 276 | } 277 | function channelSetTopic(channelId, text, callback, token) { 278 | var params = { 279 | token: token || slackConfig.DefaultToken, 280 | channel: channelId, 281 | topic: text 282 | }; 283 | executeApiCall("channels.setTopic", params, callback); 284 | } 285 | function getChannelList(callback, token) { 286 | var params = { 287 | token: token || slackConfig.DefaultToken 288 | }; 289 | executeApiCall("channels.list", params, callback); 290 | } 291 | function getChannel(channelId, callback, token) { 292 | var params = { 293 | token: token || slackConfig.DefaultToken, 294 | channel: channelId 295 | }; 296 | executeApiCall("channels.info", params, callback); 297 | } 298 | function createChannel(channeName, callback, token) { 299 | var params = { 300 | token: token || slackConfig.DefaultToken, 301 | name: channeName 302 | }; 303 | executeApiCall("channels.create", params, callback); 304 | } 305 | 306 | // CHAT 307 | function postMessage(channeId, message, callback, token) { 308 | var params = { 309 | token: token || slackConfig.DefaultToken, 310 | channel: channeId, 311 | text: message 312 | }; 313 | executeApiCall("chat.postMessage", params, callback); 314 | } 315 | function deleteMessage(channeId, timestamp, callback, token) { 316 | var params = { 317 | token: token || slackConfig.DefaultToken, 318 | channel: channeId, 319 | ts: timestamp 320 | }; 321 | executeApiCall("chat.delete", params, callback); 322 | } 323 | function updateMessage(channeId, timestamp, newMessage, callback, token) { 324 | var params = { 325 | token: token || slackConfig.DefaultToken, 326 | channel: channeId, 327 | ts: timestamp, 328 | text: newMessage 329 | }; 330 | executeApiCall("chat.update", params, callback); 331 | } 332 | 333 | // TEAM 334 | function getTeamInfo(callback, token) { 335 | var params = { 336 | token: token || slackConfig.DefaultToken 337 | }; 338 | executeApiCall("team.info", params, callback); 339 | } 340 | function teamLogs(callback, token) { 341 | var params = { 342 | token: token || slackConfig.DefaultToken 343 | }; 344 | executeApiCall("team.accessLogs", params, callback); 345 | } 346 | // FILES 347 | function deleteFile(fileId, callback, token) { 348 | var params = { 349 | token: token || slackConfig.DefaultToken, 350 | file: fileId 351 | }; 352 | executeApiCall("files.delete", params, callback); 353 | } 354 | 355 | function getFileInfo(fileId, callback, token) { 356 | var params = { 357 | token: token || slackConfig.DefaultToken, 358 | file: fileId 359 | }; 360 | executeApiCall("files.info", params, callback); 361 | } 362 | 363 | function listfiles(callback, token) { 364 | var params = { 365 | token: token || slackConfig.DefaultToken 366 | }; 367 | executeApiCall("files.list", params, callback); 368 | } 369 | function uploadFile(params, callback) { 370 | 371 | params.token = token || slackConfig.DefaultToken; 372 | 373 | if (params.content) { 374 | var url = slackConfig.ApiUrl + "files.upload"; 375 | executePostRequest(url, params, callback); 376 | } 377 | 378 | executeApiCall("files.upload", params, callback); 379 | } 380 | 381 | // SEARCH 382 | function searchFiles(query, callback, token) { 383 | var params = { 384 | token: token || slackConfig.DefaultToken, 385 | query: query 386 | }; 387 | executeApiCall("search.files", params, callback); 388 | } 389 | function searchAll(query, callback, token) { 390 | var params = { 391 | token: token || slackConfig.DefaultToken, 392 | query: query 393 | }; 394 | executeApiCall("search.all", params, callback); 395 | } 396 | function searchMessages(query, callback, token) { 397 | var params = { 398 | token: token || slackConfig.DefaultToken, 399 | query: query 400 | }; 401 | executeApiCall("search.messages", params, callback); 402 | } 403 | 404 | // STARS 405 | function starsList(userId, callback, token) { 406 | var params = { 407 | token: token || slackConfig.DefaultToken, 408 | user: userId 409 | }; 410 | executeApiCall("stars.list", params, callback); 411 | } 412 | 413 | // HELPERS 414 | function executeApiCall(endpoint, paramsObj, callback) { 415 | var qs = toQueryString(paramsObj); 416 | var url = slackConfig.ApiUrl + endpoint + "?" + qs; 417 | executeGetRequest(url, callback); 418 | } 419 | function executeGetRequest(url, callback) { 420 | $http.get(url). 421 | success(function (result) { 422 | if (callback) 423 | callback(result); 424 | }). 425 | error(function (data, status) { 426 | $log.log(status); 427 | $log.log(data); 428 | }); 429 | } 430 | function executePostRequest(url, data, callback) { 431 | $http.post(url, data). 432 | success(function (result) { 433 | 434 | callback(result); 435 | }). 436 | error(function (data, status) { 437 | $log.log(status); 438 | $log.log(data); 439 | }); 440 | } 441 | function toQueryString(obj) { 442 | var parts = []; 443 | for (var i in obj) { 444 | if (obj.hasOwnProperty(i)) { 445 | parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i])); 446 | } 447 | } 448 | return parts.join("&"); 449 | } 450 | 451 | function notImplemented() { 452 | $log.log("Method not implemented. Remind nickaranz@gmail.com to quit slacking"); 453 | } 454 | 455 | }]); 456 | 457 | })(angular); 458 | -------------------------------------------------------------------------------- /build/ng-deg.slackapi.min.js: -------------------------------------------------------------------------------- 1 | /*! ng-deg.slackapi v1.0 (c) 2015 Nick Aranzamendi */ 2 | "use strict";!function(e){var n=e.module("Deg.SlackApi",[]);n.value("slackConfig",{OAuthUrl:"https://slack.com/oauth/authorize",ApiUrl:"https://slack.com/api/",DefaultToken:""})}(angular),function(e){e.module("Deg.SlackApi").service("slackSvc",["$http","$log","slackConfig",function(e,n,t){function o(e,n,o){var a={token:o||t.DefaultToken,user:e};b("users.getPresence",a,n)}function a(e,n,o){var a={token:o||t.DefaultToken,user:e};b("users.info",a,n)}function c(e,n){var o={token:n||t.DefaultToken};b("users.list",o,e)}function i(e,n){var o={token:n||t.DefaultToken};b("users.setActive",o,e)}function u(e,n,o){var a={token:o||t.DefaultToken,presence:e};b("users.setPresence",a,n)}function l(e){var n={token:e||t.DefaultToken};b("auth.test",n)}function s(e,n){var o="&"+G(n),a=t.OAuthUrl+"?client_id="+e+o;window.location.replace(a)}function r(e,n){t.DefaultToken=e,k(n)}function f(e,n,t,o){var a={client_id:e,client_secret:n,code:t};b("oauth.access",a,o)}function k(e,n){var o={token:n||t.DefaultToken};b("auth.test",o,e)}function h(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.archive",a,n)}function v(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.unarchive",a,n)}function T(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.history",a,n)}function D(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,user:n};b("channels.invite",c,o)}function p(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.join",a,n)}function m(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,user:n};b("channels.kick",c,o)}function g(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.leave",a,n)}function d(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,ts:n};b("channels.mark",c,o)}function A(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.rename",a,n)}function y(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,purpose:n};b("channels.setPurpose",c,o)}function P(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,topic:n};b("channels.setTopic",c,o)}function U(e,n){var o={token:n||t.DefaultToken};b("channels.list",o,e)}function C(e,n,o){var a={token:o||t.DefaultToken,channel:e};b("channels.info",a,n)}function q(e,n,o){var a={token:o||t.DefaultToken,name:e};b("channels.create",a,n)}function M(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,text:n};b("chat.postMessage",c,o)}function j(e,n,o,a){var c={token:a||t.DefaultToken,channel:e,ts:n};b("chat.delete",c,o)}function w(e,n,o,a,c){var i={token:c||t.DefaultToken,channel:e,ts:n,text:o};b("chat.update",i,a)}function x(e,n){var o={token:n||t.DefaultToken};b("team.info",o,e)}function z(e,n){var o={token:n||t.DefaultToken};b("team.accessLogs",o,e)}function I(e,n,o){var a={token:o||t.DefaultToken,file:e};b("files.delete",a,n)}function O(e,n,o){var a={token:o||t.DefaultToken,file:e};b("files.info",a,n)}function R(e,n){var o={token:n||t.DefaultToken};b("files.list",o,e)}function S(e,n){if(e.token=token||t.DefaultToken,e.content){var o=t.ApiUrl+"files.upload";F(o,e,n)}b("files.upload",e,n)}function _(e,n,o){var a={token:o||t.DefaultToken,query:e};b("search.files",a,n)}function L(e,n,o){var a={token:o||t.DefaultToken,query:e};b("search.all",a,n)}function $(e,n,o){var a={token:o||t.DefaultToken,query:e};b("search.messages",a,n)}function E(e,n,o){var a={token:o||t.DefaultToken,user:e};b("stars.list",a,n)}function b(e,n,o){var a=G(n),c=t.ApiUrl+e+"?"+a;B(c,o)}function B(t,o){e.get(t).success(function(e){o&&o(e)}).error(function(e,t){n.log(t),n.log(e)})}function F(t,o,a){e.post(t,o).success(function(e){a(e)}).error(function(e,t){n.log(t),n.log(e)})}function G(e){var n=[];for(var t in e)e.hasOwnProperty(t)&&n.push(encodeURIComponent(t)+"="+encodeURIComponent(e[t]));return n.join("&")}function H(){n.log("Method not implemented. Remind nickaranz@gmail.com to quit slacking")}return{authorize:s,auth:{test:k},oauth:{access:f},channels:{archive:h,create:q,history:T,info:C,invite:D,join:p,kick:m,leave:g,list:U,mark:d,rename:A,setPurpose:y,setTopic:P,unarchive:v},chat:{"delete":j,postMessage:M,update:w},files:{"delete":I,info:O,list:R,upload:S},rtm:{start:l},search:{all:L,files:_,messages:$},stars:{list:E},team:{accessLogs:z,info:x},users:{getPresence:o,info:a,list:c,setActive:i,setPresence:u},InitToken:r,ExecuteApiMethod:b,groups:{archive:H,close:H,create:H,createChild:H,history:H,invite:H,kick:H,leave:H,list:H,mark:H,open:H,rename:H,setPurpose:H,setTopic:H,unarchive:H},im:{close:H,history:H,list:H,mark:H,open:H}}}])}(angular); -------------------------------------------------------------------------------- /src/deg.slackapi.module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | (function (angular) { 4 | 5 | var slackApi = angular.module("Deg.SlackApi", []); 6 | slackApi.value("slackConfig", { 7 | OAuthUrl: "https://slack.com/oauth/authorize", 8 | ApiUrl: "https://slack.com/api/", 9 | DefaultToken: "" 10 | }); 11 | 12 | }(angular)); 13 | -------------------------------------------------------------------------------- /src/deg.slackapi.services.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | (function (angular) { 3 | 4 | angular.module("Deg.SlackApi").service('slackSvc', ['$http', '$log', 'slackConfig', function ($http, $log, slackConfig) { 5 | 6 | 7 | return { 8 | //auth 9 | authorize: authorizeApp, 10 | auth: { 11 | test: authTest 12 | }, 13 | oauth: { 14 | access: getAccessToken 15 | }, 16 | 17 | //channels 18 | channels: { 19 | archive: archiveChannel, 20 | create: createChannel, 21 | history: channelHistory, 22 | info: getChannel, 23 | invite: channelInvite, 24 | join: channelJoin, 25 | kick: channelKick, 26 | leave: channelleave, 27 | list: getChannelList, 28 | mark: channelMark, 29 | rename: channelRename, 30 | setPurpose: channelSetPurpose, 31 | setTopic: channelSetTopic, 32 | unarchive: channelUnarchive 33 | }, 34 | 35 | //chat 36 | chat: { 37 | delete: deleteMessage, 38 | postMessage: postMessage, 39 | update: updateMessage 40 | }, 41 | 42 | //files 43 | files: { 44 | delete: deleteFile, 45 | info: getFileInfo, 46 | list: listfiles, 47 | upload: uploadFile 48 | }, 49 | 50 | //rtm 51 | rtm: { 52 | start: startRtm 53 | }, 54 | 55 | //search 56 | search: { 57 | all: searchAll, 58 | files: searchFiles, 59 | messages: searchMessages 60 | }, 61 | 62 | //stars 63 | stars: { 64 | list: starsList 65 | }, 66 | 67 | //team 68 | team: { 69 | accessLogs: teamLogs, 70 | info: getTeamInfo 71 | }, 72 | 73 | //users 74 | users: { 75 | getPresence: getUserPresence, 76 | info: getUserinfo, 77 | list: getUserslist, 78 | setActive: setUserActive, 79 | setPresence: setUserPresence 80 | }, 81 | 82 | //Helpers 83 | InitToken: initToken, 84 | ExecuteApiMethod: executeApiCall, 85 | 86 | //groups 87 | groups: { 88 | archive: notImplemented, 89 | close: notImplemented, 90 | create: notImplemented, 91 | createChild: notImplemented, 92 | history: notImplemented, 93 | invite: notImplemented, 94 | kick: notImplemented, 95 | leave: notImplemented, 96 | list: notImplemented, 97 | mark: notImplemented, 98 | open: notImplemented, 99 | rename: notImplemented, 100 | setPurpose: notImplemented, 101 | setTopic: notImplemented, 102 | unarchive: notImplemented 103 | }, 104 | 105 | //im 106 | im: { 107 | close: notImplemented, 108 | history: notImplemented, 109 | list: notImplemented, 110 | mark: notImplemented, 111 | open: notImplemented 112 | }, 113 | }; 114 | 115 | // USERS 116 | function getUserPresence(userId, callback, token) { 117 | var params = { 118 | token: token || slackConfig.DefaultToken, 119 | user: userId 120 | }; 121 | executeApiCall("users.getPresence", params, callback); 122 | } 123 | function getUserinfo(userId, callback, token) { 124 | var params = { 125 | token: token || slackConfig.DefaultToken, 126 | user: userId 127 | }; 128 | executeApiCall("users.info", params, callback); 129 | } 130 | function getUserslist(callback, token) { 131 | var params = { 132 | token: token || slackConfig.DefaultToken 133 | }; 134 | executeApiCall("users.list", params, callback); 135 | } 136 | function setUserActive(callback, token) { 137 | var params = { 138 | token: token || slackConfig.DefaultToken 139 | }; 140 | executeApiCall("users.setActive", params, callback); 141 | } 142 | function setUserPresence(status, callback, token) { 143 | var params = { 144 | token: token || slackConfig.DefaultToken, 145 | presence: status 146 | }; 147 | executeApiCall("users.setPresence", params, callback); 148 | } 149 | 150 | 151 | function startRtm(token) { 152 | var params = { 153 | token: token || slackConfig.DefaultToken 154 | }; 155 | executeApiCall("auth.test", params); 156 | } 157 | 158 | //AUTH 159 | function authorizeApp(clientId, params) { 160 | var qs = "&" + toQueryString(params); 161 | var url = slackConfig.OAuthUrl + "?client_id=" + clientId + qs; 162 | window.location.replace(url); 163 | } 164 | function initToken(token, callback) { 165 | slackConfig.DefaultToken = token; 166 | authTest(callback); 167 | } 168 | function getAccessToken(client, secret, code, callback) { 169 | var params = { 170 | client_id: client, 171 | client_secret: secret, 172 | code: code 173 | }; 174 | executeApiCall("oauth.access", params, callback); 175 | } 176 | function authTest(callback, token) { 177 | var params = { 178 | token: token || slackConfig.DefaultToken 179 | }; 180 | executeApiCall("auth.test", params, callback); 181 | } 182 | // CHANNELS 183 | function archiveChannel(channeId, callback, token) { 184 | var params = { 185 | token: token || slackConfig.DefaultToken, 186 | channel: channeId 187 | }; 188 | executeApiCall("channels.archive", params, callback); 189 | } 190 | function channelUnarchive(channeId, callback, token) { 191 | var params = { 192 | token: token || slackConfig.DefaultToken, 193 | channel: channeId 194 | }; 195 | executeApiCall("channels.unarchive", params, callback); 196 | } 197 | function channelHistory(channeId, callback, token) { 198 | var params = { 199 | token: token || slackConfig.DefaultToken, 200 | channel: channeId 201 | }; 202 | executeApiCall("channels.history", params, callback); 203 | } 204 | function channelInvite(channeId, userId, callback, token) { 205 | var params = { 206 | token: token || slackConfig.DefaultToken, 207 | channel: channeId, 208 | user: userId 209 | }; 210 | executeApiCall("channels.invite", params, callback); 211 | } 212 | function channelJoin(channeName, callback, token) { 213 | var params = { 214 | token: token || slackConfig.DefaultToken, 215 | channel: channeName 216 | }; 217 | executeApiCall("channels.join", params, callback); 218 | } 219 | function channelKick(channelId, userId, callback, token) { 220 | var params = { 221 | token: token || slackConfig.DefaultToken, 222 | channel: channelId, 223 | user: userId 224 | }; 225 | executeApiCall("channels.kick", params, callback); 226 | } 227 | function channelleave(channelId, callback, token) { 228 | var params = { 229 | token: token || slackConfig.DefaultToken, 230 | channel: channelId 231 | }; 232 | executeApiCall("channels.leave", params, callback); 233 | } 234 | function channelMark(channelId, timeStamp, callback, token) { 235 | var params = { 236 | token: token || slackConfig.DefaultToken, 237 | channel: channelId, 238 | ts: timeStamp 239 | }; 240 | executeApiCall("channels.mark", params, callback); 241 | } 242 | function channelRename(channelId, callback, token) { 243 | var params = { 244 | token: token || slackConfig.DefaultToken, 245 | channel: channelId 246 | }; 247 | executeApiCall("channels.rename", params, callback); 248 | } 249 | 250 | function channelSetPurpose(channelId, text, callback, token) { 251 | var params = { 252 | token: token || slackConfig.DefaultToken, 253 | channel: channelId, 254 | purpose: text 255 | }; 256 | executeApiCall("channels.setPurpose", params, callback); 257 | } 258 | function channelSetTopic(channelId, text, callback, token) { 259 | var params = { 260 | token: token || slackConfig.DefaultToken, 261 | channel: channelId, 262 | topic: text 263 | }; 264 | executeApiCall("channels.setTopic", params, callback); 265 | } 266 | function getChannelList(callback, token) { 267 | var params = { 268 | token: token || slackConfig.DefaultToken 269 | }; 270 | executeApiCall("channels.list", params, callback); 271 | } 272 | function getChannel(channelId, callback, token) { 273 | var params = { 274 | token: token || slackConfig.DefaultToken, 275 | channel: channelId 276 | }; 277 | executeApiCall("channels.info", params, callback); 278 | } 279 | function createChannel(channeName, callback, token) { 280 | var params = { 281 | token: token || slackConfig.DefaultToken, 282 | name: channeName 283 | }; 284 | executeApiCall("channels.create", params, callback); 285 | } 286 | 287 | // CHAT 288 | function postMessage(channeId, message, callback, token) { 289 | var params = { 290 | token: token || slackConfig.DefaultToken, 291 | channel: channeId, 292 | text: message 293 | }; 294 | executeApiCall("chat.postMessage", params, callback); 295 | } 296 | function deleteMessage(channeId, timestamp, callback, token) { 297 | var params = { 298 | token: token || slackConfig.DefaultToken, 299 | channel: channeId, 300 | ts: timestamp 301 | }; 302 | executeApiCall("chat.delete", params, callback); 303 | } 304 | function updateMessage(channeId, timestamp, newMessage, callback, token) { 305 | var params = { 306 | token: token || slackConfig.DefaultToken, 307 | channel: channeId, 308 | ts: timestamp, 309 | text: newMessage 310 | }; 311 | executeApiCall("chat.update", params, callback); 312 | } 313 | 314 | // TEAM 315 | function getTeamInfo(callback, token) { 316 | var params = { 317 | token: token || slackConfig.DefaultToken 318 | }; 319 | executeApiCall("team.info", params, callback); 320 | } 321 | function teamLogs(callback, token) { 322 | var params = { 323 | token: token || slackConfig.DefaultToken 324 | }; 325 | executeApiCall("team.accessLogs", params, callback); 326 | } 327 | // FILES 328 | function deleteFile(fileId, callback, token) { 329 | var params = { 330 | token: token || slackConfig.DefaultToken, 331 | file: fileId 332 | }; 333 | executeApiCall("files.delete", params, callback); 334 | } 335 | 336 | function getFileInfo(fileId, callback, token) { 337 | var params = { 338 | token: token || slackConfig.DefaultToken, 339 | file: fileId 340 | }; 341 | executeApiCall("files.info", params, callback); 342 | } 343 | 344 | function listfiles(callback, token) { 345 | var params = { 346 | token: token || slackConfig.DefaultToken 347 | }; 348 | executeApiCall("files.list", params, callback); 349 | } 350 | function uploadFile(params, callback) { 351 | 352 | params.token = token || slackConfig.DefaultToken; 353 | 354 | if (params.content) { 355 | var url = slackConfig.ApiUrl + "files.upload"; 356 | executePostRequest(url, params, callback); 357 | } 358 | 359 | executeApiCall("files.upload", params, callback); 360 | } 361 | 362 | // SEARCH 363 | function searchFiles(query, callback, token) { 364 | var params = { 365 | token: token || slackConfig.DefaultToken, 366 | query: query 367 | }; 368 | executeApiCall("search.files", params, callback); 369 | } 370 | function searchAll(query, callback, token) { 371 | var params = { 372 | token: token || slackConfig.DefaultToken, 373 | query: query 374 | }; 375 | executeApiCall("search.all", params, callback); 376 | } 377 | function searchMessages(query, callback, token) { 378 | var params = { 379 | token: token || slackConfig.DefaultToken, 380 | query: query 381 | }; 382 | executeApiCall("search.messages", params, callback); 383 | } 384 | 385 | // STARS 386 | function starsList(userId, callback, token) { 387 | var params = { 388 | token: token || slackConfig.DefaultToken, 389 | user: userId 390 | }; 391 | executeApiCall("stars.list", params, callback); 392 | } 393 | 394 | // HELPERS 395 | function executeApiCall(endpoint, paramsObj, callback) { 396 | var qs = toQueryString(paramsObj); 397 | var url = slackConfig.ApiUrl + endpoint + "?" + qs; 398 | executeGetRequest(url, callback); 399 | } 400 | function executeGetRequest(url, callback) { 401 | $http.get(url). 402 | success(function (result) { 403 | if (callback) 404 | callback(result); 405 | }). 406 | error(function (data, status) { 407 | $log.log(status); 408 | $log.log(data); 409 | }); 410 | } 411 | function executePostRequest(url, data, callback) { 412 | $http.post(url, data). 413 | success(function (result) { 414 | 415 | callback(result); 416 | }). 417 | error(function (data, status) { 418 | $log.log(status); 419 | $log.log(data); 420 | }); 421 | } 422 | function toQueryString(obj) { 423 | var parts = []; 424 | for (var i in obj) { 425 | if (obj.hasOwnProperty(i)) { 426 | parts.push(encodeURIComponent(i) + "=" + encodeURIComponent(obj[i])); 427 | } 428 | } 429 | return parts.join("&"); 430 | } 431 | 432 | function notImplemented() { 433 | $log.log("Method not implemented. Remind nickaranz@gmail.com to quit slacking"); 434 | } 435 | 436 | }]); 437 | 438 | })(angular); --------------------------------------------------------------------------------