rslack 0.2.5 → 0.2.7
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/lib/rslack.rb +1 -2
- data/lib/rslack/actions/cron.rb +5 -8
- data/lib/rslack/api.rb +9 -5
- data/lib/rslack/bot.rb +35 -31
- data/lib/rslack/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8feb48a7730fc536e14a81b525a755af73c9d8fb
|
4
|
+
data.tar.gz: 35fb641427ea9320d0258224cf105966156013d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68a0a9e94ac80dcb4338e8b67c109b6e9c3c614f3c432361159b58bfb15f64564716778aa8cfb6f9daee07e04687b8d6267e2f38fe617eda2c2cf0b458300643
|
7
|
+
data.tar.gz: a45bd0b20d33d29a32345bb299decaccb0b0b282d02bb281f556e9356af19737fb8df35b06723d92e78b3706e4fb2da2b7a7ebd4716261644d28d9a20414b66a
|
data/lib/rslack.rb
CHANGED
data/lib/rslack/actions/cron.rb
CHANGED
@@ -17,13 +17,10 @@ module RSlack
|
|
17
17
|
helptext: 'List cron schedules.',
|
18
18
|
callback: 'list'
|
19
19
|
|
20
|
-
class << self
|
21
|
-
attr_accessor :timer
|
22
|
-
end
|
23
|
-
|
24
20
|
def initialize(bot)
|
25
|
-
|
21
|
+
@timer = nil
|
26
22
|
@channel = {}
|
23
|
+
super(bot)
|
27
24
|
end
|
28
25
|
|
29
26
|
def add(msg)
|
@@ -64,16 +61,16 @@ module RSlack
|
|
64
61
|
parser = CronParser.new(msg.var.syntax)
|
65
62
|
sleep = parser.next(Time.now) - Time.now
|
66
63
|
|
67
|
-
|
64
|
+
@timer = EM::Timer.new(sleep) do
|
68
65
|
item = OpenStruct.new(msg.to_h.merge(text: msg.var.command))
|
69
66
|
item.delete_field(:var)
|
70
67
|
bot.react(item)
|
71
|
-
|
68
|
+
start(msg)
|
72
69
|
end
|
73
70
|
end
|
74
71
|
|
75
72
|
def stop
|
76
|
-
|
73
|
+
@timer.cancel if @timer
|
77
74
|
end
|
78
75
|
|
79
76
|
private
|
data/lib/rslack/api.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'faye/websocket'
|
1
2
|
require 'http'
|
2
3
|
require 'json'
|
3
4
|
|
@@ -7,17 +8,20 @@ module RSlack
|
|
7
8
|
|
8
9
|
BASEURL = "https://slack.com/api/"
|
9
10
|
|
10
|
-
|
11
|
+
attr_reader :url
|
12
|
+
attr_reader :token
|
11
13
|
|
12
|
-
def initialize(token)
|
14
|
+
def initialize(url: BASEURL, token:)
|
15
|
+
@url = url
|
13
16
|
@token = token
|
14
17
|
end
|
15
18
|
|
16
|
-
def
|
17
|
-
call('rtm.start')
|
19
|
+
def websocket
|
20
|
+
rtm = call('rtm.start')
|
21
|
+
Faye::WebSocket::Client.new(rtm['url'], {}, { ping: 60 })
|
18
22
|
end
|
19
23
|
|
20
|
-
def
|
24
|
+
def me
|
21
25
|
call('auth.test')
|
22
26
|
end
|
23
27
|
|
data/lib/rslack/bot.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'eventmachine'
|
2
|
-
require 'faye/websocket'
|
3
2
|
require 'rslack/api'
|
4
3
|
|
5
4
|
require 'json'
|
@@ -15,12 +14,8 @@ module RSlack
|
|
15
14
|
class << self
|
16
15
|
|
17
16
|
def register(route)
|
18
|
-
routes.push(route)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
def routes
|
23
17
|
@routes ||= []
|
18
|
+
@routes.push(route)
|
24
19
|
end
|
25
20
|
|
26
21
|
end
|
@@ -34,26 +29,29 @@ module RSlack
|
|
34
29
|
STORAGE_INTERVAL = 5
|
35
30
|
|
36
31
|
def initialize(token, log: nil)
|
37
|
-
@client = APIClient.new(token)
|
32
|
+
@client = APIClient.new(token: token)
|
38
33
|
@logger = Logger.new(log || STDOUT)
|
39
34
|
@memory = {}
|
35
|
+
@running = true
|
40
36
|
|
41
37
|
@routes = self.class.instance_variable_get(:@routes)
|
38
|
+
@actions = @routes.reduce({}) { |a, e| a[e.action] ||= e.action.new(self); a }
|
39
|
+
@actions.keys.each { |e, _| @logger.info("#{self.class} loads #{e}.") }
|
42
40
|
@storage = LevelDB::DB.new(File.join(Dir.pwd, "#{STORAGE_KEYNAME}.db"))
|
41
|
+
@botuser = @client.me
|
43
42
|
|
44
|
-
|
45
|
-
unless @auth['ok']
|
43
|
+
unless @botuser['ok']
|
46
44
|
@logger.fatal("#{self.class} Failed to access slack web api.")
|
47
45
|
exit 1
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
49
|
def name
|
52
|
-
"@#{@
|
50
|
+
"@#{@botuser['user']}"
|
53
51
|
end
|
54
52
|
|
55
53
|
def linked_name
|
56
|
-
"<@#{@
|
54
|
+
"<@#{@botuser['user_id']}>"
|
57
55
|
end
|
58
56
|
|
59
57
|
def reply(msg, **opts)
|
@@ -70,38 +68,41 @@ module RSlack
|
|
70
68
|
count += 1
|
71
69
|
message = msg.dup
|
72
70
|
message.var = OpenStruct.new(matched.named_captures)
|
73
|
-
logger.info("#{self.class} passed msg to: '#{route.action}'.")
|
71
|
+
logger.info("#{self.class} passed the msg to: '#{route.action}'.")
|
74
72
|
|
75
|
-
|
73
|
+
Thread.start do
|
76
74
|
begin
|
77
|
-
action = route.action
|
75
|
+
action = @actions[route.action]
|
78
76
|
action.instance_exec(message.freeze, &route.callback)
|
79
77
|
rescue => e
|
80
|
-
reply(msg, text: "_#{e}._")
|
78
|
+
reply(msg, text: "#{route.action} encountered an error: _#{e}._")
|
81
79
|
end
|
82
80
|
end
|
83
|
-
th.abort_on_exception = true
|
84
81
|
end
|
85
82
|
|
86
|
-
reply(msg, text: 'I have no idea what to do...') if msg.prefix == linked_name && count.zero?
|
83
|
+
reply(msg, text: 'Sorry, I have no idea what to do...') if msg.prefix == linked_name && count.zero?
|
87
84
|
end
|
88
85
|
|
89
86
|
def start
|
90
87
|
load_storage
|
91
88
|
EM.run { wait_for_message }
|
89
|
+
logger.info("#{self.class} started.")
|
92
90
|
end
|
93
91
|
|
94
|
-
def stop
|
95
|
-
|
96
|
-
dump_storage
|
97
|
-
end
|
92
|
+
def stop(force: false)
|
93
|
+
@running = !force
|
98
94
|
|
99
|
-
def force_stop
|
100
95
|
EM.stop
|
96
|
+
exit 0 unless @running
|
97
|
+
|
98
|
+
dump_storage
|
99
|
+
logger.info("#{self.class} stopped.")
|
101
100
|
end
|
102
101
|
|
103
102
|
def restart
|
104
103
|
stop
|
104
|
+
|
105
|
+
sleep 5
|
105
106
|
start
|
106
107
|
end
|
107
108
|
|
@@ -109,22 +110,25 @@ module RSlack
|
|
109
110
|
def wait_for_message
|
110
111
|
EM.add_periodic_timer(STORAGE_INTERVAL) { dump_storage }
|
111
112
|
|
112
|
-
|
113
|
-
|
113
|
+
ws = @client.websocket
|
114
|
+
|
115
|
+
ws.on(:open) do |event|
|
116
|
+
logger.info("#{self.class} slack rtm api connection has opened.")
|
117
|
+
end
|
114
118
|
|
115
|
-
|
116
|
-
logger.info("#{self.class} slack
|
119
|
+
ws.on(:close) do |event|
|
120
|
+
logger.info("#{self.class} slack rtm api connection has closed.")
|
121
|
+
restart if EM.reactor_running? && @running
|
117
122
|
end
|
118
123
|
|
119
|
-
|
120
|
-
logger.info("#{self.class} slack
|
121
|
-
restart if EM.reactor_running?
|
124
|
+
ws.on(:error) do |event|
|
125
|
+
logger.info("#{self.class} slack rtm api error has occured: #{event.message}")
|
122
126
|
end
|
123
127
|
|
124
|
-
|
128
|
+
ws.on(:message) do |event|
|
125
129
|
msg = OpenStruct.new(JSON.parse(event.data))
|
126
130
|
if msg.type == 'message' && msg.subtype.nil?
|
127
|
-
logger.info("#{self.class} recieved msg: '#{msg.text}'.")
|
131
|
+
logger.info("#{self.class} recieved a msg: '#{msg.text}'.")
|
128
132
|
|
129
133
|
if msg.text =~ /^\s*(#{linked_name})\s*(.*)$/
|
130
134
|
msg.prefix = $1.to_s
|
data/lib/rslack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rslack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- haccht
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|