slackbot_frd 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/slackbot-frd +34 -34
- data/lib/slackbot_frd/initializer/bot_starter.rb +8 -6
- data/lib/slackbot_frd/lib/bot.rb +1 -1
- data/lib/slackbot_frd/lib/errors.rb +1 -1
- data/lib/slackbot_frd/lib/log.rb +1 -1
- data/lib/slackbot_frd/lib/slack_connection.rb +134 -62
- data/lib/slackbot_frd/slack_methods/channels_info.rb +2 -2
- data/lib/slackbot_frd/slack_methods/channels_list.rb +4 -4
- data/lib/slackbot_frd/slack_methods/groups_list.rb +4 -4
- data/lib/slackbot_frd/slack_methods/im_channels_list.rb +4 -4
- data/lib/slackbot_frd/slack_methods/rtm_start.rb +1 -1
- data/lib/slackbot_frd/slack_methods/users_list.rb +4 -4
- data/lib/slackbot_frd.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: 8f18d78abc8751ff7cf6ccab669a856f3e5896eb
|
4
|
+
data.tar.gz: 7ccd3d4e72331455e3ae954225dea63421cbc696
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd865011f64fd16a8d53f39ce099f0ca62308b0228117b598471817cf06be91eab66d4e8ee84e3b388c1a345a7bd94e4dbe1c56b45bd46cd46d7894f4a98e529
|
7
|
+
data.tar.gz: 088ccc188cc9f8f4b1bad887ce5beb91107e8053393a927aa6bf36ef29f265036c51c7cfd46ca25994533119ab8101688a6fab6c5c2fe75d78e3e34368bc9740
|
data/bin/slackbot-frd
CHANGED
@@ -16,15 +16,15 @@ end
|
|
16
16
|
|
17
17
|
DEBUG = true
|
18
18
|
|
19
|
-
PID_FILE_WATCHER =
|
20
|
-
PID_FILE_CONNECTION =
|
21
|
-
BOT_LIST_FILE =
|
22
|
-
ERROR_FILE =
|
23
|
-
DEFAULT_CONFIG_FILE =
|
24
|
-
LOG_FILE =
|
19
|
+
PID_FILE_WATCHER = '/tmp/slackbot-frd-watcher.pid'
|
20
|
+
PID_FILE_CONNECTION = '/tmp/slackbot-frd-connection.pid'
|
21
|
+
BOT_LIST_FILE = '/tmp/slackbot-frd-bot-list.pid'
|
22
|
+
ERROR_FILE = '/tmp/slackbot-frd.errors'
|
23
|
+
DEFAULT_CONFIG_FILE = 'slackbot-frd.conf'
|
24
|
+
LOG_FILE = 'slackbot-frd.log'
|
25
25
|
|
26
26
|
class SlackbotFrdBin < Thor
|
27
|
-
desc
|
27
|
+
desc 'list', 'List all bots'
|
28
28
|
long_desc <<-LONGDESC
|
29
29
|
list will print out all available bots
|
30
30
|
|
@@ -34,16 +34,16 @@ class SlackbotFrdBin < Thor
|
|
34
34
|
# TODO
|
35
35
|
end
|
36
36
|
|
37
|
-
desc
|
37
|
+
desc 'status', 'Report status on daemon procs'
|
38
38
|
def status
|
39
39
|
if running?(watcher_pid)
|
40
40
|
puts "Daemon running as pid '#{watcher_pid}'".green
|
41
41
|
else
|
42
|
-
puts
|
42
|
+
puts 'Daemon not running'.red
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
desc
|
46
|
+
desc 'new <project-name>', 'Generate a new slackbot_frd project'
|
47
47
|
long_desc <<-LONGDESC
|
48
48
|
new will generate a skeleton for a new slackbot_frd project
|
49
49
|
LONGDESC
|
@@ -56,25 +56,25 @@ class SlackbotFrdBin < Thor
|
|
56
56
|
Dir.mkdir(proj_name)
|
57
57
|
Dir.chdir(proj_name)
|
58
58
|
genconfig
|
59
|
-
File.write(
|
59
|
+
File.write('Gemfile', <<-GEMFILE.strip_heredoc)
|
60
60
|
source "https://rubygems.org"
|
61
61
|
|
62
62
|
gem "slackbot_frd"
|
63
63
|
GEMFILE
|
64
|
-
Dir.mkdir(
|
65
|
-
write_example_bot(
|
66
|
-
Dir.mkdir(
|
64
|
+
Dir.mkdir('bots')
|
65
|
+
write_example_bot('bots/example_bot.rb')
|
66
|
+
Dir.mkdir('lib')
|
67
67
|
|
68
68
|
unless options[:nospec]
|
69
|
-
File.append(
|
69
|
+
File.append('Gemfile', <<-GEMFILE.strip_heredoc)
|
70
70
|
|
71
71
|
gem "rspec", "~> 3.2"
|
72
72
|
GEMFILE
|
73
|
-
Dir.mkdir(
|
73
|
+
Dir.mkdir('spec')
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
desc
|
77
|
+
desc 'genconfig', 'Generate a skeleton config file'
|
78
78
|
long_desc <<-LONGDESC
|
79
79
|
genconfig will generate a skeleton config file that
|
80
80
|
can be customized
|
@@ -93,7 +93,7 @@ class SlackbotFrdBin < Thor
|
|
93
93
|
CONFIG_FILE_SKELETON
|
94
94
|
end
|
95
95
|
|
96
|
-
desc
|
96
|
+
desc 'start [bot1] [bot2] [botx...]', 'Start all specified bots, or all bots'
|
97
97
|
long_desc <<-LONGDESC
|
98
98
|
start [bot1] [bot2] [botx...] will start the specified bots.
|
99
99
|
If no bots are specified, all available bots will be run.
|
@@ -125,25 +125,25 @@ class SlackbotFrdBin < Thor
|
|
125
125
|
$slackbotfrd_conf.freeze
|
126
126
|
|
127
127
|
daemonize = false
|
128
|
-
daemonize = $slackbotfrd_conf[
|
129
|
-
daemonize = ENV[
|
128
|
+
daemonize = $slackbotfrd_conf['daemonize'] if $slackbotfrd_conf['daemonize']
|
129
|
+
daemonize = ENV['SLACKBOT_FRD_DAEMONIZE'] if ENV['SLACKBOT_FRD_DAEMONIZE']
|
130
130
|
daemonize = options[:daemonize] if options[:daemonize]
|
131
131
|
|
132
132
|
botdir = Dir.pwd
|
133
|
-
botdir = $slackbotfrd_conf[
|
134
|
-
botdir = ENV[
|
133
|
+
botdir = $slackbotfrd_conf['botdir'] if $slackbotfrd_conf['botdir']
|
134
|
+
botdir = ENV['SLACKBOT_FRD_BOTDIR'] if ENV['SLACKBOT_FRD_BOTDIR']
|
135
135
|
botdir = options[:botdir] if options[:botdir]
|
136
136
|
botdir = File.expand_path(botdir)
|
137
137
|
|
138
138
|
SlackbotFrd::Log.logfile = "#{botdir}/#{LOG_FILE}"
|
139
|
-
SlackbotFrd::Log.logfile = $slackbotfrd_conf[
|
140
|
-
SlackbotFrd::Log.logfile = ENV[
|
141
|
-
SlackbotFrd::Log.logfile = options[
|
139
|
+
SlackbotFrd::Log.logfile = $slackbotfrd_conf['log_file'] if $slackbotfrd_conf['log_file']
|
140
|
+
SlackbotFrd::Log.logfile = ENV['SLACKBOT_FRD_LOG_FILE'] if ENV['SLACKBOT_FRD_LOG_FILE']
|
141
|
+
SlackbotFrd::Log.logfile = options['log-file'] if options['log-file']
|
142
142
|
|
143
143
|
SlackbotFrd::Log.level = :info
|
144
|
-
SlackbotFrd::Log.level = $slackbotfrd_conf[
|
145
|
-
SlackbotFrd::Log.level = ENV[
|
146
|
-
SlackbotFrd::Log.level = options[
|
144
|
+
SlackbotFrd::Log.level = $slackbotfrd_conf['log_level'] if $slackbotfrd_conf['log_level']
|
145
|
+
SlackbotFrd::Log.level = ENV['SLACKBOT_FRD_LOG_LEVEL'] if ENV['SLACKBOT_FRD_LOG_LEVEL']
|
146
|
+
SlackbotFrd::Log.level = options['log-level'] if options['log-level']
|
147
147
|
|
148
148
|
# If we got a number for log level that is valid, just use that
|
149
149
|
if SlackbotFrd::Log.level =~ /\d+/ && SlackbotFrd::Log.levels.values.include?(SlackbotFrd::Log.level.to_i)
|
@@ -165,11 +165,11 @@ class SlackbotFrdBin < Thor
|
|
165
165
|
SlackbotFrd::Log.warn("Logging to file '#{SlackbotFrd::Log.logfile}'")
|
166
166
|
SlackbotFrd::Log.warn("Logging level set to '#{SlackbotFrd::Log.level}'")
|
167
167
|
|
168
|
-
token = $slackbotfrd_conf[
|
169
|
-
token = ENV[
|
168
|
+
token = $slackbotfrd_conf['token']
|
169
|
+
token = ENV['SLACKBOT_FRD_TOKEN'] if ENV['SLACKBOT_FRD_TOKEN']
|
170
170
|
token = options[:token] if options[:token]
|
171
171
|
unless token
|
172
|
-
SlackbotFrd::Log.error(
|
172
|
+
SlackbotFrd::Log.error('No token found. Cannot authenticate to Slack')
|
173
173
|
return
|
174
174
|
end
|
175
175
|
|
@@ -180,7 +180,7 @@ class SlackbotFrdBin < Thor
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
-
desc
|
183
|
+
desc 'stop', 'Stop all bots'
|
184
184
|
long_desc <<-LONGDESC
|
185
185
|
stop will stop all bots
|
186
186
|
|
@@ -195,7 +195,7 @@ class SlackbotFrdBin < Thor
|
|
195
195
|
delfile(ERROR_FILE)
|
196
196
|
end
|
197
197
|
|
198
|
-
desc
|
198
|
+
desc 'bump', 'Kill the bots, but not the watcher'
|
199
199
|
long_desc <<-LONGDESC
|
200
200
|
bump will kill the connection process, but not the watcher.
|
201
201
|
this causes the watcher to restart the connection. This
|
@@ -208,7 +208,7 @@ class SlackbotFrdBin < Thor
|
|
208
208
|
kill_pid(connection_pid)
|
209
209
|
end
|
210
210
|
|
211
|
-
desc
|
211
|
+
desc 'restart', 'Stop all bots and restart them'
|
212
212
|
long_desc <<-LONGDESC
|
213
213
|
restart will restart all bots
|
214
214
|
|
@@ -17,11 +17,13 @@ class BotStarter
|
|
17
17
|
bot_enabled = ->(bot) do
|
18
18
|
enabled_bots.empty? ||
|
19
19
|
enabled_bots.include?(bot) ||
|
20
|
-
enabled_bots.include?(bot.gsub(
|
20
|
+
enabled_bots.include?(bot.gsub('-', '_').camelize)
|
21
21
|
end
|
22
22
|
|
23
23
|
# Create a new Connection to pass to the bot classes
|
24
|
-
slack_connection = SlackbotFrd::SlackConnection.new(
|
24
|
+
slack_connection = SlackbotFrd::SlackConnection.new(
|
25
|
+
token: token, errors_file: errors_file, monitor_connection: true
|
26
|
+
)
|
25
27
|
|
26
28
|
load_bot_files(botdir)
|
27
29
|
|
@@ -37,12 +39,12 @@ class BotStarter
|
|
37
39
|
end
|
38
40
|
|
39
41
|
if bots.count == 0
|
40
|
-
SlackbotFrd::Log.error(
|
41
|
-
File.append(errors_file,
|
42
|
+
SlackbotFrd::Log.error('Not starting: no bots found')
|
43
|
+
File.append(errors_file, 'Not starting: no bots found')
|
42
44
|
else
|
43
|
-
SlackbotFrd::Log.debug(
|
45
|
+
SlackbotFrd::Log.debug('Starting SlackConnection')
|
44
46
|
slack_connection.start
|
45
|
-
SlackbotFrd::Log.debug(
|
47
|
+
SlackbotFrd::Log.debug('Connection closed')
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
data/lib/slackbot_frd/lib/bot.rb
CHANGED
@@ -12,7 +12,7 @@ module SlackbotFrd
|
|
12
12
|
|
13
13
|
# This is where the bot adds all of their callbacks to the bpbot
|
14
14
|
def add_callbacks(slack_connection)
|
15
|
-
raise StandardError.new(
|
15
|
+
raise StandardError.new('You must override the define() method for your bot to do anything')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/slackbot_frd/lib/log.rb
CHANGED
@@ -48,7 +48,7 @@ module SlackbotFrd
|
|
48
48
|
om = "#{DateTime.now.strftime('%Y-%m-%e %H:%M:%S.%L %z')}: [#{loglevel}]: #{message}\n"
|
49
49
|
print om.send(color)
|
50
50
|
begin
|
51
|
-
raise StandardError.new(
|
51
|
+
raise StandardError.new('No log file specified. (Set with SlackbotFrd::Log.logfile=)') unless @logfile
|
52
52
|
File.open(@logfile, 'a') do |f|
|
53
53
|
f.write(om)
|
54
54
|
end
|
@@ -21,16 +21,17 @@ module SlackbotFrd
|
|
21
21
|
FILE_DIR = File.dirname(FILE_PATH)
|
22
22
|
LOG_FILE = "#{APP_ROOT}/bp-slackbot.log"
|
23
23
|
PID_FILE_NAME = "#{APP_ROOT}/bp-slackbot.pid"
|
24
|
+
PING_INTERVAL_SECONDS = 5
|
24
25
|
|
25
26
|
attr_accessor :token
|
26
27
|
|
27
|
-
def initialize(token
|
28
|
-
unless token
|
29
|
-
log_and_add_to_error_file("No token passed to #{self.class}")
|
30
|
-
end
|
28
|
+
def initialize(token:, errors_file:, monitor_connection: true)
|
29
|
+
log_and_add_to_error_file("No token passed to #{self.class}") unless token
|
31
30
|
|
32
31
|
@token = token
|
33
32
|
@errors_file = errors_file
|
33
|
+
@monitor_connection = monitor_connection
|
34
|
+
|
34
35
|
@event_id = 0
|
35
36
|
@on_connected_callbacks = []
|
36
37
|
@on_disconnected_callbacks = []
|
@@ -44,7 +45,8 @@ module SlackbotFrd
|
|
44
45
|
@channel_id_to_name = {}
|
45
46
|
@channel_name_to_id = {}
|
46
47
|
|
47
|
-
|
48
|
+
@pong_received = true
|
49
|
+
|
48
50
|
SlackbotFrd::Log.debug("Done initializing #{self.class}")
|
49
51
|
end
|
50
52
|
|
@@ -62,7 +64,9 @@ module SlackbotFrd
|
|
62
64
|
end
|
63
65
|
|
64
66
|
unless wss_url
|
65
|
-
log_and_add_to_error_file(
|
67
|
+
log_and_add_to_error_file(
|
68
|
+
'No Real Time stream opened by slack. Check for network connection and correct authentication token'
|
69
|
+
)
|
66
70
|
return
|
67
71
|
end
|
68
72
|
@ws = Faye::WebSocket::Client.new(wss_url)
|
@@ -72,10 +76,15 @@ module SlackbotFrd
|
|
72
76
|
@ws.on(:message) { |event| process_message_received(event) }
|
73
77
|
|
74
78
|
# Clean up our pid file
|
75
|
-
@ws.on(:close) { |
|
79
|
+
@ws.on(:close) { |_event| File.delete(PID_FILE_NAME) }
|
80
|
+
|
81
|
+
# This should ensure that we get a pong back at least every
|
82
|
+
# PING_INTERVAL_SECONDS, otherwise we die because our
|
83
|
+
# connection is probably toast
|
84
|
+
EM.add_periodic_timer(PING_INTERVAL_SECONDS) { check_ping }
|
76
85
|
end
|
77
86
|
|
78
|
-
SlackbotFrd::Log.
|
87
|
+
SlackbotFrd::Log.info("#{self.class}: event machine loop terminated")
|
79
88
|
end
|
80
89
|
|
81
90
|
def event_id
|
@@ -93,13 +102,21 @@ module SlackbotFrd
|
|
93
102
|
|
94
103
|
def on_message(user: :any, channel: :any, &block)
|
95
104
|
wrap_user_or_channel_lookup_on_callback('on_message', user, channel) do
|
96
|
-
@on_message_callbacks.add(
|
105
|
+
@on_message_callbacks.add(
|
106
|
+
user: user_name_to_id(user),
|
107
|
+
channel: channel_name_to_id(channel),
|
108
|
+
callback: block
|
109
|
+
)
|
97
110
|
end
|
98
111
|
end
|
99
112
|
|
100
113
|
def on_channel_left(user: :any, channel: :any, &block)
|
101
114
|
wrap_user_or_channel_lookup_on_callback('on_message_channel_left', user, channel) do
|
102
|
-
@on_channel_left_callbacks.add(
|
115
|
+
@on_channel_left_callbacks.add(
|
116
|
+
user: user_name_to_id(user),
|
117
|
+
channel: channel_name_to_id(channel),
|
118
|
+
callback: block
|
119
|
+
)
|
103
120
|
end
|
104
121
|
end
|
105
122
|
|
@@ -138,7 +155,9 @@ module SlackbotFrd
|
|
138
155
|
end
|
139
156
|
|
140
157
|
def post_reaction(name:, channel: nil, timestamp: nil)
|
141
|
-
SlackbotFrd::Log.debug(
|
158
|
+
SlackbotFrd::Log.debug(
|
159
|
+
"#{self.class}: Posting reaction '#{name}' to channel '#{channel}' with timestamp '#{timestamp}'"
|
160
|
+
)
|
142
161
|
|
143
162
|
resp = SlackbotFrd::SlackMethods::ReactionsAdd.add(
|
144
163
|
token: @token,
|
@@ -150,24 +169,25 @@ module SlackbotFrd
|
|
150
169
|
SlackbotFrd::Log.debug("#{self.class}: Received response: #{resp}")
|
151
170
|
end
|
152
171
|
|
153
|
-
def invite_user(user
|
154
|
-
SlackbotFrd::Log.debug(
|
172
|
+
def invite_user(user:, channel:)
|
173
|
+
SlackbotFrd::Log.debug(
|
174
|
+
"#{self.class}: Inviting user '#{user}' to channel '#{channel}'"
|
175
|
+
)
|
155
176
|
|
156
177
|
resp = SlackbotFrd::SlackMethods::ChannelsInvite.invite(
|
157
178
|
token: @token,
|
158
179
|
user: user_name_to_id(user),
|
159
|
-
channel: channel_name_to_id(channel)
|
180
|
+
channel: channel_name_to_id(channel)
|
160
181
|
)
|
161
182
|
|
162
183
|
SlackbotFrd::Log.debug("#{self.class}: Received response: #{resp}")
|
163
184
|
end
|
164
185
|
|
165
|
-
def restrict_actions_to_channels_joined(value = true)
|
166
|
-
@restrict_actions_to_channels_joined = value
|
167
|
-
end
|
168
|
-
|
169
186
|
def users_in_channel(channel)
|
170
|
-
a = SlackMethods::ChannelsInfo.members(
|
187
|
+
a = SlackMethods::ChannelsInfo.members(
|
188
|
+
token: @token,
|
189
|
+
channel: channel_name_to_id(channel)
|
190
|
+
)
|
171
191
|
a.map{ |id| user_id_to_name(id) }
|
172
192
|
end
|
173
193
|
|
@@ -189,52 +209,70 @@ module SlackbotFrd
|
|
189
209
|
|
190
210
|
def user_id_to_name(user_id)
|
191
211
|
return user_id if user_id == :any || user_id == :bot
|
192
|
-
unless @user_id_to_name && @user_id_to_name.
|
212
|
+
unless @user_id_to_name && @user_id_to_name.key?(user_id)
|
193
213
|
refresh_user_info
|
194
214
|
end
|
195
|
-
|
215
|
+
unless @user_id_to_name.include?(user_id)
|
216
|
+
SlackbotFrd::Log.warn("#{self.class}: User id '#{user_id}' not found")
|
217
|
+
end
|
196
218
|
@user_id_to_name[user_id]
|
197
219
|
end
|
198
220
|
|
199
221
|
def user_name_to_id(user_name)
|
200
222
|
return user_name if user_name == :any || user_name == :bot
|
201
|
-
unless @user_name_to_id && @user_name_to_id.
|
223
|
+
unless @user_name_to_id && @user_name_to_id.key?(user_name)
|
202
224
|
refresh_user_info
|
203
225
|
end
|
204
|
-
|
226
|
+
unless @user_name_to_id.include?(user_name)
|
227
|
+
SlackbotFrd::Log.warn(
|
228
|
+
"#{self.class}: User name '#{user_name}' not found"
|
229
|
+
)
|
230
|
+
end
|
205
231
|
@user_name_to_id[user_name]
|
206
232
|
end
|
207
233
|
|
208
234
|
def channel_id_to_name(channel_id)
|
209
|
-
unless @channel_id_to_name && @channel_id_to_name.
|
235
|
+
unless @channel_id_to_name && @channel_id_to_name.key?(channel_id)
|
210
236
|
refresh_channel_info
|
211
237
|
end
|
212
|
-
|
238
|
+
unless @channel_id_to_name.include?(channel_id)
|
239
|
+
SlackbotFrd::Log.warn(
|
240
|
+
"#{self.class}: Channel id '#{channel_id}' not found"
|
241
|
+
)
|
242
|
+
end
|
213
243
|
@channel_id_to_name[channel_id]
|
214
244
|
end
|
215
245
|
|
216
246
|
def channel_name_to_id(channel_name)
|
217
247
|
return channel_name if channel_name == :any
|
218
248
|
nc = normalize_channel_name(channel_name)
|
219
|
-
unless @channel_name_to_id && @channel_name_to_id.
|
249
|
+
unless @channel_name_to_id && @channel_name_to_id.key?(nc)
|
220
250
|
refresh_channel_info
|
221
251
|
end
|
222
|
-
|
252
|
+
unless @channel_name_to_id.include?(nc)
|
253
|
+
SlackbotFrd::Log.warn(
|
254
|
+
"#{self.class}: Channel name '#{nc}' not found"
|
255
|
+
)
|
256
|
+
end
|
223
257
|
@channel_name_to_id[nc]
|
224
258
|
end
|
225
259
|
|
226
260
|
private
|
227
|
-
def send_message_as_user(channel
|
261
|
+
def send_message_as_user(channel:, message:)
|
228
262
|
unless @ws
|
229
|
-
log_and_add_to_error_file(
|
263
|
+
log_and_add_to_error_file(
|
264
|
+
"Cannot send message '#{message}' as user to channel '#{channel}' because not connected to wss stream"
|
265
|
+
)
|
230
266
|
end
|
231
267
|
|
232
|
-
SlackbotFrd::Log.debug(
|
268
|
+
SlackbotFrd::Log.debug(
|
269
|
+
"#{self.class}: Sending message '#{message}' as user to channel '#{channel}'"
|
270
|
+
)
|
233
271
|
|
234
272
|
begin
|
235
273
|
resp = @ws.send({
|
236
274
|
id: event_id,
|
237
|
-
type:
|
275
|
+
type: 'message',
|
238
276
|
channel: channel_name_to_id(channel),
|
239
277
|
text: message
|
240
278
|
}.to_json)
|
@@ -247,7 +285,9 @@ module SlackbotFrd
|
|
247
285
|
|
248
286
|
private
|
249
287
|
def send_message_as_bot(channel:, message:, username:, avatar_emoji: nil, avatar_url: nil)
|
250
|
-
SlackbotFrd::Log.debug(
|
288
|
+
SlackbotFrd::Log.debug(
|
289
|
+
"#{self.class}: Sending message '#{message}' as bot user '#{username}' to channel '#{channel}'"
|
290
|
+
)
|
251
291
|
|
252
292
|
resp = SlackbotFrd::SlackMethods::ChatPostMessage.postMessage(
|
253
293
|
token: @token,
|
@@ -265,10 +305,14 @@ module SlackbotFrd
|
|
265
305
|
def wrap_user_or_channel_lookup_on_callback(callback_name, user, channel)
|
266
306
|
begin
|
267
307
|
return yield
|
268
|
-
rescue SlackbotFrd::InvalidChannelError =>
|
269
|
-
log_and_add_to_error_file(
|
270
|
-
|
271
|
-
|
308
|
+
rescue SlackbotFrd::InvalidChannelError => _e
|
309
|
+
log_and_add_to_error_file(
|
310
|
+
"Unable to add #{callback_name} callback for channel '#{channel}'. Lookup of channel name to ID failed. Check network connection, and ensure channel exists and is accessible"
|
311
|
+
)
|
312
|
+
rescue SlackbotFrd::InvalidUserError => _e
|
313
|
+
log_and_add_to_error_file(
|
314
|
+
"Unable to add #{callback_name} callback for user '#{user}'. Lookup of user name to ID failed. Check network connection and ensure user exists"
|
315
|
+
)
|
272
316
|
end
|
273
317
|
end
|
274
318
|
|
@@ -282,44 +326,48 @@ module SlackbotFrd
|
|
282
326
|
def process_message_received(event)
|
283
327
|
message = JSON.parse(event.data)
|
284
328
|
SlackbotFrd::Log.verbose("#{self.class}: Message received: #{message}")
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
329
|
+
|
330
|
+
return unless message['type'] == 'message'
|
331
|
+
if message['subtype'] == 'channel_join'
|
332
|
+
process_join_message(message)
|
333
|
+
elsif message['subtype'] == 'channel_leave'
|
334
|
+
process_leave_message(message)
|
335
|
+
elsif message['subtype'] == 'file_share'
|
336
|
+
process_file_share(message)
|
337
|
+
else
|
338
|
+
process_chat_message(message)
|
295
339
|
end
|
296
340
|
end
|
297
341
|
|
298
342
|
private
|
299
343
|
def process_file_share(message)
|
300
|
-
SlackbotFrd::Log.verbose(
|
301
|
-
|
344
|
+
SlackbotFrd::Log.verbose(
|
345
|
+
"#{self.class}: Processing file share: #{message}"
|
346
|
+
)
|
347
|
+
SlackbotFrd::Log.debug(
|
348
|
+
"#{self.class}: Not processing file share because it is not implemented:"
|
349
|
+
)
|
302
350
|
end
|
303
351
|
|
304
352
|
private
|
305
353
|
def extract_user(message)
|
306
|
-
user = message[
|
307
|
-
user = :bot if message[
|
308
|
-
user = message[
|
354
|
+
user = message['user']
|
355
|
+
user = :bot if message['subtype'] == 'bot_message'
|
356
|
+
user = message['message']['user'] if !user && message['message']
|
309
357
|
user
|
310
358
|
end
|
311
359
|
|
312
360
|
private
|
313
361
|
def extract_ts(message)
|
314
|
-
ts = message[
|
315
|
-
ts = message[
|
362
|
+
ts = message['ts']
|
363
|
+
ts = message['message']['ts'] if message['message'] && message['message']['ts']
|
316
364
|
ts
|
317
365
|
end
|
318
366
|
|
319
367
|
private
|
320
368
|
def extract_text(message)
|
321
|
-
text = message[
|
322
|
-
text = message[
|
369
|
+
text = message['text']
|
370
|
+
text = message['message']['text'] if !text && message['message']
|
323
371
|
text
|
324
372
|
end
|
325
373
|
|
@@ -328,7 +376,7 @@ module SlackbotFrd
|
|
328
376
|
SlackbotFrd::Log.verbose("#{self.class}: Processing chat message: #{message}")
|
329
377
|
|
330
378
|
user = extract_user(message)
|
331
|
-
channel = message[
|
379
|
+
channel = message['channel']
|
332
380
|
text = extract_text(message)
|
333
381
|
ts = extract_ts(message)
|
334
382
|
|
@@ -362,9 +410,9 @@ module SlackbotFrd
|
|
362
410
|
private
|
363
411
|
def process_join_message(message)
|
364
412
|
SlackbotFrd::Log.verbose("#{self.class}: Processing join message: #{message}")
|
365
|
-
user = message[
|
366
|
-
user = :bot if message[
|
367
|
-
channel = message[
|
413
|
+
user = message['user']
|
414
|
+
user = :bot if message['subtype'] == 'bot_message'
|
415
|
+
channel = message['channel']
|
368
416
|
@on_channel_joined_callbacks.where_include_all(user: user, channel: channel).each do |callback|
|
369
417
|
callback.call(user: user_id_to_name(user), channel: channel_id_to_name(channel))
|
370
418
|
end
|
@@ -373,9 +421,9 @@ module SlackbotFrd
|
|
373
421
|
private
|
374
422
|
def process_leave_message(message)
|
375
423
|
SlackbotFrd::Log.verbose("#{self.class}: Processing leave message: #{message}")
|
376
|
-
user = message[
|
377
|
-
user = :bot if message[
|
378
|
-
channel = message[
|
424
|
+
user = message['user']
|
425
|
+
user = :bot if message['subtype'] == 'bot_message'
|
426
|
+
channel = message['channel']
|
379
427
|
@on_channel_left_callbacks.where_include_all(user: user, channel: channel).each do |callback|
|
380
428
|
callback.call(user: user_id_to_name(user), channel: channel_id_to_name(channel))
|
381
429
|
end
|
@@ -421,5 +469,29 @@ module SlackbotFrd
|
|
421
469
|
SlackbotFrd::Log.error(err)
|
422
470
|
File.append(@errors_file, "#{err}\n")
|
423
471
|
end
|
472
|
+
|
473
|
+
private
|
474
|
+
def check_ping
|
475
|
+
@pong_received ? send_ping : die_from_no_pong
|
476
|
+
end
|
477
|
+
|
478
|
+
private
|
479
|
+
def send_ping
|
480
|
+
SlackbotFrd::Log.verbose('Sending ping')
|
481
|
+
@pong_received = false
|
482
|
+
@ws.ping do
|
483
|
+
@pong_received = true
|
484
|
+
SlackbotFrd::Log.verbose('Pong received')
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
private
|
489
|
+
def die_from_no_pong
|
490
|
+
SlackbotFrd::Log.error(
|
491
|
+
'Pong not received after 5 seconds. Stopping EM loop...'
|
492
|
+
)
|
493
|
+
@ws.close
|
494
|
+
EM.stop_event_loop
|
495
|
+
end
|
424
496
|
end
|
425
497
|
end
|
@@ -20,16 +20,16 @@ module SlackbotFrd
|
|
20
20
|
|
21
21
|
def ids_to_names
|
22
22
|
retval = {}
|
23
|
-
@response[
|
24
|
-
retval[channel[
|
23
|
+
@response['channels'].each do |channel|
|
24
|
+
retval[channel['id']] = channel['name']
|
25
25
|
end
|
26
26
|
retval
|
27
27
|
end
|
28
28
|
|
29
29
|
def names_to_ids
|
30
30
|
retval = {}
|
31
|
-
@response[
|
32
|
-
retval[channel[
|
31
|
+
@response['channels'].each do |channel|
|
32
|
+
retval[channel['name']] = channel['id']
|
33
33
|
end
|
34
34
|
retval
|
35
35
|
end
|
@@ -20,16 +20,16 @@ module SlackbotFrd
|
|
20
20
|
|
21
21
|
def ids_to_names
|
22
22
|
retval = {}
|
23
|
-
@response[
|
24
|
-
retval[group[
|
23
|
+
@response['groups'].each do |group|
|
24
|
+
retval[group['id']] = group['name']
|
25
25
|
end
|
26
26
|
retval
|
27
27
|
end
|
28
28
|
|
29
29
|
def names_to_ids
|
30
30
|
retval = {}
|
31
|
-
@response[
|
32
|
-
retval[group[
|
31
|
+
@response['groups'].each do |group|
|
32
|
+
retval[group['name']] = group['id']
|
33
33
|
end
|
34
34
|
retval
|
35
35
|
end
|
@@ -20,16 +20,16 @@ module SlackbotFrd
|
|
20
20
|
|
21
21
|
def ids_to_names
|
22
22
|
retval = {}
|
23
|
-
@response[
|
24
|
-
retval[im[
|
23
|
+
@response['ims'].each do |im|
|
24
|
+
retval[im['id']] = im['user']
|
25
25
|
end
|
26
26
|
retval
|
27
27
|
end
|
28
28
|
|
29
29
|
def names_to_ids
|
30
30
|
retval = {}
|
31
|
-
@response[
|
32
|
-
retval[im[
|
31
|
+
@response['ims'].each do |im|
|
32
|
+
retval[im['user']] = im['id']
|
33
33
|
end
|
34
34
|
retval
|
35
35
|
end
|
@@ -20,16 +20,16 @@ module SlackbotFrd
|
|
20
20
|
|
21
21
|
def ids_to_names
|
22
22
|
retval = {}
|
23
|
-
@response[
|
24
|
-
retval[user[
|
23
|
+
@response['members'].each do |user|
|
24
|
+
retval[user['id']] = user['name']
|
25
25
|
end
|
26
26
|
retval
|
27
27
|
end
|
28
28
|
|
29
29
|
def names_to_ids
|
30
30
|
retval = {}
|
31
|
-
@response[
|
32
|
-
retval[user[
|
31
|
+
@response['members'].each do |user|
|
32
|
+
retval[user['name']] = user['id']
|
33
33
|
end
|
34
34
|
retval
|
35
35
|
end
|
data/lib/slackbot_frd.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slackbot_frd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Porter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|