###################################################### # WindropClan @ http://windrop.clan.su # Автор: Vladislav # Версия: 1.3 # Описание: Скрипт поиска по википедии с выводом найденных результатов. # Команды: !вики !лурк !егг ###################################################### namespace eval wiki { setudef flag no[namespace tail [namespace current]] variable pbind 1 variable count 2 variable redir 0 variable clock 0 variable timer 30 foreach bind {вики лурк егг wiki lurk egg} {bind pub - $::gprefix(1)$bind [namespace current]::main; if {$pbind} {bind msg - $::gprefix(1)$bind [namespace current]::msg}} proc msg {nick host hand text} {main $nick $host $hand $nick $text; return} proc main {nick uhost hand chan text} { variable redir; variable count; variable clock; variable timer if {$chan != $nick && [channel get $chan no[namespace tail [namespace current]]]} {return} set lastbind $::lastbind; set text [string trim [string map { {}} [stripcodes cubr $text]]] if {[string match -noc "*wiki" $lastbind] || [string match -noc "*вики" $lastbind]} {set f "Википедии"} elseif {[string match -noc "*egg" $lastbind] || [string match -noc "*егг" $lastbind]} {set f "Еггхелпе"} elseif {[string match -noc "*lurk" $lastbind] || [string match -noc "*лурк" $lastbind]} {set f "Луркморье"} if {[string is space $text]} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Формат: $lastbind \[-язык\] \<запрос\> \[число строк\] - поиск в $f."; return} if {[regexp -- {\s(\d+)$} $text -> cnt]} { set count $cnt; regsub -- " $cnt$" $text "" text; if {![matchattr $hand n] && $cnt > 10} {set count 10}; if {$cnt == 0} {set count 1} } else {set count 2} if {[regexp -nocase -- {^-(..)\s} $text -> lang]} {set lang $lang} {set lang ru} set langs {en ru uk}; if {[lsearch -exact -nocase $langs $lang] == "-1"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Неверно указан язык! Доступные: [join $langs ", "]."; return} if {[expr [clock seconds]-$clock] < $timer} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Команда недавно запрашивалась. Повтори попытку через [expr $timer-([clock seconds]-$clock)] сек."; return}; set clock [clock seconds] ::http::config -useragent "Opera/9.52 (Windows NT 5.1; U; en)" -urlencoding utf-8; regsub -- "-$lang " $text "" text; set text [::http::formatQuery $text] if {[string match -noc "*wiki" $lastbind] || [string match -noc "*вики" $lastbind]} {set s 0; set url "http://$lang.wikipedia.org/w/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Search&search=$text&ns0=1&redirs=0"} if {[string match -noc "*egg" $lastbind] || [string match -noc "*егг" $lastbind]} {set s 1; set url "http://wiki.egghelp.ru/Служебная:Search?search=$text&go=%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8"} if {[string match -noc "*lurk" $lastbind] || [string match -noc "*лурк" $lastbind]} {set s 2; set url "http://lurkmore.to/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Search?search=[string toupper $text]&go=%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8"} request $url [list $nick $chan $lang $s] } proc request {url extra} { variable redir set nick [lindex $extra 0]; set chan [lindex $extra 1] if {$redir > 4} {set redir 0; return} incr redir; if {[catch {set token [::http::geturl $url -timeout 20000 -binary 0 -blocksize 32760 -command [list [namespace current]::data $extra $url]]} err]} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Не могу соединиться с сервером. ($err)"; return} } proc data {extra url token} { variable redir; variable count set nick [lindex $extra 0]; set chan [lindex $extra 1]; set lang [lindex $extra 2]; set s [lindex $extra 3] set status [::http::status $token]; set ncode [::http::ncode $token] if {$status eq "timeout"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Таймаут соединения."; ::http::cleanup $token; return} elseif {$status eq "error"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка при получении данных. [lindex [::http::error $token] 0]"; ::http::cleanup $token; return} array set meta [::http::meta $token] if {[string match "30?" $ncode] && [info exists meta(Location)]} {::http::cleanup $token; request $meta(Location) $extra} else { set data [regsub -all -- {\n|\r|\t|\v} [::http::data $token] ""]; ::http::cleanup $token if {[regexp -nocase -- {
} $data "" data]} {regsub -nocase -- {^.*?
} $data "" data}; regsub -nocase -- {