#!/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 = [] 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 "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) begin text = clean_text(status['text'], options.filters) comment = "@#{status['user']['screen_name']}: #{text}" 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