slack-smart-bot 0.7.6 → 0.8.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 +18 -4
- data/lib/slack-smart-bot.rb +498 -379
- 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: e67d5995df02ee254fa8718239824db71089ea64978f9faecdcca2314ebf9a65
|
4
|
+
data.tar.gz: 057437a83aaf967520f7cb327c0225f2a2bd2194c5a97502131869f537484d81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9415c8a44f98beafdc03ab06df88064ac7ac83d16de3fd3b1f5c3033937e0956c30db54d74272e867b33e2d9f99e60ea33165ed8ec89a8d3923c95c7e2a829bb
|
7
|
+
data.tar.gz: b2d54101b89ecc4a9d048313674d99b0269d40e520f709f24a189f3d490c74c8a8e8ae5b506308e4022daf8d65a3fee79dbd8dccb4652c36a2cd4643a70f8987
|
data/README.md
CHANGED
@@ -241,6 +241,7 @@ Apart of the specific commands you define on the rules file of the channel, you
|
|
241
241
|
|
242
242
|
>ruby require 'json'; res=[]; 20.times {res<<rand(100)}; my_json={result: res}; puts my_json.to_json
|
243
243
|
|
244
|
+
>Also it is possible to attach a Ruby file.
|
244
245
|
|
245
246
|
**_`add shortcut NAME: COMMAND`_**
|
246
247
|
|
@@ -278,18 +279,29 @@ Apart of the specific commands you define on the rules file of the channel, you
|
|
278
279
|
|
279
280
|
**_`use rules from CHANNEL`_**
|
280
281
|
|
281
|
-
**_`use rules CHANNEL`_**
|
282
|
-
|
283
282
|
>it will use the rules from the specified channel.
|
284
283
|
|
285
284
|
>you need to be part of that channel to be able to use the rules.
|
286
285
|
|
287
|
-
|
286
|
+
>only when on a private conversation with the bot or in a private group
|
288
287
|
|
289
|
-
**_`stop using rules CHANNEL`_**
|
288
|
+
**_`stop using rules from CHANNEL`_**
|
290
289
|
|
291
290
|
>it will stop using the rules from the specified channel.
|
292
291
|
|
292
|
+
>only when on a private conversation with the bot or in a private group
|
293
|
+
|
294
|
+
**_`extend rules to CHANNEL_NAME`_**
|
295
|
+
|
296
|
+
**_`use rules on CHANNEL_NAME`_**
|
297
|
+
|
298
|
+
>it will allow to use the specific rules from this channel on the CHANNEL_NAME
|
299
|
+
|
300
|
+
**_`stop using rules on CHANNEL_NAME`_**
|
301
|
+
|
302
|
+
>it will stop using the extended rules on the specified channel.
|
303
|
+
|
304
|
+
|
293
305
|
### Available commands from channels without a Smart Bot
|
294
306
|
**_`@BOT_NAME on #CHANNEL_NAME COMMAND`_**
|
295
307
|
|
@@ -299,6 +311,8 @@ Apart of the specific commands you define on the rules file of the channel, you
|
|
299
311
|
|
300
312
|
>You need to join the specified channel to be able to use those rules.
|
301
313
|
|
314
|
+
>Also you can use this command to call another bot from a channel with a running bot.
|
315
|
+
|
302
316
|
## Contributing
|
303
317
|
|
304
318
|
Bug reports and pull requests are welcome on GitHub at https://github.com/marioruiz/slack-smart-bot.
|
data/lib/slack-smart-bot.rb
CHANGED
@@ -64,18 +64,15 @@ class SlackSmartBot
|
|
64
64
|
end
|
65
65
|
|
66
66
|
if ON_MASTER_BOT and File.exist?($0.gsub(".rb", "_bots.rb"))
|
67
|
-
|
68
|
-
|
69
|
-
@bots_created
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
value[:thread] = t
|
77
|
-
}
|
78
|
-
end
|
67
|
+
get_bots_created()
|
68
|
+
if @bots_created.kind_of?(Hash)
|
69
|
+
@bots_created.each { |key, value|
|
70
|
+
@logger.info "ruby #{$0} \"#{value[:channel_name]}\" \"#{value[:admins]}\" \"#{value[:rules_file]}\" #{value[:status].to_sym}"
|
71
|
+
t = Thread.new do
|
72
|
+
`ruby #{$0} \"#{value[:channel_name]}\" \"#{value[:admins]}\" \"#{value[:rules_file]}\" #{value[:status].to_sym}`
|
73
|
+
end
|
74
|
+
value[:thread] = t
|
75
|
+
}
|
79
76
|
end
|
80
77
|
end
|
81
78
|
|
@@ -139,6 +136,18 @@ class SlackSmartBot
|
|
139
136
|
file.close
|
140
137
|
end
|
141
138
|
|
139
|
+
def get_bots_created
|
140
|
+
if !defined?(@datetime_bots_created) or @datetime_bots_created!=File.mtime($0.gsub(".rb", "_bots.rb"))
|
141
|
+
file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
|
142
|
+
if file_conf.to_s() == ""
|
143
|
+
@bots_created = {}
|
144
|
+
else
|
145
|
+
@bots_created = eval(file_conf)
|
146
|
+
end
|
147
|
+
@datetime_bots_created = File.mtime($0.gsub(".rb", "_bots.rb"))
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
142
151
|
def update_shortcuts_file
|
143
152
|
file = File.open("./shortcuts/#{SHORTCUTS_FILE}", "w")
|
144
153
|
file.write @shortcuts.inspect
|
@@ -173,8 +182,10 @@ class SlackSmartBot
|
|
173
182
|
#help: `@BOT_NAME #CHANNEL_NAME COMMAND`
|
174
183
|
#help: It will run the supplied command using the rules on the channel supplied.
|
175
184
|
#help: You need to join the specified channel to be able to use those rules.
|
185
|
+
#help: Also you can use this command to call another bot from a channel with a running bot.
|
176
186
|
def listen
|
177
187
|
@salutations = [config[:nick], config[:nick_id], "bot", "smart"]
|
188
|
+
get_bots_created()
|
178
189
|
client.on :message do |data|
|
179
190
|
if data.channel[0] == "D" or data.channel[0] == "C" or data.channel[0] == "G" #Direct message or Channel or Private Channel
|
180
191
|
dest = data.channel
|
@@ -188,7 +199,6 @@ class SlackSmartBot
|
|
188
199
|
begin
|
189
200
|
#todo: when changed @questions user_id then move user_info inside the ifs to avoid calling it when not necessary
|
190
201
|
user_info = client.web_client.users_info(user: data.user)
|
191
|
-
#todo: check to remove user_info.user.name == config[:nick] since I think we will never get messages from the bot on slack
|
192
202
|
# if Direct message or we are in the channel of the bot
|
193
203
|
if data.text.size >= 2 and
|
194
204
|
((data.text[0] == "`" and data.text[-1] == "`") or (data.text[0] == "*" and data.text[-1] == "*") or (data.text[0] == "_" and data.text[-1] == "_"))
|
@@ -234,6 +244,10 @@ class SlackSmartBot
|
|
234
244
|
#todo: @questions key should be the id not the name. change it everywhere
|
235
245
|
dest = data.channel
|
236
246
|
res = process_first(user_info.user, data.text, dest, @channels_id[CHANNEL])
|
247
|
+
elsif CHANNEL != MASTER_CHANNEL and @bots_created[@channels_id[CHANNEL]].key?(:extended) and
|
248
|
+
@bots_created[@channels_id[CHANNEL]][:extended].include?(@channels_name[data.channel]) and
|
249
|
+
data.text.size > 0 and data.text[0] != "-"
|
250
|
+
res = process_first(user_info.user, data.text, dest, @channels_id[CHANNEL])
|
237
251
|
elsif (dest[0] == "D" or @channels_id[CHANNEL] == data.channel or data.user == config[:nick_id]) and
|
238
252
|
data.text.size > 0 and data.text[0] != "-"
|
239
253
|
res = process_first(user_info.user, data.text, dest, data.channel)
|
@@ -258,10 +272,7 @@ class SlackSmartBot
|
|
258
272
|
|
259
273
|
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
260
274
|
unless @bots_created.key?(@rules_imported[user.id][dchannel])
|
261
|
-
|
262
|
-
unless file_conf.to_s() == ""
|
263
|
-
@bots_created = eval(file_conf)
|
264
|
-
end
|
275
|
+
get_bots_created()
|
265
276
|
end
|
266
277
|
if @bots_created.key?(@rules_imported[user.id][dchannel])
|
267
278
|
rules_file = @bots_created[@rules_imported[user.id][dchannel]][:rules_file]
|
@@ -269,10 +280,7 @@ class SlackSmartBot
|
|
269
280
|
end
|
270
281
|
elsif dest[0] == "D" and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
|
271
282
|
unless @bots_created.key?(@rules_imported[user.id][user.id])
|
272
|
-
|
273
|
-
unless file_conf.to_s() == ""
|
274
|
-
@bots_created = eval(file_conf)
|
275
|
-
end
|
283
|
+
get_bots_created()
|
276
284
|
end
|
277
285
|
if @bots_created.key?(@rules_imported[user.id][user.id])
|
278
286
|
rules_file = @bots_created[@rules_imported[user.id][user.id]][:rules_file]
|
@@ -350,9 +358,14 @@ class SlackSmartBot
|
|
350
358
|
command = $2
|
351
359
|
on_demand = true
|
352
360
|
end
|
361
|
+
if dest[0]=="C" and dchannel != dest # on extended channel only specific rules
|
362
|
+
only_on_demand = true
|
363
|
+
else
|
364
|
+
only_on_demand = false
|
365
|
+
end
|
353
366
|
if @status == :on and
|
354
367
|
(@questions.keys.include?(nick) or
|
355
|
-
@listening.include?(nick) or
|
368
|
+
(@listening.include?(nick) and !only_on_demand) or
|
356
369
|
dest[0] == "D" or on_demand)
|
357
370
|
@logger.info "command: #{nick}> #{command}" unless processed
|
358
371
|
#todo: verify this
|
@@ -431,417 +444,432 @@ class SlackSmartBot
|
|
431
444
|
firstname = from.split(/ /).first
|
432
445
|
processed = true
|
433
446
|
|
434
|
-
|
435
|
-
|
436
|
-
#help: ----------------------------------------------
|
437
|
-
#help: `Hello Bot`
|
438
|
-
#help: `Hello Smart`
|
439
|
-
#help: `Hello THE_NAME_OF_THE_BOT`
|
440
|
-
#help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
|
441
|
-
#help: Bot starts listening to you
|
442
|
-
#help: If you want to avoid a single message to be treated by the smart bot, start the message by -
|
443
|
-
#help:
|
444
|
-
when /^(Hello|Hallo|Hi|Hola|What's\sup|Hey|Hæ)\s(#{@salutations.join("|")})\s*$/i
|
445
|
-
if @status == :on
|
446
|
-
greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
|
447
|
-
respond "#{greetings} #{firstname}", dest
|
448
|
-
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and dest[0] == "D"
|
449
|
-
respond "You are using specific rules for channel: <##{@rules_imported[user.id][user.id]}>", dest
|
450
|
-
elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel) and (dest[0] == "C" or dest[0] == "G")
|
451
|
-
respond "You are using specific rules for channel: <##{@rules_imported[user.id][dchannel]}>", dest
|
452
|
-
end
|
453
|
-
@listening << from unless @listening.include?(from)
|
454
|
-
end
|
447
|
+
unless dest[0]=="C" and dchannel!=dest # on extended channel only specific rules
|
448
|
+
case command
|
455
449
|
|
456
450
|
#help: ----------------------------------------------
|
457
|
-
#help: `
|
458
|
-
#help: `
|
459
|
-
#help: `
|
460
|
-
#help: Also apart of
|
461
|
-
#help: Bot
|
451
|
+
#help: `Hello Bot`
|
452
|
+
#help: `Hello Smart`
|
453
|
+
#help: `Hello THE_NAME_OF_THE_BOT`
|
454
|
+
#help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
|
455
|
+
#help: Bot starts listening to you
|
456
|
+
#help: If you want to avoid a single message to be treated by the smart bot, start the message by -
|
462
457
|
#help:
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
#helpadmin: `exit bot`
|
472
|
-
#helpadmin: `quit bot`
|
473
|
-
#helpadmin: `close bot`
|
474
|
-
#helpadmin: The bot stops running and also stops all the bots created from this master channel
|
475
|
-
#helpadmin: You can use this command only if you are an admin user and you are on the master channel
|
476
|
-
#helpadmin:
|
477
|
-
when /^exit\sbot\s*$/i, /^quit\sbot\s*$/i, /^close\sbot\s*$/i
|
478
|
-
if ON_MASTER_BOT
|
479
|
-
if ADMIN_USERS.include?(from) #admin user
|
480
|
-
unless @questions.keys.include?(from)
|
481
|
-
ask("are you sure?", command, from, dest)
|
482
|
-
else
|
483
|
-
case @questions[from]
|
484
|
-
when /yes/i, /yep/i, /sure/i
|
485
|
-
respond "Game over!", dest
|
486
|
-
respond "Ciao #{firstname}!", dest
|
487
|
-
@bots_created.each { |key, value|
|
488
|
-
value[:thread] = ""
|
489
|
-
send_msg_channel(key, "Bot has been closed by #{from}")
|
490
|
-
sleep 0.5
|
491
|
-
}
|
492
|
-
update_bots_file()
|
493
|
-
sleep 0.5
|
494
|
-
exit!
|
495
|
-
when /no/i, /nope/i, /cancel/i
|
496
|
-
@questions.delete(from)
|
497
|
-
respond "Thanks, I'm happy to be alive", dest
|
498
|
-
else
|
499
|
-
respond "I don't understand", dest
|
500
|
-
ask("are you sure do you want me to close? (yes or no)", "quit bot", from, dest)
|
501
|
-
end
|
458
|
+
when /^(Hello|Hallo|Hi|Hola|What's\sup|Hey|Hæ)\s(#{@salutations.join("|")})\s*$/i
|
459
|
+
if @status == :on
|
460
|
+
greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
|
461
|
+
respond "#{greetings} #{firstname}", dest
|
462
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and dest[0] == "D"
|
463
|
+
respond "You are using specific rules for channel: <##{@rules_imported[user.id][user.id]}>", dest
|
464
|
+
elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel) and (dest[0] == "C" or dest[0] == "G")
|
465
|
+
respond "You are using specific rules for channel: <##{@rules_imported[user.id][dchannel]}>", dest
|
502
466
|
end
|
503
|
-
|
504
|
-
respond "Only admin users can kill me", dest
|
467
|
+
@listening << from unless @listening.include?(from)
|
505
468
|
end
|
506
|
-
else
|
507
|
-
respond "To do this you need to be an admin user in the master channel: <##{@channels_id[MASTER_CHANNEL]}>", dest
|
508
|
-
end
|
509
469
|
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
470
|
+
#help: ----------------------------------------------
|
471
|
+
#help: `Bye Bot`
|
472
|
+
#help: `Bye Smart`
|
473
|
+
#help: `Bye NAME_OF_THE_BOT`
|
474
|
+
#help: Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
|
475
|
+
#help: Bot stops listening to you
|
476
|
+
#help:
|
477
|
+
when /^(Bye|Bæ|Good\sBye|Adiós|Ciao|Bless|Bless\sBless|Adeu)\s(#{@salutations.join("|")})\s*$/i
|
478
|
+
if @status == :on
|
479
|
+
bye = ["Bye", "Bæ", "Good Bye", "Adiós", "Ciao", "Bless", "Bless bless", "Adeu"].sample
|
480
|
+
respond "#{bye} #{firstname}", dest
|
481
|
+
@listening.delete(from)
|
522
482
|
end
|
523
|
-
else
|
524
|
-
respond "Only admin users can change my status", dest
|
525
|
-
end
|
526
483
|
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
unless ON_MASTER_BOT
|
539
|
-
send_msg_channel MASTER_CHANNEL, "Changed status on #{CHANNEL} to :paused"
|
484
|
+
#help: ----------------------------------------------
|
485
|
+
#help: `bot help`
|
486
|
+
#help: `bot what can I do?`
|
487
|
+
#help: `bot rules`
|
488
|
+
#help: it will display this help
|
489
|
+
#help: `bot rules` will show only the specific rules for this channel.
|
490
|
+
when /^bot\s+(rules|help)/i, /^bot,? what can I do/i
|
491
|
+
if $1.to_s.match?(/rules/i)
|
492
|
+
specific = true
|
493
|
+
else
|
494
|
+
specific = false
|
540
495
|
end
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
gems_remote = `gem list slack-smart-bot --remote`
|
552
|
-
version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
|
553
|
-
version_message = ""
|
554
|
-
if version_remote != VERSION
|
555
|
-
version_message = " There is a new available version: #{version_remote}."
|
556
|
-
end
|
557
|
-
respond "Status: #{@status}. Version: #{VERSION}.#{version_message} Rules file: #{File.basename RULES_FILE} ", dest
|
558
|
-
if @status == :on
|
559
|
-
respond "I'm listening to [#{@listening.join(", ")}]", dest
|
560
|
-
if ON_MASTER_BOT and ADMIN_USERS.include?(from)
|
561
|
-
@bots_created.each { |key, value|
|
562
|
-
respond "#{key}: #{value}", dest
|
563
|
-
}
|
496
|
+
help_message_rules = ''
|
497
|
+
if !specific
|
498
|
+
help_message = IO.readlines(__FILE__).join
|
499
|
+
if ADMIN_USERS.include?(from) #admin user
|
500
|
+
respond "*Commands for administrators:*\n#{help_message.scan(/#\s*help\s*admin:(.*)/).join("\n")}", dest
|
501
|
+
end
|
502
|
+
if ON_MASTER_BOT and (dest[0] == "C" or dest[0] == "G")
|
503
|
+
respond "*Commands only on Master Channel <##{@channels_id[MASTER_CHANNEL]}>:*\n#{help_message.scan(/#\s*help\s*master:(.*)/).join("\n")}", dest
|
504
|
+
end
|
505
|
+
respond help_message.scan(/#\s*help\s*:(.*)/).join("\n"), dest
|
564
506
|
end
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
#helpmaster: `notify all MESSAGE`
|
570
|
-
#helpmaster: It will send a notificaiton message to all bot channels
|
571
|
-
#helpmaster: It will send a notification message to all channels the bot joined and private conversations with the bot
|
572
|
-
#helpmaster: Only works if you are on Master channel and you are an admin user
|
573
|
-
#helpmaster:
|
574
|
-
when /^notify\s+(all)?\s*(.+)\s*$/i
|
575
|
-
if ON_MASTER_BOT
|
576
|
-
if ADMIN_USERS.include?(from) #admin user
|
577
|
-
all = $1
|
578
|
-
message = $2
|
579
|
-
if all.nil?
|
580
|
-
@bots_created.each do |k, v|
|
581
|
-
respond message, k
|
507
|
+
if dest[0] == "C" or dest[0] == "G" # on a channel
|
508
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
509
|
+
if @bots_created.key?(@rules_imported[user.id][dchannel])
|
510
|
+
respond "*You are using rules from another channel: <##{@rules_imported[user.id][dchannel]}>. These are the specific commands for that channel:*", dest
|
582
511
|
end
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
512
|
+
end
|
513
|
+
help_message_rules = IO.readlines(rules_file).join
|
514
|
+
respond help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), dest
|
515
|
+
elsif dest[0] == "D" and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
|
516
|
+
if @bots_created.key?(@rules_imported[user.id][user.id])
|
517
|
+
respond "*You are using rules from channel: <##{@rules_imported[user.id][user.id]}>. These are the specific commands for that channel:*", dest
|
518
|
+
help_message_rules = IO.readlines(rules_file).join
|
519
|
+
respond help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), dest
|
520
|
+
end
|
521
|
+
end
|
522
|
+
if specific
|
523
|
+
unless rules_file.empty?
|
524
|
+
begin
|
525
|
+
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
588
526
|
end
|
589
|
-
respond "Channels and users have been notified", dest
|
590
527
|
end
|
528
|
+
if defined?(git_project) and git_project.to_s!='' and help_message_rules != ''
|
529
|
+
respond "Git project: #{git_project}", dest
|
530
|
+
else
|
531
|
+
def git_project() '' end
|
532
|
+
def project_folder() '' end
|
533
|
+
end
|
534
|
+
|
535
|
+
else
|
536
|
+
respond "Slack Smart Bot Github project: https://github.com/MarioRuiz/slack-smart-bot", dest
|
591
537
|
end
|
592
|
-
end
|
593
538
|
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
channel
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
if @channels_name.key?(channel) #it is an id
|
606
|
-
channel_id = channel
|
607
|
-
channel = @channels_name[channel_id]
|
608
|
-
elsif @channels_id.key?(channel) #it is a channel name
|
609
|
-
channel_id = @channels_id[channel]
|
610
|
-
end
|
539
|
+
#help: ===================================
|
540
|
+
#help:
|
541
|
+
#help: *These commands will run only when on a private conversation with the bot or in a private group:*
|
542
|
+
#help:
|
543
|
+
#help: ----------------------------------------------
|
544
|
+
#help: `use rules from CHANNEL`
|
545
|
+
#help: it will use the rules from the specified channel.
|
546
|
+
#help: you need to be part of that channel to be able to use the rules.
|
547
|
+
#help:
|
548
|
+
when /^use rules (from\s+)<#C\w+\|(.+)>/i, /^use rules (from\s+)(.+)/i
|
549
|
+
channel = $2
|
611
550
|
channels = client.web_client.channels_list.channels
|
612
551
|
channel_found = channels.detect { |c| c.name == channel }
|
613
552
|
members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
|
614
553
|
|
615
|
-
if
|
616
|
-
respond "
|
617
|
-
elsif
|
618
|
-
respond "
|
619
|
-
elsif
|
620
|
-
respond "There is
|
621
|
-
elsif
|
622
|
-
respond "
|
554
|
+
if channel_found.nil?
|
555
|
+
respond "The channel you are trying to use doesn't exist", dest
|
556
|
+
elsif channel_found.name == MASTER_CHANNEL
|
557
|
+
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
558
|
+
elsif !@bots_created.key?(@channels_id[channel])
|
559
|
+
respond "There is no bot running on that channel.", dest
|
560
|
+
elsif @bots_created.key?(@channels_id[channel]) and @bots_created[@channels_id[channel]][:status] != :on
|
561
|
+
respond "The bot in that channel is not :on", dest
|
623
562
|
else
|
624
|
-
if
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
Dir.mkdir("rules") unless Dir.exist?("rules")
|
631
|
-
Dir.mkdir("rules/#{channel_id}") unless Dir.exist?("rules/#{channel_id}")
|
632
|
-
rules_file = "./rules/#{channel_id}/" + rules_file
|
633
|
-
end
|
634
|
-
default_rules = (__FILE__).gsub(/\.rb$/, "_rules.rb")
|
635
|
-
File.delete(rules_file) if File.exist?(rules_file)
|
636
|
-
FileUtils.copy_file(default_rules, rules_file) unless File.exist?(rules_file)
|
637
|
-
admin_users = Array.new()
|
638
|
-
admin_users = [from] + MASTER_USERS
|
639
|
-
admin_users.uniq!
|
640
|
-
@logger.info "ruby #{$0} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
|
641
|
-
t = Thread.new do
|
642
|
-
`ruby #{$0} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on`
|
643
|
-
end
|
644
|
-
@bots_created[channel_id] = {
|
645
|
-
creator_name: from,
|
646
|
-
channel_id: channel_id,
|
647
|
-
channel_name: @channels_name[channel_id],
|
648
|
-
status: :on,
|
649
|
-
created: Time.now.strftime("%Y-%m-%dT%H:%M:%S.000Z")[0..18],
|
650
|
-
rules_file: rules_file,
|
651
|
-
admins: admin_users.join(","),
|
652
|
-
thread: t,
|
653
|
-
}
|
654
|
-
respond "The bot has been created on channel: #{channel}. Rules file: #{File.basename rules_file}", dest
|
655
|
-
update_bots_file()
|
656
|
-
rescue Exception => stack
|
657
|
-
@logger.fatal stack
|
658
|
-
message = "Problem creating the bot on channel #{channel}. Error: <#{stack}>."
|
659
|
-
@logger.error message
|
660
|
-
respond message, dest
|
563
|
+
if user.id == channel_found.creator or members.include?(user.id)
|
564
|
+
@rules_imported[user.id] = {} unless @rules_imported.key?(user.id)
|
565
|
+
if dest[0] == "C" or dest[0] == "G" #todo: take in consideration bots that are not master
|
566
|
+
@rules_imported[user.id][dchannel] = channel_found.id
|
567
|
+
else
|
568
|
+
@rules_imported[user.id][user.id] = channel_found.id
|
661
569
|
end
|
570
|
+
update_rules_imported() if ON_MASTER_BOT
|
571
|
+
respond "I'm using now the rules from <##{channel_found.id}>", dest
|
572
|
+
def git_project() "" end
|
573
|
+
def project_folder() "" end
|
662
574
|
else
|
663
|
-
respond "
|
575
|
+
respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", dest
|
664
576
|
end
|
665
577
|
end
|
666
|
-
else
|
667
|
-
@logger.info MASTER_CHANNEL
|
668
|
-
@logger.info @channel_id.inspect
|
669
|
-
respond "Sorry I cannot create bots from this channel, please visit the master channel: <##{@channels_id[MASTER_CHANNEL]}>", dest
|
670
|
-
end
|
671
578
|
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
channel = $1
|
680
|
-
|
681
|
-
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
682
|
-
channel_id = nil
|
683
|
-
if @channels_name.key?(channel) #it is an id
|
684
|
-
channel_id = channel
|
685
|
-
channel = @channels_name[channel_id]
|
686
|
-
elsif @channels_id.key?(channel) #it is a channel name
|
579
|
+
#help: ----------------------------------------------
|
580
|
+
#help: `stop using rules from CHANNEL`
|
581
|
+
#help: it will stop using the rules from the specified channel.
|
582
|
+
#help:
|
583
|
+
when /^stop using rules (from\s+)<#C\w+\|(.+)>/i, /^stop using rules (from\s+)(.+)/i
|
584
|
+
channel = $2
|
585
|
+
if @channels_id.key?(channel)
|
687
586
|
channel_id = @channels_id[channel]
|
587
|
+
else
|
588
|
+
channel_id = channel
|
688
589
|
end
|
689
|
-
if
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
@
|
590
|
+
if dest[0] == "C" or dest[0] == "G" #channel
|
591
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
592
|
+
if @rules_imported[user.id][dchannel] != channel_id
|
593
|
+
respond "You are not using those rules.", dest
|
594
|
+
else
|
595
|
+
@rules_imported[user.id].delete(dchannel)
|
596
|
+
update_rules_imported() if ON_MASTER_BOT
|
597
|
+
respond "You won't be using those rules from now on.", dest
|
598
|
+
def git_project() "" end
|
599
|
+
def project_folder() "" end
|
695
600
|
end
|
696
|
-
@bots_created.delete(channel_id)
|
697
|
-
update_bots_file()
|
698
|
-
respond "Bot on channel: #{channel}, has been killed and deleted.", dest
|
699
|
-
send_msg_channel(channel, "Bot has been killed by #{from}")
|
700
601
|
else
|
701
|
-
respond "You
|
602
|
+
respond "You were not using those rules.", dest
|
702
603
|
end
|
703
|
-
else
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
#help: you need to be part of that channel to be able to use the rules.
|
715
|
-
#help:
|
716
|
-
when /^use rules (from\s+)?<#C\w+\|(.+)>/i, /^use rules (from\s+)?(.+)/i
|
717
|
-
channel = $2
|
718
|
-
channels = client.web_client.channels_list.channels
|
719
|
-
channel_found = channels.detect { |c| c.name == channel }
|
720
|
-
members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
|
721
|
-
|
722
|
-
if channel_found.nil?
|
723
|
-
respond "The channel you are trying to use doesn't exist", dest
|
724
|
-
elsif channel_found.name == MASTER_CHANNEL
|
725
|
-
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
726
|
-
elsif !@bots_created.key?(@channels_id[channel])
|
727
|
-
respond "There is no bot running on that channel.", dest
|
728
|
-
elsif @bots_created.key?(@channels_id[channel]) and @bots_created[@channels_id[channel]][:status] != :on
|
729
|
-
respond "The bot in that channel is not :on", dest
|
730
|
-
else
|
731
|
-
if user.id == channel_found.creator or members.include?(user.id)
|
732
|
-
@rules_imported[user.id] = {} unless @rules_imported.key?(user.id)
|
733
|
-
if dest[0] == "C" or dest[0] == "G" #todo: take in consideration bots that are not master
|
734
|
-
@rules_imported[user.id][dchannel] = channel_found.id
|
604
|
+
else #direct message
|
605
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id)
|
606
|
+
if @rules_imported[user.id][user.id] != channel_id
|
607
|
+
respond "You are not using those rules.", dest
|
608
|
+
else
|
609
|
+
@rules_imported[user.id].delete(user.id)
|
610
|
+
update_rules_imported() if ON_MASTER_BOT
|
611
|
+
respond "You won't be using those rules from now on.", dest
|
612
|
+
def git_project() "" end
|
613
|
+
def project_folder() "" end
|
614
|
+
end
|
735
615
|
else
|
736
|
-
|
616
|
+
respond "You were not using those rules.", dest
|
737
617
|
end
|
738
|
-
update_rules_imported() if ON_MASTER_BOT
|
739
|
-
respond "I'm using now the rules from <##{channel_found.id}>", dest
|
740
|
-
def git_project() "" end
|
741
|
-
def project_folder() "" end
|
742
|
-
else
|
743
|
-
respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", dest
|
744
618
|
end
|
745
|
-
end
|
746
619
|
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
620
|
+
#helpadmin: ----------------------------------------------
|
621
|
+
#helpadmin: `exit bot`
|
622
|
+
#helpadmin: `quit bot`
|
623
|
+
#helpadmin: `close bot`
|
624
|
+
#helpadmin: The bot stops running and also stops all the bots created from this master channel
|
625
|
+
#helpadmin: You can use this command only if you are an admin user and you are on the master channel
|
626
|
+
#helpadmin:
|
627
|
+
when /^exit\sbot\s*$/i, /^quit\sbot\s*$/i, /^close\sbot\s*$/i
|
628
|
+
if ON_MASTER_BOT
|
629
|
+
if ADMIN_USERS.include?(from) #admin user
|
630
|
+
unless @questions.keys.include?(from)
|
631
|
+
ask("are you sure?", command, from, dest)
|
632
|
+
else
|
633
|
+
case @questions[from]
|
634
|
+
when /yes/i, /yep/i, /sure/i
|
635
|
+
respond "Game over!", dest
|
636
|
+
respond "Ciao #{firstname}!", dest
|
637
|
+
@bots_created.each { |key, value|
|
638
|
+
value[:thread] = ""
|
639
|
+
send_msg_channel(key, "Bot has been closed by #{from}")
|
640
|
+
sleep 0.5
|
641
|
+
}
|
642
|
+
update_bots_file()
|
643
|
+
sleep 0.5
|
644
|
+
exit!
|
645
|
+
when /no/i, /nope/i, /cancel/i
|
646
|
+
@questions.delete(from)
|
647
|
+
respond "Thanks, I'm happy to be alive", dest
|
648
|
+
else
|
649
|
+
respond "I don't understand", dest
|
650
|
+
ask("are you sure do you want me to close? (yes or no)", "quit bot", from, dest)
|
651
|
+
end
|
652
|
+
end
|
763
653
|
else
|
764
|
-
|
765
|
-
update_rules_imported() if ON_MASTER_BOT
|
766
|
-
respond "You won't be using those rules from now on.", dest
|
767
|
-
def git_project() "" end
|
768
|
-
def project_folder() "" end
|
654
|
+
respond "Only admin users can kill me", dest
|
769
655
|
end
|
770
656
|
else
|
771
|
-
respond "
|
657
|
+
respond "To do this you need to be an admin user in the master channel: <##{@channels_id[MASTER_CHANNEL]}>", dest
|
772
658
|
end
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
659
|
+
|
660
|
+
#helpadmin: ----------------------------------------------
|
661
|
+
#helpadmin: `start bot`
|
662
|
+
#helpadmin: `start this bot`
|
663
|
+
#helpadmin: the bot will start to listen
|
664
|
+
#helpadmin: You can use this command only if you are an admin user
|
665
|
+
#helpadmin:
|
666
|
+
when /^start\s(this\s)?bot$/i
|
667
|
+
if ADMIN_USERS.include?(from) #admin user
|
668
|
+
respond "This bot is running and listening from now on. You can pause again: pause this bot", dest
|
669
|
+
@status = :on
|
670
|
+
unless ON_MASTER_BOT
|
671
|
+
send_msg_channel MASTER_CHANNEL, "Changed status on #{CHANNEL} to :on"
|
783
672
|
end
|
784
673
|
else
|
785
|
-
respond "
|
674
|
+
respond "Only admin users can change my status", dest
|
786
675
|
end
|
787
|
-
end
|
788
676
|
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
if $1.to_s.match?(/rules/i)
|
797
|
-
specific = true
|
798
|
-
else
|
799
|
-
specific = false
|
800
|
-
end
|
801
|
-
help_message_rules = ''
|
802
|
-
if !specific
|
803
|
-
help_message = IO.readlines(__FILE__).join
|
677
|
+
#helpadmin: ----------------------------------------------
|
678
|
+
#helpadmin: `pause bot`
|
679
|
+
#helpadmin: `pause this bot`
|
680
|
+
#helpadmin: the bot will pause so it will listen only to admin commands
|
681
|
+
#helpadmin: You can use this command only if you are an admin user
|
682
|
+
#helpadmin:
|
683
|
+
when /^pause\s(this\s)?bot$/i
|
804
684
|
if ADMIN_USERS.include?(from) #admin user
|
805
|
-
respond "
|
685
|
+
respond "This bot is paused from now on. You can start it again: start this bot", dest
|
686
|
+
respond "zZzzzzZzzzzZZZZZZzzzzzzzz", dest
|
687
|
+
@status = :paused
|
688
|
+
unless ON_MASTER_BOT
|
689
|
+
send_msg_channel MASTER_CHANNEL, "Changed status on #{CHANNEL} to :paused"
|
690
|
+
end
|
691
|
+
else
|
692
|
+
respond "Only admin users can put me on pause", dest
|
806
693
|
end
|
807
|
-
|
808
|
-
|
694
|
+
|
695
|
+
#helpadmin: ----------------------------------------------
|
696
|
+
#helpadmin: `bot status`
|
697
|
+
#helpadmin: Displays the status of the bot
|
698
|
+
#helpadmin: If on master channel and admin user also it will display info about bots created
|
699
|
+
#helpadmin:
|
700
|
+
when /^bot\sstatus/i
|
701
|
+
get_bots_created()
|
702
|
+
gems_remote = `gem list slack-smart-bot --remote`
|
703
|
+
version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
|
704
|
+
version_message = ""
|
705
|
+
if version_remote != VERSION
|
706
|
+
version_message = " There is a new available version: #{version_remote}."
|
809
707
|
end
|
810
|
-
respond
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
708
|
+
respond "Status: #{@status}. Version: #{VERSION}.#{version_message} Rules file: #{File.basename RULES_FILE} ", dest
|
709
|
+
if @status == :on
|
710
|
+
respond "I'm listening to [#{@listening.join(", ")}]", dest
|
711
|
+
if ON_MASTER_BOT and ADMIN_USERS.include?(from)
|
712
|
+
@bots_created.each { |key, value|
|
713
|
+
respond "#{key}: #{value}", dest
|
714
|
+
}
|
816
715
|
end
|
817
716
|
end
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
717
|
+
|
718
|
+
#helpmaster: ----------------------------------------------
|
719
|
+
#helpmaster: `notify MESSAGE`
|
720
|
+
#helpmaster: `notify all MESSAGE`
|
721
|
+
#helpmaster: It will send a notificaiton message to all bot channels
|
722
|
+
#helpmaster: It will send a notification message to all channels the bot joined and private conversations with the bot
|
723
|
+
#helpmaster: Only works if you are on Master channel and you are an admin user
|
724
|
+
#helpmaster:
|
725
|
+
when /^notify\s+(all)?\s*(.+)\s*$/i
|
726
|
+
if ON_MASTER_BOT
|
727
|
+
if ADMIN_USERS.include?(from) #admin user
|
728
|
+
all = $1
|
729
|
+
message = $2
|
730
|
+
if all.nil?
|
731
|
+
@bots_created.each do |k, v|
|
732
|
+
respond message, k
|
733
|
+
end
|
734
|
+
respond "Bot channels have been notified", dest
|
735
|
+
else
|
736
|
+
myconv = client.web_client.users_conversations(exclude_archived: true, limit: 100, types: "im, public_channel").channels
|
737
|
+
myconv.each do |c|
|
738
|
+
respond message, c.id unless c.name == MASTER_CHANNEL
|
739
|
+
end
|
740
|
+
respond "Channels and users have been notified", dest
|
741
|
+
end
|
742
|
+
end
|
825
743
|
end
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
744
|
+
|
745
|
+
#helpmaster: ----------------------------------------------
|
746
|
+
#helpmaster: `create bot on CHANNEL_NAME`
|
747
|
+
#helpmaster: creates a new bot on the channel specified
|
748
|
+
#helpmaster: it will work only if you are on Master channel
|
749
|
+
#helpmaster: the admins will be the master admins, the creator of the bot and the creator of the channel
|
750
|
+
#helpmaster:
|
751
|
+
when /^create\sbot\son\s<#C\w+\|(.+)>\s*/i, /^create\sbot\son\s(.+)\s*/i
|
752
|
+
if ON_MASTER_BOT
|
753
|
+
channel = $1
|
754
|
+
|
755
|
+
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
756
|
+
channel_id = nil
|
757
|
+
if @channels_name.key?(channel) #it is an id
|
758
|
+
channel_id = channel
|
759
|
+
channel = @channels_name[channel_id]
|
760
|
+
elsif @channels_id.key?(channel) #it is a channel name
|
761
|
+
channel_id = @channels_id[channel]
|
831
762
|
end
|
763
|
+
channels = client.web_client.channels_list.channels
|
764
|
+
channel_found = channels.detect { |c| c.name == channel }
|
765
|
+
members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
|
766
|
+
|
767
|
+
if channel_id.nil?
|
768
|
+
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
|
769
|
+
elsif channel == MASTER_CHANNEL
|
770
|
+
respond "There is already a bot in this channel: #{channel}", dest
|
771
|
+
elsif @bots_created.keys.include?(channel_id)
|
772
|
+
respond "There is already a bot in this channel: #{channel}, kill it before", dest
|
773
|
+
elsif config[:nick_id] != channel_found.creator and !members.include?(config[:nick_id])
|
774
|
+
respond "You need to add first to the channel the smart bot user: #{config[:nick]}", dest
|
775
|
+
else
|
776
|
+
if channel_id != config[:channel]
|
777
|
+
begin
|
778
|
+
rules_file = "slack-smart-bot_rules_#{channel_id}_#{from.gsub(" ", "_")}.rb"
|
779
|
+
if defined?(RULES_FOLDER)
|
780
|
+
rules_file = RULES_FOLDER + rules_file
|
781
|
+
else
|
782
|
+
Dir.mkdir("rules") unless Dir.exist?("rules")
|
783
|
+
Dir.mkdir("rules/#{channel_id}") unless Dir.exist?("rules/#{channel_id}")
|
784
|
+
rules_file = "./rules/#{channel_id}/" + rules_file
|
785
|
+
end
|
786
|
+
default_rules = (__FILE__).gsub(/\.rb$/, "_rules.rb")
|
787
|
+
File.delete(rules_file) if File.exist?(rules_file)
|
788
|
+
FileUtils.copy_file(default_rules, rules_file) unless File.exist?(rules_file)
|
789
|
+
admin_users = Array.new()
|
790
|
+
creator_info = client.web_client.users_info(user: channel_found.creator)
|
791
|
+
admin_users = [from, creator_info.user.name] + MASTER_USERS
|
792
|
+
admin_users.uniq!
|
793
|
+
@logger.info "ruby #{$0} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
|
794
|
+
t = Thread.new do
|
795
|
+
`ruby #{$0} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on`
|
796
|
+
end
|
797
|
+
@bots_created[channel_id] = {
|
798
|
+
creator_name: from,
|
799
|
+
channel_id: channel_id,
|
800
|
+
channel_name: @channels_name[channel_id],
|
801
|
+
status: :on,
|
802
|
+
created: Time.now.strftime("%Y-%m-%dT%H:%M:%S.000Z")[0..18],
|
803
|
+
rules_file: rules_file,
|
804
|
+
admins: admin_users.join(","),
|
805
|
+
extended: [],
|
806
|
+
thread: t,
|
807
|
+
}
|
808
|
+
respond "The bot has been created on channel: #{channel}. Rules file: #{File.basename rules_file}. Admins: #{admin_users.join(", ")}", dest
|
809
|
+
update_bots_file()
|
810
|
+
rescue Exception => stack
|
811
|
+
@logger.fatal stack
|
812
|
+
message = "Problem creating the bot on channel #{channel}. Error: <#{stack}>."
|
813
|
+
@logger.error message
|
814
|
+
respond message, dest
|
815
|
+
end
|
816
|
+
else
|
817
|
+
respond "There is already a bot in this channel: #{channel}, and it is the Master Channel!", dest
|
818
|
+
end
|
819
|
+
end
|
820
|
+
else
|
821
|
+
@logger.info MASTER_CHANNEL
|
822
|
+
@logger.info @channel_id.inspect
|
823
|
+
respond "Sorry I cannot create bots from this channel, please visit the master channel: <##{@channels_id[MASTER_CHANNEL]}>", dest
|
832
824
|
end
|
833
|
-
|
834
|
-
|
825
|
+
|
826
|
+
#helpmaster: ----------------------------------------------
|
827
|
+
#helpmaster: `kill bot on CHANNEL_NAME`
|
828
|
+
#helpmaster: kills the bot on the specified channel
|
829
|
+
#helpmaster: Only works if you are on Master channel and you created that bot or you are an admin user
|
830
|
+
#helpmaster:
|
831
|
+
when /^kill\sbot\son\s<#C\w+\|(.+)>\s*$/i, /^kill\sbot\son\s(.+)\s*$/i
|
832
|
+
if ON_MASTER_BOT
|
833
|
+
channel = $1
|
834
|
+
|
835
|
+
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
836
|
+
channel_id = nil
|
837
|
+
if @channels_name.key?(channel) #it is an id
|
838
|
+
channel_id = channel
|
839
|
+
channel = @channels_name[channel_id]
|
840
|
+
elsif @channels_id.key?(channel) #it is a channel name
|
841
|
+
channel_id = @channels_id[channel]
|
842
|
+
end
|
843
|
+
if channel_id.nil?
|
844
|
+
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
|
845
|
+
elsif @bots_created.keys.include?(channel_id)
|
846
|
+
if @bots_created[channel_id][:admins].split(",").include?(from)
|
847
|
+
if @bots_created[channel_id][:thread].kind_of?(Thread) and @bots_created[channel_id][:thread].alive?
|
848
|
+
@bots_created[channel_id][:thread].kill
|
849
|
+
end
|
850
|
+
@bots_created.delete(channel_id)
|
851
|
+
update_bots_file()
|
852
|
+
respond "Bot on channel: #{channel}, has been killed and deleted.", dest
|
853
|
+
send_msg_channel(channel, "Bot has been killed by #{from}")
|
854
|
+
else
|
855
|
+
respond "You need to be the creator or an admin of that bot channel", dest
|
856
|
+
end
|
857
|
+
else
|
858
|
+
respond "There is no bot in this channel: #{channel}", dest
|
859
|
+
end
|
835
860
|
else
|
836
|
-
|
837
|
-
def project_folder() '' end
|
861
|
+
respond "Sorry I cannot kill bots from this channel, please visit the master channel: <##{@channels_id[MASTER_CHANNEL]}>", dest
|
838
862
|
end
|
839
|
-
|
863
|
+
|
864
|
+
|
865
|
+
|
840
866
|
else
|
841
|
-
|
867
|
+
processed = false
|
842
868
|
end
|
869
|
+
only_on_demand = false
|
843
870
|
else
|
844
871
|
processed = false
|
872
|
+
only_on_demand = true
|
845
873
|
end
|
846
874
|
|
847
875
|
on_demand = false
|
@@ -855,7 +883,7 @@ class SlackSmartBot
|
|
855
883
|
#only when :on and (listening or on demand or direct message)
|
856
884
|
if @status == :on and
|
857
885
|
(@questions.keys.include?(from) or
|
858
|
-
@listening.include?(from) or
|
886
|
+
(@listening.include?(from) and !only_on_demand) or
|
859
887
|
dest[0] == "D" or on_demand)
|
860
888
|
processed2 = true
|
861
889
|
|
@@ -868,6 +896,97 @@ class SlackSmartBot
|
|
868
896
|
#help:
|
869
897
|
case command
|
870
898
|
|
899
|
+
when /^bot\s+rules$/i
|
900
|
+
if only_on_demand #extended rules
|
901
|
+
help_message_rules = ''
|
902
|
+
message = "-\n\n\n===================================\n*Rules from channel <##{@channels_id[CHANNEL]}>*\n"
|
903
|
+
message += "To run the commands on this extended channel, add `!` before the command.\n"
|
904
|
+
help_message_rules = IO.readlines(rules_file).join
|
905
|
+
message += help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n")
|
906
|
+
respond message, dest
|
907
|
+
unless rules_file.empty?
|
908
|
+
begin
|
909
|
+
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
910
|
+
end
|
911
|
+
end
|
912
|
+
if defined?(git_project) and git_project.to_s!='' and help_message_rules != ''
|
913
|
+
respond "Git project: #{git_project}", dest
|
914
|
+
else
|
915
|
+
def git_project() '' end
|
916
|
+
def project_folder() '' end
|
917
|
+
end
|
918
|
+
end
|
919
|
+
|
920
|
+
|
921
|
+
|
922
|
+
#helpadmin: ----------------------------------------------
|
923
|
+
#helpadmin: `extend rules to CHANNEL_NAME`
|
924
|
+
#helpadmin: `use rules on CHANNEL_NAME`
|
925
|
+
#helpadmin: It will allow to use the specific rules from this channel on the CHANNEL_NAME
|
926
|
+
#helpadmin:
|
927
|
+
when /^extend\s+rules\s+(to\s+)<#C\w+\|(.+)>/i, /^extend\s+rules\s+(to\s+)(.+)/i,
|
928
|
+
/^use\s+rules\s+(on\s+)<#C\w+\|(.+)>/i, /^use\s+rules\s+(on\s+)(.+)/i
|
929
|
+
if ON_MASTER_BOT
|
930
|
+
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
931
|
+
elsif !ADMIN_USERS.include?(from) #not admin
|
932
|
+
respond "Only admins can extend the rules. Admins on this channel: #{ADMIN_USERS}", dest
|
933
|
+
else
|
934
|
+
channel = $2
|
935
|
+
channels = client.web_client.channels_list.channels
|
936
|
+
channel_found = channels.detect { |c| c.name == channel }
|
937
|
+
members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
|
938
|
+
get_bots_created()
|
939
|
+
channels_in_use = []
|
940
|
+
@bots_created.each do |k,v|
|
941
|
+
if v.key?(:extended) and v[:extended].include?(channel)
|
942
|
+
channels_in_use << v[:channel_name]
|
943
|
+
end
|
944
|
+
end
|
945
|
+
|
946
|
+
if channel_found.nil?
|
947
|
+
respond "The channel you specified doesn't exist", dest
|
948
|
+
elsif @bots_created.key?(@channels_id[channel])
|
949
|
+
respond "There is a bot already running on that channel.", dest
|
950
|
+
elsif @bots_created[@channels_id[CHANNEL]][:extended].include?(channel)
|
951
|
+
respond "The rules are already extended to that channel.", dest
|
952
|
+
elsif !members.include?(config[:nick_id])
|
953
|
+
respond "You need to add first to the channel the smart bot user: #{config[:nick]}", dest
|
954
|
+
elsif !members.include?(user.id)
|
955
|
+
respond "You need to join that channel first", dest
|
956
|
+
else
|
957
|
+
channels_in_use.each do |channel_in_use|
|
958
|
+
respond "The rules from channel <##{@channels_id[channel_in_use]}> are already in use on that channel", dest
|
959
|
+
end
|
960
|
+
@bots_created[@channels_id[CHANNEL]][:extended] = [] unless @bots_created[@channels_id[CHANNEL]].key?(:extended)
|
961
|
+
@bots_created[@channels_id[CHANNEL]][:extended] << channel
|
962
|
+
update_bots_file()
|
963
|
+
respond "Now the rules from <##{@channels_id[CHANNEL]}> are available on <##{@channels_id[channel]}>", dest
|
964
|
+
respond "<@#{user.id}> extended the rules from <##{@channels_id[CHANNEL]}> to this channel so now you can talk to the Smart Bot on demand using those rules.", @channels_id[channel]
|
965
|
+
respond "Use `!` before the command you want to run", @channels_id[channel]
|
966
|
+
respond "To see the specific rules for this bot on this channel: `!bot rules`", @channels_id[channel]
|
967
|
+
end
|
968
|
+
end
|
969
|
+
|
970
|
+
#help: ----------------------------------------------
|
971
|
+
#help: `stop using rules on CHANNEL_NAME`
|
972
|
+
#help: it will stop using the extended rules on the specified channel.
|
973
|
+
#help:
|
974
|
+
when /^stop using rules (on\s+)<#C\w+\|(.+)>/i, /^stop using rules (on\s+)(.+)/i
|
975
|
+
if !ADMIN_USERS.include?(from) #not admin
|
976
|
+
respond "Only admins can extend or stop using the rules. Admins on this channel: #{ADMIN_USERS}", dest
|
977
|
+
else
|
978
|
+
channel = $2
|
979
|
+
get_bots_created()
|
980
|
+
if @bots_created[@channels_id[CHANNEL]][:extended].include?(channel)
|
981
|
+
@bots_created[@channels_id[CHANNEL]][:extended].delete(channel)
|
982
|
+
update_bots_file()
|
983
|
+
respond "The rules won't be accessible from <##{@channels_id[CHANNEL]}> from now on.", dest
|
984
|
+
respond "<@#{user.id}> removed the access to the rules of <##{@channels_id[CHANNEL]}> from this channel.", @channels_id[channel]
|
985
|
+
else
|
986
|
+
respond "The rules were not accessible from <##{@channels_id[channel]}>", dest
|
987
|
+
end
|
988
|
+
end
|
989
|
+
|
871
990
|
#help: ----------------------------------------------
|
872
991
|
#help: `add shortcut NAME: COMMAND`
|
873
992
|
#help: `add sc NAME: COMMAND`
|
@@ -1127,5 +1246,5 @@ class SlackSmartBot
|
|
1127
1246
|
)
|
1128
1247
|
end
|
1129
1248
|
|
1130
|
-
private :update_bots_file, :get_channels_name_and_id, :update_shortcuts_file
|
1249
|
+
private :update_bots_file, :get_bots_created, :get_channels_name_and_id, :update_shortcuts_file
|
1131
1250
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-smart-bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.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: 2019-08-
|
11
|
+
date: 2019-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slack-ruby-client
|