#!/usr/bin/env ruby
#
# ss - sure search
#
# Ȥ
#
#   ss ե [...]
#
# - եˤäƥåɤ򸡺롣
# - ɸϤ˸̤Ǥ
# - åɰĤƱ̾Υե¸롣
#   ss ư줿Ȥˤ̾Υե뤬
#   ̿ˤΥեƤȤ
#
# $Id: ss 10 2007-03-31 03:07:15Z ta $

#XXX |r| бƤʤ
#XXX " ?" 򥹥ڡä "?" ȤƤޤȤʤ
#XXX 󥹥κ祹֤ǥե륿򤫤Τϡɤ­ȤΤȤͤȥޥ

$KCODE = 'EUC'

require 'nkf'
require 'open-uri'

sures = Hash.new
servers = Hash.new

while s = ARGF.gets
    s.chomp!
    if s =~ /^@/
        # С

        server, board = s[1..-1].split('/')
        unless server && server.length > 0 && board && board.length > 0
            abort("#{ARGF.filename}: #{ARGF.file.lineno}: missing server or board")
        end
        server << '.2ch.net' unless server.include?('.')
        servers[board] = server
    elsif s =~ /^([[:alnum:],]+)(.)/
        # 

        m = $~
        boards = m[1].split(',')
        delim = m[2]
        opt, *qq = m.post_match.split(delim)

        # ʬ䤷ƤѴǤʤȶڤʸǤʬ䤵줿ꤷƤޤ
        qq.map! do |q|
            case opt
            when 's'
                q = NKF::nkf('-Eexm0 -X', q)
            when 'h'
                q = NKF::nkf('-Eexm0 -XhZ1', q)
            when 'hs'
                q = NKF::nkf('-Eexm0 -Xh', q)
            else  # 'x'
                q = NKF::nkf('-Eexm0 -XZ1', q)
            end
            # Regexp::IGNORECASE ư1.8.4ˤΤǻȤʤ
            # /[^]/e !~ '' ʤΤ /[^]/ei =~ '' Ȥ
            #Regexp.new(q, Regexp::IGNORECASE)
            Regexp.new(q.downcase)
        end

        #print ":#{boards.join(',')}:#{delim}:#{opt}:#{qq.join(',')}:\n"
        #next

        boards.each do |board|
            server = servers[board]
            unless sures.key?(board)
                begin
                    s = IO.read(board)
                rescue
                    if !server || server.length == 0
                        abort("server not specified: #{board}\n")
                    end
                    s = nil
                    begin
                        s = open("http://#{server}/#{board}/subject.txt").read
                        raise "#{board}: server moved" if s.size == 0
                    rescue
                        raise if s

                        STDERR.puts "#{board}: #$!"
                        # 餫ͳ subject.txt Ǥʤä
                        # Υե
                        s = ''
                    end
                    open(board, 'w').write(s)
                end

                sures[board] = Array.new
                s.each do |ss|
                    # 쥿˥ߤäƤʸѴ
                    # ǥߥʤȤΤ
                    # Хʥ꡼Ȥʬ䤹
                    if ss !~ /^([0-9]+)\.dat<>(.*) \(([0-9]+)\)$/n
                        abort("invalid line: #{board}: <#{NKF::nkf('-Sexm0', ss)}>\n")
                    else
                        e = {
                            'id' => $1,
                            'r' => NKF::nkf('-Sexm0', $2),
                            'count' => $3
                        }

                        # ȾѥʤѤˡѱѿȾѤΤ
                        # ۤѴθȤƤϤᤫǼƤ
                        e['x'] = NKF::nkf('-Eexm0 -XZ1', e['r']).downcase

                        sures[board] << e
                    end
                end
            end
        end

        boards.each do |board|
            sures[board].each do |e|
                unless e['hit']
                    case opt
                    when 's'
                        t = e['s']
                        t = e['s'] = NKF::nkf('-Eexm0 -X', e['r']).downcase unless t
                    when 'h'
                        t = e['h']
                        t = e['h'] = NKF::nkf('-Eexm0 -XhZ1', e['r']).downcase unless t
                    when 'hs'
                        t = e['hs']
                        t = e['hs'] = NKF::nkf('-Eexm0 -Xh', e['r']).downcase unless t
                    else  # 'x'
                        t = e['x']
                        t = e['x'] = NKF::nkf('-Eexm0 -XZ1', e['r']).downcase unless t
                    end

                    qq.each do |q|
                        if q =~ t
                            # 쥹ԤǽϤ sort ȤȤ߹碌䤹
                            uri = "http://#{servers[board]}/test/read.cgi/#{board}/#{e['id']}/l50"
                            print "#{e['r']} (#{e['count']})<br><a href=#{uri}>#{uri}</a><br>\n"
                            e['hit'] = true
                            break
                        end
                    end
                end
            end
        end
    end
end
