hipchat_smart 1.0.2 → 1.1.0
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/README.md +2 -0
- data/lib/hipchat_smart.rb +182 -136
- data/lib/hipchat_smart_rules.rb +11 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3e585b909e8904d242c669afb747002c50d72a1101ba5277fba3f486c61f4f6
|
4
|
+
data.tar.gz: d57b2218f543ff1aa916b57f91bba57c82a37bfe12521f9da1e0d45102e28aa2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edfceedc17b581e3be9b6a219ad1927faa073d6a94d11e1c5600635a6980f087140a47fef4d773306c76dc33ebb5388ddb63db7bbec5a503658669cee398dcc7
|
7
|
+
data.tar.gz: cd2f376978be01e117f610f04ded45075fa1c59be60ce51400e89033be6b4685f0fd0e423e64bd9d743ceccc3049ddad788d7adf66f46dcaa2b36bc71b829073
|
data/README.md
CHANGED
@@ -101,6 +101,8 @@ def rules(from, command, processed)
|
|
101
101
|
end
|
102
102
|
|
103
103
|
```
|
104
|
+
### How to access the bot
|
105
|
+
You can access the bot directly on the MASTER ROOM, on a secondary room where the bot is running and directly by opening a private chat with the bot, in this case the conversation will be just between you and the bot.
|
104
106
|
|
105
107
|
### Available commands even when the bot is not listening to you
|
106
108
|
Some of the commands are available always even when the bot is not listening to you but it is running
|
data/lib/hipchat_smart.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
require 'xmpp4r'
|
2
2
|
require 'xmpp4r/muc/helper/simplemucclient'
|
3
3
|
require 'xmpp4r/muc/helper/mucbrowser'
|
4
|
+
require 'xmpp4r/roster'
|
5
|
+
require 'hipchat'
|
4
6
|
require 'open-uri'
|
5
7
|
require 'cgi'
|
6
8
|
require 'json'
|
7
|
-
require 'hipchat'
|
8
9
|
require 'logger'
|
10
|
+
require 'fileutils'
|
11
|
+
require 'open3'
|
9
12
|
|
10
13
|
if ARGV.size==0
|
11
14
|
ROOM = MASTER_ROOM
|
@@ -13,9 +16,8 @@ if ARGV.size==0
|
|
13
16
|
ADMIN_USERS = MASTER_USERS
|
14
17
|
RULES_FILE = "#{$0.gsub('.rb', '_rules.rb')}" unless defined?(RULES_FILE)
|
15
18
|
unless File.exist?(RULES_FILE)
|
16
|
-
|
17
|
-
|
18
|
-
FileUtils.copy_file(default_rules, RULES_FILE)
|
19
|
+
default_rules=(__FILE__).gsub(".rb", "_rules.rb")
|
20
|
+
FileUtils.copy_file(default_rules, RULES_FILE)
|
19
21
|
end
|
20
22
|
STATUS_INIT = :on
|
21
23
|
else
|
@@ -30,7 +32,7 @@ SHORTCUTS_FILE = "hipchat_smart_shortcuts_#{ROOM}.rb".gsub(" ", "_")
|
|
30
32
|
|
31
33
|
class Bot
|
32
34
|
|
33
|
-
attr_accessor :config, :client, :muc, :muc_browser
|
35
|
+
attr_accessor :config, :client, :muc, :muc_browser, :roster
|
34
36
|
|
35
37
|
def initialize(config)
|
36
38
|
Dir.mkdir("./logs") unless Dir.exist?("./logs")
|
@@ -98,6 +100,9 @@ class Bot
|
|
98
100
|
end
|
99
101
|
config.delete(:password)
|
100
102
|
client.send(Jabber::Presence.new.set_type(:available))
|
103
|
+
|
104
|
+
self.roster = Jabber::Roster::Helper.new(client)
|
105
|
+
|
101
106
|
@status = STATUS_INIT
|
102
107
|
@questions = Hash.new()
|
103
108
|
@rooms_jid=Hash.new()
|
@@ -129,95 +134,119 @@ class Bot
|
|
129
134
|
}
|
130
135
|
end
|
131
136
|
|
137
|
+
|
132
138
|
def listen
|
133
139
|
@salutations = [config[:nick].split(/\s+/).first, "bot"]
|
134
140
|
|
135
141
|
muc.on_message do |time, nick, text|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
when /^Bot has been killed by/
|
141
|
-
exit!
|
142
|
-
when /^Changed status on (.+) to :(.+)/i
|
143
|
-
room=$1
|
144
|
-
status=$2
|
145
|
-
@bots_created[room][:status]=status.to_sym
|
146
|
-
update_bots_file()
|
147
|
-
end
|
148
|
-
next #don't continue analyzing
|
149
|
-
rescue Exception => stack
|
150
|
-
@logger.fatal stack
|
151
|
-
next
|
152
|
-
end
|
142
|
+
jid_user = nil
|
143
|
+
res = process_first(time, nick, text, jid_user)
|
144
|
+
next if res.to_s=="next"
|
145
|
+
end
|
153
146
|
|
154
|
-
|
147
|
+
muc.join(config[:room] + '/' + config[:nick])
|
148
|
+
respond "Bot started"
|
155
149
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
150
|
+
#accept subscriptions from everyone
|
151
|
+
roster.add_subscription_request_callback do |item, pres|
|
152
|
+
roster.accept_subscription(pres.from)
|
153
|
+
end
|
154
|
+
|
155
|
+
client.add_message_callback do |m|
|
156
|
+
unless m.body.to_s==""
|
157
|
+
jid_user=m.from.node+"@"+m.from.domain
|
158
|
+
user=roster[jid_user]
|
159
|
+
unless user.nil?
|
160
|
+
res = process_first("", user.attributes["name"], m.body, jid_user)
|
161
|
+
next if res.to_s=="next"
|
165
162
|
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
@logger.info "Bot listening"
|
167
|
+
self
|
168
|
+
end
|
166
169
|
|
170
|
+
def process_first(time, nick, text, jid_user)
|
171
|
+
if nick==config[:nick] or nick==(config[:nick] + " · Bot") #if message is coming from the bot
|
172
|
+
begin
|
173
|
+
@logger.info "#{nick}: #{text}"
|
174
|
+
case text
|
175
|
+
when /^Bot has been killed by/
|
176
|
+
exit!
|
177
|
+
when /^Changed status on (.+) to :(.+)/i
|
178
|
+
room=$1
|
179
|
+
status=$2
|
180
|
+
@bots_created[room][:status]=status.to_sym
|
181
|
+
update_bots_file()
|
182
|
+
end
|
183
|
+
return :next #don't continue analyzing
|
184
|
+
rescue Exception => stack
|
185
|
+
@logger.fatal stack
|
186
|
+
return :next
|
167
187
|
end
|
168
188
|
|
169
|
-
|
170
|
-
|
171
|
-
|
189
|
+
end
|
190
|
+
|
191
|
+
if text.match?(/^\/(shortcut|sc)\s(.+)/i)
|
192
|
+
shortcut=text.scan(/\/\w+\s*(.+)\s*/i).join.downcase
|
193
|
+
if @shortcuts.keys.include?(nick) and @shortcuts[nick].keys.include?(shortcut)
|
194
|
+
text=@shortcuts[nick][shortcut]
|
195
|
+
elsif @shortcuts.keys.include?(:all) and @shortcuts[:all].keys.include?(shortcut)
|
196
|
+
text=@shortcuts[:all][shortcut]
|
172
197
|
else
|
173
|
-
|
198
|
+
respond "Shortcut not found", jid_user
|
199
|
+
return :next
|
174
200
|
end
|
175
201
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
202
|
+
end
|
203
|
+
|
204
|
+
if @questions.keys.include?(nick)
|
205
|
+
command=@questions[nick]
|
206
|
+
@questions[nick]=text
|
207
|
+
else
|
208
|
+
command=text
|
209
|
+
end
|
210
|
+
|
211
|
+
begin
|
212
|
+
t = Thread.new do
|
213
|
+
begin
|
214
|
+
processed = process(nick, command, jid_user)
|
215
|
+
@logger.info "command: #{nick}> #{command}" if processed
|
216
|
+
if @status==:on and
|
217
|
+
((@questions.keys.include?(nick) or
|
218
|
+
@listening.include?(nick) or
|
219
|
+
command.match?(/^@?#{@salutations.join("|")}:*\s+(.+)$/i) or
|
220
|
+
command.match?(/^!(.+)$/)))
|
221
|
+
@logger.info "command: #{nick}> #{command}" unless processed
|
222
|
+
begin
|
223
|
+
eval(File.new(RULES_FILE).read) if File.exist?(RULES_FILE)
|
224
|
+
rescue Exception => stack
|
225
|
+
@logger.fatal "ERROR ON RULES FILE: #{RULES_FILE}"
|
226
|
+
@logger.fatal stack
|
227
|
+
end
|
228
|
+
if defined?(rules)
|
229
|
+
command[0]="" if command[0]=="!"
|
230
|
+
command.gsub!(/^@\w+:*\s*/, "")
|
231
|
+
rules(nick, command, processed, jid_user)
|
232
|
+
else
|
233
|
+
@logger.warn "It seems like rules method is not defined"
|
200
234
|
end
|
201
|
-
rescue Exception => stack
|
202
|
-
@logger.fatal stack
|
203
235
|
end
|
204
|
-
|
236
|
+
rescue Exception => stack
|
237
|
+
@logger.fatal stack
|
205
238
|
end
|
206
239
|
|
207
|
-
rescue => e
|
208
|
-
@logger.error "exception: #{e.inspect}"
|
209
240
|
end
|
210
|
-
end
|
211
241
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
self
|
242
|
+
rescue => e
|
243
|
+
@logger.error "exception: #{e.inspect}"
|
244
|
+
end
|
216
245
|
end
|
217
246
|
|
218
247
|
#help: Commands you can use:
|
219
248
|
#help:
|
220
|
-
def process(from, command)
|
249
|
+
def process(from, command, jid_user)
|
221
250
|
firstname = from.split(/ /).first
|
222
251
|
processed=true
|
223
252
|
|
@@ -231,7 +260,7 @@ class Bot
|
|
231
260
|
when /^(Hello|Hallo|Hi|Hola|What's\sup|Hey|Zdravo|Molim|Hæ)\s(#{@salutations.join("|")})\s*$/i
|
232
261
|
if @status==:on
|
233
262
|
greetings=['Hello', 'Hallo', 'Hi', 'Hola', "What's up", "Hey", "Zdravo", "Molim", "Hæ"].sample
|
234
|
-
respond "#{greetings} #{firstname}"
|
263
|
+
respond "#{greetings} #{firstname}", jid_user
|
235
264
|
@listening<<from unless @listening.include?(from)
|
236
265
|
end
|
237
266
|
|
@@ -243,7 +272,7 @@ class Bot
|
|
243
272
|
when /^(Bye|Bæ|Good\sBye|Adiós|Ciao|Bless|Bless\sBless|Zbogom|Adeu)\s(#{@salutations.join("|")})\s*$/i
|
244
273
|
if @status==:on
|
245
274
|
bye=['Bye', 'Bæ', 'Good Bye', 'Adiós', "Ciao", "Bless", "Bless bless", "Zbogom", "Adeu"].sample
|
246
|
-
respond "#{bye} #{firstname}"
|
275
|
+
respond "#{bye} #{firstname}", jid_user
|
247
276
|
@listening.delete(from)
|
248
277
|
end
|
249
278
|
|
@@ -257,15 +286,15 @@ class Bot
|
|
257
286
|
if ON_MASTER_ROOM
|
258
287
|
if ADMIN_USERS.include?(from) #admin user
|
259
288
|
unless @questions.keys.include?(from)
|
260
|
-
ask("are you sure?", command, from)
|
289
|
+
ask("are you sure?", command, from, jid_user)
|
261
290
|
else
|
262
291
|
case @questions[from]
|
263
292
|
when /yes/i, /yep/i, /sure/i
|
264
|
-
respond "Game over!"
|
265
|
-
respond "Ciao #{firstname}!"
|
293
|
+
respond "Game over!", jid_user
|
294
|
+
respond "Ciao #{firstname}!", jid_user
|
266
295
|
@bots_created.each {|key, value|
|
267
296
|
value[:thread]=""
|
268
|
-
|
297
|
+
send_msg_room(key, "Bot has been killed by #{from}")
|
269
298
|
sleep 0.5
|
270
299
|
}
|
271
300
|
update_bots_file()
|
@@ -273,18 +302,18 @@ class Bot
|
|
273
302
|
exit!
|
274
303
|
when /no/i, /nope/i, /cancel/i
|
275
304
|
@questions.delete(from)
|
276
|
-
respond "Thanks, I'm happy to be alive"
|
305
|
+
respond "Thanks, I'm happy to be alive", jid_user
|
277
306
|
else
|
278
|
-
respond "I don't understand"
|
279
|
-
ask("are you sure do you want me to close? (yes or no)", "quit bot", from)
|
307
|
+
respond "I don't understand", jid_user
|
308
|
+
ask("are you sure do you want me to close? (yes or no)", "quit bot", from, jid_user)
|
280
309
|
end
|
281
310
|
end
|
282
311
|
else
|
283
|
-
respond "Only admin users can kill me"
|
312
|
+
respond "Only admin users can kill me", jid_user
|
284
313
|
end
|
285
314
|
|
286
315
|
else
|
287
|
-
respond "To do this you need to be an admin user in the master room"
|
316
|
+
respond "To do this you need to be an admin user in the master room", jid_user
|
288
317
|
end
|
289
318
|
|
290
319
|
#help: start bot
|
@@ -294,14 +323,14 @@ class Bot
|
|
294
323
|
#help:
|
295
324
|
when /^start\s(this\s)?bot$/i
|
296
325
|
if ADMIN_USERS.include?(from) #admin user
|
297
|
-
respond "This bot is running and listening from now on. You can pause again: pause this bot"
|
326
|
+
respond "This bot is running and listening from now on. You can pause again: pause this bot", jid_user
|
298
327
|
@status=:on
|
299
328
|
unless ON_MASTER_ROOM
|
300
329
|
get_rooms_name_and_jid() unless @rooms_name.keys.include?(MASTER_ROOM) and @rooms_name.keys.include?(ROOM)
|
301
|
-
|
330
|
+
send_msg_room @rooms_name[MASTER_ROOM], "Changed status on #{@rooms_name[ROOM]} to :on"
|
302
331
|
end
|
303
332
|
else
|
304
|
-
respond "Only admin users can change my status"
|
333
|
+
respond "Only admin users can change my status", jid_user
|
305
334
|
end
|
306
335
|
|
307
336
|
|
@@ -312,15 +341,15 @@ class Bot
|
|
312
341
|
#help:
|
313
342
|
when /^pause\s(this\s)?bot$/i
|
314
343
|
if ADMIN_USERS.include?(from) #admin user
|
315
|
-
respond "This bot is paused from now on. You can start it again: start this bot"
|
316
|
-
respond "zZzzzzZzzzzZZZZZZzzzzzzzz"
|
344
|
+
respond "This bot is paused from now on. You can start it again: start this bot", jid_user
|
345
|
+
respond "zZzzzzZzzzzZZZZZZzzzzzzzz", jid_user
|
317
346
|
@status=:paused
|
318
347
|
unless ON_MASTER_ROOM
|
319
348
|
get_rooms_name_and_jid() unless @rooms_name.keys.include?(MASTER_ROOM) and @rooms_name.keys.include?(ROOM)
|
320
|
-
|
349
|
+
send_msg_room @rooms_name[MASTER_ROOM], "Changed status on #{@rooms_name[ROOM]} to :paused"
|
321
350
|
end
|
322
351
|
else
|
323
|
-
respond "Only admin users can put me on pause"
|
352
|
+
respond "Only admin users can put me on pause", jid_user
|
324
353
|
end
|
325
354
|
|
326
355
|
|
@@ -329,12 +358,12 @@ class Bot
|
|
329
358
|
#help: If on master room and admin user also it will display info about bots created
|
330
359
|
#help:
|
331
360
|
when /^bot\sstatus/i
|
332
|
-
respond "Status: #{@status}. Rules file: #{File.basename RULES_FILE} "
|
361
|
+
respond "Status: #{@status}. Rules file: #{File.basename RULES_FILE} ", jid_user
|
333
362
|
if @status==:on
|
334
|
-
respond "I'm listening to [#{@listening.join(", ")}]"
|
363
|
+
respond "I'm listening to [#{@listening.join(", ")}]", jid_user
|
335
364
|
if ON_MASTER_ROOM and ADMIN_USERS.include?(from)
|
336
365
|
@bots_created.each {|key, value|
|
337
|
-
respond "#{key}: #{value}"
|
366
|
+
respond "#{key}: #{value}", jid_user
|
338
367
|
}
|
339
368
|
end
|
340
369
|
end
|
@@ -347,7 +376,7 @@ class Bot
|
|
347
376
|
if ON_MASTER_ROOM
|
348
377
|
room=$1
|
349
378
|
if @bots_created.keys.include?(room)
|
350
|
-
respond "There is already a bot in this room: #{room}, kill it before"
|
379
|
+
respond "There is already a bot in this room: #{room}, kill it before", jid_user
|
351
380
|
else
|
352
381
|
rooms=Hash.new()
|
353
382
|
muc_browser.muc_rooms(@xmpp_namespace).each {|jid, name|
|
@@ -355,6 +384,7 @@ class Bot
|
|
355
384
|
}
|
356
385
|
if rooms.keys.include?(room)
|
357
386
|
jid=rooms[room]
|
387
|
+
@rooms_jid[room]=jid
|
358
388
|
if jid!=config[:room]
|
359
389
|
jid=jid.to_s.gsub(/@.+/, '')
|
360
390
|
begin
|
@@ -366,7 +396,6 @@ class Bot
|
|
366
396
|
Dir.mkdir("rules/#{jid}") unless Dir.exist?("rules/#{jid}")
|
367
397
|
rules_file="./rules/#{jid}/" + rules_file
|
368
398
|
end
|
369
|
-
require 'fileutils'
|
370
399
|
default_rules=(__FILE__).gsub(".rb", "_rules.rb")
|
371
400
|
File.delete(rules_file) if File.exist?(rules_file)
|
372
401
|
FileUtils.copy_file(default_rules, rules_file) unless File.exist?(rules_file)
|
@@ -386,24 +415,24 @@ class Bot
|
|
386
415
|
admins: admin_users.join(","),
|
387
416
|
thread: t
|
388
417
|
}
|
389
|
-
respond "The bot has been created on room: #{room}. Rules file: #{File.basename rules_file}"
|
418
|
+
respond "The bot has been created on room: #{room}. Rules file: #{File.basename rules_file}", jid_user
|
390
419
|
update_bots_file()
|
391
420
|
rescue Exception => stack
|
392
421
|
@logger.fatal stack
|
393
422
|
message="Problem creating the bot on room #{room}. Error: <#{stack}>."
|
394
423
|
@logger.error message
|
395
|
-
respond message
|
424
|
+
respond message, jid_user
|
396
425
|
end
|
397
426
|
else
|
398
|
-
respond "There is already a bot in this room: #{room}, and it is the Master Room!"
|
427
|
+
respond "There is already a bot in this room: #{room}, and it is the Master Room!", jid_user
|
399
428
|
end
|
400
429
|
|
401
430
|
else
|
402
|
-
respond "There is no room with that name: #{room}, please be sure is written exactly the same"
|
431
|
+
respond "There is no room with that name: #{room}, please be sure is written exactly the same", jid_user
|
403
432
|
end
|
404
433
|
end
|
405
434
|
else
|
406
|
-
respond "Sorry I cannot create bots from this room, please visit the master room"
|
435
|
+
respond "Sorry I cannot create bots from this room, please visit the master room", jid_user
|
407
436
|
end
|
408
437
|
|
409
438
|
#help: kill bot on ROOM_NAME
|
@@ -420,16 +449,16 @@ class Bot
|
|
420
449
|
end
|
421
450
|
@bots_created.delete(room)
|
422
451
|
update_bots_file()
|
423
|
-
respond "Bot on room: #{room}, has been killed and deleted."
|
424
|
-
|
452
|
+
respond "Bot on room: #{room}, has been killed and deleted.", jid_user
|
453
|
+
send_msg_room(room, "Bot has been killed by #{from}")
|
425
454
|
else
|
426
|
-
respond "You need to be the creator or an admin of that room"
|
455
|
+
respond "You need to be the creator or an admin of that room", jid_user
|
427
456
|
end
|
428
457
|
else
|
429
|
-
respond "There is no bot in this room: #{room}"
|
458
|
+
respond "There is no bot in this room: #{room}", jid_user
|
430
459
|
end
|
431
460
|
else
|
432
|
-
respond "Sorry I cannot kill bots from this room, please visit the master room"
|
461
|
+
respond "Sorry I cannot kill bots from this room, please visit the master room", jid_user
|
433
462
|
end
|
434
463
|
|
435
464
|
#help: bot help
|
@@ -439,8 +468,8 @@ class Bot
|
|
439
468
|
when /^bot help/i, /^bot,? what can I do/i
|
440
469
|
help_message = IO.readlines(__FILE__).join
|
441
470
|
help_message_rules = IO.readlines(RULES_FILE).join
|
442
|
-
respond "/quote " + help_message.scan(/#\s*help\s*:(.*)/).join("\n")
|
443
|
-
respond "/quote " + help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n")
|
471
|
+
respond "/quote " + help_message.scan(/#\s*help\s*:(.*)/).join("\n"), jid_user
|
472
|
+
respond "/quote " + help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), jid_user
|
444
473
|
|
445
474
|
else
|
446
475
|
processed = false
|
@@ -482,31 +511,31 @@ class Bot
|
|
482
511
|
@shortcuts[from]=Hash.new() unless @shortcuts.keys.include?(from)
|
483
512
|
|
484
513
|
if !ADMIN_USERS.include?(from) and @shortcuts[:all].include?(shortcut_name) and !@shortcuts[from].include?(shortcut_name)
|
485
|
-
respond "Only the creator of the shortcut or an admin user can modify it"
|
514
|
+
respond "Only the creator of the shortcut or an admin user can modify it", jid_user
|
486
515
|
elsif !@shortcuts[from].include?(shortcut_name)
|
487
516
|
#new shortcut
|
488
517
|
@shortcuts[from][shortcut_name]=command_to_run
|
489
518
|
@shortcuts[:all][shortcut_name]=command_to_run if for_all.to_s!=""
|
490
519
|
update_shortcuts_file()
|
491
|
-
respond "shortcut added"
|
520
|
+
respond "shortcut added", jid_user
|
492
521
|
else
|
493
522
|
|
494
523
|
#are you sure? to avoid overwriting existing
|
495
524
|
unless @questions.keys.include?(from)
|
496
|
-
ask("The shortcut already exists, are you sure you want to overwrite it?", command, from)
|
525
|
+
ask("The shortcut already exists, are you sure you want to overwrite it?", command, from, jid_user)
|
497
526
|
else
|
498
527
|
case @questions[from]
|
499
528
|
when /^(yes|yep)/i
|
500
529
|
@shortcuts[from][shortcut_name]=command_to_run
|
501
530
|
@shortcuts[:all][shortcut_name]=command_to_run if for_all.to_s!=""
|
502
531
|
update_shortcuts_file()
|
503
|
-
respond "shortcut added"
|
532
|
+
respond "shortcut added", jid_user
|
504
533
|
@questions.delete(from)
|
505
534
|
when /^no/i
|
506
|
-
respond "ok, I won't add it"
|
535
|
+
respond "ok, I won't add it", jid_user
|
507
536
|
@questions.delete(from)
|
508
537
|
else
|
509
|
-
respond "I don't understand, yes or no?"
|
538
|
+
respond "I don't understand, yes or no?", jid_user
|
510
539
|
end
|
511
540
|
end
|
512
541
|
|
@@ -520,30 +549,30 @@ class Bot
|
|
520
549
|
deleted=false
|
521
550
|
|
522
551
|
if !ADMIN_USERS.include?(from) and @shortcuts[:all].include?(shortcut) and !@shortcuts[from].include?(shortcut)
|
523
|
-
respond "Only the creator of the shortcut or an admin user can delete it"
|
552
|
+
respond "Only the creator of the shortcut or an admin user can delete it", jid_user
|
524
553
|
elsif (@shortcuts.keys.include?(from) and @shortcuts[from].keys.include?(shortcut)) or
|
525
554
|
(ADMIN_USERS.include?(from) and @shortcuts[:all].include?(shortcut))
|
526
555
|
#are you sure? to avoid deleting by mistake
|
527
556
|
unless @questions.keys.include?(from)
|
528
|
-
ask("are you sure you want to delete it?", command, from)
|
557
|
+
ask("are you sure you want to delete it?", command, from, jid_user)
|
529
558
|
else
|
530
559
|
case @questions[from]
|
531
560
|
when /^(yes|yep)/i
|
532
|
-
respond "shortcut deleted!"
|
533
|
-
respond "#{shortcut}: #{@shortcuts[from][shortcut]}"
|
561
|
+
respond "shortcut deleted!", jid_user
|
562
|
+
respond "#{shortcut}: #{@shortcuts[from][shortcut]}", jid_user
|
534
563
|
@shortcuts[from].delete(shortcut)
|
535
564
|
@shortcuts[:all].delete(shortcut)
|
536
565
|
@questions.delete(from)
|
537
566
|
update_shortcuts_file()
|
538
567
|
when /^no/i
|
539
|
-
respond "ok, I won't delete it"
|
568
|
+
respond "ok, I won't delete it", jid_user
|
540
569
|
@questions.delete(from)
|
541
570
|
else
|
542
|
-
respond "I don't understand, yes or no?"
|
571
|
+
respond "I don't understand, yes or no?", jid_user
|
543
572
|
end
|
544
573
|
end
|
545
574
|
else
|
546
|
-
respond "shortcut not found"
|
575
|
+
respond "shortcut not found", jid_user
|
547
576
|
end
|
548
577
|
|
549
578
|
#help: see shortcuts
|
@@ -556,7 +585,7 @@ class Bot
|
|
556
585
|
@shortcuts[:all].each {|name, value|
|
557
586
|
msg+="#{name}: #{value}\n"
|
558
587
|
}
|
559
|
-
respond msg
|
588
|
+
respond msg, jid_user
|
560
589
|
end
|
561
590
|
|
562
591
|
if @shortcuts.keys.include?(from) and @shortcuts[from].keys.size>0
|
@@ -567,10 +596,10 @@ class Bot
|
|
567
596
|
new_hash.each {|name, value|
|
568
597
|
msg+="#{name}: #{value}\n"
|
569
598
|
}
|
570
|
-
respond msg
|
599
|
+
respond msg, jid_user
|
571
600
|
end
|
572
601
|
end
|
573
|
-
respond "No shortcuts found" if msg==""
|
602
|
+
respond "No shortcuts found", jid_user if msg==""
|
574
603
|
|
575
604
|
#help: jid room ROOM_NAME
|
576
605
|
#help: shows the jid of a room name
|
@@ -579,9 +608,9 @@ class Bot
|
|
579
608
|
room_name=$1
|
580
609
|
get_rooms_name_and_jid()
|
581
610
|
if @rooms_jid.keys.include?(room_name)
|
582
|
-
respond "the jid of #{room_name} is #{@rooms_jid[room_name]}"
|
611
|
+
respond "the jid of #{room_name} is #{@rooms_jid[room_name]}", jid_user
|
583
612
|
else
|
584
|
-
respond "room: #{room_name} not found"
|
613
|
+
respond "room: #{room_name} not found", jid_user
|
585
614
|
end
|
586
615
|
|
587
616
|
# help: ruby RUBY_CODE
|
@@ -598,22 +627,21 @@ class Bot
|
|
598
627
|
code.match?(/open3/i) or code.match?(/bundle/i) or code.match?(/gemfile/i) or code.include?("%x") or
|
599
628
|
code.include?("ENV")
|
600
629
|
begin
|
601
|
-
require 'open3'
|
602
630
|
stdout, stderr, status = Open3.capture3("ruby -e \"#{code.gsub('"', '\"')}\"")
|
603
631
|
if stderr==""
|
604
632
|
if stdout==""
|
605
|
-
respond "Nothing returned. Remember you need to use p or puts to print"
|
633
|
+
respond "Nothing returned. Remember you need to use p or puts to print", jid_user
|
606
634
|
else
|
607
|
-
respond stdout
|
635
|
+
respond stdout, jid_user
|
608
636
|
end
|
609
637
|
else
|
610
|
-
respond stderr
|
638
|
+
respond stderr, jid_user
|
611
639
|
end
|
612
640
|
rescue Exception => exc
|
613
|
-
respond exc
|
641
|
+
respond exc, jid_user
|
614
642
|
end
|
615
643
|
else
|
616
|
-
respond "Sorry I cannot run this due security issues"
|
644
|
+
respond "Sorry I cannot run this due security issues", jid_user
|
617
645
|
end
|
618
646
|
|
619
647
|
else
|
@@ -625,28 +653,46 @@ class Bot
|
|
625
653
|
return processed
|
626
654
|
end
|
627
655
|
|
628
|
-
def respond(msg)
|
629
|
-
|
656
|
+
def respond(msg,jid_user=nil)
|
657
|
+
if jid_user.nil?
|
658
|
+
muc.send Jabber::Message.new(muc.room, msg)
|
659
|
+
else #private message
|
660
|
+
send_msg_user(jid_user, msg)
|
661
|
+
end
|
630
662
|
end
|
631
663
|
|
632
664
|
#context: previous message
|
633
665
|
#to: user that should answer
|
634
|
-
def ask(question, context, to)
|
635
|
-
|
666
|
+
def ask(question, context, to, jid_user=nil)
|
667
|
+
if jid_user.nil?
|
668
|
+
muc.send Jabber::Message.new(muc.room, "#{to}: #{question}")
|
669
|
+
else #private message
|
670
|
+
send_msg_user(jid_user, "#{to}: #{question}")
|
671
|
+
end
|
636
672
|
@questions[to]=context
|
637
673
|
end
|
638
674
|
|
675
|
+
|
639
676
|
# Uses the hipchat gem (REST)
|
640
677
|
# to: (String) Room name
|
641
678
|
# msg: (String) message to send
|
642
|
-
def
|
679
|
+
def send_msg_room(to, msg)
|
643
680
|
unless msg==""
|
644
681
|
hc_client=HipChat::Client.new(config[:token], :server_url => config[:jid].to_s.scan(/.+@(.+)\/.+/).join)
|
645
682
|
hc_client[to].send("Bot", msg)
|
646
683
|
end
|
647
|
-
|
648
684
|
end
|
649
685
|
|
686
|
+
#to send messages without listening for a response to users
|
687
|
+
#to: jid
|
688
|
+
def send_msg_user(to, msg)
|
689
|
+
unless msg==""
|
690
|
+
to=to+"@chat."+@xmpp_namespace.scan(/\w+\.(.+)/).join unless to.include?("@")
|
691
|
+
message = Jabber::Message::new(to, msg)
|
692
|
+
message.type=:chat
|
693
|
+
client.send message
|
694
|
+
end
|
695
|
+
end
|
650
696
|
|
651
697
|
def always
|
652
698
|
loop {sleep 1}
|
data/lib/hipchat_smart_rules.rb
CHANGED
@@ -5,13 +5,13 @@ else
|
|
5
5
|
@testing = true
|
6
6
|
@questions = Hash.new()
|
7
7
|
|
8
|
-
def respond(message)
|
8
|
+
def respond(message, jid_user)
|
9
9
|
puts message
|
10
10
|
end
|
11
11
|
|
12
12
|
#context: previous message
|
13
13
|
#to: user that should answer
|
14
|
-
def ask(question, context, to)
|
14
|
+
def ask(question, context, to, jid_user)
|
15
15
|
puts "Bot: #{question}"
|
16
16
|
@questions[to]=context
|
17
17
|
end
|
@@ -28,7 +28,7 @@ end
|
|
28
28
|
# help: @FIRST_NAME_BOT THE_COMMAND
|
29
29
|
# help: FIRST_NAME_BOT THE_COMMAND
|
30
30
|
# help:
|
31
|
-
def rules(from, command, processed)
|
31
|
+
def rules(from, command, processed, jid_user)
|
32
32
|
if @testing
|
33
33
|
puts "#{from}: #{command}"
|
34
34
|
if @questions.keys.include?(from)
|
@@ -44,32 +44,32 @@ def rules(from, command, processed)
|
|
44
44
|
# help: repeats SOMETHING
|
45
45
|
# help:
|
46
46
|
when /echo\s(.+)/i
|
47
|
-
respond $1
|
47
|
+
respond $1, jid_user
|
48
48
|
|
49
49
|
# help: go to sleep
|
50
50
|
# help: it will sleep the bot for 10 seconds
|
51
51
|
# help:
|
52
52
|
when /go\sto\ssleep/i
|
53
53
|
unless @questions.keys.include?(from)
|
54
|
-
ask("do you want me to take a siesta?", command, from)
|
54
|
+
ask("do you want me to take a siesta?", command, from, jid_user)
|
55
55
|
else
|
56
56
|
case @questions[from]
|
57
57
|
when /yes/i, /yep/i, /sure/i
|
58
|
-
respond "zZzzzzzZZZZZZzzzzzzz!"
|
59
|
-
respond "I'll be sleeping for 10 secs... just for you"
|
58
|
+
respond "zZzzzzzZZZZZZzzzzzzz!", jid_user
|
59
|
+
respond "I'll be sleeping for 10 secs... just for you", jid_user
|
60
60
|
sleep 10
|
61
61
|
when /no/i, /nope/i, /cancel/i
|
62
62
|
@questions.delete(from)
|
63
|
-
respond "Thanks, I'm happy to be awake"
|
63
|
+
respond "Thanks, I'm happy to be awake", jid_user
|
64
64
|
else
|
65
|
-
respond "I don't understand"
|
66
|
-
ask("are you sure do you want me to sleep? (yes or no)", "go to sleep", from)
|
65
|
+
respond "I don't understand", jid_user
|
66
|
+
ask("are you sure do you want me to sleep? (yes or no)", "go to sleep", from, jid_user)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
else
|
70
70
|
unless processed
|
71
71
|
resp = %w{ what huh sorry }.sample
|
72
|
-
respond "#{firstname}: #{resp}?"
|
72
|
+
respond "#{firstname}: #{resp}?", jid_user
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hipchat_smart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mario Ruiz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xmpp4r
|