hipchat 1.5.2 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/README.textile +14 -5
- data/hipchat.gemspec +2 -2
- data/lib/hipchat/api_version.rb +83 -1
- data/lib/hipchat/capistrano/tasks/hipchat.rake +10 -3
- data/lib/hipchat/client.rb +27 -23
- data/lib/hipchat/errors.rb +47 -8
- data/lib/hipchat/room.rb +198 -83
- data/lib/hipchat/user.rb +32 -32
- data/lib/hipchat/version.rb +1 -1
- data/spec/hipchat_api_v1_spec.rb +49 -5
- data/spec/hipchat_api_v2_spec.rb +291 -7
- data/spec/hipchat_spec.rb +5 -0
- data/spec/support/shared_contexts_for_hipchat.rb +156 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbeb4474e9bae99465b61d971e6d5ac53f4562f1
|
4
|
+
data.tar.gz: a9e7ec6445f91871676065bf26a0c19c817d511c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e50b678c47c408557c8443352086ab4fd2020b5d7eaad21741eddae2dfc3866ce06cb333afe0df329814d8f946ae18e0d2d14319f5a4d85b1bc331fed22aed3a
|
7
|
+
data.tar.gz: 87e12c6fcc6e94dd7b609eed2cb9f9f32626bedbe14fbe8f32f40c57c3e1abb746b88713973794e267e2beeda814da8441ed660f96ceef4e4fa32b728213078b
|
data/.travis.yml
CHANGED
data/README.textile
CHANGED
@@ -4,8 +4,8 @@ A very basic wrapper for the HipChat HTTP API.
|
|
4
4
|
|
5
5
|
h2. CI Status
|
6
6
|
|
7
|
-
"!https://travis-ci.org/hipchat/hipchat-rb.
|
8
|
-
!https://coveralls.io/repos/hipchat/hipchat-rb/badge.
|
7
|
+
"!https://travis-ci.org/hipchat/hipchat-rb.svg!":https://travis-ci.org/hipchat/hipchat-rb
|
8
|
+
!https://coveralls.io/repos/hipchat/hipchat-rb/badge.svg(Coverage Status)!:https://coveralls.io/r/hipchat/hipchat-rb
|
9
9
|
|
10
10
|
h2. Requirements
|
11
11
|
* Ruby 1.9.3 or higher
|
@@ -26,6 +26,9 @@ h1. Usage
|
|
26
26
|
h2. "API v1":https://www.hipchat.com/docs/api
|
27
27
|
|
28
28
|
bc.. client = HipChat::Client.new(api_token)
|
29
|
+
# Set http proxy
|
30
|
+
client = HipChat::Client.new(api_token, :http_proxy => 'http://proxy_host:proxy_port')
|
31
|
+
|
29
32
|
# 'username' is the name for which the message will be presented as from
|
30
33
|
client['my room'].send('username', 'I talk')
|
31
34
|
|
@@ -56,6 +59,9 @@ client.create_room("Name", :owner_user_id => 'user_id')
|
|
56
59
|
h2. "API v2":https://www.hipchat.com/docs/apiv2
|
57
60
|
|
58
61
|
bc.. client = HipChat::Client.new(api_token, :api_version => 'v2')
|
62
|
+
# Set http proxy
|
63
|
+
client = HipChat::Client.new(api_token, :api_version => 'v2', :http_proxy => 'http://proxy_host:proxy_port')
|
64
|
+
|
59
65
|
# 'username' is the name for which the message will be presented as from
|
60
66
|
client['my room'].send('username', 'I talk')
|
61
67
|
|
@@ -93,6 +99,9 @@ client['my room'].get_room
|
|
93
99
|
It's recommended to call client['my room'].get_room then pass in modified hash attributes to #update_room
|
94
100
|
client['my room'].update_room(options = {})
|
95
101
|
|
102
|
+
# Delete room (see https://www.hipchat.com/docs/apiv2/method/delete_room)
|
103
|
+
client['my room'].delete_room
|
104
|
+
|
96
105
|
# Invite user to room (see https://www.hipchat.com/docs/apiv2/method/invite_user)
|
97
106
|
client['my room'].invite("USER_ID_OR_NAME", options = {})
|
98
107
|
|
@@ -224,7 +233,7 @@ h2. Chef Handler
|
|
224
233
|
*APIv1 ONLY, use APIv1 Key*
|
225
234
|
NOTE: APIv2 required for HipChatServer Beta
|
226
235
|
|
227
|
-
Report on Chef runs.
|
236
|
+
Report on Chef runs.
|
228
237
|
|
229
238
|
h3. Within a Recipe:
|
230
239
|
|
@@ -248,8 +257,8 @@ bc.. require 'hipchat/chef'
|
|
248
257
|
h3. With HipChat Server Beta
|
249
258
|
|
250
259
|
Add an "options" hash to set api v2 and your URL:
|
251
|
-
* arguments ['API_KEY', 'HIPCHAT_ROOM', options={api_version: "v2", server_url: "https://hipchat.example.com"}]
|
252
|
-
* hipchat_handler = HipChat::NotifyRoom.new("API_KEY", "HIPCHAT_ROOM", options={api_version: "v2", server_url: "https://hipchat.example.com"})
|
260
|
+
* arguments ['API_KEY', 'HIPCHAT_ROOM', options={hipchat_options: {api_version: "v2", server_url: "https://hipchat.example.com"}}]
|
261
|
+
* hipchat_handler = HipChat::NotifyRoom.new("API_KEY", "HIPCHAT_ROOM", options={hipchat_options: {api_version: "v2", server_url: "https://hipchat.example.com"}})
|
253
262
|
|
254
263
|
h2. Copyright
|
255
264
|
|
data/hipchat.gemspec
CHANGED
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
27
|
spec.add_development_dependency "rr"
|
28
|
-
spec.add_development_dependency "bundler", "~> 1.
|
28
|
+
spec.add_development_dependency "bundler", "~> 1.11.1"
|
29
29
|
spec.add_development_dependency "rake"
|
30
|
-
spec.add_development_dependency "webmock"
|
30
|
+
spec.add_development_dependency "webmock", "= 1.22.1"
|
31
31
|
spec.add_development_dependency 'rdoc', '> 2.4.2'
|
32
32
|
spec.add_development_dependency 'coveralls'
|
33
33
|
end
|
data/lib/hipchat/api_version.rb
CHANGED
@@ -20,10 +20,12 @@ module HipChat
|
|
20
20
|
@base_uri = "#{options[:server_url]}/v1"
|
21
21
|
@headers = {'Accept' => 'application/json',
|
22
22
|
'Content-Type' => 'application/x-www-form-urlencoded'}
|
23
|
-
|
23
|
+
elsif @version.eql?('v2')
|
24
24
|
@base_uri = "#{options[:server_url]}/v2"
|
25
25
|
@headers = {'Accept' => 'application/json',
|
26
26
|
'Content-Type' => 'application/json'}
|
27
|
+
else
|
28
|
+
raise InvalidApiVersion, 'Couldn\'t recognize API version'
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
@@ -56,6 +58,19 @@ module HipChat
|
|
56
58
|
}[version]
|
57
59
|
end
|
58
60
|
|
61
|
+
def create_user_config
|
62
|
+
{
|
63
|
+
'v1' => {
|
64
|
+
:url => '/users/create',
|
65
|
+
:body_format => :to_hash
|
66
|
+
},
|
67
|
+
'v2' => {
|
68
|
+
:url => '/user',
|
69
|
+
:body_format => :to_json
|
70
|
+
}
|
71
|
+
}[version]
|
72
|
+
end
|
73
|
+
|
59
74
|
def users_config
|
60
75
|
{
|
61
76
|
'v1' => {
|
@@ -116,6 +131,21 @@ module HipChat
|
|
116
131
|
}[version]
|
117
132
|
end
|
118
133
|
|
134
|
+
def delete_room_config
|
135
|
+
{
|
136
|
+
'v1' => {
|
137
|
+
:url => URI::escape("/delete"),
|
138
|
+
:method => :post,
|
139
|
+
:query_params => { :room_id => room_id }
|
140
|
+
},
|
141
|
+
'v2' => {
|
142
|
+
:url => URI::escape("/#{room_id}"),
|
143
|
+
:method => :delete,
|
144
|
+
:query_params => {}
|
145
|
+
}
|
146
|
+
}[version]
|
147
|
+
end
|
148
|
+
|
119
149
|
def invite_config
|
120
150
|
{
|
121
151
|
'v2' => {
|
@@ -125,6 +155,24 @@ module HipChat
|
|
125
155
|
}[version]
|
126
156
|
end
|
127
157
|
|
158
|
+
def add_member_config
|
159
|
+
{
|
160
|
+
'v2' => {
|
161
|
+
:url => URI::escape("/#{room_id}/member"),
|
162
|
+
:body_format => :to_json
|
163
|
+
}
|
164
|
+
}[version]
|
165
|
+
end
|
166
|
+
|
167
|
+
def send_message_config
|
168
|
+
{
|
169
|
+
'v2' => {
|
170
|
+
:url => URI::escape("/#{room_id}/message"),
|
171
|
+
:body_format => :to_json
|
172
|
+
}
|
173
|
+
}[version]
|
174
|
+
end
|
175
|
+
|
128
176
|
def send_config
|
129
177
|
{
|
130
178
|
'v1' => {
|
@@ -147,6 +195,15 @@ module HipChat
|
|
147
195
|
}[version]
|
148
196
|
end
|
149
197
|
|
198
|
+
def share_link_config
|
199
|
+
{
|
200
|
+
'v2' => {
|
201
|
+
:url => URI::escape("/#{room_id}/share/link"),
|
202
|
+
:body_format => :to_json
|
203
|
+
}
|
204
|
+
}[version]
|
205
|
+
end
|
206
|
+
|
150
207
|
def topic_config
|
151
208
|
{
|
152
209
|
'v1' => {
|
@@ -180,6 +237,15 @@ module HipChat
|
|
180
237
|
}
|
181
238
|
}[version]
|
182
239
|
end
|
240
|
+
|
241
|
+
def webhook_config
|
242
|
+
raise InvalidApiVersion, 'This functionality is not supported in API v1' unless version.eql?('v2')
|
243
|
+
{
|
244
|
+
'v2' => {
|
245
|
+
:url => URI::escape("/#{room_id}/webhook")
|
246
|
+
}
|
247
|
+
}[version]
|
248
|
+
end
|
183
249
|
end
|
184
250
|
|
185
251
|
class User
|
@@ -236,6 +302,22 @@ module HipChat
|
|
236
302
|
}[version]
|
237
303
|
end
|
238
304
|
|
305
|
+
|
306
|
+
def delete_config
|
307
|
+
{
|
308
|
+
'v1' => {
|
309
|
+
:url => URI::escape('/delete'),
|
310
|
+
:body_format => :to_json,
|
311
|
+
:query_params => { :user_id => user_id }
|
312
|
+
},
|
313
|
+
'v2' => {
|
314
|
+
:url => URI::escape("/#{user_id}"),
|
315
|
+
:body_format => :to_json,
|
316
|
+
:query_params => {}
|
317
|
+
}
|
318
|
+
}[version]
|
319
|
+
end
|
320
|
+
|
239
321
|
def history_config
|
240
322
|
raise InvalidApiVersion, 'This functionality is not supported in API v1' unless version.eql?('v2')
|
241
323
|
|
@@ -65,18 +65,21 @@ namespace :hipchat do
|
|
65
65
|
|
66
66
|
def deployment_name
|
67
67
|
if fetch(:branch, nil)
|
68
|
-
application = fetch(:application)
|
69
68
|
branch = fetch(:branch)
|
70
69
|
real_revision = fetch(:real_revision)
|
71
70
|
|
72
|
-
name = "#{
|
71
|
+
name = "#{application_name}/#{branch}"
|
73
72
|
name += " (revision #{real_revision[0..7]})" if real_revision
|
74
73
|
name
|
75
74
|
else
|
76
|
-
|
75
|
+
application_name
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
79
|
+
def application_name
|
80
|
+
alt_application_name.nil? ? fetch(:application) : alt_application_name
|
81
|
+
end
|
82
|
+
|
80
83
|
def message_color
|
81
84
|
fetch(:hipchat_color, 'yellow')
|
82
85
|
end
|
@@ -101,6 +104,10 @@ namespace :hipchat do
|
|
101
104
|
fetch(:hipchat_deploy_user, 'Deploy')
|
102
105
|
end
|
103
106
|
|
107
|
+
def alt_application_name
|
108
|
+
fetch(:hipchat_app_name, nil)
|
109
|
+
end
|
110
|
+
|
104
111
|
def human
|
105
112
|
user = ENV['HIPCHAT_USER'] || fetch(:hipchat_human)
|
106
113
|
user = user || if (u = %x{git config user.name}.strip) != ''
|
data/lib/hipchat/client.rb
CHANGED
@@ -44,16 +44,26 @@ module HipChat
|
|
44
44
|
:headers => @api.headers
|
45
45
|
)
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
raise
|
54
|
-
else
|
55
|
-
raise UnknownResponseCode, "Unexpected error #{response.code}"
|
47
|
+
ErrorHandler.response_code_to_exception_for :room, name, response
|
48
|
+
response.parsed_response
|
49
|
+
end
|
50
|
+
|
51
|
+
def create_user(name, email, options={})
|
52
|
+
if name.length > 50
|
53
|
+
raise UsernameTooLong, "User name #{name} is #{name.length} characters long. Limit is 50."
|
56
54
|
end
|
55
|
+
|
56
|
+
response = self.class.post(@api.create_user_config[:url],
|
57
|
+
:query => { :auth_token => @token },
|
58
|
+
:body => {
|
59
|
+
:name => name,
|
60
|
+
:email => email
|
61
|
+
}.merge(options).send(@api.create_user_config[:body_format]),
|
62
|
+
:headers => @api.headers
|
63
|
+
)
|
64
|
+
|
65
|
+
ErrorHandler.response_code_to_exception_for :user, email, response
|
66
|
+
response.parsed_response
|
57
67
|
end
|
58
68
|
|
59
69
|
def user(name)
|
@@ -92,13 +102,10 @@ module HipChat
|
|
92
102
|
},
|
93
103
|
:headers => @api.headers
|
94
104
|
)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
else
|
101
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room"
|
105
|
+
|
106
|
+
ErrorHandler.response_code_to_exception_for :room, nil, response
|
107
|
+
response[@api.rooms_config[:data_key]].map do |r|
|
108
|
+
HipChat::Room.new(@token, r.merge(:api_version => @api_version, :server_url => @options[:server_url]))
|
102
109
|
end
|
103
110
|
end
|
104
111
|
|
@@ -110,13 +117,10 @@ module HipChat
|
|
110
117
|
},
|
111
118
|
:headers => @api.headers
|
112
119
|
)
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
end
|
118
|
-
else
|
119
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for user"
|
120
|
+
|
121
|
+
ErrorHandler.response_code_to_exception_for :user, nil, response
|
122
|
+
response[@api.users_config[:data_key]].map do |u|
|
123
|
+
HipChat::User.new(@token, u.merge(:api_version => @api_version, :server_url => @options[:server_url]))
|
120
124
|
end
|
121
125
|
end
|
122
126
|
end
|
data/lib/hipchat/errors.rb
CHANGED
@@ -1,10 +1,49 @@
|
|
1
1
|
module HipChat
|
2
|
-
class
|
3
|
-
class RoomNameTooLong
|
4
|
-
class RoomMissingOwnerUserId
|
5
|
-
class
|
6
|
-
class
|
7
|
-
class
|
8
|
-
class
|
9
|
-
class
|
2
|
+
class ServiceError < StandardError; end
|
3
|
+
class RoomNameTooLong < ServiceError; end
|
4
|
+
class RoomMissingOwnerUserId < ServiceError; end
|
5
|
+
class UnknownResponseCode < ServiceError; end
|
6
|
+
class Unauthorized < UnknownResponseCode; end
|
7
|
+
class BadRequest < ServiceError; end
|
8
|
+
class MethodNotAllowed < ServiceError; end
|
9
|
+
class UsernameTooLong < ServiceError; end
|
10
|
+
class InvalidApiVersion < ServiceError; end
|
11
|
+
class InvalidUrl < ServiceError; end
|
12
|
+
class InvalidEvent < ServiceError; end
|
13
|
+
class ObjectNotFound < UnknownResponseCode; end
|
14
|
+
class UnknownRoom < ObjectNotFound; end
|
15
|
+
class UnknownUser < ObjectNotFound; end
|
16
|
+
class UnknownWebhook < ObjectNotFound; end
|
17
|
+
class TooManyRequests < UnknownResponseCode; end
|
18
|
+
|
19
|
+
class ErrorHandler
|
20
|
+
|
21
|
+
# Pass-through to catch error states and raise their appropriate exceptions
|
22
|
+
# @param klass {Symbol} The class of object we are handling the error for
|
23
|
+
# @param identifier {String} An identifying string for the object causing the error
|
24
|
+
# @param response {HTTParty::Response} The HTTParty response/request object
|
25
|
+
def self.response_code_to_exception_for(klass, identifier, response)
|
26
|
+
# Supports user, room and webhook objects. If we get something other than that, bail.
|
27
|
+
raise ServiceError "Unknown class #{klass}" unless [:user, :room, :webhook].include? klass
|
28
|
+
# Grab the corresponding unknown object exception class and constantize it for the 404 case to call
|
29
|
+
not_found_exception = Module.const_get(HipChat.to_s.to_sym).const_get("Unknown#{klass.capitalize}".to_sym)
|
30
|
+
case response.code
|
31
|
+
when 200, 201, 202, 204;
|
32
|
+
return
|
33
|
+
when 400
|
34
|
+
raise BadRequest, "The request was invalid. You may be missing a required argument or provided bad data. path:#{response.request.path.to_s} method:#{response.request.http_method.to_s}"
|
35
|
+
when 401, 403
|
36
|
+
raise Unauthorized, "Access denied to #{klass} `#{identifier}'"
|
37
|
+
when 404
|
38
|
+
raise not_found_exception, "Unknown #{klass}: `#{identifier}'"
|
39
|
+
when 405
|
40
|
+
raise MethodNotAllowed, "You requested an invalid method. path:#{response.request.path.to_s} method:#{response.request.http_method.to_s}"
|
41
|
+
when 429
|
42
|
+
raise TooManyRequests, 'You have exceeded the rate limit. `https://www.hipchat.com/docs/apiv2/rate_limiting`'
|
43
|
+
else
|
44
|
+
raise UnknownResponseCode, "Unexpected #{response.code} for #{klass} `#{identifier}'"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
10
49
|
end
|
data/lib/hipchat/room.rb
CHANGED
@@ -23,16 +23,8 @@ module HipChat
|
|
23
23
|
:headers => @api.headers
|
24
24
|
)
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
response.parsed_response
|
29
|
-
when 404
|
30
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
31
|
-
when 401
|
32
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
33
|
-
else
|
34
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
35
|
-
end
|
26
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
27
|
+
response.parsed_response
|
36
28
|
end
|
37
29
|
|
38
30
|
# Update a room
|
@@ -55,15 +47,17 @@ module HipChat
|
|
55
47
|
}.to_json,
|
56
48
|
:headers => @api.headers)
|
57
49
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
50
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
# Delete a room
|
55
|
+
def delete_room
|
56
|
+
response = self.class.send(@api.delete_room_config[:method], @api.delete_room_config[:url],
|
57
|
+
:query => {:auth_token => @token }.merge(@api.get_room_config[:query_params]),
|
58
|
+
:headers => @api.headers)
|
59
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
60
|
+
true
|
67
61
|
end
|
68
62
|
|
69
63
|
# Invite user to this room
|
@@ -75,15 +69,21 @@ module HipChat
|
|
75
69
|
}.to_json,
|
76
70
|
:headers => @api.headers)
|
77
71
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
72
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
73
|
+
true
|
74
|
+
end
|
75
|
+
|
76
|
+
# Add member to this room
|
77
|
+
def add_member(user, room_roles=['room_member'])
|
78
|
+
response = self.class.put(@api.add_member_config[:url]+"/#{user}",
|
79
|
+
:query => { :auth_token => @token },
|
80
|
+
:body => {
|
81
|
+
:room_roles => room_roles
|
82
|
+
}.to_json,
|
83
|
+
:headers => @api.headers)
|
84
|
+
|
85
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
86
|
+
true
|
87
87
|
end
|
88
88
|
|
89
89
|
|
@@ -92,6 +92,28 @@ module HipChat
|
|
92
92
|
# Usage:
|
93
93
|
#
|
94
94
|
# # Default
|
95
|
+
# send 'some message'
|
96
|
+
#
|
97
|
+
def send_message(message)
|
98
|
+
response = self.class.post(@api.send_message_config[:url],
|
99
|
+
:query => { :auth_token => @token },
|
100
|
+
:body => {
|
101
|
+
:room_id => room_id,
|
102
|
+
:message => message,
|
103
|
+
}.send(@api.send_config[:body_format]),
|
104
|
+
:headers => @api.headers
|
105
|
+
)
|
106
|
+
|
107
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
# Send a notification message to this room.
|
113
|
+
#
|
114
|
+
# Usage:
|
115
|
+
#
|
116
|
+
# # Default
|
95
117
|
# send 'nickname', 'some message'
|
96
118
|
#
|
97
119
|
# # Notify users and color the message red
|
@@ -107,8 +129,8 @@ module HipChat
|
|
107
129
|
# +notify+:: true or false
|
108
130
|
# (default false)
|
109
131
|
def send(from, message, options_or_notify = {})
|
110
|
-
if from.length >
|
111
|
-
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is
|
132
|
+
if from.length > 20
|
133
|
+
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is 20'"
|
112
134
|
end
|
113
135
|
options = if options_or_notify == true or options_or_notify == false
|
114
136
|
warn 'DEPRECATED: Specify notify flag as an option (e.g., :notify => true)'
|
@@ -117,30 +139,46 @@ module HipChat
|
|
117
139
|
options_or_notify || {}
|
118
140
|
end
|
119
141
|
|
120
|
-
options = { :color => 'yellow', :notify => false }.merge options
|
142
|
+
options = { :color => 'yellow', :notify => false, :message_format => 'html' }.merge options
|
143
|
+
|
144
|
+
body = {
|
145
|
+
:room_id => room_id,
|
146
|
+
:from => from,
|
147
|
+
:message => message,
|
148
|
+
:message_format => options[:message_format],
|
149
|
+
:color => options[:color],
|
150
|
+
:card => options[:card],
|
151
|
+
:notify => @api.bool_val(options[:notify])
|
152
|
+
}.delete_if { |_k, v| v.nil? }
|
121
153
|
|
122
154
|
response = self.class.post(@api.send_config[:url],
|
155
|
+
:query => { :auth_token => @token },
|
156
|
+
:body => body.send(@api.send_config[:body_format]),
|
157
|
+
:headers => @api.headers
|
158
|
+
)
|
159
|
+
|
160
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
161
|
+
true
|
162
|
+
end
|
163
|
+
|
164
|
+
def share_link(from, message, link)
|
165
|
+
if from.length > 20
|
166
|
+
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is 20'"
|
167
|
+
end
|
168
|
+
|
169
|
+
response = self.class.post(@api.share_link_config[:url],
|
123
170
|
:query => { :auth_token => @token },
|
124
171
|
:body => {
|
125
172
|
:room_id => room_id,
|
126
173
|
:from => from,
|
127
174
|
:message => message,
|
128
|
-
:
|
129
|
-
:color => options[:color],
|
130
|
-
:notify => @api.bool_val(options[:notify])
|
175
|
+
:link => link,
|
131
176
|
}.send(@api.send_config[:body_format]),
|
132
177
|
:headers => @api.headers
|
133
178
|
)
|
134
179
|
|
135
|
-
|
136
|
-
|
137
|
-
when 404
|
138
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
139
|
-
when 401
|
140
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
141
|
-
else
|
142
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
143
|
-
end
|
180
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
181
|
+
true
|
144
182
|
end
|
145
183
|
|
146
184
|
# Send a file to this room.
|
@@ -150,8 +188,8 @@ module HipChat
|
|
150
188
|
# # Default
|
151
189
|
# send_file 'nickname', 'some message', File.open("/path/to/file")
|
152
190
|
def send_file(from, message, file)
|
153
|
-
if from.length >
|
154
|
-
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is
|
191
|
+
if from.length > 20
|
192
|
+
raise UsernameTooLong, "Username #{from} is `#{from.length} characters long. Limit is 20'"
|
155
193
|
end
|
156
194
|
|
157
195
|
response = self.class.post(@api.send_file_config[:url],
|
@@ -166,15 +204,8 @@ module HipChat
|
|
166
204
|
:headers => file_body_headers(@api.headers)
|
167
205
|
)
|
168
206
|
|
169
|
-
|
170
|
-
|
171
|
-
when 404
|
172
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
173
|
-
when 401
|
174
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
175
|
-
else
|
176
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
177
|
-
end
|
207
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
208
|
+
true
|
178
209
|
end
|
179
210
|
|
180
211
|
# Change this room's topic
|
@@ -202,15 +233,8 @@ module HipChat
|
|
202
233
|
:headers => @api.headers
|
203
234
|
)
|
204
235
|
|
205
|
-
|
206
|
-
|
207
|
-
when 404
|
208
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
209
|
-
when 401
|
210
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
211
|
-
else
|
212
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
213
|
-
end
|
236
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
237
|
+
true
|
214
238
|
end
|
215
239
|
|
216
240
|
# Pull this room's history
|
@@ -235,7 +259,8 @@ module HipChat
|
|
235
259
|
:timezone => 'UTC',
|
236
260
|
:format => 'JSON',
|
237
261
|
:'max-results' => 100,
|
238
|
-
:'start-index' => 0
|
262
|
+
:'start-index' => 0,
|
263
|
+
:'end-date' => nil
|
239
264
|
}.merge options
|
240
265
|
|
241
266
|
response = self.class.get(@api.history_config[:url],
|
@@ -246,21 +271,14 @@ module HipChat
|
|
246
271
|
:format => options[:format],
|
247
272
|
:'max-results' => options[:'max-results'],
|
248
273
|
:'start-index' => options[:'start-index'],
|
274
|
+
:'end-date' => options[:'end-date'],
|
249
275
|
:auth_token => @token
|
250
276
|
},
|
251
277
|
:headers => @api.headers
|
252
278
|
)
|
253
279
|
|
254
|
-
|
255
|
-
|
256
|
-
response.body
|
257
|
-
when 404
|
258
|
-
raise UnknownRoom, "Unknown room: `#{room_id}'"
|
259
|
-
when 401
|
260
|
-
raise Unauthorized, "Access denied to room `#{room_id}'"
|
261
|
-
else
|
262
|
-
raise UnknownResponseCode, "Unexpected #{response.code} for room `#{room_id}'"
|
263
|
-
end
|
280
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
281
|
+
response.body
|
264
282
|
end
|
265
283
|
|
266
284
|
# Pull this room's statistics
|
@@ -277,16 +295,113 @@ module HipChat
|
|
277
295
|
:headers => @api.headers
|
278
296
|
)
|
279
297
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
298
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
299
|
+
response.body
|
300
|
+
end
|
301
|
+
|
302
|
+
# Create a webhook for this room
|
303
|
+
#
|
304
|
+
# Usage:
|
305
|
+
#
|
306
|
+
# # Default
|
307
|
+
# create_webhook 'http://example.org/path/to/my/webhook', 'room_event'
|
308
|
+
#
|
309
|
+
# Options:
|
310
|
+
#
|
311
|
+
# +pattern+:: The regular expression pattern to match against messages. Only applicable for message events.
|
312
|
+
# (default "")
|
313
|
+
# +name+:: The label for this webhook
|
314
|
+
# (default "")
|
315
|
+
def create_webhook(url, event, options = {})
|
316
|
+
raise InvalidEvent unless %w(room_message room_notification room_exit room_enter room_topic_change room_archived room_deleted room_unarchived).include? event
|
317
|
+
|
318
|
+
begin
|
319
|
+
u = URI::parse(url)
|
320
|
+
raise InvalidUrl unless %w(http https).include? u.scheme
|
321
|
+
rescue URI::InvalidURIError
|
322
|
+
raise InvalidUrl
|
289
323
|
end
|
324
|
+
|
325
|
+
options = {
|
326
|
+
:pattern => '',
|
327
|
+
:name => ''
|
328
|
+
}.merge options
|
329
|
+
|
330
|
+
response = self.class.post(@api.webhook_config[:url],
|
331
|
+
:query => {
|
332
|
+
:auth_token => @token
|
333
|
+
},
|
334
|
+
:body => {:url => url, :pattern => options[:pattern], :event => event, :name => options[:name]}.send(@api.send_config[:body_format]),
|
335
|
+
:headers => @api.headers
|
336
|
+
)
|
337
|
+
|
338
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
339
|
+
response.body
|
340
|
+
end
|
341
|
+
|
342
|
+
# Delete a webhook for this room
|
343
|
+
#
|
344
|
+
# Usage:
|
345
|
+
#
|
346
|
+
# # Default
|
347
|
+
# delete_webhook 'webhook_id'
|
348
|
+
def delete_webhook(webhook_id)
|
349
|
+
response = self.class.delete("#{@api.webhook_config[:url]}/#{URI::escape(webhook_id)}",
|
350
|
+
:query => {
|
351
|
+
:auth_token => @token
|
352
|
+
},
|
353
|
+
:headers => @api.headers
|
354
|
+
)
|
355
|
+
|
356
|
+
ErrorHandler.response_code_to_exception_for :webhook, webhook_id, response
|
357
|
+
true
|
358
|
+
end
|
359
|
+
|
360
|
+
# Gets all webhooks for this room
|
361
|
+
#
|
362
|
+
# Usage:
|
363
|
+
#
|
364
|
+
# # Default
|
365
|
+
# get_all_webhooks
|
366
|
+
#
|
367
|
+
# Options:
|
368
|
+
#
|
369
|
+
# +start-index+:: The regular expression pattern to match against messages. Only applicable for message events.
|
370
|
+
# (default "")
|
371
|
+
# +max-results+:: The label for this webhook
|
372
|
+
# (default "")
|
373
|
+
def get_all_webhooks(options = {})
|
374
|
+
options = {:'start-index' => 0, :'max-results' => 100}.merge(options)
|
375
|
+
|
376
|
+
response = self.class.get(@api.webhook_config[:url],
|
377
|
+
:query => {
|
378
|
+
:auth_token => @token,
|
379
|
+
:'start-index' => options[:'start-index'],
|
380
|
+
:'max-results' => options[:'max-results']
|
381
|
+
},
|
382
|
+
:headers => @api.headers
|
383
|
+
)
|
384
|
+
|
385
|
+
ErrorHandler.response_code_to_exception_for :room, room_id, response
|
386
|
+
response.body
|
387
|
+
end
|
388
|
+
|
389
|
+
# Get a webhook for this room
|
390
|
+
#
|
391
|
+
# Usage:
|
392
|
+
#
|
393
|
+
# # Default
|
394
|
+
# get_webhook 'webhook_id'
|
395
|
+
def get_webhook(webhook_id)
|
396
|
+
response = self.class.get("#{@api.webhook_config[:url]}/#{URI::escape(webhook_id)}",
|
397
|
+
:query => {
|
398
|
+
:auth_token => @token
|
399
|
+
},
|
400
|
+
:headers => @api.headers
|
401
|
+
)
|
402
|
+
|
403
|
+
ErrorHandler.response_code_to_exception_for :webhook, webhook_id, response
|
404
|
+
response.body
|
290
405
|
end
|
291
406
|
|
292
407
|
private
|