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
|