module SlackRubyBot class App cattr_accessor :hooks include SlackRubyBot::Hooks::Hello include SlackRubyBot::Hooks::Message def initialize SlackRubyBot.configure do |config| config.token = ENV['SLACK_API_TOKEN'] || fail("Missing ENV['SLACK_API_TOKEN'].") config.aliases = ENV['SLACK_RUBY_BOT_ALIASES'].split(' ') if ENV['SLACK_RUBY_BOT_ALIASES'] end Slack.configure do |config| config.token = SlackRubyBot.config.token end end def config SlackRubyBot.config end def self.instance @instance ||= SlackRubyBot::App.new end def run auth! start! end def stop! client.stop end private def logger @logger ||= begin $stdout.sync = true Logger.new(STDOUT) end end def start! loop do begin client.start! rescue Slack::Web::Api::Error => e logger.error e case e.message when 'migration_in_progress' sleep 1 # ignore, try again else raise e end rescue Faraday::Error::TimeoutError, Faraday::Error::ConnectionFailed, Faraday::Error::SSLError => e logger.error e sleep 1 # ignore, try again rescue StandardError => e logger.error e raise e ensure @client = nil end end end def client @client ||= begin client = Slack::RealTime::Client.new hooks.each do |hook| client.on hook do |data| begin send hook, client, data rescue StandardError => e logger.error e begin client.message(channel: data['channel'], text: e.message) if data.key?('channel') rescue # ignore end end end end client end end def auth! auth = client.web_client.auth_test SlackRubyBot.configure do |config| config.url = auth['url'] config.team = auth['team'] config.user = auth['user'] config.team_id = auth['team_id'] config.user_id = auth['user_id'] end logger.info "Welcome '#{SlackRubyBot.config.user}' to the '#{SlackRubyBot.config.team}' team at #{SlackRubyBot.config.url}." end def reset! SlackRubyBot.configure do |config| config.url = nil config.team = nil config.user = nil config.team_id = nil config.user_id = nil end end end end