/usr/share/nadoka/plugins/opensearchbot.nb is in nadoka 0.7.6-1.1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | # -*-ruby-*- #
# Copyright (C) 2011 Kazuhiro NISHIYAMA
#
# This program is free software with ABSOLUTELY NO WARRANTY.
# You can re-distribute and/or modify this program under
# the same terms of the Ruby's license.
#
=begin
== Usage with irc client
  bing> keyword
    -> search keyword by bing
  googlecode> keyword
    -> search keyword by Google Code Search Data API (Deprecated)
  koders> keyword
    -> search keyword by koders
== Configuration:
  BotConfig << {
    :name => :OpenSearchBot,
    :bot_name => 'bing',
    :ch => //,
    :referer => 'http://rubyforge.org/projects/nadoka/',
    :ch_kcode => :jis,
    :html => 'http://www.bing.com/search?q={searchTerms}',
    :rss => 'http://api.search.live.com/rss.aspx?source=web&query={searchTerms}'
,
  }
  BotConfig << {
    :name => :OpenSearchBot,
    :bot_name => 'googlecode',
    :ch => //,
    :ch_kcode => :jis,
    :referer => 'http://rubyforge.org/projects/nadoka/',
    # Google Code Search Data API (Deprecated)
    # http://code.google.com/intl/ja/apis/codesearch/docs/2.0/developers_guide.h
tml
    :html => 'http://www.google.com/codesearch?q={searchTerms}',
    :rss => 'http://www.google.com/codesearch/feeds/search?q={searchTerms}',
  }
  BotConfig << {
    :name => :OpenSearchBot,
    :bot_name => 'koders',
    :ch => //,
    :referer => 'http://rubyforge.org/projects/nadoka/',
    :ch_kcode => :jis,
    # http://www.koders.com/search/KodersDescriptionOS1_1.xml
    :html => 'http://www.koders.com/?s={searchTerms}',
    :rss => 'http://www.koders.com/?s={searchTerms}&results=code&output=rss&OSve
rsion=1.1',
  }
=end
require 'open-uri'
require 'uri'
require 'cgi'
class OpenSearch
  def initialize(options)
    @html = options[:html]
    @rss = options[:rss]
    @referer = options[:referer] || 'http://rubyforge.org/projects/nadoka/'
  end
  def result(key)
    escaped_key = CGI.escape(key)
    link = @html.sub(/\{searchTerms\}/) { escaped_key }
    uri = @rss.sub(/\{searchTerms\}/) { escaped_key }
    open(uri, "Referer" => @referer) do |f|
      result = f.read
      if /<([A-Za-z]+):totalResults>(\d+)<\/\1:totalResults>/ =~ result
        total = $2.to_i
        return "#{total} result#{total > 1 ? 's' : ''} in #{link}"
      else
        return "#{key} - not found in #{link}"
      end
    end
  end
end
if __FILE__ == $0
  h = {
    'bing' => {
      :referer => 'http://rubyforge.org/projects/nadoka/',
      :html => 'http://www.bing.com/search?q={searchTerms}',
      :rss => 'http://api.search.live.com/rss.aspx?source=web&query={searchTerms}',
    },
    'googlecode' => {
      :referer => 'http://rubyforge.org/projects/nadoka/',
      # Google Code Search Data API (Deprecated)
      # http://code.google.com/intl/ja/apis/codesearch/docs/2.0/developers_guide.html
      :html => 'http://www.google.com/codesearch?q={searchTerms}',
      :rss => 'http://www.google.com/codesearch/feeds/search?q={searchTerms}',
    },
    'koders' => {
      :referer => 'http://rubyforge.org/projects/nadoka/',
      # http://www.koders.com/search/KodersDescriptionOS1_1.xml
      :html => 'http://www.koders.com/?s={searchTerms}',
      :rss => 'http://www.koders.com/?s={searchTerms}&results=code&output=rss&OSversion=1.1',
    },
    'youtube' => {
      :referer => 'http://rubyforge.org/projects/nadoka/',
      :html => 'http://www.youtube.com/results?search_query={searchTerms}',
      :rss => 'http://gdata.youtube.com/feeds/api/videos?q={searchTerms}',
    },
  }
  engine = ARGV.shift
  if h.key?(engine)
    open_search = OpenSearch.new(h[engine])
    ARGV.each do |key|
      result = open_search.result(key)
      puts result
    end
  else
    STDERR.puts "usage: #{$0} {#{h.keys.sort.join('|')}} key ..."
  end
  exit
end
class OpenSearchBot < Nadoka::NDK_Bot
  def bot_initialize
    if @bot_config.key?(:channels)
      channels = '\A(?:' + @bot_config[:channels].collect{|ch|
        Regexp.quote(ch)
      }.join('|') + ')\z'
      @available_channel = Regexp.compile(channels)
    else
      @available_channel = @bot_config[:ch] || //
    end
    @bot_name = @bot_config[:bot_name] || 'OpenSearchBot'
    @open_search = OpenSearch.new(@bot_config)
    @pattern = @bot_config[:pattern] || /\A#{Regexp.quote(@bot_name)}\s*[<:>]\s*(.+)/
    @ch_kcode = @bot_config[:ch_kcode]
  end
  def on_privmsg prefix, ch, msg
    if @pattern =~ msg
      key = $1
      if @ch_kcode == :jis
        ret = @open_search.result(key.toutf8).tojis
      else
        ret = @open_search.result(key)
      end
      send_notice ch, "#{@bot_name} bot: #{ret}"
    end
  end
end
 |