slack-smart-bot 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dae9bd068fb11def9fdd0b81e3868e1f1ee4b35a2743f75bf47febf212ed6b86
4
- data.tar.gz: c0bc03f403f9161fb79ff1993f73f2150eed7af1524e6005efc03a7c60c5bb0d
3
+ metadata.gz: 3a1d9b4bd841702898c4e1d360d02feddb1925978384737ca004465c99d142b4
4
+ data.tar.gz: 7dcf3a38e80192839a80a661cfac41ce07e8a4e8e5727fbd01a983d7198b9e50
5
5
  SHA512:
6
- metadata.gz: bb6fffcb65ae550998c869f9fd03a3869f5eedfe4921c4bad4634980e841cc578b8b56ef96c770deff591676bfcf7557fa458851d17784a95df5f418ff52eb23
7
- data.tar.gz: 5a7ef6c491043979b43a6cdf6ce245a646fab4b29e111069e029a2b7c9da22bf23f9161033ce48f3f1d39691fc0ea653cd37f62aa184b8860730fb4aadcfa18c
6
+ metadata.gz: 402028ab7ccdbaceca81ea0e3c41f05abe63e460911c302891f7b62166115adb64be63a4f9fd7565b5a5b1b075d0f5eb6ba5549d8ee88550438f722638feb76a
7
+ data.tar.gz: b5c20e75ddb9fa8c180893dd436116a2b3bfa85d104b6a91479b8ebc18e64c70e233be18e77858e5600427a829cb073c44594780e30d9ff615dea1195d63864d
@@ -6,7 +6,6 @@ require "logger"
6
6
  require "fileutils"
7
7
  require "open3"
8
8
 
9
-
10
9
  if ARGV.size == 0
11
10
  CHANNEL = MASTER_CHANNEL
12
11
  ON_MASTER_BOT = true
@@ -29,7 +28,8 @@ SHORTCUTS_FILE = "slack-smart-bot_shortcuts_#{CHANNEL}.rb".gsub(" ", "_")
29
28
 
30
29
  class SlackSmartBot
31
30
  attr_accessor :config, :client, :wclient
32
- VERSION = Gem.loaded_specs.values.select {|x| x.name=='slack-smart-bot'}[0].version.to_s
31
+ VERSION = Gem.loaded_specs.values.select { |x| x.name == "slack-smart-bot" }[0].version.to_s
32
+
33
33
  def initialize(config)
34
34
  Dir.mkdir("./logs") unless Dir.exist?("./logs")
35
35
  Dir.mkdir("./shortcuts") unless Dir.exist?("./shortcuts")
@@ -37,6 +37,7 @@ class SlackSmartBot
37
37
  @logger = Logger.new("./logs/#{logfile}")
38
38
  config_log = config.dup
39
39
  config_log.delete(:token)
40
+ config[:silent] = false unless config.key?(:silent)
40
41
  @logger.info "Initializing bot: #{config_log.inspect}"
41
42
 
42
43
  config[:channel] = CHANNEL
@@ -101,11 +102,13 @@ class SlackSmartBot
101
102
  @logger.info m
102
103
  gems_remote = `gem list slack-smart-bot --remote`
103
104
  version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
104
- version_message = ''
105
+ version_message = ""
105
106
  if version_remote != VERSION
106
107
  version_message = ". There is a new available version: #{version_remote}."
107
108
  end
108
- respond "Smart Bot started v#{VERSION}#{version_message}\nIf you want to know what I can do for you: `bot help`.\n`bot rules` if you want to display just the specific rules of this channel.\nYou can talk to me privately if you prefer it."
109
+ unless config[:silent]
110
+ respond "Smart Bot started v#{VERSION}#{version_message}\nIf you want to know what I can do for you: `bot help`.\n`bot rules` if you want to display just the specific rules of this channel.\nYou can talk to me privately if you prefer it."
111
+ end
109
112
  end
110
113
 
111
114
  @status = STATUS_INIT
@@ -153,7 +156,7 @@ class SlackSmartBot
153
156
  #help: *Commands from Channels without a bot:*
154
157
  #help:
155
158
  #help: ----------------------------------------------
156
- #help:
159
+ #help:
157
160
  #help: `@BOT_NAME on #CHANNEL_NAME COMMAND`
158
161
  #help: `@BOT_NAME #CHANNEL_NAME COMMAND`
159
162
  #help: It will run the supplied command using the rules on the channel supplied.
@@ -161,60 +164,58 @@ class SlackSmartBot
161
164
  def listen
162
165
  @salutations = [config[:nick], config[:nick_id], "bot", "smart"]
163
166
  client.on :message do |data|
164
- if data.channel[0] == 'D' or data.channel[0] == "C" #Direct message or Channel
165
- dest = data.channel
167
+ if data.channel[0] == "D" or data.channel[0] == "C" #Direct message or Channel
168
+ dest = data.channel
166
169
  else # not treated
167
170
  dest = nil
168
171
  end
169
172
  #todo: sometimes data.user is nil, check the problem.
170
173
  @logger.warn "!dest is nil. user: #{data.user}, channel: #{data.channel}, message: #{data.text}" if dest.nil?
171
174
  # Direct messages are treated only on the master bot
172
- if !dest.nil? and ((dest[0] == 'D' and ON_MASTER_BOT) or (dest[0] == 'C'))
175
+ if !dest.nil? and ((dest[0] == "D" and ON_MASTER_BOT) or (dest[0] == "C")) and data.user.to_s != ""
173
176
  begin
174
- #todo: when changed @questions user_id then move user_info inside the ifs to avoid calling it when not necessary
175
- user_info = wclient.users_info(user: data.user)
176
- #todo: check to remove user_info.user.name == config[:nick] since I think we will never get messages from the bot on slack
177
- # if Direct message or we are in the channel of the bot
178
- if data.text.size >=2 and
179
- ((data.text[0]=='`' and data.text[-1]=='`') or (data.text[0]=='*' and data.text[-1]=='*') or (data.text[0]=='_' and data.text[-1]=='_'))
180
- data.text = data.text[1..-2]
181
- end
182
- if (dest[0]=='D' or @channels_id[CHANNEL] == data.channel or data.user == config[:nick_id]) and
183
- data.text.size>0 and data.text[0]!="-"
184
-
185
- res = process_first(user_info.user, data.text, dest, data.channel)
186
- # if @botname on #channel_rules: do something
187
- elsif data.text.match(/^<@#{config[:nick_id]}>\s(on\s)?<#(\w+)\|(.+)>\s*:?\s*(.+)$/i)
188
- channel_rules = $2
189
- channel_rules_name = $3
190
- command = $4
191
- command = "!" + command unless command[0]=="!"
192
- if @channels_id[CHANNEL] == channel_rules #to be treated only on the bot of the requested channel
193
- dest = data.channel
194
-
195
- channels = wclient.channels_list.channels
196
- channel_found = channels.detect { |c| c.name == channel_rules_name }
197
- members = wclient.conversations_members(channel: @channels_id[channel_rules_name]).members unless channel_found.nil?
198
-
199
- if channel_found.nil?
200
- @logger.fatal "Not possible to find the channel #{channel_rules_name}"
201
- elsif channel_found.name == MASTER_CHANNEL
202
- respond "You cannot use the rules from Master Channel on any other channel.", dest
203
- elsif data.user == channel_found.creator or members.include?(data.user)
204
- res = process_first(user_info.user, command, dest, channel_rules)
205
- else
206
- respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", dest
177
+ #todo: when changed @questions user_id then move user_info inside the ifs to avoid calling it when not necessary
178
+ user_info = wclient.users_info(user: data.user)
179
+ #todo: check to remove user_info.user.name == config[:nick] since I think we will never get messages from the bot on slack
180
+ # if Direct message or we are in the channel of the bot
181
+ if data.text.size >= 2 and
182
+ ((data.text[0] == "`" and data.text[-1] == "`") or (data.text[0] == "*" and data.text[-1] == "*") or (data.text[0] == "_" and data.text[-1] == "_"))
183
+ data.text = data.text[1..-2]
184
+ end
185
+ if data.text.match(/^<@#{config[:nick_id]}>\s(on\s)?<#(\w+)\|(.+)>\s*:?\s*(.+)$/i)
186
+ channel_rules = $2
187
+ channel_rules_name = $3
188
+ command = $4
189
+ command = "!" + command unless command[0] == "!"
190
+ if @channels_id[CHANNEL] == channel_rules #to be treated only on the bot of the requested channel
191
+ dest = data.channel
192
+
193
+ channels = wclient.channels_list.channels
194
+ channel_found = channels.detect { |c| c.name == channel_rules_name }
195
+ members = wclient.conversations_members(channel: @channels_id[channel_rules_name]).members unless channel_found.nil?
196
+
197
+ if channel_found.nil?
198
+ @logger.fatal "Not possible to find the channel #{channel_rules_name}"
199
+ elsif channel_found.name == MASTER_CHANNEL
200
+ respond "You cannot use the rules from Master Channel on any other channel.", dest
201
+ elsif data.user == channel_found.creator or members.include?(data.user)
202
+ res = process_first(user_info.user, command, dest, channel_rules)
203
+ else
204
+ respond "You need to join the channel <##{channel_found.id}> to be able to use the rules.", dest
205
+ end
207
206
  end
207
+ elsif @questions.keys.include?(user_info.user.name)
208
+ #todo: @questions key should be the id not the name. change it everywhere
209
+ dest = data.channel
210
+ res = process_first(user_info.user, data.text, dest, @channels_id[CHANNEL])
211
+ elsif (dest[0] == "D" or @channels_id[CHANNEL] == data.channel or data.user == config[:nick_id]) and
212
+ data.text.size > 0 and data.text[0] != "-"
213
+ res = process_first(user_info.user, data.text, dest, data.channel)
214
+ # if @botname on #channel_rules: do something
208
215
  end
209
- elsif @questions.keys.include?(user_info.user.name)
210
- #todo: @questions key should be the id not the name. change it everywhere
211
- dest = data.channel
212
- res = process_first(user_info.user, data.text, dest, @channels_id[CHANNEL])
216
+ rescue Exception => stack
217
+ @logger.fatal stack
213
218
  end
214
- rescue Exception => stack
215
- @logger.fatal stack
216
- end
217
-
218
219
  end
219
220
  end
220
221
 
@@ -284,10 +285,10 @@ class SlackSmartBot
284
285
  if @status == :on and
285
286
  (@questions.keys.include?(nick) or
286
287
  @listening.include?(nick) or
287
- dest[0]=='D' or on_demand)
288
+ dest[0] == "D" or on_demand)
288
289
  @logger.info "command: #{nick}> #{command}" unless processed
289
290
  #todo: verify this
290
- if dest[0]=='C' #only for channels, not for DM
291
+ if dest[0] == "C" #only for channels, not for DM
291
292
  rules_file = RULES_FILE
292
293
  if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
293
294
  unless @bots_created.key?(@rules_imported[user.id][dchannel])
@@ -378,9 +379,9 @@ class SlackSmartBot
378
379
  if @status == :on
379
380
  greetings = ["Hello", "Hallo", "Hi", "Hola", "What's up", "Hey", "Hæ"].sample
380
381
  respond "#{greetings} #{firstname}", dest
381
- if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and dest[0]=='D'
382
+ if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) and dest[0] == "D"
382
383
  respond "You are using specific rules for channel: <##{@rules_imported[user.id][user.id]}>", dest
383
- elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel) and dest[0]=='C'
384
+ elsif @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel) and dest[0] == "C"
384
385
  respond "You are using specific rules for channel: <##{@rules_imported[user.id][dchannel]}>", dest
385
386
  end
386
387
  @listening << from unless @listening.include?(from)
@@ -485,7 +486,7 @@ class SlackSmartBot
485
486
  when /^bot\sstatus/i
486
487
  gems_remote = `gem list slack-smart-bot --remote`
487
488
  version_remote = gems_remote.to_s().scan(/slack-smart-bot \((\d+\.\d+\.\d+)/).join
488
- version_message = ''
489
+ version_message = ""
489
490
  if version_remote != VERSION
490
491
  version_message = " There is a new available version: #{version_remote}."
491
492
  end
@@ -512,12 +513,12 @@ class SlackSmartBot
512
513
  all = $1
513
514
  message = $2
514
515
  if all.nil?
515
- @bots_created.each do |k,v|
516
+ @bots_created.each do |k, v|
516
517
  respond message, k
517
518
  end
518
519
  respond "Bot channels have been notified", dest
519
520
  else
520
- myconv = wclient.users_conversations(exclude_archived: true, limit: 100, types: 'im, public_channel').channels
521
+ myconv = wclient.users_conversations(exclude_archived: true, limit: 100, types: "im, public_channel").channels
521
522
  myconv.each do |c|
522
523
  respond message, c.id unless c.name == MASTER_CHANNEL
523
524
  end
@@ -658,7 +659,7 @@ class SlackSmartBot
658
659
  else
659
660
  if user.id == channel_found.creator or channel_found.members.include?(user.id)
660
661
  @rules_imported[user.id] = {} unless @rules_imported.key?(user.id)
661
- if dest[0]=="C" #todo: take in consideration bots that are not master
662
+ if dest[0] == "C" #todo: take in consideration bots that are not master
662
663
  @rules_imported[user.id][dchannel] = channel_found.id
663
664
  else
664
665
  @rules_imported[user.id][user.id] = channel_found.id
@@ -682,7 +683,7 @@ class SlackSmartBot
682
683
  else
683
684
  channel_id = channel
684
685
  end
685
- if dest[0]=='C' #channel
686
+ if dest[0] == "C" #channel
686
687
  if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
687
688
  if @rules_imported[user.id][dchannel] != channel_id
688
689
  respond "You are not using those rules.", dest
@@ -725,12 +726,12 @@ class SlackSmartBot
725
726
  if ADMIN_USERS.include?(from) #admin user
726
727
  respond "*Commands for administrators:*\n#{help_message.scan(/#\s*help\s*admin:(.*)/).join("\n")}", dest
727
728
  end
728
- if ON_MASTER_BOT and dest[0]=="C"
729
+ if ON_MASTER_BOT and dest[0] == "C"
729
730
  respond "*Commands only on Master Channel <##{@channels_id[MASTER_CHANNEL]}>:*\n#{help_message.scan(/#\s*help\s*master:(.*)/).join("\n")}", dest
730
731
  end
731
732
  respond help_message.scan(/#\s*help\s*:(.*)/).join("\n"), dest
732
733
  end
733
- if dest[0]=="C" # on a channel
734
+ if dest[0] == "C" # on a channel
734
735
  rules_file = RULES_FILE
735
736
 
736
737
  if @rules_imported.key?(user.id) and @rules_imported[user.id].key?(dchannel)
@@ -747,7 +748,7 @@ class SlackSmartBot
747
748
  end
748
749
  help_message_rules = IO.readlines(rules_file).join
749
750
  respond help_message_rules.scan(/#\s*help\s*:(.*)/).join("\n"), dest
750
- elsif dest[0]=='D' and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
751
+ elsif dest[0] == "D" and @rules_imported.key?(user.id) and @rules_imported[user.id].key?(user.id) #direct message
751
752
  unless @bots_created.key?(@rules_imported[user.id][user.id])
752
753
  file_conf = IO.readlines($0.gsub(".rb", "_bots.rb")).join
753
754
  unless file_conf.to_s() == ""
@@ -778,7 +779,7 @@ class SlackSmartBot
778
779
  if @status == :on and
779
780
  (@questions.keys.include?(from) or
780
781
  @listening.include?(from) or
781
- dest[0]=='D' or on_demand)
782
+ dest[0] == "D" or on_demand)
782
783
  processed2 = true
783
784
 
784
785
  #help: ===================================
@@ -961,9 +962,9 @@ class SlackSmartBot
961
962
  def respond(msg, dest = nil)
962
963
  if dest.nil?
963
964
  client.message(channel: @channels_id[CHANNEL], text: msg, as_user: true)
964
- elsif dest[0]=="C" # channel
965
- client.message(channel: dest, text: msg, as_user: true)
966
- elsif dest[0]=='D' # Direct message
965
+ elsif dest[0] == "C" # channel
966
+ client.message(channel: dest, text: msg, as_user: true)
967
+ elsif dest[0] == "D" # Direct message
967
968
  send_msg_user(dest, msg)
968
969
  else
969
970
  @logger.warn("method respond not treated correctly: msg:#{msg} dest:#{dest}")
@@ -975,9 +976,9 @@ class SlackSmartBot
975
976
  def ask(question, context, to, dest = nil)
976
977
  if dest.nil?
977
978
  client.message(channel: @channels_id[CHANNEL], text: "#{to}: #{question}", as_user: true)
978
- elsif dest[0]=="C" # channel
979
- client.message(channel: dest, text: "#{to}: #{question}", as_user: true)
980
- elsif dest[0]=='D' #private message
979
+ elsif dest[0] == "C" # channel
980
+ client.message(channel: dest, text: "#{to}: #{question}", as_user: true)
981
+ elsif dest[0] == "D" #private message
981
982
  send_msg_user(dest, "#{to}: #{question}")
982
983
  end
983
984
  @questions[to] = context
@@ -1002,7 +1003,7 @@ class SlackSmartBot
1002
1003
  #to send messages without listening for a response to users
1003
1004
  def send_msg_user(id_user, msg)
1004
1005
  unless msg == ""
1005
- if id_user[0]=="D"
1006
+ if id_user[0] == "D"
1006
1007
  client.message(channel: id_user, as_user: true, text: msg)
1007
1008
  else
1008
1009
  im = wclient.im_open(user: id_user)
@@ -82,8 +82,8 @@ end
82
82
 
83
83
  #for the case of testing just running this file, write the dialogue in here:
84
84
  if @testing
85
- require 'nice_hash'
86
- user = {name: "Peter Johson", id: "Uxxxxxx"}
85
+ require "nice_hash"
86
+ user = { name: "Peter Johson", id: "Uxxxxxx" }
87
87
 
88
88
  rules user, "go to sleep, you look tired", false, nil
89
89
  rules user, "yes", false, nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-smart-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-05 00:00:00.000000000 Z
11
+ date: 2019-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slack-ruby-client