slack-bot-server 0.1.1 → 0.1.2
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 +1 -1
- data/lib/slack_bot_server/bot.rb +55 -7
- data/lib/slack_bot_server/redis_queue.rb +8 -3
- data/lib/slack_bot_server/version.rb +1 -1
- data/slack_bot_server.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 905bc700aa34e23d3da3e04a4956248ceb8f6d09
|
4
|
+
data.tar.gz: 8e85e1157e0d351c58b861f30586570786d8e871
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4836b1679ba77a3089bca65188317847a8a3b7c797d87e18a9cad009237fa3e0655e9dcc5a9b6faf7a9e5054b8f23863a44bcf3db4db8a4beed9495b8fcfda1
|
7
|
+
data.tar.gz: b6e71a1aafb3139235875f2d07c82b2d9f780647416ae3bb32ba5af8a63cb31c352c453ee3d3f1b05cff202d706139d4fb17f8592aca2a1d719ca23437f447a9
|
data/README.md
CHANGED
@@ -35,7 +35,7 @@ require 'slack_bot_server/simple_bot'
|
|
35
35
|
|
36
36
|
# Use a Redis-based queue to add/remove bots and to trigger
|
37
37
|
# bot messages to be sent
|
38
|
-
queue = SlackBotServer::RedisQueue.new
|
38
|
+
queue = SlackBotServer::RedisQueue.new
|
39
39
|
|
40
40
|
# Create a new server using that queue
|
41
41
|
server = SlackBotServer::Server.new(queue: queue)
|
data/lib/slack_bot_server/bot.rb
CHANGED
@@ -10,12 +10,17 @@ class SlackBotServer::Bot
|
|
10
10
|
@key = key || @token
|
11
11
|
@api = ::Slack::Client.new(token: @token)
|
12
12
|
@im_channel_ids = []
|
13
|
+
@channel_ids = []
|
14
|
+
@connected = false
|
15
|
+
@running = false
|
13
16
|
|
14
17
|
raise InvalidToken unless auth_test['ok']
|
15
18
|
end
|
16
19
|
|
17
20
|
def say(options)
|
18
|
-
@
|
21
|
+
@channel_ids.each do |channel_id|
|
22
|
+
@api.chat_postMessage(default_message_options.merge(options).merge(channel: channel_id))
|
23
|
+
end
|
19
24
|
end
|
20
25
|
|
21
26
|
def reply(options)
|
@@ -35,34 +40,49 @@ class SlackBotServer::Bot
|
|
35
40
|
end
|
36
41
|
|
37
42
|
def start
|
43
|
+
@running = true
|
38
44
|
@ws = Faye::WebSocket::Client.new(websocket_url, nil, ping: 60)
|
39
45
|
|
40
46
|
@ws.on :open do |event|
|
47
|
+
@connected = true
|
41
48
|
log "connected to '#{team}'"
|
42
49
|
load_im_channels
|
50
|
+
load_channels
|
43
51
|
end
|
44
52
|
|
45
53
|
@ws.on :message do |event|
|
46
54
|
begin
|
47
|
-
debug event
|
55
|
+
debug event.data
|
48
56
|
handle_message(event)
|
49
57
|
rescue => e
|
50
58
|
log error: e
|
59
|
+
log backtrace: e.backtrace
|
51
60
|
end
|
52
61
|
end
|
53
62
|
|
54
63
|
@ws.on :close do |event|
|
55
64
|
log "disconnected"
|
65
|
+
@connected = false
|
66
|
+
if @running
|
67
|
+
start
|
68
|
+
end
|
56
69
|
end
|
57
70
|
end
|
58
71
|
|
59
72
|
def stop
|
60
73
|
log "closing connection"
|
74
|
+
@running = false
|
61
75
|
@ws.close
|
62
76
|
log "closed"
|
63
77
|
end
|
64
78
|
|
79
|
+
def connected?
|
80
|
+
@connected
|
81
|
+
end
|
82
|
+
|
65
83
|
class << self
|
84
|
+
attr_reader :mention_keywords
|
85
|
+
|
66
86
|
def username(name)
|
67
87
|
default_message_options[:username] = name
|
68
88
|
end
|
@@ -71,8 +91,12 @@ class SlackBotServer::Bot
|
|
71
91
|
default_message_options[:icon_url] = url
|
72
92
|
end
|
73
93
|
|
94
|
+
def mention_as(*keywords)
|
95
|
+
@mention_keywords = keywords
|
96
|
+
end
|
97
|
+
|
74
98
|
def default_message_options
|
75
|
-
@default_message_options ||= {
|
99
|
+
@default_message_options ||= {}
|
76
100
|
end
|
77
101
|
|
78
102
|
def callbacks_for(type)
|
@@ -92,9 +116,9 @@ class SlackBotServer::Bot
|
|
92
116
|
def on_mention(&block)
|
93
117
|
on(:message) do |data|
|
94
118
|
if !bot_message?(data) &&
|
95
|
-
(data['text'] =~ /\A#{
|
96
|
-
data['text'] =~ /\A<@#{user_id}>[\s\:](.*)/)
|
97
|
-
message = $
|
119
|
+
(data['text'] =~ /\A(#{mention_keywords.join('|')})[\s\:](.*)/i ||
|
120
|
+
data['text'] =~ /\A(<@#{user_id}>)[\s\:](.*)/)
|
121
|
+
message = $2.strip
|
98
122
|
@last_received_data = data.merge('message' => message)
|
99
123
|
instance_exec(@last_received_data, &block)
|
100
124
|
end
|
@@ -117,6 +141,18 @@ class SlackBotServer::Bot
|
|
117
141
|
@im_channel_ids << channel_id
|
118
142
|
end
|
119
143
|
|
144
|
+
on :channel_joined do |data|
|
145
|
+
channel_id = data['channel']['id']
|
146
|
+
log "Adding new channel: #{channel_id}"
|
147
|
+
@channel_ids << channel_id
|
148
|
+
end
|
149
|
+
|
150
|
+
on :channel_left do |data|
|
151
|
+
channel_id = data['channel']
|
152
|
+
log "Removing channel: #{channel_id}"
|
153
|
+
@channel_ids.delete(channel_id)
|
154
|
+
end
|
155
|
+
|
120
156
|
def to_s
|
121
157
|
"<#{self.class.name} key:#{key}>"
|
122
158
|
end
|
@@ -170,12 +206,20 @@ class SlackBotServer::Bot
|
|
170
206
|
log im_channels: @im_channel_ids
|
171
207
|
end
|
172
208
|
|
209
|
+
def load_channels
|
210
|
+
log "Loading IM channels"
|
211
|
+
result = @api.channels_list(exclude_archived: 1)
|
212
|
+
@channel_ids = result['channels'].select { |d| d['is_member'] == true }.map { |d| d['id'] }
|
213
|
+
log channels: @channel_ids
|
214
|
+
end
|
215
|
+
|
173
216
|
def is_im_channel?(id)
|
174
217
|
@im_channel_ids.include?(id)
|
175
218
|
end
|
176
219
|
|
177
220
|
def bot_message?(data)
|
178
|
-
data['subtype'] == 'bot_message'
|
221
|
+
data['subtype'] == 'bot_message' ||
|
222
|
+
data['user'] == 'USLACKBOT'
|
179
223
|
end
|
180
224
|
|
181
225
|
def websocket_url
|
@@ -185,4 +229,8 @@ class SlackBotServer::Bot
|
|
185
229
|
def default_message_options
|
186
230
|
self.class.default_message_options
|
187
231
|
end
|
232
|
+
|
233
|
+
def mention_keywords
|
234
|
+
self.class.mention_keywords || [user]
|
235
|
+
end
|
188
236
|
end
|
@@ -1,9 +1,14 @@
|
|
1
1
|
require 'multi_json'
|
2
2
|
|
3
3
|
class SlackBotServer::RedisQueue
|
4
|
-
def initialize(redis)
|
4
|
+
def initialize(redis=nil)
|
5
5
|
@key = 'slack_bot_server:queue'
|
6
|
-
@redis = redis
|
6
|
+
@redis = if redis
|
7
|
+
redis
|
8
|
+
else
|
9
|
+
require 'redis'
|
10
|
+
Redis.new
|
11
|
+
end
|
7
12
|
end
|
8
13
|
|
9
14
|
def push(value)
|
@@ -13,7 +18,7 @@ class SlackBotServer::RedisQueue
|
|
13
18
|
def pop
|
14
19
|
json_value = @redis.lpop @key
|
15
20
|
if json_value
|
16
|
-
MultiJson.load(json_value)
|
21
|
+
MultiJson.load(json_value, symbolize_keys: true)
|
17
22
|
else
|
18
23
|
nil
|
19
24
|
end
|
data/slack_bot_server.gemspec
CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.10"
|
26
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "redis"
|
27
28
|
spec.add_development_dependency "rspec"
|
28
29
|
spec.add_development_dependency "rspec-eventmachine"
|
29
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slack-bot-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Adam
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06
|
11
|
+
date: 2015-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: slack-api
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: redis
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|