slacky 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/slacky.rb +0 -1
- data/lib/slacky/bot.rb +22 -31
- data/lib/slacky/channel.rb +1 -1
- data/lib/slacky/cli.rb +2 -21
- data/lib/slacky/config.rb +1 -19
- data/lib/slacky/service.rb +10 -68
- data/lib/slacky/version.rb +1 -1
- metadata +2 -3
- data/lib/slacky/daemon.rb +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e608d8b4af8ddfadf4c45aa64a4dc4bcd5d03dd8c1b78fb5e362ea16c4bf602e
|
4
|
+
data.tar.gz: dfee525f94af1a3aca6aa048e9c714a377750bc34980d1e033f9387d6cc50ecf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ab7bccbff9e0aa4b0a1a6873ec4e21db25321714a38d3b85c0a01c469267d7caf1c470a521e62a5475080dbdfe5735cd8fa080e96fdf2930ec4388e9e25758c
|
7
|
+
data.tar.gz: f53e5ae04d5674352bc2f9915340acf8228a164bf67254add03348359b3b8294351f11172d28f2f06ca7617263c713c989ea8b99fdce8652b55d2a487b05a80d
|
data/Gemfile.lock
CHANGED
data/lib/slacky.rb
CHANGED
data/lib/slacky/bot.rb
CHANGED
@@ -8,9 +8,6 @@ module Slacky
|
|
8
8
|
attr_reader :client, :config, :slack_id
|
9
9
|
|
10
10
|
def initialize(config)
|
11
|
-
config.log "#{config.name} is starting up..."
|
12
|
-
puts "#{config.name} is starting up..."
|
13
|
-
|
14
11
|
@config = config
|
15
12
|
@command_handlers = []
|
16
13
|
@channel_handlers = []
|
@@ -19,8 +16,7 @@ module Slacky
|
|
19
16
|
@cron_handlers = []
|
20
17
|
|
21
18
|
unless @config.slack_api_token
|
22
|
-
|
23
|
-
return
|
19
|
+
raise "No Slack API token found. Use environment variable SLACK_API_TOKEN."
|
24
20
|
end
|
25
21
|
|
26
22
|
Slack.configure do |slack_cfg|
|
@@ -30,13 +26,8 @@ module Slacky
|
|
30
26
|
@client = Slack::RealTime::Client.new
|
31
27
|
|
32
28
|
auth = web_client.auth_test
|
33
|
-
|
34
|
-
|
35
|
-
@config.log "Slackbot is active!"
|
36
|
-
else
|
37
|
-
@config.log "Slackbot is doomed :-("
|
38
|
-
return
|
39
|
-
end
|
29
|
+
@slack_id = auth.user_id
|
30
|
+
puts "Slackbot is active!"
|
40
31
|
|
41
32
|
@bookkeeper = Bookkeeper.new @client
|
42
33
|
|
@@ -47,6 +38,7 @@ module Slacky
|
|
47
38
|
populate_channels
|
48
39
|
stay_alive
|
49
40
|
|
41
|
+
on_command 'blowup', &(method :blowup)
|
50
42
|
end
|
51
43
|
|
52
44
|
def web_client
|
@@ -159,27 +151,28 @@ module Slacky
|
|
159
151
|
end
|
160
152
|
end
|
161
153
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
154
|
+
puts "#{@config.name} is listening to: #{@config.slack_accept_channels}"
|
155
|
+
|
156
|
+
Thread.report_on_exception = false if defined? Thread.report_on_exception
|
157
|
+
|
158
|
+
@client.start! do
|
159
|
+
# This code must run in the callback / block because it requires EventMachine
|
160
|
+
# be running before it gets executed. If we can find another way to handle
|
161
|
+
# this cron syntax we can move to using the async-websocket library instead
|
162
|
+
# of EventMachine. -mike
|
163
|
+
|
164
|
+
@cron_handlers.each do |h|
|
165
|
+
cron, handler = h.values_at :cron, :handler
|
166
|
+
EM::Cron.schedule cron do |time|
|
167
|
+
handler.call
|
170
168
|
end
|
171
169
|
end
|
172
170
|
end
|
173
|
-
|
174
|
-
puts "#{@config.name} is listening to: #{@config.slack_accept_channels}"
|
175
|
-
|
176
|
-
@client.start!
|
177
171
|
end
|
178
172
|
|
179
173
|
def populate_users
|
180
174
|
print "Getting users from Slack..."
|
181
175
|
resp = web_client.users_list
|
182
|
-
throw resp unless resp.ok
|
183
176
|
User.invalidate_all_users
|
184
177
|
whitelist = @config.whitelist_users || []
|
185
178
|
resp.members.map do |member|
|
@@ -201,13 +194,11 @@ module Slacky
|
|
201
194
|
def populate_channels
|
202
195
|
print "Getting channels from Slack..."
|
203
196
|
resp = web_client.channels_list
|
204
|
-
throw resp unless resp.ok
|
205
197
|
resp.channels.map do |channel|
|
206
198
|
Channel.channel channel
|
207
199
|
end
|
208
200
|
|
209
201
|
resp = web_client.groups_list
|
210
|
-
throw resp unless resp.ok
|
211
202
|
resp.groups.map do |group|
|
212
203
|
Channel.group group
|
213
204
|
end
|
@@ -226,14 +217,14 @@ module Slacky
|
|
226
217
|
now = Time.now.to_f
|
227
218
|
stamp = data.stamp
|
228
219
|
delta = now - stamp
|
229
|
-
|
220
|
+
raise Exception.new("Slow ping pong response: #{delta}s") if delta > 5
|
230
221
|
end
|
231
222
|
end
|
232
223
|
|
233
|
-
def blowup(
|
234
|
-
|
224
|
+
def blowup(message)
|
225
|
+
message.reply "Tick... tick... tick... BOOM! Goodbye."
|
235
226
|
EM.next_tick do
|
236
|
-
raise "kablammo!"
|
227
|
+
raise Exception.new("kablammo!")
|
237
228
|
end
|
238
229
|
end
|
239
230
|
end
|
data/lib/slacky/channel.rb
CHANGED
data/lib/slacky/cli.rb
CHANGED
@@ -3,32 +3,13 @@ module Slacky
|
|
3
3
|
attr_reader :bot
|
4
4
|
|
5
5
|
def initialize(name, bot_class, opts)
|
6
|
-
|
7
|
-
@options = { :verbose => false }.merge opts
|
6
|
+
raise "CLI must be passed a name" unless name
|
8
7
|
config = Config.new name
|
9
|
-
|
10
|
-
@service = Service.new config, daemon
|
8
|
+
@service = Service.new config, bot_class
|
11
9
|
end
|
12
10
|
|
13
11
|
def run(params)
|
14
12
|
@service.run
|
15
13
|
end
|
16
|
-
|
17
|
-
def start(params)
|
18
|
-
@service.start
|
19
|
-
end
|
20
|
-
|
21
|
-
def stop(params)
|
22
|
-
@service.stop
|
23
|
-
end
|
24
|
-
|
25
|
-
def restart(params)
|
26
|
-
@service.restart
|
27
|
-
end
|
28
|
-
|
29
|
-
def status(params)
|
30
|
-
@service.status
|
31
|
-
end
|
32
|
-
|
33
14
|
end
|
34
15
|
end
|
data/lib/slacky/config.rb
CHANGED
@@ -5,14 +5,12 @@ require 'dotenv'
|
|
5
5
|
|
6
6
|
module Slacky
|
7
7
|
class Config
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :name, :db
|
9
9
|
|
10
10
|
def initialize(name, opts = {})
|
11
11
|
@name = name
|
12
12
|
Dotenv.load ".env", "#{config_dir}/.env"
|
13
13
|
FileUtils.mkdir config_dir unless File.directory? config_dir
|
14
|
-
@pid_file = "#{config_dir}/pid"
|
15
|
-
@timestamps = {}
|
16
14
|
User.config = self
|
17
15
|
end
|
18
16
|
|
@@ -55,26 +53,10 @@ module Slacky
|
|
55
53
|
ENV['WHITELIST_USERS'].split(',').map {|u| u.strip}
|
56
54
|
end
|
57
55
|
|
58
|
-
def log(msg, ex = nil)
|
59
|
-
log = File.new(log_file, 'a')
|
60
|
-
timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S')
|
61
|
-
type = ex ? 'ERROR' : ' INFO'
|
62
|
-
log.puts "#{type} #{timestamp} #{msg}"
|
63
|
-
if ex
|
64
|
-
log.puts ex.message
|
65
|
-
log.puts("Stacktrace:\n" + ex.backtrace.join("\n"))
|
66
|
-
end
|
67
|
-
log.flush
|
68
|
-
end
|
69
|
-
|
70
56
|
private
|
71
57
|
|
72
58
|
def db_connect_params
|
73
59
|
ENV['DATABASE_URL'] || { dbname: "slacky_#{down_name}" }
|
74
60
|
end
|
75
|
-
|
76
|
-
def log_file
|
77
|
-
"#{config_dir}/#{down_name}.log"
|
78
|
-
end
|
79
61
|
end
|
80
62
|
end
|
data/lib/slacky/service.rb
CHANGED
@@ -1,73 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
@daemon = daemon
|
7
|
-
end
|
8
|
-
|
9
|
-
def run
|
10
|
-
@daemon.start false
|
11
|
-
end
|
12
|
-
|
13
|
-
def start(persist = false)
|
14
|
-
pid = get_pid
|
15
|
-
if pid
|
16
|
-
puts "#{@config.name} is already running with PID #{pid}"
|
17
|
-
return
|
1
|
+
module Slacky
|
2
|
+
class Service
|
3
|
+
def initialize(config, bot_class)
|
4
|
+
@config = config
|
5
|
+
@bot_class = bot_class
|
18
6
|
end
|
19
7
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def stop(persist = false)
|
27
|
-
pid = get_pid
|
28
|
-
unless pid
|
29
|
-
puts "#{@config.name} is not running"
|
30
|
-
return
|
31
|
-
end
|
32
|
-
|
33
|
-
print "Stopping #{@config.name}..."
|
34
|
-
|
35
|
-
begin
|
36
|
-
Process.kill 'HUP', pid
|
37
|
-
rescue
|
38
|
-
@daemon.cleanup
|
39
|
-
end
|
40
|
-
|
41
|
-
ticks = 0
|
42
|
-
while pid = get_pid && ticks < 40
|
43
|
-
sleep 0.5
|
44
|
-
ticks += 1
|
45
|
-
print '.' if ticks % 4 == 0
|
46
|
-
end
|
47
|
-
puts " #{pid.nil? ? 'stopped' : 'failed'}"
|
48
|
-
end
|
49
|
-
|
50
|
-
def restart
|
51
|
-
stop
|
52
|
-
start
|
53
|
-
end
|
54
|
-
|
55
|
-
def status
|
56
|
-
pid = get_pid
|
57
|
-
if pid
|
58
|
-
puts "#{@config.name} is running with PID #{pid}"
|
59
|
-
true
|
60
|
-
else
|
61
|
-
puts "#{@config.name} is not running"
|
62
|
-
false
|
8
|
+
def run
|
9
|
+
puts "#{@config.name} is running"
|
10
|
+
bot = Bot.new @config
|
11
|
+
@bot_class.new bot
|
12
|
+
bot.run
|
63
13
|
end
|
64
14
|
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def get_pid
|
69
|
-
return nil unless File.exists? @config.pid_file
|
70
|
-
IO.read(@config.pid_file).to_i
|
71
|
-
end
|
72
|
-
|
73
15
|
end
|
data/lib/slacky/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slacky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Wynholds
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slack-ruby-client
|
@@ -183,7 +183,6 @@ files:
|
|
183
183
|
- lib/slacky/channel.rb
|
184
184
|
- lib/slacky/cli.rb
|
185
185
|
- lib/slacky/config.rb
|
186
|
-
- lib/slacky/daemon.rb
|
187
186
|
- lib/slacky/message.rb
|
188
187
|
- lib/slacky/service.rb
|
189
188
|
- lib/slacky/user.rb
|
data/lib/slacky/daemon.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
module Slacky
|
2
|
-
class Daemon
|
3
|
-
|
4
|
-
def initialize(config, bot_class)
|
5
|
-
@config = config
|
6
|
-
@bot_class = bot_class
|
7
|
-
@active = true
|
8
|
-
@running = false
|
9
|
-
end
|
10
|
-
|
11
|
-
def start(daemonize = true)
|
12
|
-
Process.daemon if daemonize
|
13
|
-
write_pid
|
14
|
-
|
15
|
-
[ 'HUP', 'INT', 'QUIT', 'TERM' ].each do |sig|
|
16
|
-
Signal.trap(sig) do
|
17
|
-
@config.log "Interrupted with signal: #{sig}"
|
18
|
-
kill
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
begin
|
23
|
-
Thread.abort_on_exception = true
|
24
|
-
@slackthread = Thread.new do
|
25
|
-
bot = Bot.new @config
|
26
|
-
@bot_class.new bot
|
27
|
-
bot.run
|
28
|
-
end
|
29
|
-
run
|
30
|
-
rescue => e
|
31
|
-
@config.log "Unexpected error", e
|
32
|
-
ensure
|
33
|
-
cleanup
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def cleanup
|
38
|
-
delete_pid
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def run
|
44
|
-
@config.log "#{@config.name} is running."
|
45
|
-
while active? do
|
46
|
-
sleep 0.5
|
47
|
-
end
|
48
|
-
@config.log "#{@config.name} got killed"
|
49
|
-
@slackthread.kill
|
50
|
-
end
|
51
|
-
|
52
|
-
def active?
|
53
|
-
@active
|
54
|
-
end
|
55
|
-
|
56
|
-
def kill
|
57
|
-
@active = false
|
58
|
-
end
|
59
|
-
|
60
|
-
def write_pid
|
61
|
-
File.open @config.pid_file, 'w' do |f|
|
62
|
-
f.write Process.pid.to_s
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def delete_pid
|
67
|
-
File.delete @config.pid_file if File.exists? @config.pid_file
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|