slack-smart-bot 1.7.0 → 1.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -12
  3. data/lib/slack-smart-bot.rb +53 -43
  4. data/lib/slack-smart-bot_general_rules.rb +7 -4
  5. data/lib/slack-smart-bot_rules.rb +8 -6
  6. data/lib/slack/smart-bot/comm.rb +6 -1
  7. data/lib/slack/smart-bot/comm/ask.rb +12 -5
  8. data/lib/slack/smart-bot/comm/dont_understand.rb +1 -1
  9. data/lib/slack/smart-bot/comm/event_hello.rb +30 -0
  10. data/lib/slack/smart-bot/comm/get_channel_members.rb +8 -0
  11. data/lib/slack/smart-bot/comm/get_channels.rb +20 -0
  12. data/lib/slack/smart-bot/comm/get_user_info.rb +16 -0
  13. data/lib/slack/smart-bot/comm/react.rb +21 -8
  14. data/lib/slack/smart-bot/comm/respond.rb +38 -12
  15. data/lib/slack/smart-bot/comm/send_file.rb +1 -1
  16. data/lib/slack/smart-bot/comm/send_msg_channel.rb +2 -2
  17. data/lib/slack/smart-bot/comm/send_msg_user.rb +4 -4
  18. data/lib/slack/smart-bot/comm/unreact.rb +29 -0
  19. data/lib/slack/smart-bot/commands.rb +3 -1
  20. data/lib/slack/smart-bot/commands/general/bot_help.rb +16 -3
  21. data/lib/slack/smart-bot/commands/general/bot_stats.rb +313 -0
  22. data/lib/slack/smart-bot/commands/general/bot_status.rb +1 -1
  23. data/lib/slack/smart-bot/commands/general/bye_bot.rb +1 -1
  24. data/lib/slack/smart-bot/commands/general/hi_bot.rb +1 -1
  25. data/lib/slack/smart-bot/commands/general/use_rules.rb +6 -9
  26. data/lib/slack/smart-bot/commands/general/whats_new.rb +19 -0
  27. data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +65 -33
  28. data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +42 -9
  29. data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +3 -7
  30. data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +1 -0
  31. data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +9 -2
  32. data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +1 -0
  33. data/lib/slack/smart-bot/commands/on_bot/delete_repl.rb +1 -1
  34. data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +52 -21
  35. data/lib/slack/smart-bot/commands/on_bot/get_repl.rb +5 -5
  36. data/lib/slack/smart-bot/commands/on_bot/repl.rb +50 -18
  37. data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +34 -9
  38. data/lib/slack/smart-bot/commands/on_bot/run_repl.rb +2 -3
  39. data/lib/slack/smart-bot/commands/on_bot/see_repls.rb +1 -1
  40. data/lib/slack/smart-bot/commands/on_bot/see_shortcuts.rb +27 -9
  41. data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +14 -1
  42. data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +3 -3
  43. data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +1 -1
  44. data/lib/slack/smart-bot/commands/on_master/admin_master/set_maintenance.rb +41 -0
  45. data/lib/slack/smart-bot/commands/on_master/create_bot.rb +4 -8
  46. data/lib/slack/smart-bot/listen.rb +6 -5
  47. data/lib/slack/smart-bot/process.rb +230 -186
  48. data/lib/slack/smart-bot/process_first.rb +104 -87
  49. data/lib/slack/smart-bot/treat_message.rb +128 -52
  50. data/lib/slack/smart-bot/utils.rb +2 -0
  51. data/lib/slack/smart-bot/utils/answer.rb +18 -0
  52. data/lib/slack/smart-bot/utils/answer_delete.rb +15 -0
  53. data/lib/slack/smart-bot/utils/build_help.rb +57 -5
  54. data/lib/slack/smart-bot/utils/create_routine_thread.rb +48 -8
  55. data/lib/slack/smart-bot/utils/get_channels_name_and_id.rb +1 -7
  56. data/lib/slack/smart-bot/utils/get_help.rb +79 -17
  57. data/lib/slack/smart-bot/utils/save_stats.rb +21 -8
  58. data/lib/slack/smart-bot/utils/update_shortcuts_file.rb +6 -0
  59. data/whats_new.txt +24 -0
  60. metadata +23 -13
  61. data/lib/slack/smart-bot/commands/on_bot/admin_master/bot_stats.rb +0 -135
@@ -14,7 +14,7 @@ class SlackSmartBot
14
14
  gems_remote = `gem list slack-smart-bot --remote`
15
15
  version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
16
16
  version_message = ""
17
- if version_remote != VERSION
17
+ if Gem::Version.new(version_remote) > Gem::Version.new(VERSION)
18
18
  version_message = " There is a new available version: #{version_remote}."
19
19
  end
20
20
  require "socket"
@@ -4,8 +4,8 @@ class SlackSmartBot
4
4
  # help: `Bye Bot`
5
5
  # help: `Bye Smart`
6
6
  # help: `Bye NAME_OF_THE_BOT`
7
- # help: Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
8
7
  # help: Bot stops listening to you
8
+ # help: Also apart of Bye you can use _Bæ, Good Bye, Adiós, Ciao, Bless, Bless Bless, Adeu_
9
9
  # help:
10
10
  def bye_bot(dest, from, display_name)
11
11
  if @status == :on
@@ -5,9 +5,9 @@ class SlackSmartBot
5
5
  # help: `Hi Smart`
6
6
  # help: `Hello Bot` `Hola Bot` `Hallo Bot` `What's up Bot` `Hey Bot` `Hæ Bot`
7
7
  # help: `Hello THE_NAME_OF_THE_BOT`
8
- # help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
9
8
  # help: Bot starts listening to you
10
9
  # help: After that if you want to avoid a single message to be treated by the smart bot, start the message by -
10
+ # help: Also apart of Hello you can use _Hallo, Hi, Hola, What's up, Hey, Hæ_
11
11
  # help:
12
12
  def hi_bot(user, dest, dchannel, from, display_name)
13
13
  if @status == :on
@@ -15,17 +15,14 @@ class SlackSmartBot
15
15
  respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
16
16
  else
17
17
  #todo: add pagination for case more than 1000 channels on the workspace
18
- channels = client.web_client.conversations_list(
19
- types: "private_channel,public_channel",
20
- limit: "1000",
21
- exclude_archived: "true",
22
- ).channels
23
-
18
+ channels = get_channels()
19
+ channel.gsub!('#','') # for the case the channel name is in plain text including #
24
20
  channel_found = channels.detect { |c| c.name == channel }
25
- members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
21
+ get_channels_name_and_id() unless @channels_id.key?(channel)
22
+ members = get_channel_members(@channels_id[channel]) unless channel_found.nil? or !@channels_id.key?(channel)
26
23
 
27
- if channel_found.nil?
28
- respond "The channel you are trying to use doesn't exist", dest
24
+ if channel_found.nil? or !@channels_id.key?(channel)
25
+ respond "The channel you are trying to use doesn't exist or cannot be found.", dest
29
26
  elsif channel_found.name == config.master_channel
30
27
  respond "You cannot use the rules from Master Channel on any other channel.", dest
31
28
  elsif !@bots_created.key?(@channels_id[channel])
@@ -0,0 +1,19 @@
1
+ class SlackSmartBot
2
+
3
+ # help: ----------------------------------------------
4
+ # help: `What's new`
5
+ # help: It will display the last user changes on Slack Smart Bot
6
+ # help:
7
+ def whats_new(user, dest, dchannel, from, display_name)
8
+ if @status == :on
9
+ save_stats(__method__)
10
+ whats_new_file = (__FILE__).gsub(/lib\/slack\/smart-bot\/commands\/general\/whats_new\.rb$/, "whats_new.txt")
11
+ whats_new = File.read(whats_new_file)
12
+ whats_new.split(/^\-\-\-\-\-\-+$/).each do |msg|
13
+ respond msg
14
+ sleep 0.3
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -7,8 +7,10 @@ class SlackSmartBot
7
7
  # help: `add sc for all NAME: COMMAND`
8
8
  # help: `shortcut NAME: COMMAND`
9
9
  # help: `shortcut for all NAME: COMMAND`
10
+ # help: `add global sc for all NAME: COMMAND`
10
11
  # help: It will add a shortcut that will execute the command we supply.
11
12
  # help: In case we supply 'for all' then the shorcut will be available for everybody
13
+ # help: If 'global' or 'generic' supplied and in Master channel then the shortcut will be available in all Bot channels.
12
14
  # help: If you want to use a shortcut as a inline shortcut inside a command you can do it by adding a $ fex: _!run tests $cust1_
13
15
  # help: Example:
14
16
  # help: _add shortcut for all Spanish account: code require 'iso/iban'; 10.times {puts ISO::IBAN.random('ES')}_
@@ -17,7 +19,7 @@ class SlackSmartBot
17
19
  # help: _shortcut Spanish Account_
18
20
  # help: _Spanish Account_
19
21
  # help:
20
- def add_shortcut(dest, user, typem, for_all, shortcut_name, command, command_to_run)
22
+ def add_shortcut(dest, user, typem, for_all, shortcut_name, command, command_to_run, global)
21
23
  save_stats(__method__)
22
24
  unless typem == :on_extended
23
25
  from = user.name
@@ -25,43 +27,73 @@ class SlackSmartBot
25
27
  (!user.key?(:enterprise_user) or ( user.key?(:enterprise_user) and !config[:allow_access][__method__].include?(user[:enterprise_user].id)))
26
28
  respond "You don't have access to use this command, please contact an Admin to be able to use it: <@#{config.admins.join(">, <@")}>"
27
29
  else
28
- @shortcuts[from] = Hash.new() unless @shortcuts.keys.include?(from)
29
30
 
30
- found_other = false
31
- if for_all.to_s != ""
32
- @shortcuts.each { |sck, scv|
33
- if sck != :all and sck != from and scv.key?(shortcut_name)
34
- found_other = true
31
+ if global
32
+ if !config.on_master_bot or typem != :on_master
33
+ respond "It is only possible to add global shortcuts from Master channel"
34
+ else
35
+ @shortcuts_global[from] = Hash.new() unless @shortcuts_global.keys.include?(from)
36
+ found_other = false
37
+ if for_all.to_s != ""
38
+ @shortcuts_global.each { |sck, scv|
39
+ if sck != :all and sck != from and scv.key?(shortcut_name)
40
+ found_other = true
41
+ end
42
+ }
35
43
  end
36
- }
37
- end
38
- if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut_name) and !@shortcuts[from].include?(shortcut_name)
39
- respond "Only the creator of the shortcut can modify it", dest
40
- elsif found_other
41
- respond "You cannot create a shortcut for all with the same name than other user is using", dest
42
- elsif !@shortcuts[from].include?(shortcut_name)
43
- #new shortcut
44
- @shortcuts[from][shortcut_name] = command_to_run
45
- @shortcuts[:all][shortcut_name] = command_to_run if for_all.to_s != ""
46
- update_shortcuts_file()
47
- respond "shortcut added", dest
44
+ if @shortcuts_global[:all].include?(shortcut_name) or @shortcuts_global[from].include?(shortcut_name)
45
+ respond "Global shortcut name already in use. Please use another shortcut name."
46
+ elsif found_other
47
+ respond "You cannot create a global shortcut for all with the same name than other user is using."
48
+ elsif !@shortcuts_global[from].include?(shortcut_name)
49
+ #new shortcut
50
+ @shortcuts_global[from][shortcut_name] = command_to_run
51
+ @shortcuts_global[:all][shortcut_name] = command_to_run if for_all.to_s != ""
52
+ update_shortcuts_file()
53
+ respond "global shortcut added"
54
+ else
55
+ respond "Not possible to add the global shortcut" #todo: check if this is ever gonna be the case
56
+ end
57
+ end
48
58
  else
49
- #are you sure? to avoid overwriting existing
50
- unless @questions.keys.include?(from)
51
- ask("The shortcut already exists, are you sure you want to overwrite it?", command, from, dest)
59
+ @shortcuts[from] = Hash.new() unless @shortcuts.keys.include?(from)
60
+
61
+ found_other = false
62
+ if for_all.to_s != ""
63
+ @shortcuts.each { |sck, scv|
64
+ if sck != :all and sck != from and scv.key?(shortcut_name)
65
+ found_other = true
66
+ end
67
+ }
68
+ end
69
+ if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut_name) and !@shortcuts[from].include?(shortcut_name)
70
+ respond "Only the creator of the shortcut can modify it", dest
71
+ elsif found_other
72
+ respond "You cannot create a shortcut for all with the same name than other user is using", dest
73
+ elsif !@shortcuts[from].include?(shortcut_name)
74
+ #new shortcut
75
+ @shortcuts[from][shortcut_name] = command_to_run
76
+ @shortcuts[:all][shortcut_name] = command_to_run if for_all.to_s != ""
77
+ update_shortcuts_file()
78
+ respond "shortcut added", dest
52
79
  else
53
- case @questions[from]
54
- when /^(yes|yep)/i
55
- @shortcuts[from][shortcut_name] = command_to_run
56
- @shortcuts[:all][shortcut_name] = command_to_run if for_all.to_s != ""
57
- update_shortcuts_file()
58
- respond "shortcut added", dest
59
- @questions.delete(from)
60
- when /^no/i
61
- respond "ok, I won't add it", dest
62
- @questions.delete(from)
80
+ #are you sure? to avoid overwriting existing
81
+ if answer.empty?
82
+ ask("The shortcut already exists, are you sure you want to overwrite it?", command, from, dest)
63
83
  else
64
- ask "I don't understand, yes or no?", command, from, dest
84
+ case answer
85
+ when /^(yes|yep)/i
86
+ @shortcuts[from][shortcut_name] = command_to_run
87
+ @shortcuts[:all][shortcut_name] = command_to_run if for_all.to_s != ""
88
+ update_shortcuts_file()
89
+ respond "shortcut added", dest
90
+ answer_delete(from)
91
+ when /^no/i
92
+ respond "ok, I won't add it", dest
93
+ answer_delete(from)
94
+ else
95
+ ask "I don't understand, yes or no?", command, from, dest
96
+ end
65
97
  end
66
98
  end
67
99
  end
@@ -1,10 +1,14 @@
1
1
  class SlackSmartBot
2
2
  # helpadmin: ----------------------------------------------
3
3
  # helpadmin: `add routine NAME every NUMBER PERIOD COMMAND`
4
+ # helpadmin: `add routine NAME every NUMBER PERIOD #CHANNEL COMMAND`
4
5
  # helpadmin: `add routine NAME every NUMBER PERIOD`
5
6
  # helpadmin: `add silent routine NAME every NUMBER PERIOD`
6
7
  # helpadmin: `create routine NAME every NUMBER PERIOD`
7
8
  # helpadmin: `add routine NAME at TIME COMMAND`
9
+ # helpadmin: `add routine NAME at TIME #CHANNEL COMMAND`
10
+ # helpadmin: `add routine NAME on DAYWEEK at TIME COMMAND`
11
+ # helpadmin: `add routine NAME on DAYWEEK at TIME #CHANNEL COMMAND`
8
12
  # helpadmin: `add routine NAME at TIME`
9
13
  # helpadmin: `add silent routine NAME at TIME`
10
14
  # helpadmin: `create routine NAME at TIME`
@@ -15,14 +19,18 @@ class SlackSmartBot
15
19
  # helpadmin: NUMBER: Integer
16
20
  # helpadmin: PERIOD: days, d, hours, h, minutes, mins, min, m, seconds, secs, sec, s
17
21
  # helpadmin: TIME: time at format HH:MM:SS
22
+ # helpadmin: DAYWEEK: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. And their plurals.
23
+ # helpadmin: #CHANNEL: the destination channel where the results will be published. If not supplied then the bot channel by default or a DM if the command is run from a DM.
18
24
  # helpadmin: COMMAND: any valid smart bot command or rule
19
25
  # helpadmin: Examples:
20
26
  # helpadmin: _add routine example every 30s ruby puts 'a'_
21
27
  # helpadmin: _add routine example every 3 days ruby puts 'a'_
22
28
  # helpadmin: _add routine example at 17:05 ruby puts 'a'_
23
- # helpadmin: _create silent routine every 12 hours !Run customer tests_
29
+ # helpadmin: _create silent routine Example every 12 hours !Run customer tests_
30
+ # helpadmin: _add routine example on Mondays at 05:00 !run customer tests_
31
+ # helpadmin: _add routine example on Tuesdays at 09:00 #SREChannel !run db cleanup_
24
32
  # helpadmin:
25
- def add_routine(dest, from, user, name, type, number_time, period, command_to_run, files, silent)
33
+ def add_routine(dest, from, user, name, type, number_time, period, command_to_run, files, silent, channel)
26
34
  save_stats(__method__)
27
35
  if files.nil? or files.size == 0 or (files.size > 0 and config.masters.include?(from))
28
36
  if config.admins.include?(from)
@@ -30,13 +38,14 @@ class SlackSmartBot
30
38
  respond "I'm sorry but there is already a routine with that name.\nCall `see routines` to see added routines", dest
31
39
  else
32
40
  number_time += ":00" if number_time.split(":").size == 2
33
- if (type == "at") && !number_time.match?(/^[01][0-9]:[0-5][0-9]:[0-5][0-9]$/) &&
41
+ if (type != "every") && !number_time.match?(/^[01][0-9]:[0-5][0-9]:[0-5][0-9]$/) &&
34
42
  !number_time.match?(/^2[0-3]:[0-5][0-9]:[0-5][0-9]$/)
35
43
  respond "Wrong time specified: *#{number_time}*"
36
44
  else
37
45
  file_path = ""
38
46
  every = ""
39
47
  at = ""
48
+ dayweek = ''
40
49
  next_run = Time.now
41
50
  case period.downcase
42
51
  when "days", "d"
@@ -52,16 +61,31 @@ class SlackSmartBot
52
61
  every = "#{number_time} seconds"
53
62
  every_in_seconds = number_time.to_i
54
63
  else # time
64
+ if type != 'at'
65
+ dayweek = type.downcase
66
+ days = ['sunday','monday','tuesday','wednesday','thursday','friday','saturday']
67
+ incr = days.index(dayweek) - Time.now.wday
68
+ if incr < 0
69
+ incr = (7+incr)*24*60*60
70
+ else
71
+ incr = incr * 24 * 60 * 60
72
+ end
73
+ days = incr/(24*60*60)
74
+ every_in_seconds = 7 * 24 * 60 * 60 # one week
75
+ else
76
+ days = 0
77
+ every_in_seconds = 24 * 60 * 60 # one day
78
+ end
79
+
55
80
  at = number_time
56
- if next_run.strftime("%H:%M:%S") < number_time
81
+ if next_run.strftime("%H:%M:%S") < number_time and days == 0
57
82
  nt = number_time.split(":")
58
83
  next_run = Time.new(next_run.year, next_run.month, next_run.day, nt[0], nt[1], nt[2])
59
84
  else
60
- next_run += (24 * 60 * 60) # one more day
85
+ next_run += ((24 * 60 * 60) * days) # one or more days
61
86
  nt = number_time.split(":")
62
87
  next_run = Time.new(next_run.year, next_run.month, next_run.day, nt[0], nt[1], nt[2])
63
88
  end
64
- every_in_seconds = 24 * 60 * 60
65
89
  end
66
90
  Dir.mkdir("#{config.path}/routines/#{@channel_id}") unless Dir.exist?("#{config.path}/routines/#{@channel_id}")
67
91
 
@@ -75,12 +99,21 @@ class SlackSmartBot
75
99
  http.get(files[0].url_private_download, save_data: file_path)
76
100
  system("chmod +x #{file_path}")
77
101
  end
78
-
102
+ get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
103
+ channel_id = nil
104
+ if @channels_name.key?(channel) #it is an id
105
+ channel_id = channel
106
+ channel = @channels_name[channel_id]
107
+ elsif @channels_id.key?(channel) #it is a channel name
108
+ channel_id = @channels_id[channel]
109
+ end
110
+
111
+ channel_id = dest if channel_id.to_s == ''
79
112
  @routines[@channel_id] = {} unless @routines.key?(@channel_id)
80
113
  @routines[@channel_id][name] = { channel_name: config.channel, creator: from, creator_id: user.id, status: :on,
81
- every: every, every_in_seconds: every_in_seconds, at: at, file_path: file_path,
114
+ every: every, every_in_seconds: every_in_seconds, at: at, dayweek: dayweek, file_path: file_path,
82
115
  command: command_to_run.to_s.strip, silent: silent,
83
- next_run: next_run.to_s, dest: dest, last_run: "", last_elapsed: "",
116
+ next_run: next_run.to_s, dest: channel_id, last_run: "", last_elapsed: "",
84
117
  running: false }
85
118
  update_routines
86
119
  respond "Added routine *`#{name}`* to the channel", dest
@@ -14,15 +14,11 @@ class SlackSmartBot
14
14
  respond "Only admins can extend the rules. Admins on this channel: #{config.admins}", dest
15
15
  else
16
16
  #todo: add pagination for case more than 1000 channels on the workspace
17
- channels = client.web_client.conversations_list(
18
- types: "private_channel,public_channel",
19
- limit: "1000",
20
- exclude_archived: "true",
21
- ).channels
17
+ channels = get_channels()
22
18
 
23
19
  channel_found = channels.detect { |c| c.name == channel }
24
20
  get_channels_name_and_id()
25
- members = client.web_client.conversations_members(channel: @channels_id[channel]).members unless channel_found.nil?
21
+ members = get_channel_members(@channels_id[channel]) unless channel_found.nil?
26
22
  get_bots_created()
27
23
  channels_in_use = []
28
24
  @bots_created.each do |k, v|
@@ -39,7 +35,7 @@ class SlackSmartBot
39
35
  elsif !members.include?(user.id)
40
36
  respond "You need to join that channel first", dest
41
37
  elsif !members.include?(config[:nick_id])
42
- respond "You need to add first to the channel the smart bot user: #{config[:nick]}", dest
38
+ respond "You need to add first to the channel the smart bot user: <@#{config[:nick_id]}>", dest
43
39
  else
44
40
  channels_in_use.each do |channel_in_use|
45
41
  respond "The rules from channel <##{@channels_id[channel_in_use]}> are already in use on that channel", dest
@@ -13,6 +13,7 @@ class SlackSmartBot
13
13
  respond "zZzzzzZzzzzZZZZZZzzzzzzzz", dest
14
14
  @status = :paused
15
15
  @bots_created[@channel_id][:status] = :paused
16
+ update_bots_file()
16
17
  unless config.on_master_bot
17
18
  send_msg_channel config.master_channel, "Changed status on #{config.channel} to :paused"
18
19
  end
@@ -38,12 +38,19 @@ class SlackSmartBot
38
38
  respond "Routines on channel *#{rout_ch.get_values(:channel_name).values.flatten.uniq[0]}*", dest
39
39
  rout_ch.each do |k, v|
40
40
  msg = []
41
- ch != v[:dest] ? directm = " (*DM to #{v[:creator]}*)" : directm = ""
42
- msg << "*`#{k}`*#{directm}"
41
+ if v[:dest][0] == 'D'
42
+ extram = " (*DM to #{v[:creator]}*)"
43
+ elsif v[:dest] != ch
44
+ extram = " (*publish on <##{v[:dest]}>*)"
45
+ else
46
+ extram = ''
47
+ end
48
+ msg << "*`#{k}`*#{extram}"
43
49
  msg << "\tCreator: #{v[:creator]}"
44
50
  msg << "\tStatus: #{v[:status]}"
45
51
  msg << "\tEvery: #{v[:every]}" unless v[:every] == ""
46
52
  msg << "\tAt: #{v[:at]}" unless v[:at] == ""
53
+ msg << "\tOn: #{v[:dayweek]}" unless !v.key?(:dayweek) or v[:dayweek].to_s == ""
47
54
  msg << "\tNext Run: #{v[:next_run]}"
48
55
  msg << "\tLast Run: #{v[:last_run]}"
49
56
  msg << "\tTime consumed on last run: #{v[:last_elapsed]}" unless v[:command] !=''
@@ -12,6 +12,7 @@ class SlackSmartBot
12
12
  respond "This bot is running and listening from now on. You can pause again: pause this bot", dest
13
13
  @status = :on
14
14
  @bots_created[@channel_id][:status] = :on
15
+ update_bots_file()
15
16
  unless config.on_master_bot
16
17
  send_msg_channel config.master_channel, "Changed status on #{config.channel} to :on"
17
18
  end
@@ -3,7 +3,6 @@ class SlackSmartBot
3
3
  # help: `delete repl SESSION_NAME`
4
4
  # help: `delete irb SESSION_NAME`
5
5
  # help: `remove repl SESSION_NAME`
6
- # help:
7
6
  # help: Will delete the specified REPL
8
7
  # help: Only the creator of the REPL or an admin can delete REPLs
9
8
  # help:
@@ -20,6 +19,7 @@ class SlackSmartBot
20
19
  @repls.delete(session_name)
21
20
  update_repls()
22
21
  File.rename("#{config.path}/repl/#{@channel_id}/#{session_name}.input", "#{config.path}/repl/#{@channel_id}/#{session_name}_#{Time.now.strftime("%Y%m%d%H%M%S%N")}.deleted")
22
+ File.delete("#{config.path}/repl/#{@channel_id}/#{session_name}.output") if File.exist?("#{config.path}/repl/#{@channel_id}/#{session_name}.output")
23
23
  File.delete("#{config.path}/repl/#{@channel_id}/#{session_name}.run") if File.exist?("#{config.path}/repl/#{@channel_id}/#{session_name}.run")
24
24
  respond "REPL #{session_name} deleted"
25
25
  else
@@ -2,10 +2,12 @@ class SlackSmartBot
2
2
  # help: ----------------------------------------------
3
3
  # help: `delete shortcut NAME`
4
4
  # help: `delete sc NAME`
5
+ # help: `delete global sc NAME`
5
6
  # help: It will delete the shortcut with the supplied name
7
+ # help: 'global' or 'generic' can only be used on Master channel.
6
8
  # help:
7
9
 
8
- def delete_shortcut(dest, user, shortcut, typem, command)
10
+ def delete_shortcut(dest, user, shortcut, typem, command, global)
9
11
  save_stats(__method__)
10
12
  unless typem == :on_extended
11
13
  from = user.name
@@ -15,32 +17,61 @@ class SlackSmartBot
15
17
  else
16
18
  deleted = false
17
19
 
18
- if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut) and !@shortcuts[from].include?(shortcut)
19
- respond "Only the creator of the shortcut or an admin user can delete it", dest
20
- elsif (@shortcuts.keys.include?(from) and @shortcuts[from].keys.include?(shortcut)) or
21
- (config.admins.include?(from) and @shortcuts[:all].include?(shortcut))
22
- #are you sure? to avoid deleting by mistake
23
- unless @questions.keys.include?(from)
24
- ask("are you sure you want to delete it?", command, from, dest)
20
+ if global
21
+ if !config.on_master_bot or typem != :on_master
22
+ respond "It is only possible to delete global shortcuts from Master channel"
25
23
  else
26
- case @questions[from]
27
- when /^(yes|yep)/i
28
- @questions.delete(from)
29
- respond "shortcut deleted!", dest
30
- respond("#{shortcut}: #{@shortcuts[from][shortcut]}", dest) if @shortcuts.key?(from) and @shortcuts[from].key?(shortcut)
31
- respond("#{shortcut}: #{@shortcuts[:all][shortcut]}", dest) if @shortcuts.key?(:all) and @shortcuts[:all].key?(shortcut)
32
- @shortcuts[from].delete(shortcut) if @shortcuts.key?(from) and @shortcuts[from].key?(shortcut)
33
- @shortcuts[:all].delete(shortcut) if @shortcuts.key?(:all) and @shortcuts[:all].key?(shortcut)
24
+ if !config.admins.include?(from) and @shortcuts_global[:all].include?(shortcut) and
25
+ (!@shortcuts_global.key?(from) or !@shortcuts_global[from].include?(shortcut))
26
+ respond "Only the creator of the shortcut or an admin user can delete it"
27
+ elsif (@shortcuts_global.key?(from) and @shortcuts_global[from].keys.include?(shortcut)) or
28
+ (config.admins.include?(from) and @shortcuts_global[:all].include?(shortcut))
29
+
30
+ respond "global shortcut deleted!", dest
31
+ if @shortcuts_global.key?(from) and @shortcuts_global[from].key?(shortcut)
32
+ respond("#{shortcut}: #{@shortcuts_global[from][shortcut]}", dest)
33
+ elsif @shortcuts_global.key?(:all) and @shortcuts_global[:all].key?(shortcut)
34
+ respond("#{shortcut}: #{@shortcuts_global[:all][shortcut]}", dest)
35
+ end
36
+ @shortcuts_global[from].delete(shortcut) if @shortcuts_global.key?(from) and @shortcuts_global[from].key?(shortcut)
37
+ @shortcuts_global[:all].delete(shortcut) if @shortcuts_global.key?(:all) and @shortcuts_global[:all].key?(shortcut)
34
38
  update_shortcuts_file()
35
- when /^no/i
36
- @questions.delete(from)
37
- respond "ok, I won't delete it", dest
38
39
  else
39
- ask("I don't understand, are you sure you want to delete it? (yes or no)", command, from, dest)
40
+ respond 'shortcut not found'
40
41
  end
41
42
  end
42
43
  else
43
- respond "shortcut not found", dest
44
+ if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut) and
45
+ (!@shortcuts.key?(from) or !@shortcuts[from].include?(shortcut))
46
+ respond "Only the creator of the shortcut or an admin user can delete it", dest
47
+ elsif (@shortcuts.keys.include?(from) and @shortcuts[from].keys.include?(shortcut)) or
48
+ (config.admins.include?(from) and @shortcuts[:all].include?(shortcut))
49
+ #are you sure? to avoid deleting by mistake
50
+ if answer.empty?
51
+ ask("are you sure you want to delete it?", command, from, dest)
52
+ else
53
+ case answer
54
+ when /^(yes|yep)/i
55
+ answer_delete(from)
56
+ respond "shortcut deleted!", dest
57
+ if @shortcuts.key?(from) and @shortcuts[from].key?(shortcut)
58
+ respond("#{shortcut}: #{@shortcuts[from][shortcut]}", dest)
59
+ elsif @shortcuts.key?(:all) and @shortcuts[:all].key?(shortcut)
60
+ respond("#{shortcut}: #{@shortcuts[:all][shortcut]}", dest)
61
+ end
62
+ @shortcuts[from].delete(shortcut) if @shortcuts.key?(from) and @shortcuts[from].key?(shortcut)
63
+ @shortcuts[:all].delete(shortcut) if @shortcuts.key?(:all) and @shortcuts[:all].key?(shortcut)
64
+ update_shortcuts_file()
65
+ when /^no/i
66
+ answer_delete(from)
67
+ respond "ok, I won't delete it", dest
68
+ else
69
+ ask("I don't understand, are you sure you want to delete it? (yes or no)", command, from, dest)
70
+ end
71
+ end
72
+ else
73
+ respond "shortcut not found", dest
74
+ end
44
75
  end
45
76
  end
46
77
  end