slack-smart-bot 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/lib/slack-smart-bot.rb +206 -30
- data/lib/slack-smart-bot_rules.rb +2 -1
- 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: cfe8bd620d33775142c024063dd587fa8dfae7bb42c998fc617cf7d75daa991a
|
4
|
+
data.tar.gz: cc0829d5ebe5085c54b3f87f7c43c07718e8a0c05415acf49f1dea2c8ff0ca27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4381cba75e222058b4ba20c29c9ae2e3caaaa7db0a839645f7109b1e74c6c61da401fc7ae3b9df3fa016fc4624b7e24dfe5f543b76cdff56fdc0b18a86565a0
|
7
|
+
data.tar.gz: 62445d54652b4b4fa3ce9155d0736c812be8a31133b4b2def6cadb66f30f78834c1ae7c6a08cd37cea239914d3d7e10932550ed608fa2e3954f5e8d00448196f
|
data/README.md
CHANGED
@@ -57,7 +57,8 @@ The rules file can be edited and will be only affecting this particular bot.
|
|
57
57
|
You can add all the rules you want for your bot in the rules file, this is an example:
|
58
58
|
|
59
59
|
```ruby
|
60
|
-
def rules(
|
60
|
+
def rules(user, command, processed, id_user)
|
61
|
+
from = user.name
|
61
62
|
firstname = from.split(" ").first
|
62
63
|
case command
|
63
64
|
|
data/lib/slack-smart-bot.rb
CHANGED
@@ -52,6 +52,7 @@ class SlackSmartBot
|
|
52
52
|
@bots_created = Hash.new()
|
53
53
|
@shortcuts = Hash.new()
|
54
54
|
@shortcuts[:all] = Hash.new()
|
55
|
+
@rules_imported = Hash.new()
|
55
56
|
|
56
57
|
if File.exist?("./shortcuts/#{SHORTCUTS_FILE}")
|
57
58
|
file_sc = IO.readlines("./shortcuts/#{SHORTCUTS_FILE}").join
|
@@ -76,6 +77,13 @@ class SlackSmartBot
|
|
76
77
|
end
|
77
78
|
end
|
78
79
|
|
80
|
+
# rules imported only for private channels
|
81
|
+
if ON_MASTER_BOT and File.exist?('./rules/rules_imported.rb')
|
82
|
+
file_conf = IO.readlines('./rules/rules_imported.rb').join
|
83
|
+
unless file_conf.to_s() == ""
|
84
|
+
@rules_imported = eval(file_conf)
|
85
|
+
end
|
86
|
+
end
|
79
87
|
wclient.auth_test
|
80
88
|
|
81
89
|
begin
|
@@ -90,7 +98,7 @@ class SlackSmartBot
|
|
90
98
|
m = "Successfully connected, welcome '#{client.self.name}' to the '#{client.team.name}' team at https://#{client.team.domain}.slack.com."
|
91
99
|
puts m
|
92
100
|
@logger.info m
|
93
|
-
respond "Smart Bot started\nIf you want to know what I can do for you:
|
101
|
+
respond "Smart Bot started\nIf you want to know what I can do for you: `bot help` or `bot specific help`\nYou can send me also a direct message."
|
94
102
|
end
|
95
103
|
|
96
104
|
@status = STATUS_INIT
|
@@ -115,6 +123,13 @@ class SlackSmartBot
|
|
115
123
|
file.close
|
116
124
|
end
|
117
125
|
|
126
|
+
def update_rules_imported
|
127
|
+
file = File.open("./rules/rules_imported.rb", "w")
|
128
|
+
file.write @rules_imported.inspect
|
129
|
+
file.close
|
130
|
+
end
|
131
|
+
|
132
|
+
|
118
133
|
def get_channels_name_and_id
|
119
134
|
channels = wclient.channels_list.channels
|
120
135
|
@channels_id = Hash.new()
|
@@ -137,10 +152,15 @@ class SlackSmartBot
|
|
137
152
|
end
|
138
153
|
# Direct messages are treated only on the master bot
|
139
154
|
if id_user.nil? or (!id_user.nil? and ON_MASTER_BOT)
|
140
|
-
|
141
|
-
if
|
142
|
-
|
143
|
-
|
155
|
+
#todo: sometimes data.user is nil, check the problem.
|
156
|
+
if data.user.nil?
|
157
|
+
@logger.fatal "user is nil. channel: #{data.channel}, message: #{data.text}"
|
158
|
+
else
|
159
|
+
user_info = wclient.users_info(user: data.user)
|
160
|
+
if !id_user.nil? or @channels_id[CHANNEL] == data.channel or user_info.user.name == config[:nick]
|
161
|
+
res = process_first(user_info.user, data.text, id_user, data.channel)
|
162
|
+
next if res.to_s == "next"
|
163
|
+
end
|
144
164
|
end
|
145
165
|
end
|
146
166
|
end
|
@@ -149,7 +169,8 @@ class SlackSmartBot
|
|
149
169
|
client.start!
|
150
170
|
end
|
151
171
|
|
152
|
-
def process_first(
|
172
|
+
def process_first(user, text, id_user, dchannel)
|
173
|
+
nick = user.name
|
153
174
|
#todo: verify if on slack on anytime nick == config[:nick]
|
154
175
|
if nick == config[:nick] or nick == (config[:nick] + " · Bot") #if message is coming from the bot
|
155
176
|
begin
|
@@ -198,7 +219,7 @@ class SlackSmartBot
|
|
198
219
|
begin
|
199
220
|
t = Thread.new do
|
200
221
|
begin
|
201
|
-
processed = process(
|
222
|
+
processed = process(user, command, id_user, dchannel)
|
202
223
|
@logger.info "command: #{nick}> #{command}" if processed
|
203
224
|
if @status == :on and
|
204
225
|
((@questions.keys.include?(nick) or
|
@@ -210,21 +231,63 @@ class SlackSmartBot
|
|
210
231
|
@logger.info "command: #{nick}> #{command}" unless processed
|
211
232
|
#todo: verify this
|
212
233
|
if id_user.nil? #only for channels, not for DM
|
234
|
+
rules_file = RULES_FILE
|
235
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
236
|
+
unless @bots_created.key?(@rules_imported[user.id][dchannel])
|
237
|
+
file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
|
238
|
+
unless file_conf.to_s() == ""
|
239
|
+
@bots_created = eval(file_conf)
|
240
|
+
end
|
241
|
+
end
|
242
|
+
if @bots_created.key?(@rules_imported[user.id][dchannel])
|
243
|
+
rules_file = @bots_created[@rules_imported[user.id][dchannel]][:rules_file]
|
244
|
+
end
|
245
|
+
end
|
246
|
+
@logger.info "rules file: #{rules_file}"
|
213
247
|
begin
|
214
|
-
eval(File.new(
|
248
|
+
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
215
249
|
rescue Exception => stack
|
216
|
-
@logger.fatal "ERROR ON RULES FILE: #{
|
250
|
+
@logger.fatal "ERROR ON RULES FILE: #{rules_file}"
|
217
251
|
@logger.fatal stack
|
218
252
|
end
|
219
253
|
if defined?(rules)
|
220
254
|
command[0] = "" if command[0] == "!"
|
221
255
|
command.gsub!(/^@\w+:*\s*/, "")
|
222
|
-
rules(
|
256
|
+
rules(user, command, processed, id_user)
|
223
257
|
else
|
224
258
|
@logger.warn "It seems like rules method is not defined"
|
225
259
|
end
|
226
|
-
|
227
|
-
@
|
260
|
+
elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id)
|
261
|
+
unless @bots_created.key?(@rules_imported[user.id][user.id])
|
262
|
+
file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
|
263
|
+
unless file_conf.to_s() == ""
|
264
|
+
@bots_created = eval(file_conf)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
if @bots_created.key?(@rules_imported[user.id][user.id])
|
269
|
+
rules_file = @bots_created[@rules_imported[user.id][user.id]][:rules_file]
|
270
|
+
begin
|
271
|
+
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
272
|
+
rescue Exception => stack
|
273
|
+
@logger.fatal "ERROR ON imported RULES FILE: #{rules_file}"
|
274
|
+
@logger.fatal stack
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
if defined?(rules)
|
279
|
+
command[0] = "" if command[0] == "!"
|
280
|
+
command.gsub!(/^@\w+:*\s*/, "")
|
281
|
+
rules(user, command, processed, id_user)
|
282
|
+
else
|
283
|
+
@logger.warn "It seems like rules method is not defined"
|
284
|
+
end
|
285
|
+
else #jal9
|
286
|
+
@logger.info "it is a direct message with no rules file selected so no rules file executed."
|
287
|
+
unless processed
|
288
|
+
resp = %w{ what huh sorry }.sample
|
289
|
+
respond "#{resp}?", id_user
|
290
|
+
end
|
228
291
|
end
|
229
292
|
end
|
230
293
|
rescue Exception => stack
|
@@ -239,7 +302,8 @@ class SlackSmartBot
|
|
239
302
|
#help:
|
240
303
|
#help: *General commands:*:
|
241
304
|
#help:
|
242
|
-
def process(
|
305
|
+
def process(user, command, id_user, dchannel)
|
306
|
+
from = user.name
|
243
307
|
firstname = from.split(/ /).first
|
244
308
|
processed = true
|
245
309
|
|
@@ -255,6 +319,11 @@ class SlackSmartBot
|
|
255
319
|
if @status == :on
|
256
320
|
greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
|
257
321
|
respond "#{greetings} #{firstname}", id_user
|
322
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and !id_user.nil?
|
323
|
+
respond "You are using specific rules for channel: <##{@rules_imported[user.id][user.id]}>", id_user
|
324
|
+
elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel) and id_user.nil?
|
325
|
+
respond "You are using specific rules for channel: <##{@rules_imported[user.id][dchannel]}>", id_user
|
326
|
+
end
|
258
327
|
@listening << from unless @listening.include?(from)
|
259
328
|
end
|
260
329
|
|
@@ -307,7 +376,7 @@ class SlackSmartBot
|
|
307
376
|
respond "Only admin users can kill me", id_user
|
308
377
|
end
|
309
378
|
else
|
310
|
-
respond "To do this you need to be an admin user in the master channel", id_user
|
379
|
+
respond "To do this you need to be an admin user in the master channel: <##{@channels_id[MASTER_CHANNEL]}>", id_user
|
311
380
|
end
|
312
381
|
|
313
382
|
#helpadmin: `start bot`
|
@@ -364,7 +433,7 @@ class SlackSmartBot
|
|
364
433
|
#helpmaster: creates a new bot on the channel specified
|
365
434
|
#helpmaster: it will work only if you are on Master channel
|
366
435
|
#helpmaster:
|
367
|
-
when /^create\sbot\son\s<#C\w+\|(.+)>\s*/i, /^create\sbot\son\s(.+)\s*/i#jal9
|
436
|
+
when /^create\sbot\son\s<#C\w+\|(.+)>\s*/i, /^create\sbot\son\s(.+)\s*/i #jal9
|
368
437
|
if ON_MASTER_BOT
|
369
438
|
channel = $1
|
370
439
|
|
@@ -376,12 +445,17 @@ class SlackSmartBot
|
|
376
445
|
elsif @channels_id.key?(channel) #it is a channel name
|
377
446
|
channel_id = @channels_id[channel]
|
378
447
|
end
|
448
|
+
channels = wclient.channels_list.channels
|
449
|
+
channel_found = channels.detect { |c| c.name == channel }
|
450
|
+
|
379
451
|
if channel_id.nil?
|
380
452
|
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", id_user
|
381
453
|
elsif channel == MASTER_CHANNEL
|
382
454
|
respond "There is already a bot in this channel: #{channel}", id_user
|
383
455
|
elsif @bots_created.keys.include?(channel_id) #jal9
|
384
456
|
respond "There is already a bot in this channel: #{channel}, kill it before", id_user
|
457
|
+
elsif config[:nick_id] != channel_found.creator and !channel_found.members.include?(config[:nick_id])
|
458
|
+
respond "You need to add first to the channel the smart bot user: #{config[:nick]}, kill it before", id_user
|
385
459
|
else
|
386
460
|
if channel_id != config[:channel]
|
387
461
|
begin
|
@@ -424,17 +498,18 @@ class SlackSmartBot
|
|
424
498
|
else
|
425
499
|
respond "There is already a bot in this channel: #{channel}, and it is the Master Channel!", id_user
|
426
500
|
end
|
427
|
-
|
428
501
|
end
|
429
502
|
else
|
430
|
-
|
503
|
+
@logger.info MASTER_CHANNEL
|
504
|
+
@logger.info @channel_id.inspect
|
505
|
+
respond "Sorry I cannot create bots from this channel, please visit the master channel: <##{@channels_id[MASTER_CHANNEL]}>", id_user
|
431
506
|
end
|
432
507
|
|
433
508
|
#helpmaster: `kill bot on CHANNEL_NAME`
|
434
509
|
#helpmaster: kills the bot on the specified channel
|
435
510
|
#helpmaster: Only works if you are on Master channel and you created that bot or you are an admin user
|
436
511
|
#helpmaster:
|
437
|
-
when /^kill\sbot\son\s<#C\w+\|(.+)>\s*/i
|
512
|
+
when /^kill\sbot\son\s<#C\w+\|(.+)>\s*/i, /^kill\sbot\son\s(.+)\s*/i
|
438
513
|
if ON_MASTER_BOT
|
439
514
|
channel = $1
|
440
515
|
|
@@ -464,27 +539,128 @@ class SlackSmartBot
|
|
464
539
|
respond "There is no bot in this channel: #{channel}", id_user
|
465
540
|
end
|
466
541
|
else
|
467
|
-
respond "Sorry I cannot kill bots from this channel, please visit the master channel", id_user
|
542
|
+
respond "Sorry I cannot kill bots from this channel, please visit the master channel: <##{@channels_id[MASTER_CHANNEL]}>", id_user
|
543
|
+
end
|
544
|
+
|
545
|
+
#help: `use rules from CHANNEL`
|
546
|
+
#help: `use rules CHANNEL`
|
547
|
+
#help: it will use the rules from the specified channel.
|
548
|
+
#help: you need to be part of that channel to be able to use the rules.
|
549
|
+
#help:
|
550
|
+
when /^use rules (from\s+)?<#C\w+\|(.+)>/i, /^use rules (from\s+)?(.+)/i
|
551
|
+
channel = $2
|
552
|
+
channels = wclient.channels_list.channels
|
553
|
+
channel_found = channels.detect { |c| c.name == channel }
|
554
|
+
if channel_found.nil?
|
555
|
+
respond "The channel you are trying to use doesn't exist", id_user
|
556
|
+
elsif channel_found.name == MASTER_CHANNEL
|
557
|
+
respond "You cannot use the rules from Master Channel on any other channel.", id_user
|
558
|
+
else
|
559
|
+
if user.id == channel_found.creator or channel_found.members.include?(user.id)
|
560
|
+
@rules_imported[user.id] = {} unless @rules_imported.key?(user.id)
|
561
|
+
if id_user.nil? #todo: take in consideration bots that are not master
|
562
|
+
@rules_imported[user.id][dchannel] = channel_found.id
|
563
|
+
else
|
564
|
+
@rules_imported[user.id][user.id] = channel_found.id
|
565
|
+
end
|
566
|
+
update_rules_imported() if ON_MASTER_BOT
|
567
|
+
respond "I'm using now the rules from <##{channel_found.id}>", id_user
|
568
|
+
else
|
569
|
+
respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", id_user
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
#help: `stop using rules from CHANNEL`
|
574
|
+
#help: `stop using rules CHANNEL`
|
575
|
+
#help: it will stop using the rules from the specified channel.
|
576
|
+
#help:
|
577
|
+
when /^stop using rules (from\s+)?<#C\w+\|(.+)>/i, /^stop using rules (from\s+)?(.+)/i
|
578
|
+
channel = $2
|
579
|
+
if @channels_id.key?(channel)
|
580
|
+
channel_id = @channels_id[channel]
|
581
|
+
else
|
582
|
+
channel_id = channel
|
583
|
+
end
|
584
|
+
if id_user.nil? #channel
|
585
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
586
|
+
if @rules_imported[user.id][dchannel]!= channel_id
|
587
|
+
respond "You are not using those rules.", id_user
|
588
|
+
else
|
589
|
+
@rules_imported[user.id].delete(dchannel)
|
590
|
+
update_rules_imported() if ON_MASTER_BOT
|
591
|
+
respond "You won't be using those rules from now on.", id_user
|
592
|
+
end
|
593
|
+
else
|
594
|
+
respond "You were not using those rules.", id_user
|
595
|
+
end
|
596
|
+
else #direct message
|
597
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id)
|
598
|
+
if @rules_imported[user.id][user.id]!= channel_id
|
599
|
+
respond "You are not using those rules.", id_user
|
600
|
+
else
|
601
|
+
@rules_imported[user.id].delete(user.id)
|
602
|
+
update_rules_imported() if ON_MASTER_BOT
|
603
|
+
respond "You won't be using those rules from now on.", id_user
|
604
|
+
end
|
605
|
+
else
|
606
|
+
respond "You were not using those rules.", id_user
|
607
|
+
end
|
468
608
|
end
|
469
609
|
|
610
|
+
|
470
611
|
#help: `bot help`
|
471
612
|
#help: `bot what can I do?`
|
613
|
+
#help: `bot specific help`
|
472
614
|
#help: it will display this help
|
473
|
-
#help:
|
474
|
-
when /^bot help/i, /^bot,? what can I do/i
|
475
|
-
|
476
|
-
|
477
|
-
|
615
|
+
#help: bot specific help will show only the specific rules for this channel.
|
616
|
+
when /^bot (specific\s)?help/i, /^bot,? what can I do/i
|
617
|
+
if $1.to_s != ''
|
618
|
+
specific = true
|
619
|
+
else
|
620
|
+
specific = false
|
478
621
|
end
|
479
|
-
if
|
480
|
-
|
622
|
+
if !specific then
|
623
|
+
help_message = IO.readlines(__FILE__).join
|
624
|
+
if ADMIN_USERS.include?(from) #admin user
|
625
|
+
respond "*Commands for administrators:*\n#{help_message.scan(/#\s*help\s*admin:(.*)/).join("\n")}", id_user
|
626
|
+
end
|
627
|
+
if ON_MASTER_BOT and id_user.nil?
|
628
|
+
respond "*Commands only on Master Channel <##{@channels_id[MASTER_CHANNEL]}>:*\n#{help_message.scan(/#\s*help\s*master:(.*)/).join("\n")}", id_user
|
629
|
+
end
|
630
|
+
respond help_message.scan(/#\s*help\s*:(.*)/).join("\n"), id_user
|
481
631
|
end
|
482
|
-
#jal9
|
483
|
-
respond help_message.scan(/#\s*help\s*:(.*)/).join("\n"), id_user
|
484
632
|
if id_user.nil? # on a channel
|
485
|
-
|
633
|
+
rules_file = RULES_FILE
|
634
|
+
|
635
|
+
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
636
|
+
|
637
|
+
unless @bots_created.key?(@rules_imported[user.id][dchannel])
|
638
|
+
file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
|
639
|
+
unless file_conf.to_s() == ""
|
640
|
+
@bots_created = eval(file_conf)
|
641
|
+
end
|
642
|
+
end
|
643
|
+
if @bots_created.key?(@rules_imported[user.id][dchannel])
|
644
|
+
rules_file = @bots_created[@rules_imported[user.id][dchannel]][:rules_file]
|
645
|
+
respond "*You are using rules from another channel: <##{@rules_imported[user.id][dchannel]}>. These are the specific commands for that channel:*", id_user
|
646
|
+
end
|
647
|
+
end
|
648
|
+
help_message_rules = IO.readlines(rules_file).join
|
486
649
|
respond help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), id_user
|
487
|
-
|
650
|
+
elsif !id_user.nil? and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
|
651
|
+
unless @bots_created.key?(@rules_imported[user.id][user.id])
|
652
|
+
file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
|
653
|
+
unless file_conf.to_s() == ""
|
654
|
+
@bots_created = eval(file_conf)
|
655
|
+
end
|
656
|
+
end
|
657
|
+
if @bots_created.key?(@rules_imported[user.id][user.id])
|
658
|
+
rules_file = @bots_created[@rules_imported[user.id][user.id]][:rules_file]
|
659
|
+
respond "*You are using rules from channel: <##{@rules_imported[user.id][user.id]}>. These are the specific commands for that channel:*", id_user
|
660
|
+
help_message_rules = IO.readlines(rules_file).join
|
661
|
+
respond help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), id_user
|
662
|
+
end
|
663
|
+
end
|
488
664
|
respond "Github project: https://github.com/MarioRuiz/slack-smart-bot", id_user
|
489
665
|
else
|
490
666
|
processed = false
|
@@ -29,7 +29,8 @@ end
|
|
29
29
|
# help: `@NAME_OF_BOT THE_COMMAND`
|
30
30
|
# help: `NAME_OF_BOT THE_COMMAND`
|
31
31
|
# help:
|
32
|
-
def rules(
|
32
|
+
def rules(user, command, processed, id_user)
|
33
|
+
from = user.name
|
33
34
|
if @testing
|
34
35
|
puts "#{from}: #{command}"
|
35
36
|
if @questions.keys.include?(from)
|
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.3.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-05-
|
11
|
+
date: 2019-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slack-ruby-client
|