class Akane::Manager
Public Class Methods
new(config)
click to toggle source
# File lib/akane/manager.rb, line 8 def initialize(config) @config = config @logger = config.logger end
Public Instance Methods
handle_signals()
click to toggle source
# File lib/akane/manager.rb, line 37 def handle_signals @terminating = false begin require 'sigdump/setup' rescue LoadError end on_interrupt = proc do if @terminating @config.log_direct "Terminating forcely..." exit else @terminating = true @config.log_direct "Gracefully stopping..." @recorder.stop! end end trap(:INT, on_interrupt) trap(:TERM, on_interrupt) end
prepare()
click to toggle source
# File lib/akane/manager.rb, line 13 def prepare @logger.info 'Preparing' prepare_receivers prepare_storages prepare_recorder @logger.info "Prepared with #{@storages.size} storage(s) and #{@receivers.size} receiver(s)" end
run()
click to toggle source
# File lib/akane/manager.rb, line 60 def run @logger.info "Running..." self.prepare() start() end
start()
click to toggle source
# File lib/akane/manager.rb, line 23 def start @logger.info "Starting receivers..." @receivers.each(&:start) @logger.info "Assigning signal handlers..." handle_signals @logger.info "Starting recorder..." @recorder.run @logger.info "Recorder stopped. Waiting for storages..." stop_storages end
stop_storages()
click to toggle source
# File lib/akane/manager.rb, line 67 def stop_storages @storages.each(&:stop!) loop do not_exitable = @storages.any? do |storage| if storage.exitable? false else @logger.debug "[status] #{storage.name}: #{storage.status || 'not exitable'.freeze}" true end end break unless not_exitable sleep 1 end end
Private Instance Methods
on_delete(account, user_id, tweet_id)
click to toggle source
# File lib/akane/manager.rb, line 97 def on_delete(account, user_id, tweet_id) @recorder.mark_as_deleted(account, user_id, tweet_id) end
on_event(account, event)
click to toggle source
# File lib/akane/manager.rb, line 93 def on_event(account, event) @recorder.record_event(account, event) end
on_message(account, message)
click to toggle source
# File lib/akane/manager.rb, line 89 def on_message(account, message) @recorder.record_message(account, message) end
on_tweet(account, tweet)
click to toggle source
# File lib/akane/manager.rb, line 85 def on_tweet(account, tweet) @recorder.record_tweet(account, tweet) end
prepare_receivers()
click to toggle source
# File lib/akane/manager.rb, line 101 def prepare_receivers @receivers = @config["accounts"].flat_map do |name, credential| receiver_definitions = credential["receivers"] || ['stream'] receiver_definitions.map do |definition| if definition.kind_of?(Hash) if 1 < definition.size @logger.warn "Only 1 receiver definition is used in one Hash instance." end kind, config = definition.each.first else kind, config = definition, {} end Akane::Receivers.find(kind).new( consumer: {token: @config["consumer"]["token"], secret: @config["consumer"]["secret"]}, account: {token: credential["token"], secret: credential["secret"], name: name}, config: config, logger: @config.logger ).tap do |receiver| @logger.info "Preparing... receiver - #{receiver.class}" receiver.on_tweet(&( method(:on_tweet).to_proc.curry[receiver.name])) receiver.on_message(&(method(:on_message).to_proc.curry[receiver.name])) receiver.on_event(&( method(:on_event).to_proc.curry[receiver.name])) receiver.on_delete(&( method(:on_delete).to_proc.curry[receiver.name])) end end end end
prepare_recorder()
click to toggle source
# File lib/akane/manager.rb, line 151 def prepare_recorder @recorder = Akane::Recorder.new( @storages, timeout: @config["timeout"] || 20, logger: @config.logger ) end
prepare_storages()
click to toggle source
# File lib/akane/manager.rb, line 132 def prepare_storages @storages = @config["storages"].flat_map do |definition| case definition when Hash definition.map do |kind, config| [kind, config] end when String [[definition, {}]] end end.map do |kind, config| @logger.info "Preparing... storage - #{kind}" Akane::Storages.find(kind).new( config: config, logger: @config.logger ) end end