#################################################### # Windrop © Vladislav # Автор: Vertigo mod Vladislav # Версия: 1.0 # Описание: Погода с www.foreca.com # Команды: !п !погода #################################################### namespace eval ::foreca { bind pub - $::gprefix(1)п [namespace current]::weather:pub bind pub - $::gprefix(1)погода [namespace current]::weather:pub bind msg - $::gprefix(1)п [namespace current]::weather:msg bind msg - $::gprefix(1)погода [namespace current]::weather:msg # выдавать в кратком формате погоду или еще на 3 дня вперед? Также полный формат доступен при указании "+" в запросе variable fullformat "1" variable site "http://www.foreca.com/" variable timeout "30" variable timer "5" variable useragent "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.62" variable chflag nofweather variable fcookies "st2=lang%3Dru%26units%3Dmetric%26tf%3D24h%26u%3DU4XYU0R304QA" setudef flag $chflag proc weather:msg {nick uhost hand text} { weather:pub $nick $uhost $hand $nick $text return 1 } proc weather:pub {nick uhost hand chan text} { variable chflag variable timer if {$chan != $nick && [channel get $chan $chflag]} { putserv "NOTICE $nick :Данная команда отключена на этом канале."; return } if {[info exists [namespace current]::wait] && [expr [clock seconds] - $[namespace current]::wait] < $timer} { putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Команда недавно запрашивалась. Пожалуйста повторите попытку через [expr $timer - ([clock seconds] - $[namespace current]::wait)] сек."; return 0; } set [namespace current]::wait [clock seconds] if {[string is space $text]} { putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Формат: $::lastbind \[-номер\] \<город\> - погода в указанном городе."; return; } if {[regexp -- {^-(\d+)} $text -> num]} { regsub -- "^-$num\s?" $text "" text } else { set num 1 } set ext 0 variable fullformat if {[string match "*+*" $text] || $fullformat == "1"} {set text [string map {+ ""} $text]; set ext 1} if {[string length $text] > 50} { putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Максимально символов в городе должно быть - 50."; return; } if {[string length $text] < 3} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Минимально символов в городе должно быть - 3."; return; } variable timeout variable useragent variable site variable fcookies ::http::config -useragent $useragent -urlencoding utf-8 if {[catch { set token [::http::geturl $site \ -method POST \ -protocol 1.0 \ -query [::http::formatQuery loc_id "" continent_id "" country_id "" geode_lon "" geode_lat "" q $text do_search "Find place"] \ -headers [list "Accept-Language" "ru-RU,ru;q=0.9,en;q=0.8" "Accept-Charset" "iso-8859-1, utf-8, utf-16, *;q=0.1" Cookie $fcookies] \ -timeout [expr $timeout * 1000] \ -command [list [namespace current]::weather:data $nick $chan [scan $num %d] 1 $ext]] } err]} { putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка при соединении с сервером: $err" return 1 } } proc weather:data {nick chan num total ext token} { set ncode [::http::ncode $token] set status [::http::status $token] array set meta [::http::meta $token] variable site variable timeout variable fcookies ::http::config -urlencoding cp1251 if {[string index $ncode 0] == "3" && [info exists meta(Location)]} { ::http::cleanup $token if {[catch { set token [::http::geturl "$site[string map {{%2f} {/}} [::http::formatQuery [encoding convertfrom cp1251 $meta(Location)]]]" \ -timeout [expr $timeout * 1000] \ -protocol 1.0 \ -headers [list "Accept-Language" "ru-RU,ru;q=0.9,en;q=0.8" "Accept-Charset" "iso-8859-1, utf-8, utf-16, *;q=0.1" Cookie $fcookies] \ -command [list [namespace current]::weather:data $nick $chan $num $total $ext]] } err]} { putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка при соединении с сервером (редирект): $err"; return 1; } return } if {$ncode != "200" || $status ne "ok"} { ::http::cleanup $token putserv "PRIVMSG $chan :Server returned a $ncode-error code or timeout occured." putserv "PRIVMSG $chan :[array get meta]" return 0 } set data [::http::data $token] ::http::cleanup $token regsub -all -- "\n|\r|\t" $data "" data if {[string match -nocase "*No results*" $data] || [string match -nocase "*без результ*" $data]} { putserv "PRIVMSG $chan :Ничего не найдено."; return; } if {[regexp -nocase -- {
.*?(.+?)} $data -> data]} { set clist [list] foreach _ [split [string map {{$} $data "" data if {[string match -nocase "*No results*" $data] || [string match -nocase "*без результ*" $data]} { putserv "PRIVMSG $chan :Ничего не найдено."; return; } set temp "N/A" set windd "" set windv "" set sky "N/A" set ftemp "N/A" set pres "N/A" set bpnt "N/A" set relw "N/A" set time "N/A" #catch {::egglib::writedata data/weather/fw.txt [list $data]} regexp -nocase -- {.*?src="/img/symb-wind/.*?.gif" alt="(.*?)".*?(.*?)} $data -> windd windv regexp -nocase -- {<.*?class=".*?txt-xxlarge">(.*?).*?} $data -> temp if { ![regexp -nocase -- {