├── .gitignore ├── package.json ├── README.md ├── src └── hipchat.coffee └── lib └── hipchat.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | *.DS_Store 4 | 5 | .idea/ 6 | atlassian* 7 | 8 | test.coffee 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-hipchat", 3 | "version": "0.4.4", 4 | "description": "HipChat API library for node.js", 5 | "main": "lib/hipchat.js", 6 | "licenses": [{ 7 | "type": "BSD", 8 | "url": "http://www.opensource.org/licenses/bsd-license.php" 9 | }], 10 | "maintainers": [{ 11 | "name": "Nate Kohari", 12 | "email": "nkohari@gmail.com", 13 | "web": "http://nate.io/" 14 | }], 15 | "contributors": [ 16 | { 17 | "name": "Dan Rumney", 18 | "email": "dancrumb@gmail.com", 19 | "web": "http://dancrumb.com/" 20 | }, 21 | { 22 | "name": "Sergey Balbeko", 23 | "email": "sergey@balbeko.com" 24 | } 25 | ], 26 | "repository": { 27 | "type": "git", 28 | "url": "http://github.com/nkohari/node-hipchat.git" 29 | }, 30 | "scripts": { 31 | "prepublish": "./node_modules/.bin/coffee --compile --output lib src/*.coffee" 32 | }, 33 | "devDependencies": { 34 | "coffee-script": "1.7.x" 35 | }, 36 | "dependencies": { 37 | "underscore": "1.6.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Summary 2 | ======= 3 | A simple node.js library for communicating with the [HipChat](http://hipchat.com/) REST API. 4 | Supports full Hipchat API 5 | 6 | You can also install via npm: 7 | 8 | npm install node-hipchat 9 | 10 | 11 | Methods implemented: 12 | ==================== 13 | 14 | `rooms/create` 15 | `rooms/delete` 16 | `rooms/history` 17 | `rooms/list` 18 | `rooms/message` 19 | `rooms/show` 20 | 21 | `users/create` 22 | `users/delete` 23 | `users/list` 24 | `users/show` 25 | `users/update` 26 | 27 | 28 | # Examples 29 | 30 | First make sure you have an [Admin API Key](https://www.hipchat.com/admin/api). 31 | 32 | ## Send a message to a room 33 | 34 | var hipchat = require('node-hipchat'); 35 | 36 | var HC = new hipchat('YOUR_API_KEY'); 37 | 38 | HC.listRooms(function(data) { 39 | console.log(data); // These are all the rooms 40 | }); 41 | 42 | var params = { 43 | room: 123456, // Found in the JSON response from the call above 44 | from: 'FunkyMonkey', 45 | message: 'Some HTML formatted string', 46 | color: 'yellow' 47 | }; 48 | 49 | HC.postMessage(params, function(data) { 50 | // Message has been sent! 51 | }); 52 | -------------------------------------------------------------------------------- /src/hipchat.coffee: -------------------------------------------------------------------------------- 1 | https = require 'https' 2 | querystring = require 'querystring' 3 | _ = require 'underscore' 4 | 5 | class HipChatClient 6 | 7 | host: 'api.hipchat.com' 8 | 9 | constructor: (@apikey, @agent) -> 10 | @rateLimits = 11 | limit: 0 12 | remaining: 0 13 | reset: 0 14 | 15 | createRoom: (params, callback) -> 16 | data = 17 | name: params.name 18 | owner_user_id: params.owner_user_id 19 | privacy: params.privacy ? 'public' 20 | topic: params.topic 21 | guest_access: if params.guest_access then 1 else 0 22 | 23 | options = @_prepareOptions 24 | method: 'post' 25 | path: '/v1/rooms/create' 26 | query: data 27 | @_sendRequest options, callback 28 | 29 | listRooms: (callback) -> 30 | options = @_prepareOptions 31 | method: 'get' 32 | path: '/v1/rooms/list' 33 | @_sendRequest options, callback 34 | 35 | showRoom: (room, callback) -> 36 | options = @_prepareOptions 37 | method: 'get' 38 | path: '/v1/rooms/show' 39 | query: 40 | room_id: room 41 | @_sendRequest options, callback 42 | 43 | deleteRoom: (room, callback) -> 44 | options = @_prepareOptions 45 | method: 'post' 46 | path: '/v1/rooms/delete' 47 | query: 48 | room_id: room 49 | @_sendRequest options, callback 50 | 51 | 52 | getHistory: (params, callback) -> 53 | data = 54 | room_id: params.room_id 55 | date: params.date ? 'recent' 56 | timezone: params.timezone ? 'UTC' 57 | 58 | options = @_prepareOptions 59 | method: 'get' 60 | path: '/v1/rooms/history' 61 | query: data 62 | 63 | @_sendRequest options, callback 64 | 65 | postMessage: (params, callback) -> 66 | data = 67 | room_id: params.room_id 68 | from: params.from ? 'node-hipchat' 69 | message: params.message 70 | notify: if params.notify then 1 else 0 71 | color: params.color ? 'yellow' 72 | message_format: params.message_format ? 'html' 73 | 74 | options = @_prepareOptions 75 | method: 'post' 76 | path: '/v1/rooms/message' 77 | data: data 78 | 79 | @_sendRequest options, callback 80 | 81 | # users/* methods 82 | 83 | showUser: (user_id, callback) -> 84 | options = @_prepareOptions 85 | method: 'get' 86 | path: '/v1/users/show' 87 | query: 88 | user_id: user_id 89 | @_sendRequest options, callback 90 | 91 | listUsers: (callback) -> 92 | options = @_prepareOptions 93 | method: 'get' 94 | path: '/v1/users/list' 95 | @_sendRequest options, callback 96 | 97 | 98 | deleteUser: (user_id, callback) -> 99 | options = @_prepareOptions 100 | method: 'post' 101 | path: '/v1/users/delete' 102 | query: 103 | user_id: user_id 104 | @_sendRequest options, callback 105 | 106 | 107 | undeleteUser: (user_id, callback) -> 108 | options = @_prepareOptions 109 | method: 'post' 110 | path: '/v1/users/undelete' 111 | query: 112 | user_id: user_id 113 | @_sendRequest options, callback 114 | 115 | 116 | createUser: (params, callback) -> 117 | data = 118 | email: params.email 119 | name: params.name 120 | mention_name: params.name.replace(/\s+/g, '') 121 | title: params.title 122 | is_group_admin: if params.is_group_admin then 1 else 0 123 | password: params.password 124 | timezone: params.timezone ? 'UTC' 125 | 126 | 127 | options = @_prepareOptions 128 | method: 'post' 129 | path: '/v1/users/create' 130 | data: data 131 | 132 | 133 | @_sendRequest options, callback 134 | 135 | updateUser: (params, callback) -> 136 | data = 137 | user_id: params.user_id 138 | email: params.email 139 | name: params.name 140 | mention_name: params.name.replace(/\s+/g, '') 141 | title: params.title 142 | is_group_admin: if params.is_group_admin then 1 else 0 143 | password: params.password 144 | timezone: params.timezone ? 'UTC' 145 | 146 | options = @_prepareOptions 147 | method: 'post' 148 | path: '/v1/users/update' 149 | data: data 150 | 151 | @_sendRequest options, callback 152 | 153 | 154 | getRateLimits: () -> 155 | @rateLimits 156 | 157 | 158 | # private methods 159 | 160 | _prepareOptions: (op) -> 161 | #console.log ">>> _prepareOptions" 162 | #console.log op 163 | #console.log "<<< _prepareOptions" 164 | 165 | op.host = @host 166 | 167 | op.query = {} unless op.query? 168 | op.query['auth_token'] = @apikey 169 | op.query = querystring.stringify(op.query) 170 | op.path += '?' + op.query 171 | 172 | if op.method is 'post' and op.data? 173 | op.data = querystring.stringify(op.data) 174 | op.headers = {} unless op.headers? 175 | op.headers['Content-Type'] = 'application/x-www-form-urlencoded' 176 | op.headers['Content-Length'] = op.data.length 177 | 178 | if(@agent) 179 | op.agent = @agent 180 | 181 | return op 182 | 183 | _sendRequest: (options, callback) -> 184 | req = https.request(options) 185 | 186 | req.on 'response', (res) => 187 | buffer = '' 188 | res.on 'data', (chunk) -> 189 | buffer += chunk 190 | res.on 'end', => 191 | headers = res.headers 192 | @rateLimits = 193 | limit: headers['x-ratelimit-limit'], 194 | remaining: headers['x-ratelimit-remaining'], 195 | reset: headers['x-ratelimit-reset'] 196 | 197 | if callback? 198 | if res.statusCode is 200 199 | value = if options.json is false then buffer else JSON.parse(buffer) 200 | callback(value, null) 201 | else 202 | callback(null, buffer) 203 | 204 | if options.data? then req.write('' + options.data) 205 | req.end() 206 | 207 | 208 | exports = module.exports = HipChatClient 209 | -------------------------------------------------------------------------------- /lib/hipchat.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.7.1 2 | (function() { 3 | var HipChatClient, exports, https, querystring, _; 4 | 5 | https = require('https'); 6 | 7 | querystring = require('querystring'); 8 | 9 | _ = require('underscore'); 10 | 11 | HipChatClient = (function() { 12 | HipChatClient.prototype.host = 'api.hipchat.com'; 13 | 14 | function HipChatClient(apikey, agent) { 15 | this.apikey = apikey; 16 | this.agent = agent; 17 | this.rateLimits = { 18 | limit: 0, 19 | remaining: 0, 20 | reset: 0 21 | }; 22 | } 23 | 24 | HipChatClient.prototype.createRoom = function(params, callback) { 25 | var data, options, _ref; 26 | data = { 27 | name: params.name, 28 | owner_user_id: params.owner_user_id, 29 | privacy: (_ref = params.privacy) != null ? _ref : 'public', 30 | topic: params.topic, 31 | guest_access: params.guest_access ? 1 : 0 32 | }; 33 | options = this._prepareOptions({ 34 | method: 'post', 35 | path: '/v1/rooms/create', 36 | query: data 37 | }); 38 | return this._sendRequest(options, callback); 39 | }; 40 | 41 | HipChatClient.prototype.listRooms = function(callback) { 42 | var options; 43 | options = this._prepareOptions({ 44 | method: 'get', 45 | path: '/v1/rooms/list' 46 | }); 47 | return this._sendRequest(options, callback); 48 | }; 49 | 50 | HipChatClient.prototype.showRoom = function(room, callback) { 51 | var options; 52 | options = this._prepareOptions({ 53 | method: 'get', 54 | path: '/v1/rooms/show', 55 | query: { 56 | room_id: room 57 | } 58 | }); 59 | return this._sendRequest(options, callback); 60 | }; 61 | 62 | HipChatClient.prototype.deleteRoom = function(room, callback) { 63 | var options; 64 | options = this._prepareOptions({ 65 | method: 'post', 66 | path: '/v1/rooms/delete', 67 | query: { 68 | room_id: room 69 | } 70 | }); 71 | return this._sendRequest(options, callback); 72 | }; 73 | 74 | HipChatClient.prototype.getHistory = function(params, callback) { 75 | var data, options, _ref, _ref1; 76 | data = { 77 | room_id: params.room_id, 78 | date: (_ref = params.date) != null ? _ref : 'recent', 79 | timezone: (_ref1 = params.timezone) != null ? _ref1 : 'UTC' 80 | }; 81 | options = this._prepareOptions({ 82 | method: 'get', 83 | path: '/v1/rooms/history', 84 | query: data 85 | }); 86 | return this._sendRequest(options, callback); 87 | }; 88 | 89 | HipChatClient.prototype.postMessage = function(params, callback) { 90 | var data, options, _ref, _ref1, _ref2; 91 | data = { 92 | room_id: params.room_id, 93 | from: (_ref = params.from) != null ? _ref : 'node-hipchat', 94 | message: params.message, 95 | notify: params.notify ? 1 : 0, 96 | color: (_ref1 = params.color) != null ? _ref1 : 'yellow', 97 | message_format: (_ref2 = params.message_format) != null ? _ref2 : 'html' 98 | }; 99 | options = this._prepareOptions({ 100 | method: 'post', 101 | path: '/v1/rooms/message', 102 | data: data 103 | }); 104 | return this._sendRequest(options, callback); 105 | }; 106 | 107 | HipChatClient.prototype.showUser = function(user_id, callback) { 108 | var options; 109 | options = this._prepareOptions({ 110 | method: 'get', 111 | path: '/v1/users/show', 112 | query: { 113 | user_id: user_id 114 | } 115 | }); 116 | return this._sendRequest(options, callback); 117 | }; 118 | 119 | HipChatClient.prototype.listUsers = function(callback) { 120 | var options; 121 | options = this._prepareOptions({ 122 | method: 'get', 123 | path: '/v1/users/list' 124 | }); 125 | return this._sendRequest(options, callback); 126 | }; 127 | 128 | HipChatClient.prototype.deleteUser = function(user_id, callback) { 129 | var options; 130 | options = this._prepareOptions({ 131 | method: 'post', 132 | path: '/v1/users/delete', 133 | query: { 134 | user_id: user_id 135 | } 136 | }); 137 | return this._sendRequest(options, callback); 138 | }; 139 | 140 | HipChatClient.prototype.undeleteUser = function(user_id, callback) { 141 | var options; 142 | options = this._prepareOptions({ 143 | method: 'post', 144 | path: '/v1/users/undelete', 145 | query: { 146 | user_id: user_id 147 | } 148 | }); 149 | return this._sendRequest(options, callback); 150 | }; 151 | 152 | HipChatClient.prototype.createUser = function(params, callback) { 153 | var data, options, _ref; 154 | data = { 155 | email: params.email, 156 | name: params.name, 157 | mention_name: params.name.replace(/\s+/g, ''), 158 | title: params.title, 159 | is_group_admin: params.is_group_admin ? 1 : 0, 160 | password: params.password, 161 | timezone: (_ref = params.timezone) != null ? _ref : 'UTC' 162 | }; 163 | options = this._prepareOptions({ 164 | method: 'post', 165 | path: '/v1/users/create', 166 | data: data 167 | }); 168 | return this._sendRequest(options, callback); 169 | }; 170 | 171 | HipChatClient.prototype.updateUser = function(params, callback) { 172 | var data, options, _ref; 173 | data = { 174 | user_id: params.user_id, 175 | email: params.email, 176 | name: params.name, 177 | mention_name: params.name.replace(/\s+/g, ''), 178 | title: params.title, 179 | is_group_admin: params.is_group_admin ? 1 : 0, 180 | password: params.password, 181 | timezone: (_ref = params.timezone) != null ? _ref : 'UTC' 182 | }; 183 | options = this._prepareOptions({ 184 | method: 'post', 185 | path: '/v1/users/update', 186 | data: data 187 | }); 188 | return this._sendRequest(options, callback); 189 | }; 190 | 191 | HipChatClient.prototype.getRateLimits = function() { 192 | return this.rateLimits; 193 | }; 194 | 195 | HipChatClient.prototype._prepareOptions = function(op) { 196 | op.host = this.host; 197 | if (op.query == null) { 198 | op.query = {}; 199 | } 200 | op.query['auth_token'] = this.apikey; 201 | op.query = querystring.stringify(op.query); 202 | op.path += '?' + op.query; 203 | if (op.method === 'post' && (op.data != null)) { 204 | op.data = querystring.stringify(op.data); 205 | if (op.headers == null) { 206 | op.headers = {}; 207 | } 208 | op.headers['Content-Type'] = 'application/x-www-form-urlencoded'; 209 | op.headers['Content-Length'] = op.data.length; 210 | } 211 | if (this.agent) { 212 | op.agent = this.agent; 213 | } 214 | return op; 215 | }; 216 | 217 | HipChatClient.prototype._sendRequest = function(options, callback) { 218 | var req; 219 | req = https.request(options); 220 | req.on('response', (function(_this) { 221 | return function(res) { 222 | var buffer; 223 | buffer = ''; 224 | res.on('data', function(chunk) { 225 | return buffer += chunk; 226 | }); 227 | return res.on('end', function() { 228 | var headers, value; 229 | headers = res.headers; 230 | _this.rateLimits = { 231 | limit: headers['x-ratelimit-limit'], 232 | remaining: headers['x-ratelimit-remaining'], 233 | reset: headers['x-ratelimit-reset'] 234 | }; 235 | if (callback != null) { 236 | if (res.statusCode === 200) { 237 | value = options.json === false ? buffer : JSON.parse(buffer); 238 | return callback(value, null); 239 | } else { 240 | return callback(null, buffer); 241 | } 242 | } 243 | }); 244 | }; 245 | })(this)); 246 | if (options.data != null) { 247 | req.write('' + options.data); 248 | } 249 | return req.end(); 250 | }; 251 | 252 | return HipChatClient; 253 | 254 | })(); 255 | 256 | exports = module.exports = HipChatClient; 257 | 258 | }).call(this); 259 | --------------------------------------------------------------------------------