slack-smart-bot 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -6
- data/lib/slack-smart-bot.rb +83 -47
- data/lib/slack-smart-bot_rules.rb +1 -1
- data/lib/slack/smart-bot/comm.rb +21 -21
- data/lib/slack/smart-bot/commands/general/bot_help.rb +1 -1
- data/lib/slack/smart-bot/commands/general/bot_status.rb +4 -4
- data/lib/slack/smart-bot/commands/general/stop_using_rules.rb +2 -2
- data/lib/slack/smart-bot/commands/general/use_rules.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/add_shortcut.rb +1 -1
- data/lib/slack/smart-bot/commands/on_bot/admin/add_routine.rb +5 -5
- data/lib/slack/smart-bot/commands/on_bot/admin/extend_rules.rb +4 -4
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_bot.rb +3 -3
- data/lib/slack/smart-bot/commands/on_bot/admin/pause_routine.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/remove_routine.rb +6 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/run_routine.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/see_routines.rb +5 -5
- data/lib/slack/smart-bot/commands/on_bot/admin/start_bot.rb +3 -3
- data/lib/slack/smart-bot/commands/on_bot/admin/start_routine.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/admin/stop_using_rules_on.rb +3 -3
- data/lib/slack/smart-bot/commands/on_bot/delete_shortcut.rb +2 -2
- data/lib/slack/smart-bot/commands/on_bot/ruby_code.rb +1 -1
- data/lib/slack/smart-bot/commands/on_extended/bot_rules.rb +2 -2
- data/lib/slack/smart-bot/commands/on_master/admin/kill_bot_on_channel.rb +1 -1
- data/lib/slack/smart-bot/commands/on_master/admin_master/exit_bot.rb +9 -3
- data/lib/slack/smart-bot/commands/on_master/admin_master/notify_message.rb +3 -3
- data/lib/slack/smart-bot/commands/on_master/create_bot.rb +11 -11
- data/lib/slack/smart-bot/listen.rb +1 -1
- data/lib/slack/smart-bot/process_first.rb +16 -10
- data/lib/slack/smart-bot/treat_message.rb +13 -13
- data/lib/slack/smart-bot/utils.rb +20 -16
- 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: bc5284b6978388549e27e9f7e438064e0eb36dbe6528363e966cb024d5cad4e7
|
4
|
+
data.tar.gz: a3dea56debef65e4e9cd3b3e2733571721fa8e370ad97026dfe35f9836f4f285
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2b70ce96e94bf8b27e03694becf8abb7c7bec14a130c6d887bddc8db65f3ec638197603798130056cdce4e30ca3b211317134a363035680fa547b83fcd30a1d
|
7
|
+
data.tar.gz: 376585b302cd52381fed5539c4fc00d75f3d93c7c530d042bdf73ee6acf3e8c1a07623a57c1823de38b3b7a9ee4be5063401caecebe17efa2f0e84b4543500fd
|
data/README.md
CHANGED
@@ -39,14 +39,13 @@ After you install it you will need just a couple of things to configure it.
|
|
39
39
|
Create a file like this on the folder you want:
|
40
40
|
|
41
41
|
```ruby
|
42
|
-
# the channel that will act like the master channel, main channel
|
43
|
-
MASTER_CHANNEL="my_master_channel"
|
44
|
-
#names of the master users
|
45
|
-
MASTER_USERS=["mario"]
|
46
42
|
|
47
43
|
require 'slack-smart-bot'
|
48
44
|
|
49
45
|
settings = {
|
46
|
+
# the channel that will act like the master channel, main channel
|
47
|
+
master_channel: 'my_master_channel',
|
48
|
+
masters: ["mario"], #names of the master users
|
50
49
|
nick: 'smart-bot', # the smart bot name
|
51
50
|
token: 'xxxxxxxxxxxxxxxxxx' # the API Slack token
|
52
51
|
}
|
@@ -56,9 +55,9 @@ SlackSmartBot.new(settings).listen
|
|
56
55
|
|
57
56
|
```
|
58
57
|
|
59
|
-
The
|
58
|
+
The master_channel will be the channel where you will be able to create other bots and will have special treatment.
|
60
59
|
|
61
|
-
The
|
60
|
+
The masters will have full access to everything. You need to use the slack user name defined on https://YOUR_WORK_SPACE.slack.com/account/settings#username.
|
62
61
|
|
63
62
|
For the token remember you need to generate a token on the Slack web for the bot user.
|
64
63
|
|
data/lib/slack-smart-bot.rb
CHANGED
@@ -16,29 +16,7 @@ require_relative "slack/smart-bot/process_first"
|
|
16
16
|
require_relative "slack/smart-bot/process"
|
17
17
|
require_relative "slack/smart-bot/utils"
|
18
18
|
|
19
|
-
|
20
|
-
unless TESTING_SLACK_SMART_BOT
|
21
|
-
if ARGV.size == 0
|
22
|
-
CHANNEL = MASTER_CHANNEL
|
23
|
-
ON_MASTER_BOT = true
|
24
|
-
ADMIN_USERS = MASTER_USERS
|
25
|
-
RULES_FILE = "#{$0.gsub(".rb", "_rules.rb")}" unless defined?(RULES_FILE)
|
26
|
-
unless File.exist?(RULES_FILE)
|
27
|
-
default_rules = (__FILE__).gsub(/\.rb$/, "_rules.rb")
|
28
|
-
FileUtils.copy_file(default_rules, RULES_FILE)
|
29
|
-
end
|
30
|
-
STATUS_INIT = :on
|
31
|
-
SHORTCUTS_FILE = "slack-smart-bot_shortcuts_#{CHANNEL}.rb".gsub(" ", "_")
|
32
|
-
else
|
33
|
-
ON_MASTER_BOT = false
|
34
|
-
CHANNEL = ARGV[0]
|
35
|
-
ADMIN_USERS = ARGV[1].split(",")
|
36
|
-
RULES_FILE = ARGV[2]
|
37
|
-
STATUS_INIT = ARGV[3].to_sym
|
38
|
-
SHORTCUTS_FILE = "slack-smart-bot_shortcuts_#{CHANNEL}.rb".gsub(" ", "_")
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
19
|
+
ADMIN_USERS = MASTER_USERS if defined?(MASTER_USERS) # for bg compatibility
|
42
20
|
class SlackSmartBot
|
43
21
|
attr_accessor :config, :client
|
44
22
|
attr_reader :master_bot_id, :channel_id
|
@@ -51,22 +29,80 @@ class SlackSmartBot
|
|
51
29
|
VERSION = version
|
52
30
|
|
53
31
|
def initialize(config)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
config_log = config.dup
|
60
|
-
config_log.delete(:token)
|
32
|
+
if config.key?(:path) and config[:path] != ''
|
33
|
+
config.path.chop! if config.path[-1]=="/"
|
34
|
+
else
|
35
|
+
config[:path] = '.'
|
36
|
+
end
|
61
37
|
config[:silent] = false unless config.key?(:silent)
|
62
38
|
config[:testing] = false unless config.key?(:testing)
|
63
39
|
config[:simulate] = false unless config.key?(:simulate)
|
40
|
+
if config.path.to_s!='' and config.file.to_s==''
|
41
|
+
config.file = File.basename($0)
|
42
|
+
end
|
43
|
+
if config.key?(:file) and config.file!=''
|
44
|
+
config.file_path = "#{config.path}/#{config.file}"
|
45
|
+
else
|
46
|
+
config.file_path = $0
|
47
|
+
config.file = File.basename(config.file_path)
|
48
|
+
config.path = File.dirname(config.file_path)
|
49
|
+
end
|
50
|
+
Dir.mkdir("#{config.path}/logs") unless Dir.exist?("#{config.path}/logs")
|
51
|
+
Dir.mkdir("#{config.path}/shortcuts") unless Dir.exist?("#{config.path}/shortcuts")
|
52
|
+
Dir.mkdir("#{config.path}/routines") unless Dir.exist?("#{config.path}/routines")
|
53
|
+
|
54
|
+
config.masters = MASTER_USERS if config.masters.to_s=='' and defined?(MASTER_USERS)
|
55
|
+
config.master_channel = MASTER_CHANNEL if config.master_channel.to_s=='' and defined?(MASTER_CHANNEL)
|
56
|
+
|
57
|
+
if ARGV.size == 0 or (config.file.to_s!='' and config.file.to_s!=File.basename($0))
|
58
|
+
config.rules_file = "#{config.file.gsub(".rb", "_rules.rb")}" unless config.rules_file.to_s!=''
|
59
|
+
unless File.exist?(config.path + '/' + config.rules_file)
|
60
|
+
default_rules = (__FILE__).gsub(/\.rb$/, "_rules.rb")
|
61
|
+
FileUtils.copy_file(default_rules, config.path + '/' + config.rules_file)
|
62
|
+
end
|
63
|
+
config.admins = config.masters unless config.admins.to_s!=''
|
64
|
+
config.channel = config.master_channel unless config.channel.to_s!=''
|
65
|
+
config.status_init = :on unless config.status_init.to_s!=''
|
66
|
+
else
|
67
|
+
config.rules_file = ARGV[2]
|
68
|
+
config.admins = ARGV[1].split(",")
|
69
|
+
config.channel = ARGV[0]
|
70
|
+
config.status_init = ARGV[3].to_sym
|
71
|
+
end
|
72
|
+
config.rules_file[0]='' if config.rules_file[0]=='.'
|
73
|
+
config.rules_file='/'+config.rules_file if config.rules_file[0]!='/'
|
74
|
+
|
75
|
+
config.shortcuts_file = "slack-smart-bot_shortcuts_#{config.channel}.rb".gsub(" ", "_")
|
76
|
+
if config.channel == config.master_channel
|
77
|
+
config.on_master_bot = true
|
78
|
+
config.start_bots = true unless config.key?(:start_bots)
|
79
|
+
else
|
80
|
+
config.on_master_bot = false
|
81
|
+
end
|
82
|
+
|
83
|
+
if !config.key?(:token) or config.token.to_s == ''
|
84
|
+
abort "You need to supply a valid token key on the settings. key: :token"
|
85
|
+
elsif !config.key?(:masters) or !config.masters.is_a?(Array) or config.masters.size == 0
|
86
|
+
abort "You need to supply a masters array on the settings containing the user names of the master admins. key: :masters"
|
87
|
+
elsif !config.key?(:master_channel) or config.master_channel.to_s == ''
|
88
|
+
abort "You need to supply a master_channel on the settings. key: :master_channel"
|
89
|
+
elsif !config.key?(:channel) or config.channel.to_s == ''
|
90
|
+
abort "You need to supply a bot channel name on the settings. key: :channel"
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
logfile = File.basename(config.rules_file.gsub("_rules_", "_logs_"), ".rb") + ".log"
|
96
|
+
@logger = Logger.new("#{config.path}/logs/#{logfile}")
|
97
|
+
@logger.info ARGV.inspect #Jal
|
98
|
+
|
99
|
+
config_log = config.dup
|
100
|
+
config_log.delete(:token)
|
64
101
|
@logger.info "Initializing bot: #{config_log.inspect}"
|
65
102
|
|
66
|
-
File.new("
|
67
|
-
File.new("
|
103
|
+
File.new("#{config.path}/buffer.log", "w") if config[:testing] and config.on_master_bot
|
104
|
+
File.new("#{config.path}/buffer_complete.log", "w") if config[:simulate] and config.on_master_bot
|
68
105
|
|
69
|
-
config[:channel] = CHANNEL
|
70
106
|
self.config = config
|
71
107
|
|
72
108
|
Slack.configure do |conf|
|
@@ -101,8 +137,8 @@ class SlackSmartBot
|
|
101
137
|
@rules_imported = Hash.new()
|
102
138
|
@routines = Hash.new()
|
103
139
|
|
104
|
-
if File.exist?("
|
105
|
-
file_sc = IO.readlines("
|
140
|
+
if File.exist?("#{config.path}/shortcuts/#{config.shortcuts_file}")
|
141
|
+
file_sc = IO.readlines("#{config.path}/shortcuts/#{config.shortcuts_file}").join
|
106
142
|
unless file_sc.to_s() == ""
|
107
143
|
@shortcuts = eval(file_sc)
|
108
144
|
end
|
@@ -110,14 +146,14 @@ class SlackSmartBot
|
|
110
146
|
|
111
147
|
get_routines()
|
112
148
|
|
113
|
-
if
|
149
|
+
if config.on_master_bot and File.exist?(config.file_path.gsub(".rb", "_bots.rb"))
|
114
150
|
get_bots_created()
|
115
|
-
if @bots_created.kind_of?(Hash)
|
151
|
+
if @bots_created.kind_of?(Hash) and config.start_bots
|
116
152
|
@bots_created.each { |key, value|
|
117
153
|
if !value.key?(:cloud) or (value.key?(:cloud) and value[:cloud] == false)
|
118
|
-
@logger.info "ruby #{
|
154
|
+
@logger.info "ruby #{config.file_path} \"#{value[:channel_name]}\" \"#{value[:admins]}\" \"#{value[:rules_file]}\" #{value[:status].to_sym}"
|
119
155
|
t = Thread.new do
|
120
|
-
`ruby #{
|
156
|
+
`ruby #{config.file_path} \"#{value[:channel_name]}\" \"#{value[:admins]}\" \"#{value[:rules_file]}\" #{value[:status].to_sym}`
|
121
157
|
end
|
122
158
|
value[:thread] = t
|
123
159
|
end
|
@@ -126,8 +162,8 @@ class SlackSmartBot
|
|
126
162
|
end
|
127
163
|
|
128
164
|
# rules imported only for DM
|
129
|
-
if
|
130
|
-
file_conf = IO.readlines("
|
165
|
+
if config.on_master_bot and File.exist?("#{config.path}/rules/rules_imported.rb")
|
166
|
+
file_conf = IO.readlines("#{config.path}/rules/rules_imported.rb").join
|
131
167
|
unless file_conf.to_s() == ""
|
132
168
|
@rules_imported = eval(file_conf)
|
133
169
|
end
|
@@ -146,7 +182,7 @@ class SlackSmartBot
|
|
146
182
|
|
147
183
|
begin
|
148
184
|
@admin_users_id = []
|
149
|
-
|
185
|
+
config.admins.each do |au|
|
150
186
|
user_info = client.web_client.users_info(user: "@#{au}")
|
151
187
|
@admin_users_id << user_info.user.id
|
152
188
|
end
|
@@ -154,7 +190,7 @@ class SlackSmartBot
|
|
154
190
|
@logger.fatal "TooManyRequestsError"
|
155
191
|
abort("TooManyRequestsError please re run the bot and be sure of executing first: killall ruby")
|
156
192
|
rescue Exception => stack
|
157
|
-
abort("The admin user specified on settings: #{
|
193
|
+
abort("The admin user specified on settings: #{config.admins.join(", ")}, doesn't exist on Slack. Execution aborted")
|
158
194
|
end
|
159
195
|
|
160
196
|
client.on :hello do
|
@@ -172,20 +208,20 @@ class SlackSmartBot
|
|
172
208
|
end
|
173
209
|
@routines.each do |ch, rout|
|
174
210
|
rout.each do |k, v|
|
175
|
-
if !v[:running] and v[:channel_name] ==
|
211
|
+
if !v[:running] and v[:channel_name] == config.channel
|
176
212
|
create_routine_thread(k)
|
177
213
|
end
|
178
214
|
end
|
179
215
|
end
|
180
216
|
end
|
181
217
|
|
182
|
-
@status =
|
218
|
+
@status = config.status_init
|
183
219
|
@questions = Hash.new()
|
184
220
|
@channels_id = Hash.new()
|
185
221
|
@channels_name = Hash.new()
|
186
222
|
get_channels_name_and_id()
|
187
|
-
@channel_id = @channels_id[
|
188
|
-
@master_bot_id = @channels_id[
|
223
|
+
@channel_id = @channels_id[config.channel].dup
|
224
|
+
@master_bot_id = @channels_id[config.master_channel].dup
|
189
225
|
|
190
226
|
get_routines()
|
191
227
|
if @routines.key?(@channel_id)
|
@@ -124,6 +124,6 @@ def rules(user, command, processed, dest, files = [], rules_file = "")
|
|
124
124
|
end
|
125
125
|
rescue => exception
|
126
126
|
@logger.fatal exception
|
127
|
-
respond "Unexpected error!! Please contact an admin to solve it: <@#{
|
127
|
+
respond "Unexpected error!! Please contact an admin to solve it: <@#{config.admins.join(">, <@")}>"
|
128
128
|
end
|
129
129
|
end
|
data/lib/slack/smart-bot/comm.rb
CHANGED
@@ -7,27 +7,27 @@ class SlackSmartBot
|
|
7
7
|
|
8
8
|
if dest.nil?
|
9
9
|
if config[:simulate]
|
10
|
-
open("
|
10
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
11
11
|
f.puts "|#{@channel_id}|#{config[:nick_id]}|#{msg}$$$"
|
12
12
|
}
|
13
13
|
else
|
14
14
|
client.message(channel: @channel_id, text: msg, as_user: true)
|
15
15
|
end
|
16
|
-
if config[:testing] and
|
17
|
-
open("
|
16
|
+
if config[:testing] and config.on_master_bot
|
17
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
18
18
|
f.puts "|#{@channel_id}|#{config[:nick_id]}|#{msg}"
|
19
19
|
}
|
20
20
|
end
|
21
21
|
elsif dest[0] == "C" or dest[0] == "G" # channel
|
22
22
|
if config[:simulate]
|
23
|
-
open("
|
23
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
24
24
|
f.puts "|#{dest}|#{config[:nick_id]}|#{msg}$$$"
|
25
25
|
}
|
26
26
|
else
|
27
27
|
client.message(channel: dest, text: msg, as_user: true)
|
28
28
|
end
|
29
|
-
if config[:testing] and
|
30
|
-
open("
|
29
|
+
if config[:testing] and config.on_master_bot
|
30
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
31
31
|
f.puts "|#{dest}|#{config[:nick_id]}|#{msg}"
|
32
32
|
}
|
33
33
|
end
|
@@ -69,27 +69,27 @@ class SlackSmartBot
|
|
69
69
|
message = "#{to}: #{question}"
|
70
70
|
if dest.nil?
|
71
71
|
if config[:simulate]
|
72
|
-
open("
|
72
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
73
73
|
f.puts "|#{@channel_id}|#{config[:nick_id]}|#{message}$$$"
|
74
74
|
}
|
75
75
|
else
|
76
76
|
client.message(channel: @channel_id, text: message, as_user: true)
|
77
77
|
end
|
78
|
-
if config[:testing] and
|
79
|
-
open("
|
78
|
+
if config[:testing] and config.on_master_bot
|
79
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
80
80
|
f.puts "|#{@channel_id}|#{config[:nick_id]}|#{message}"
|
81
81
|
}
|
82
82
|
end
|
83
83
|
elsif dest[0] == "C" or dest[0] == "G" # channel
|
84
84
|
if config[:simulate]
|
85
|
-
open("
|
85
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
86
86
|
f.puts "|#{dest}|#{config[:nick_id]}|#{message}$$$"
|
87
87
|
}
|
88
88
|
else
|
89
89
|
client.message(channel: dest, text: message, as_user: true)
|
90
90
|
end
|
91
|
-
if config[:testing] and
|
92
|
-
open("
|
91
|
+
if config[:testing] and config.on_master_bot
|
92
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
93
93
|
f.puts "|#{dest}|#{config[:nick_id]}|#{message}"
|
94
94
|
}
|
95
95
|
end
|
@@ -112,14 +112,14 @@ class SlackSmartBot
|
|
112
112
|
@logger.fatal "Channel: #{to} not found. Message: #{msg}"
|
113
113
|
end
|
114
114
|
if config[:simulate]
|
115
|
-
open("
|
115
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
116
116
|
f.puts "|#{to}|#{config[:nick_id]}|#{msg}$$$"
|
117
117
|
}
|
118
118
|
else
|
119
119
|
client.message(channel: channel_id, text: msg, as_user: true)
|
120
120
|
end
|
121
|
-
if config[:testing] and
|
122
|
-
open("
|
121
|
+
if config[:testing] and config.on_master_bot
|
122
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
123
123
|
f.puts "|#{to}|#{config[:nick_id]}|#{msg}"
|
124
124
|
}
|
125
125
|
end
|
@@ -131,28 +131,28 @@ class SlackSmartBot
|
|
131
131
|
unless msg == ""
|
132
132
|
if id_user[0] == "D"
|
133
133
|
if config[:simulate]
|
134
|
-
open("
|
134
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
135
135
|
f.puts "|#{id_user}|#{config[:nick_id]}|#{msg}$$$"
|
136
136
|
}
|
137
137
|
else
|
138
138
|
client.message(channel: id_user, as_user: true, text: msg)
|
139
139
|
end
|
140
|
-
if config[:testing] and
|
141
|
-
open("
|
140
|
+
if config[:testing] and config.on_master_bot
|
141
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
142
142
|
f.puts "|#{id_user}|#{config[:nick_id]}|#{msg}"
|
143
143
|
}
|
144
144
|
end
|
145
145
|
else
|
146
146
|
im = client.web_client.im_open(user: id_user)
|
147
147
|
if config[:simulate]
|
148
|
-
open("
|
148
|
+
open("#{config.path}/buffer_complete.log", "a") { |f|
|
149
149
|
f.puts "|#{im["channel"]["id"]}|#{config[:nick_id]}|#{msg}$$$"
|
150
150
|
}
|
151
151
|
else
|
152
152
|
client.message(channel: im["channel"]["id"], as_user: true, text: msg)
|
153
153
|
end
|
154
|
-
if config[:testing] and
|
155
|
-
open("
|
154
|
+
if config[:testing] and config.on_master_bot
|
155
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
156
156
|
f.puts "|#{im["channel"]["id"]}|#{config[:nick_id]}|#{msg}"
|
157
157
|
}
|
158
158
|
end
|
@@ -53,7 +53,7 @@ class SlackSmartBot
|
|
53
53
|
if specific
|
54
54
|
unless rules_file.empty?
|
55
55
|
begin
|
56
|
-
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
56
|
+
eval(File.new(config.path + rules_file).read) if File.exist?(config.path + rules_file)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
if defined?(git_project) && (git_project.to_s != "") && (help_message_rules != "") && (help_command.to_s == "")
|
@@ -14,10 +14,10 @@ class SlackSmartBot
|
|
14
14
|
end
|
15
15
|
require "socket"
|
16
16
|
ip_address = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address
|
17
|
-
respond "*#{Socket.gethostname} (#{ip_address})*\n\tStatus: #{@status}.\n\tVersion: #{VERSION}.#{version_message}\n\tRules file: #{File.basename
|
17
|
+
respond "*#{Socket.gethostname} (#{ip_address})*\n\tStatus: #{@status}.\n\tVersion: #{VERSION}.#{version_message}\n\tRules file: #{File.basename config.rules_file}\n\tExtended: #{@bots_created[@channel_id][:extended] unless config.on_master_bot}\n\tAdmins: #{config.admins}\n\tBot time: #{Time.now}", dest
|
18
18
|
if @status == :on
|
19
19
|
respond "I'm listening to [#{@listening.join(", ")}]", dest
|
20
|
-
if
|
20
|
+
if config.on_master_bot and config.admins.include?(from)
|
21
21
|
sleep 5
|
22
22
|
@bots_created.each do |k, v|
|
23
23
|
msg = []
|
@@ -29,8 +29,8 @@ class SlackSmartBot
|
|
29
29
|
msg << "\trules: #{v[:rules_file]}"
|
30
30
|
msg << "\textended: #{v[:extended]}"
|
31
31
|
msg << "\tcloud: #{v[:cloud]}"
|
32
|
-
if
|
33
|
-
msg << "\trunner: `ruby #{
|
32
|
+
if config.on_master_bot and v.key?(:cloud) and v[:cloud]
|
33
|
+
msg << "\trunner: `ruby #{config.file} \"#{v[:channel_name]}\" \"#{v[:admins]}\" \"#{v[:rules_file]}\" on&`"
|
34
34
|
end
|
35
35
|
respond msg.join("\n"), dest
|
36
36
|
end
|
@@ -15,7 +15,7 @@ class SlackSmartBot
|
|
15
15
|
respond "You are not using those rules.", dest
|
16
16
|
else
|
17
17
|
@rules_imported[user.id].delete(dchannel)
|
18
|
-
update_rules_imported() if
|
18
|
+
update_rules_imported() if config.on_master_bot
|
19
19
|
respond "You won't be using those rules from now on.", dest
|
20
20
|
|
21
21
|
def git_project() "" end
|
@@ -30,7 +30,7 @@ class SlackSmartBot
|
|
30
30
|
respond "You are not using those rules.", dest
|
31
31
|
else
|
32
32
|
@rules_imported[user.id].delete(user.id)
|
33
|
-
update_rules_imported() if
|
33
|
+
update_rules_imported() if config.on_master_bot
|
34
34
|
respond "You won't be using those rules from now on.", dest
|
35
35
|
|
36
36
|
def git_project() "" end
|
@@ -21,7 +21,7 @@ class SlackSmartBot
|
|
21
21
|
|
22
22
|
if channel_found.nil?
|
23
23
|
respond "The channel you are trying to use doesn't exist", dest
|
24
|
-
elsif channel_found.name ==
|
24
|
+
elsif channel_found.name == config.master_channel
|
25
25
|
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
26
26
|
elsif !@bots_created.key?(@channels_id[channel])
|
27
27
|
respond "There is no bot running on that channel.", dest
|
@@ -35,7 +35,7 @@ class SlackSmartBot
|
|
35
35
|
else
|
36
36
|
@rules_imported[user.id][user.id] = channel_found.id
|
37
37
|
end
|
38
|
-
update_rules_imported() if
|
38
|
+
update_rules_imported() if config.on_master_bot
|
39
39
|
respond "I'm using now the rules from <##{channel_found.id}>", dest
|
40
40
|
|
41
41
|
def git_project() "" end
|
@@ -28,7 +28,7 @@ class SlackSmartBot
|
|
28
28
|
end
|
29
29
|
}
|
30
30
|
end
|
31
|
-
if !
|
31
|
+
if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut_name) and !@shortcuts[from].include?(shortcut_name)
|
32
32
|
respond "Only the creator of the shortcut can modify it", dest
|
33
33
|
elsif found_other
|
34
34
|
respond "You cannot create a shortcut for all with the same name than other user is using", dest
|
@@ -19,8 +19,8 @@ class SlackSmartBot
|
|
19
19
|
# helpadmin: _add routine example at 17:05 ruby puts 'a'_
|
20
20
|
# helpadmin:
|
21
21
|
def add_routine(dest, from, user, name, type, number_time, period, command_to_run, files)
|
22
|
-
if files.nil? or files.size == 0 or (files.size > 0 and
|
23
|
-
if
|
22
|
+
if files.nil? or files.size == 0 or (files.size > 0 and config.masters.include?(from))
|
23
|
+
if config.admins.include?(from)
|
24
24
|
if @routines.key?(@channel_id) && @routines[@channel_id].key?(name)
|
25
25
|
respond "I'm sorry but there is already a routine with that name.\nCall `see routines` to see added routines", dest
|
26
26
|
else
|
@@ -58,18 +58,18 @@ class SlackSmartBot
|
|
58
58
|
end
|
59
59
|
every_in_seconds = 24 * 60 * 60
|
60
60
|
end
|
61
|
-
Dir.mkdir("
|
61
|
+
Dir.mkdir("#{config.path}/routines/#{@channel_id}") unless Dir.exist?("#{config.path}/routines/#{@channel_id}")
|
62
62
|
|
63
63
|
if !files.nil? && (files.size == 1)
|
64
64
|
@logger.info files[0].inspect if config.testing
|
65
|
-
file_path = "
|
65
|
+
file_path = "#{config.path}/routines/#{@channel_id}/#{name}#{files[0].name.scan(/[^\.]+(\.\w+$)/).join}"
|
66
66
|
http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config[:token]}" }, log_headers: :partial)
|
67
67
|
http.get(files[0].url_private_download, save_data: file_path)
|
68
68
|
system("chmod +x #{file_path}")
|
69
69
|
end
|
70
70
|
|
71
71
|
@routines[@channel_id] = {} unless @routines.key?(@channel_id)
|
72
|
-
@routines[@channel_id][name] = { channel_name:
|
72
|
+
@routines[@channel_id][name] = { channel_name: config.channel, creator: from, creator_id: user.id, status: :on,
|
73
73
|
every: every, every_in_seconds: every_in_seconds, at: at, file_path: file_path, command: command_to_run.to_s.strip,
|
74
74
|
next_run: next_run.to_s, dest: dest, last_run: "", last_elapsed: "", running: false }
|
75
75
|
update_routines
|
@@ -7,10 +7,10 @@ class SlackSmartBot
|
|
7
7
|
# helpadmin:
|
8
8
|
def extend_rules(dest, user, from, channel, typem)
|
9
9
|
unless typem == :on_extended
|
10
|
-
if
|
10
|
+
if config.on_master_bot
|
11
11
|
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
12
|
-
elsif !
|
13
|
-
respond "Only admins can extend the rules. Admins on this channel: #{
|
12
|
+
elsif !config.admins.include?(from) #not admin
|
13
|
+
respond "Only admins can extend the rules. Admins on this channel: #{config.admins}", dest
|
14
14
|
else
|
15
15
|
#todo: add pagination for case more than 1000 channels on the workspace
|
16
16
|
channels = client.web_client.conversations_list(
|
@@ -47,7 +47,7 @@ class SlackSmartBot
|
|
47
47
|
@bots_created[@channel_id][:extended] = [] unless @bots_created[@channel_id].key?(:extended)
|
48
48
|
@bots_created[@channel_id][:extended] << channel
|
49
49
|
update_bots_file()
|
50
|
-
respond "<@#{user.id}> extended the rules from #{
|
50
|
+
respond "<@#{user.id}> extended the rules from #{config.channel} to be used on #{channel}.", @master_bot_id
|
51
51
|
if @channels_id[channel][0] == "G"
|
52
52
|
respond "Now the rules from <##{@channel_id}> are available on *#{channel}*", dest
|
53
53
|
else
|
@@ -7,12 +7,12 @@ class SlackSmartBot
|
|
7
7
|
# helpadmin: You can use this command only if you are an admin user
|
8
8
|
# helpadmin:
|
9
9
|
def pause_bot(dest, from)
|
10
|
-
if
|
10
|
+
if config.admins.include?(from) #admin user
|
11
11
|
respond "This bot is paused from now on. You can start it again: start this bot", dest
|
12
12
|
respond "zZzzzzZzzzzZZZZZZzzzzzzzz", dest
|
13
13
|
@status = :paused
|
14
|
-
unless
|
15
|
-
send_msg_channel
|
14
|
+
unless config.on_master_bot
|
15
|
+
send_msg_channel config.master_channel, "Changed status on #{config.channel} to :paused"
|
16
16
|
end
|
17
17
|
else
|
18
18
|
respond "Only admin users can put me on pause", dest
|
@@ -8,8 +8,8 @@ class SlackSmartBot
|
|
8
8
|
# helpadmin: _pause routine example_
|
9
9
|
# helpadmin:
|
10
10
|
def pause_routine(dest, from, name)
|
11
|
-
if
|
12
|
-
if !
|
11
|
+
if config.admins.include?(from) #admin user
|
12
|
+
if !config.on_master_bot and dest[0] == "D"
|
13
13
|
respond "It's only possible to pause routines from MASTER channel from a direct message with the bot.", dest
|
14
14
|
elsif @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
15
15
|
@routines[@channel_id][name][:status] = :paused
|
@@ -11,12 +11,15 @@ class SlackSmartBot
|
|
11
11
|
# helpadmin: _kill routine example_
|
12
12
|
# helpadmin:
|
13
13
|
def remove_routine(dest, from, name)
|
14
|
-
|
15
|
-
|
14
|
+
@logger.info "Start:#{Time.now}"
|
15
|
+
if config.admins.include?(from) #admin user
|
16
|
+
if !config.on_master_bot and dest[0] == "D"
|
16
17
|
respond "It's only possible to remove routines from MASTER channel from a direct message with the bot.", dest
|
17
18
|
elsif @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
18
19
|
@routines[@channel_id].delete(name)
|
20
|
+
@logger.info "Cont:#{Time.now}"
|
19
21
|
update_routines()
|
22
|
+
@logger.info "end:#{Time.now}"
|
20
23
|
respond "The routine *`#{name}`* has been removed.", dest
|
21
24
|
else
|
22
25
|
respond "There isn't a routine with that name: *`#{name}`*.\nCall `see routines` to see added routines", dest
|
@@ -24,5 +27,6 @@ class SlackSmartBot
|
|
24
27
|
else
|
25
28
|
respond "Only admin users can delete routines", dest
|
26
29
|
end
|
30
|
+
@logger.info "fin:#{Time.now}"
|
27
31
|
end
|
28
32
|
end
|
@@ -11,8 +11,8 @@ class SlackSmartBot
|
|
11
11
|
# helpadmin:
|
12
12
|
|
13
13
|
def run_routine(dest, from, name)
|
14
|
-
if
|
15
|
-
if !
|
14
|
+
if config.admins.include?(from) #admin user
|
15
|
+
if !config.on_master_bot and dest[0] == "D"
|
16
16
|
respond "It's only possible to run routines from MASTER channel from a direct message with the bot.", dest
|
17
17
|
elsif @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
18
18
|
if @routines[@channel_id][name][:file_path] != ""
|
@@ -7,11 +7,11 @@ class SlackSmartBot
|
|
7
7
|
# helpadmin: You can use this command only if you are an admin user
|
8
8
|
# helpadmin:
|
9
9
|
def see_routines(dest, from, user, all)
|
10
|
-
if
|
10
|
+
if config.admins.include?(from) #admin user
|
11
11
|
if all
|
12
12
|
routines = {}
|
13
|
-
if
|
14
|
-
Dir["
|
13
|
+
if config.on_master_bot
|
14
|
+
Dir["#{config.path}/routines/routines_*.rb"].each do |rout|
|
15
15
|
file_conf = IO.readlines(rout).join
|
16
16
|
unless file_conf.to_s() == ""
|
17
17
|
routines.merge!(eval(file_conf))
|
@@ -23,7 +23,7 @@ class SlackSmartBot
|
|
23
23
|
end
|
24
24
|
else
|
25
25
|
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and dest[0] == "D"
|
26
|
-
file_conf = IO.readlines("
|
26
|
+
file_conf = IO.readlines("#{config.path}/routines/routines_#{@rules_imported[user.id][user.id]}.rb").join
|
27
27
|
routines = eval(file_conf)
|
28
28
|
else
|
29
29
|
routines = @routines.deep_copy
|
@@ -46,7 +46,7 @@ class SlackSmartBot
|
|
46
46
|
msg << "\tNext Run: #{v[:next_run]}"
|
47
47
|
msg << "\tLast Run: #{v[:last_run]}"
|
48
48
|
msg << "\tTime consumed on last run: #{v[:last_elapsed]}" unless v[:command] !=''
|
49
|
-
msg << "\tCommand: #{v[:command]}" unless v[:command] == ''
|
49
|
+
msg << "\tCommand: #{v[:command]}" unless v[:command].to_s.strip == ''
|
50
50
|
msg << "\tFile: #{v[:file_path]}" unless v[:file_path] == ''
|
51
51
|
respond msg.join("\n"), dest
|
52
52
|
end
|
@@ -7,11 +7,11 @@ class SlackSmartBot
|
|
7
7
|
# helpadmin: You can use this command only if you are an admin user
|
8
8
|
# helpadmin:
|
9
9
|
def start_bot(dest, from)
|
10
|
-
if
|
10
|
+
if config.admins.include?(from) #admin user
|
11
11
|
respond "This bot is running and listening from now on. You can pause again: pause this bot", dest
|
12
12
|
@status = :on
|
13
|
-
unless
|
14
|
-
send_msg_channel
|
13
|
+
unless config.on_master_bot
|
14
|
+
send_msg_channel config.master_channel, "Changed status on #{config.channel} to :on"
|
15
15
|
end
|
16
16
|
else
|
17
17
|
respond "Only admin users can change my status", dest
|
@@ -10,8 +10,8 @@ class SlackSmartBot
|
|
10
10
|
# helpadmin:
|
11
11
|
|
12
12
|
def start_routine(dest, from, name)
|
13
|
-
if
|
14
|
-
if !
|
13
|
+
if config.admins.include?(from) #admin user
|
14
|
+
if !config.on_master_bot and dest[0] == "D"
|
15
15
|
respond "It's only possible to start routines from MASTER channel from a direct message with the bot.", dest
|
16
16
|
elsif @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
17
17
|
@routines[@channel_id][name][:status] = :on
|
@@ -7,14 +7,14 @@ class SlackSmartBot
|
|
7
7
|
|
8
8
|
def stop_using_rules_on(dest, user, from, channel, typem)
|
9
9
|
unless typem == :on_extended
|
10
|
-
if !
|
11
|
-
respond "Only admins can extend or stop using the rules. Admins on this channel: #{
|
10
|
+
if !config.admins.include?(from) #not admin
|
11
|
+
respond "Only admins can extend or stop using the rules. Admins on this channel: #{config.admins}", dest
|
12
12
|
else
|
13
13
|
get_bots_created()
|
14
14
|
if @bots_created[@channel_id][:extended].include?(channel)
|
15
15
|
@bots_created[@channel_id][:extended].delete(channel)
|
16
16
|
update_bots_file()
|
17
|
-
respond "<@#{user.id}> removed the access to the rules of #{
|
17
|
+
respond "<@#{user.id}> removed the access to the rules of #{config.channel} from #{channel}.", @master_bot_id
|
18
18
|
if @channels_id[channel][0] == "G"
|
19
19
|
respond "The rules won't be accessible from *#{channel}* from now on.", dest
|
20
20
|
else
|
@@ -9,10 +9,10 @@ class SlackSmartBot
|
|
9
9
|
unless typem == :on_extended
|
10
10
|
deleted = false
|
11
11
|
|
12
|
-
if !
|
12
|
+
if !config.admins.include?(from) and @shortcuts[:all].include?(shortcut) and !@shortcuts[from].include?(shortcut)
|
13
13
|
respond "Only the creator of the shortcut or an admin user can delete it", dest
|
14
14
|
elsif (@shortcuts.keys.include?(from) and @shortcuts[from].keys.include?(shortcut)) or
|
15
|
-
(
|
15
|
+
(config.admins.include?(from) and @shortcuts[:all].include?(shortcut))
|
16
16
|
#are you sure? to avoid deleting by mistake
|
17
17
|
unless @questions.keys.include?(from)
|
18
18
|
ask("are you sure you want to delete it?", command, from, dest)
|
@@ -14,7 +14,7 @@ class SlackSmartBot
|
|
14
14
|
code.include?("ENV") or code.match?(/=\s*IO/)
|
15
15
|
unless rules_file.empty?
|
16
16
|
begin
|
17
|
-
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
17
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -13,7 +13,7 @@ class SlackSmartBot
|
|
13
13
|
end
|
14
14
|
respond("I didn't find any command starting by `#{help_command}`", dest) unless help_found
|
15
15
|
else
|
16
|
-
message = "-\n\n\n===================================\n*Rules from channel #{
|
16
|
+
message = "-\n\n\n===================================\n*Rules from channel #{config.channel}*\n"
|
17
17
|
if typem == :on_extended
|
18
18
|
message += "To run the commands on this extended channel, add `!` before the command.\n"
|
19
19
|
end
|
@@ -23,7 +23,7 @@ class SlackSmartBot
|
|
23
23
|
|
24
24
|
unless rules_file.empty?
|
25
25
|
begin
|
26
|
-
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
26
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
if defined?(git_project) and git_project.to_s != "" and help_message_rules != "" and help_command.to_s == ""
|
@@ -5,7 +5,7 @@ class SlackSmartBot
|
|
5
5
|
# helpmaster: Only works if you are on Master channel and you created that bot or you are an admin user
|
6
6
|
# helpmaster:
|
7
7
|
def kill_bot_on_channel(dest, from, channel)
|
8
|
-
if
|
8
|
+
if config.on_master_bot
|
9
9
|
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
10
10
|
channel_id = nil
|
11
11
|
if @channels_name.key?(channel) #it is an id
|
@@ -8,8 +8,8 @@ class SlackSmartBot
|
|
8
8
|
# helpadmin: You can use this command only if you are an admin user and you are on the master channel
|
9
9
|
# helpadmin:
|
10
10
|
def exit_bot(command, from, dest, display_name)
|
11
|
-
if
|
12
|
-
if
|
11
|
+
if config.on_master_bot
|
12
|
+
if config.admins.include?(from) #admin user
|
13
13
|
unless @questions.keys.include?(from)
|
14
14
|
ask("are you sure?", command, from, dest)
|
15
15
|
else
|
@@ -24,7 +24,13 @@ class SlackSmartBot
|
|
24
24
|
}
|
25
25
|
update_bots_file()
|
26
26
|
sleep 0.5
|
27
|
-
|
27
|
+
if config.simulate #jal
|
28
|
+
@status = :off
|
29
|
+
config.simulate = false
|
30
|
+
Thread.exit
|
31
|
+
else
|
32
|
+
exit!
|
33
|
+
end
|
28
34
|
when /no/i, /nope/i, /cancel/i
|
29
35
|
@questions.delete(from)
|
30
36
|
respond "Thanks, I'm happy to be alive", dest
|
@@ -9,8 +9,8 @@ class SlackSmartBot
|
|
9
9
|
# helpmaster: Only works if you are on Master channel and you are a master admin user
|
10
10
|
# helpmaster:
|
11
11
|
def notify_message(dest, from, where, message)
|
12
|
-
if
|
13
|
-
if
|
12
|
+
if config.on_master_bot
|
13
|
+
if config.admins.include?(from) #admin user
|
14
14
|
if where.nil? #not all and not channel
|
15
15
|
@bots_created.each do |k, v|
|
16
16
|
respond message, k
|
@@ -19,7 +19,7 @@ class SlackSmartBot
|
|
19
19
|
elsif where == "all" #all
|
20
20
|
myconv = client.web_client.users_conversations(exclude_archived: true, limit: 100, types: "im, public_channel,private_channel").channels
|
21
21
|
myconv.each do |c|
|
22
|
-
respond message, c.id unless c.name ==
|
22
|
+
respond message, c.id unless c.name == config.master_channel
|
23
23
|
end
|
24
24
|
respond "Channels and users have been notified", dest
|
25
25
|
else #channel
|
@@ -8,7 +8,7 @@ class SlackSmartBot
|
|
8
8
|
# helpmaster: follow the instructions in case creating cloud bots
|
9
9
|
# helpmaster:
|
10
10
|
def create_bot(dest, from, cloud, channel)
|
11
|
-
if
|
11
|
+
if config.on_master_bot
|
12
12
|
get_channels_name_and_id() unless @channels_name.keys.include?(channel) or @channels_id.keys.include?(channel)
|
13
13
|
channel_id = nil
|
14
14
|
if @channels_name.key?(channel) #it is an id
|
@@ -28,7 +28,7 @@ class SlackSmartBot
|
|
28
28
|
|
29
29
|
if channel_id.nil?
|
30
30
|
respond "There is no channel with that name: #{channel}, please be sure is written exactly the same", dest
|
31
|
-
elsif channel ==
|
31
|
+
elsif channel == config.master_channel
|
32
32
|
respond "There is already a bot in this channel: #{channel}", dest
|
33
33
|
elsif @bots_created.keys.include?(channel_id)
|
34
34
|
respond "There is already a bot in this channel: #{channel}, kill it before", dest
|
@@ -41,24 +41,24 @@ class SlackSmartBot
|
|
41
41
|
if defined?(RULES_FOLDER)
|
42
42
|
rules_file = RULES_FOLDER + rules_file
|
43
43
|
else
|
44
|
-
Dir.mkdir("rules") unless Dir.exist?("rules")
|
45
|
-
Dir.mkdir("rules/#{channel_id}") unless Dir.exist?("rules/#{channel_id}")
|
46
|
-
rules_file = "
|
44
|
+
Dir.mkdir("#{config.path}/rules") unless Dir.exist?("#{config.path}/rules")
|
45
|
+
Dir.mkdir("#{config.path}/rules/#{channel_id}") unless Dir.exist?("#{config.path}/rules/#{channel_id}")
|
46
|
+
rules_file = "/rules/#{channel_id}/" + rules_file
|
47
47
|
end
|
48
48
|
default_rules = (__FILE__).gsub(/slack\/smart-bot\/commands\/on_master\/create_bot\.rb$/, "slack-smart-bot_rules.rb")
|
49
|
-
File.delete(rules_file) if File.exist?(rules_file)
|
50
|
-
FileUtils.copy_file(default_rules, rules_file) unless File.exist?(rules_file)
|
49
|
+
File.delete(config.path + rules_file) if File.exist?(config.path + rules_file)
|
50
|
+
FileUtils.copy_file(default_rules, config.path + rules_file) unless File.exist?(config.path + rules_file)
|
51
51
|
admin_users = Array.new()
|
52
52
|
creator_info = client.web_client.users_info(user: channel_found.creator)
|
53
|
-
admin_users = [from, creator_info.user.name] +
|
53
|
+
admin_users = [from, creator_info.user.name] + config.masters
|
54
54
|
admin_users.uniq!
|
55
|
-
@logger.info "ruby #{
|
55
|
+
@logger.info "ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on"
|
56
56
|
|
57
57
|
if cloud
|
58
|
-
respond "Copy the bot folder to your cloud location and run `ruby #{
|
58
|
+
respond "Copy the bot folder to your cloud location and run `ruby #{config.file} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on&`", dest
|
59
59
|
else
|
60
60
|
t = Thread.new do
|
61
|
-
`ruby #{
|
61
|
+
`ruby #{config.file_path} \"#{channel}\" \"#{admin_users.join(",")}\" \"#{rules_file}\" on`
|
62
62
|
end
|
63
63
|
end
|
64
64
|
@bots_created[channel_id] = {
|
@@ -4,7 +4,7 @@ class SlackSmartBot
|
|
4
4
|
@pings = []
|
5
5
|
get_bots_created()
|
6
6
|
@buffer_complete = [] unless defined?(@buffer_complete)
|
7
|
-
b = File.read("
|
7
|
+
b = File.read("#{config.path}/buffer_complete.log")
|
8
8
|
result = b.scan(/^\|(\w+)\|(\w+)\|([^$]+)\$\$\$/m)
|
9
9
|
result.delete(nil)
|
10
10
|
new_messages = result[@buffer_complete.size..-1]
|
@@ -4,9 +4,9 @@ class SlackSmartBot
|
|
4
4
|
rules_file = ""
|
5
5
|
|
6
6
|
if typem == :on_call
|
7
|
-
rules_file =
|
7
|
+
rules_file = config.rules_file
|
8
8
|
elsif dest[0] == "C" or dest[0] == "G" # on a channel or private channel
|
9
|
-
rules_file =
|
9
|
+
rules_file = config.rules_file
|
10
10
|
|
11
11
|
if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
|
12
12
|
unless @bots_created.key?(@rules_imported[user.id][dchannel])
|
@@ -29,17 +29,23 @@ class SlackSmartBot
|
|
29
29
|
begin
|
30
30
|
case text
|
31
31
|
when /^Bot has been (closed|killed) by/i
|
32
|
-
if
|
32
|
+
if config.channel == @channels_name[dchannel]
|
33
33
|
@logger.info "#{nick}: #{text}"
|
34
|
-
|
34
|
+
if config.simulate #jal
|
35
|
+
@status = :off
|
36
|
+
config.simulate = false
|
37
|
+
Thread.exit
|
38
|
+
else
|
39
|
+
exit!
|
40
|
+
end
|
35
41
|
end
|
36
42
|
when /^Changed status on (.+) to :(.+)/i
|
37
43
|
channel_name = $1
|
38
44
|
status = $2
|
39
|
-
if
|
45
|
+
if config.on_master_bot or config.channel == channel_name
|
40
46
|
@bots_created[@channels_id[channel_name]][:status] = status.to_sym
|
41
47
|
update_bots_file()
|
42
|
-
if
|
48
|
+
if config.channel == channel_name
|
43
49
|
@logger.info "#{nick}: #{text}"
|
44
50
|
else #on master bot
|
45
51
|
@logger.info "Changed status on #{channel_name} to :#{status}"
|
@@ -48,7 +54,7 @@ class SlackSmartBot
|
|
48
54
|
when /extended the rules from (.+) to be used on (.+)\.$/i
|
49
55
|
from_name = $1
|
50
56
|
to_name = $2
|
51
|
-
if
|
57
|
+
if config.on_master_bot and @bots_created[@channels_id[from_name]][:cloud]
|
52
58
|
@bots_created[@channels_id[from_name]][:extended] << to_name
|
53
59
|
@bots_created[@channels_id[from_name]][:extended].uniq!
|
54
60
|
update_bots_file()
|
@@ -56,7 +62,7 @@ class SlackSmartBot
|
|
56
62
|
when /removed the access to the rules of (.+) from (.+)\.$/i
|
57
63
|
from_name = $1
|
58
64
|
to_name = $2
|
59
|
-
if
|
65
|
+
if config.on_master_bot and @bots_created[@channels_id[from_name]][:cloud]
|
60
66
|
@bots_created[@channels_id[from_name]][:extended].delete(to_name)
|
61
67
|
update_bots_file()
|
62
68
|
end
|
@@ -131,7 +137,7 @@ class SlackSmartBot
|
|
131
137
|
end
|
132
138
|
unless rules_file.empty?
|
133
139
|
begin
|
134
|
-
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
140
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
135
141
|
rescue Exception => stack
|
136
142
|
@logger.fatal "ERROR ON RULES FILE: #{rules_file}"
|
137
143
|
@logger.fatal stack
|
@@ -154,7 +160,7 @@ class SlackSmartBot
|
|
154
160
|
if @bots_created.key?(@rules_imported[user.id][user.id])
|
155
161
|
if @bots_created[@rules_imported[user.id][user.id]][:status] == :on
|
156
162
|
begin
|
157
|
-
eval(File.new(rules_file).read) if File.exist?(rules_file)
|
163
|
+
eval(File.new(config.path+rules_file).read) if File.exist?(config.path+rules_file)
|
158
164
|
rescue Exception => stack
|
159
165
|
@logger.fatal "ERROR ON imported RULES FILE: #{rules_file}"
|
160
166
|
@logger.fatal stack
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
def treat_message(data)
|
3
|
-
if config[:testing] and
|
4
|
-
open("
|
3
|
+
if config[:testing] and config.on_master_bot
|
4
|
+
open("#{config.path}/buffer.log", "a") { |f|
|
5
5
|
f.puts "|#{data.channel}|#{data.user}|#{data.text}"
|
6
6
|
}
|
7
7
|
end
|
@@ -15,7 +15,7 @@ class SlackSmartBot
|
|
15
15
|
if !data.files.nil? and data.files.size == 1 and data.text.to_s == "" and data.files[0].filetype == "ruby"
|
16
16
|
data.text = "ruby"
|
17
17
|
end
|
18
|
-
if !dest.nil? and
|
18
|
+
if !dest.nil? and config.on_master_bot and !data.text.nil? and data.text.match(/^ping from (.+)\s*$/) and data.user == config[:nick_id]
|
19
19
|
@pings << $1
|
20
20
|
end
|
21
21
|
typem = :dont_treat
|
@@ -29,7 +29,7 @@ class SlackSmartBot
|
|
29
29
|
typem = :on_call
|
30
30
|
end
|
31
31
|
elsif dest == @master_bot_id
|
32
|
-
if
|
32
|
+
if config.on_master_bot #only to be treated on master mot channel
|
33
33
|
typem = :on_master
|
34
34
|
end
|
35
35
|
elsif @bots_created.key?(dest)
|
@@ -37,15 +37,15 @@ class SlackSmartBot
|
|
37
37
|
typem = :on_bot
|
38
38
|
end
|
39
39
|
elsif dest[0] == "D" #Direct message
|
40
|
-
if
|
40
|
+
if config.on_master_bot #only to be treated by master bot
|
41
41
|
typem = :on_dm
|
42
42
|
end
|
43
43
|
elsif dest[0] == "C" or dest[0] == "G"
|
44
44
|
#only to be treated on the channel of the bot. excluding running ruby
|
45
|
-
if !
|
45
|
+
if !config.on_master_bot and @bots_created.key?(@channel_id) and @bots_created[@channel_id][:extended].include?(@channels_name[dest]) and
|
46
46
|
!data.text.match?(/^!?\s*(ruby|code)\s+/)
|
47
47
|
typem = :on_extended
|
48
|
-
elsif
|
48
|
+
elsif config.on_master_bot and data.text.match?(/^!?\s*(ruby|code)\s+/) #or in case of running ruby, the master bot
|
49
49
|
@bots_created.each do |k, v|
|
50
50
|
if v.key?(:extended) and v[:extended].include?(@channels_name[dest])
|
51
51
|
typem = :on_extended
|
@@ -53,7 +53,7 @@ class SlackSmartBot
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
-
if dest[0] == "G" and
|
56
|
+
if dest[0] == "G" and config.on_master_bot and typem != :on_extended #private group
|
57
57
|
typem = :on_pg
|
58
58
|
end
|
59
59
|
end
|
@@ -104,7 +104,7 @@ class SlackSmartBot
|
|
104
104
|
members = client.web_client.conversations_members(channel: @channels_id[channel_rules_name]).members unless channel_found.nil?
|
105
105
|
if channel_found.nil?
|
106
106
|
@logger.fatal "Not possible to find the channel #{channel_rules_name}"
|
107
|
-
elsif channel_found.name ==
|
107
|
+
elsif channel_found.name == config.master_channel
|
108
108
|
respond "You cannot use the rules from Master Channel on any other channel.", dest
|
109
109
|
elsif @status != :on
|
110
110
|
respond "The bot in that channel is not :on", dest
|
@@ -113,11 +113,11 @@ class SlackSmartBot
|
|
113
113
|
else
|
114
114
|
respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", dest
|
115
115
|
end
|
116
|
-
elsif
|
116
|
+
elsif config.on_master_bot and typem == :on_extended and
|
117
117
|
command.size > 0 and command[0] != "-"
|
118
118
|
# to run ruby only from the master bot for the case more than one extended
|
119
119
|
res = process_first(user_info.user, command, dest, @channel_id, typem, data.files)
|
120
|
-
elsif !
|
120
|
+
elsif !config.on_master_bot and @bots_created[@channel_id].key?(:extended) and
|
121
121
|
@bots_created[@channel_id][:extended].include?(@channels_name[data.channel]) and
|
122
122
|
command.size > 0 and command[0] != "-"
|
123
123
|
res = process_first(user_info.user, command, dest, @channel_id, typem, data.files)
|
@@ -130,9 +130,9 @@ class SlackSmartBot
|
|
130
130
|
@logger.fatal stack
|
131
131
|
end
|
132
132
|
else
|
133
|
-
if !
|
133
|
+
if !config.on_master_bot and !dest.nil? and (dest == @master_bot_id or dest[0] == "D") and
|
134
134
|
data.text.match?(/^\s*bot\s+status\s*$/i) and @admin_users_id.include?(data.user)
|
135
|
-
respond "ping from #{
|
135
|
+
respond "ping from #{config.channel}", dest
|
136
136
|
end
|
137
137
|
end
|
138
138
|
end
|
@@ -1,37 +1,40 @@
|
|
1
1
|
class SlackSmartBot
|
2
2
|
def update_bots_file
|
3
|
-
file = File.open(
|
3
|
+
file = File.open(config.file_path.gsub(".rb", "_bots.rb"), "w")
|
4
4
|
bots_created = @bots_created.dup
|
5
|
-
bots_created.each { |k, v|
|
5
|
+
bots_created.each { |k, v|
|
6
|
+
v[:thread] = ""
|
7
|
+
}
|
6
8
|
file.write bots_created.inspect
|
7
9
|
file.close
|
8
10
|
end
|
9
11
|
|
10
12
|
def get_bots_created
|
11
|
-
if File.exist?(
|
12
|
-
if !defined?(@datetime_bots_created) or @datetime_bots_created != File.mtime(
|
13
|
-
file_conf = IO.readlines(
|
13
|
+
if File.exist?(config.file_path.gsub(".rb", "_bots.rb"))
|
14
|
+
if !defined?(@datetime_bots_created) or @datetime_bots_created != File.mtime(config.file_path.gsub(".rb", "_bots.rb"))
|
15
|
+
file_conf = IO.readlines(config.file_path.gsub(".rb", "_bots.rb")).join
|
14
16
|
if file_conf.to_s() == ""
|
15
17
|
@bots_created = {}
|
16
18
|
else
|
17
19
|
@bots_created = eval(file_conf)
|
18
20
|
end
|
19
|
-
@datetime_bots_created = File.mtime(
|
20
|
-
@bots_created.each do |k, v|
|
21
|
+
@datetime_bots_created = File.mtime(config.file_path.gsub(".rb", "_bots.rb"))
|
22
|
+
@bots_created.each do |k, v|
|
21
23
|
v[:extended] = [] unless v.key?(:extended)
|
24
|
+
v[:rules_file].gsub!(/^\./, '')
|
22
25
|
end
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
27
30
|
def update_shortcuts_file
|
28
|
-
file = File.open("
|
31
|
+
file = File.open("#{config.path}/shortcuts/#{config.shortcuts_file}", "w")
|
29
32
|
file.write @shortcuts.inspect
|
30
33
|
file.close
|
31
34
|
end
|
32
35
|
|
33
36
|
def update_rules_imported
|
34
|
-
file = File.open("
|
37
|
+
file = File.open("#{config.path}/rules/rules_imported.rb", "w")
|
35
38
|
file.write @rules_imported.inspect
|
36
39
|
file.close
|
37
40
|
end
|
@@ -55,8 +58,8 @@ class SlackSmartBot
|
|
55
58
|
end
|
56
59
|
|
57
60
|
def get_routines(channel = @channel_id)
|
58
|
-
if File.exist?("
|
59
|
-
file_conf = IO.readlines("
|
61
|
+
if File.exist?("#{config.path}/routines/routines_#{channel}.rb")
|
62
|
+
file_conf = IO.readlines("#{config.path}/routines/routines_#{channel}.rb").join
|
60
63
|
unless file_conf.to_s() == ""
|
61
64
|
@routines = eval(file_conf)
|
62
65
|
end
|
@@ -64,7 +67,7 @@ class SlackSmartBot
|
|
64
67
|
end
|
65
68
|
|
66
69
|
def update_routines(channel = @channel_id)
|
67
|
-
file = File.open("
|
70
|
+
file = File.open("#{config.path}/routines/routines_#{channel}.rb", "w")
|
68
71
|
file.write (@routines.inspect)
|
69
72
|
file.close
|
70
73
|
end
|
@@ -72,6 +75,7 @@ class SlackSmartBot
|
|
72
75
|
def create_routine_thread(name)
|
73
76
|
t = Thread.new do
|
74
77
|
while @routines.key?(@channel_id) and @routines[@channel_id].key?(name)
|
78
|
+
@logger.info "Routine: #{@routines[@channel_id][name].inspect}"
|
75
79
|
started = Time.now
|
76
80
|
if @status == :on and @routines[@channel_id][name][:status] == :on
|
77
81
|
if @routines[@channel_id][name][:file_path].match?(/\.rb$/i)
|
@@ -175,9 +179,9 @@ class SlackSmartBot
|
|
175
179
|
:see_routines, :start_routine, :pause_routine, :remove_routine, :run_routine],
|
176
180
|
}
|
177
181
|
# user_type: :admin, :user, :admin_master
|
178
|
-
if
|
182
|
+
if config.masters.include?(from)
|
179
183
|
user_type = :admin_master
|
180
|
-
elsif
|
184
|
+
elsif config.admins.include?(from)
|
181
185
|
user_type = :admin
|
182
186
|
else
|
183
187
|
user_type = :user
|
@@ -185,7 +189,7 @@ class SlackSmartBot
|
|
185
189
|
# channel_type: :bot, :master_bot, :direct, :extended, :external
|
186
190
|
if dest[0] == "D"
|
187
191
|
channel_type = :direct
|
188
|
-
elsif
|
192
|
+
elsif config.on_master_bot
|
189
193
|
channel_type = :master_bot
|
190
194
|
elsif @channel_id != dest
|
191
195
|
channel_type = :extended
|
@@ -200,7 +204,7 @@ class SlackSmartBot
|
|
200
204
|
help = @help_messages.deep_copy
|
201
205
|
end
|
202
206
|
if rules_file != ""
|
203
|
-
help[:rules_file] = IO.readlines(rules_file).join.scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
207
|
+
help[:rules_file] = IO.readlines(config.path+rules_file).join.scan(/#\s*help\s*\w*:(.*)/i).join("\n")
|
204
208
|
end
|
205
209
|
|
206
210
|
help = remove_hash_keys(help, :admin_master) unless user_type == :admin_master
|
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: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mario Ruiz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slack-ruby-client
|