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