class Evesync::Trigger

Attributes

remote_handlers[R]

Public Class Methods

new(watcher_queue) click to toggle source
# File lib/evesync/trigger.rb, line 10
def initialize(watcher_queue)
  @watcher_queue = watcher_queue

  # Local Data daemon
  evedatad = IPC::Client.new(port: :evedatad)

  @remote_handlers = Config[:evemond]['remotes'].map do |ip|
    new_remote_handler(ip)
  end.compact # remove nils

  # Helper triggers
  package_trigger = Trigger::Package.new(
    db: evedatad,
    remotes: @remote_handlers
  )

  file_trigger = Trigger::File.new(
    db: evedatad,
    remotes: @remote_handlers
  )

  @triggers = [package_trigger, file_trigger]

  Log.debug('Trigger initialization done!')
end

Public Instance Methods

add_remote_node(ip) click to toggle source
# File lib/evesync/trigger.rb, line 56
def add_remote_node(ip)
  unless @remote_handlers.find { |h| h.ip == ip }
    remote_handler = new_remote_handler(ip)
    @remote_handlers << remote_handler if remote_handler
  end
  Log.debug 'Trigger actual remote nodes:', @remote_handlers.map(&:ip)
end
ignore(change) click to toggle source
# File lib/evesync/trigger.rb, line 48
def ignore(change)
  trigger_method(:ignore, change)
end
start() click to toggle source
# File lib/evesync/trigger.rb, line 36
def start
  @thr = Thread.new do
    loop { biz }
  end
  Log.debug('Trigger started')
end
stop() click to toggle source
# File lib/evesync/trigger.rb, line 43
def stop
  @thr.exit
  Log.debug('Trigger stopped')
end
unignore(change) click to toggle source
# File lib/evesync/trigger.rb, line 52
def unignore(change)
  trigger_method(:unignore, change)
end

Private Instance Methods

biz() click to toggle source

Main thread business logic goes here

# File lib/evesync/trigger.rb, line 69
def biz
  change = @watcher_queue.pop
  Log.info "Trigger dequed event: #{change}"
  trigger = message_trigger(change)
  trigger.process(change)
end
message_trigger(message) click to toggle source
# File lib/evesync/trigger.rb, line 91
def message_trigger(message)
  class_last = message.class.name.to_s.split('::')[-1]
  @triggers.find do |trigger|
    trigger.to_s.include? class_last
  end
end
new_remote_handler(ip) click to toggle source
# File lib/evesync/trigger.rb, line 98
def new_remote_handler(ip)
  unless Utils.local_ip?(ip)
    IPC::Client.new(
      port: :evehand,
      ip: ip
    )
  end
end
trigger_method(method, change) click to toggle source

Send a method to target (choose by change class name)

# File lib/evesync/trigger.rb, line 77
def trigger_method(method, change)
  Log.debug("Trigger calling '#{method}' on '#{change.class.name}'")

  trigger = message_trigger(change)

  if trigger
    trigger.send(method, change) && true
  else
    # TODO: forward somewhere
    Log.error('Trigger: no watchers will be notified on ' \
              "#{change}")
  end
end