slacky 0.3.0 → 0.3.1
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/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
|