#!/usr/bin/env ruby
# -*- ruby -*-

require 'drb/drb'

require 'rabbit/console'
require 'rabbit/twitter'

def parse(args=ARGV, logger=nil)
  Rabbit::Console.parse!(args, logger) do |opts, options|
    options.rabbit_uri = "druby://localhost:10101"
    options.filters = []
    options.user_languages = []
    options.log_status = false

    opts.separator ""

    opts.on("--rabbit-uri=URI",
            "Rabbit's dRuby URI",
            "(#{options.rabbit_uri})") do |uri|
      options.rabbit_uri = uri
    end

    opts.on("--filter=FILTER",
            "Filter word for search Twitter.",
            "To use multiple filters, use this option multiple.") do |filter|
      options.filters << filter
    end

    opts.on("--user-language=LANGUAGE",
            "Filter by user language.",
            "(e.g.: ja, en)",
            "To use multiple language, use this option multiple.") do |language|
      options.user_languages << language
    end

    opts.separator "Debug"

    opts.on("--[no-]log-status",
            "Log target statuses.") do |boolean|
      options.log_status = boolean
    end

    opts.separator "Deprecated"

    opts.on("--keyword=KEYWORD",
            "Deprecated. Use --filter instead.") do |keyword|
      options.filters << keyword
    end
  end
end

def target?(status, options)
  return true if options.user_languages.empty?
  options.user_languages.include?(status["user"]["lang"])
end

def clean_text(text, filters)
  remove_ustream_link(remove_hash_tag(text, filters))
end

def remove_hash_tag(text, filters)
  hash_tag_regexps = filters.collect do |filter|
    if filter.start_with?("#")
      Regexp.escape(filter)
    else
      Regexp.escape("\##{filter}")
    end
  end
  text.gsub(Regexp.union(*hash_tag_regexps), "")
end

def remove_ustream_link(text)
  text.gsub(/\(.* live at http:\/\/ustre\.am\/.*\)/, "")
end

def main
  options, logger = parse
  if options.filters.empty?
    logger.error("must specify one or more filters by --filter")
    exit(false)
  end

  rabbit = DRbObject.new_with_uri(options.rabbit_uri)
  twitter = Rabbit::Twitter.new(logger)
  twitter.start(*options.filters) do |status|
    next unless target?(status, options)
    text = status["text"]
    next if text.nil?
    text = clean_text(status['text'], options.filters)
    comment = "@#{status['user']['screen_name']}: #{text}"
    logger.info(comment)
    begin
      rabbit.append_comment(comment)
    rescue DRb::DRbConnError
      logger.error("Rabbiter: #{$!.class}: #{$!.message}")
    end
  end

  main_loop = GLib::MainLoop.new
  trap("INT") do
    twitter.close
    main_loop.quit
  end
  main_loop.run
end

main
