class SlackSmartBot def listen_simulate @salutations = [config[:nick], "<@#{config[:nick_id]}>", "bot", "smart", "smartbot", "smart-bot", "smart bot"] @pings ||= [] @last_activity_check = Time.now get_bots_created() @buffer_complete = [] unless defined?(@buffer_complete) b = File.read("#{config.path}/buffer_complete.log", encoding: "UTF-8") result = b.scan(/^\|(\w+)\|(\w*)\|(\w+)\|(\w+)\|([^~]+)~~~/m) result.delete(nil) new_messages = result[@buffer_complete.size..-1] unless new_messages.nil? or new_messages.empty? @buffer_complete = result new_messages.each do |message| channel = message[0].strip thread_ts = message[1].strip user = message[2].strip user_name = message[3].strip command = message[4].to_s.strip # take in consideration that on simulation we are treating all messages even those that are not populated on real cases like when the message is not populated to the specific bot connection when message is sent with the bot @logger.info "treat message: #{message}" if config.testing if command.match?(/^\s*\-!!/) or command.match?(/^\s*\-\^/) command.scan(/`([^`]+)`/).flatten.each do |cmd| if cmd.to_s != "" cmd = "^#{cmd}" treat_message({ channel: channel, thread_ts: thread_ts, ts: thread_ts, user: user, text: cmd, user_name: user_name }, false) end end elsif command.match?(/^\s*\-!/) command.scan(/`([^`]+)`/).flatten.each do |cmd| if cmd.to_s != "" cmd = "!#{cmd}" treat_message({ channel: channel, thread_ts: thread_ts, ts: thread_ts, user: user, text: cmd, user_name: user_name }, false) end end else treat_message({ channel: channel, thread_ts: thread_ts, ts: thread_ts, user: user, text: command, user_name: user_name }) end end end end def listen @pings ||= [] @last_activity_check = Time.now get_bots_created() client.on :message do |data| unless data.user == "USLACKBOT" or data.text.nil? if data.text.match?(/^\s*\-!!/) or data.text.match?(/^\s*\-\^/) data.text.scan(/`([^`]+)`/).flatten.each do |cmd| if cmd.to_s != "" datao = data.dup datao.text = "^#{cmd}" treat_message(datao, false) end end elsif data.text.match?(/^\s*\-!/) data.text.scan(/`([^`]+)`/).flatten.each do |cmd| if cmd.to_s != "" datao = data.dup datao.text = "!#{cmd}" treat_message(datao, false) end end else treat_message(data) end end end restarts = 0 started = false while restarts < 200 and !started begin @logger.info "Bot starting: #{@config_log.inspect}" client.start! rescue Slack::RealTime::Client::ClientAlreadyStartedError @logger.info "ClientAlreadyStarted so we continue with execution" started = true rescue Exception => e started = false restarts += 1 if restarts < 200 @logger.info "*" * 50 @logger.fatal "Rescued on starting: #{e.inspect}" @logger.info "Waiting 60 seconds to retry. restarts: #{restarts}" puts "#{Time.now}: Not able to start client. Waiting 60 seconds to retry: #{@config_log.inspect}" sleep 60 else exit! end end end end end