Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace eval gismeteo {
- setudef flag no[namespace tail [namespace current]]
- variable file "data/city.dat"
- variable timer 5
- variable pbind 1
- variable clock 0
- foreach bind {пп} {bind pub - $::gprefix(1)$bind [namespace current]::pub; if {$pbind} {bind msg - $::gprefix(1)$bind [namespace current]::msg}}
- proc msg {nick host hand text} {pub $nick $host $hand $nick $text; return}
- proc pub {nick host hand chan text} {
- variable timer; variable clock
- if {$chan != $nick && [channel get $chan no[namespace tail [namespace current]]]} {return} else {set lastbind $::lastbind; set text [string trim [string map { {}} [stripcodes cubr $text]]]; set gorod [pgorod $nick]}
- if {[regexp -nocase -- {-(\d+)} $text -> n]} {set text [string trim [regsub -- {-\d+} $text ""]]; if {$n < 1} {set n 1}} else {set n 1}
- if {[regexp -nocase -- {\+(\d+)} $text -> d]} {set text [string trim [regsub -- {\+\d+} $text ""]]} else {set d 0}
- if {![string is space $text] && [string length $text] > 60} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Название города не может быть длиннее 60 символов."; return} elseif {![string is space $text] && [string length $text] < 2} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Название города не может быть короче 3 символов."; return} elseif {[string is space $text]} {set text $gorod}
- if {$text == 0 || [string match -nocase "хелп" $text] || [string match -nocase "help" $text]} {
- putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Формат: \[-номер\] \[+день\] \<город\> - погода с gismeteo.ru."
- if {$gorod != 0} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ваш город: $gorod. Вы можете не указывать город в команде."} else {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Добавьте свой город командой \002!город\002 для автоматического определения вашего города."}
- } else {
- if {[expr [clock seconds]-$clock] < $timer} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Команда недавно запрашивалась. Повтори попытку через [expr $timer-([clock seconds]-$clock)] сек."; return}; set clock [clock seconds]
- if {$d == 0} {set d ""} else { if {$d > 13} {set d "13/"} else {set d "$d/"} }
- ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
- array set meta [::http::meta [::http::geturl https://m.gismeteo.ru/citysearch/by_name/?gis_search=[::http::formatQuery $text] -timeout 10000]]
- if {[info exists meta(Location)]} {set r 0; set url "http://m.gismeteo.ru$meta(Location)$d"} else {set r 1; set url "https://m.gismeteo.ru/citysearch/by_name/?gis_search=[::http::formatQuery $text]"}
- ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
- if {[catch {set parsing [::http::geturl $url -binary true -timeout 10000]} error]} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: $error"; return} elseif {[http::ncode $parsing] == "404"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: [http::code $parsing]"} elseif {[http::status $parsing] == "ok"} {set data [regsub -all -- {\n|\r|\t|\v} [encoding convertfrom utf-8 [::http::data $parsing]] ""]; regsub -all -- {\s+} $data " " data} elseif {[http::status $parsing] == "timeout"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Таймаут соединения."} elseif {[http::status $parsing] == "error"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: [http::error $parsing]"}
- ::http::cleanup $parsing; if {![info exists data]} {return}
- if {$r} {
- set list [list]; foreach {b x} [regexp -nocase -inline -all {<a class="catalog__link" href="/weather/(\d+)/">} $data] { if {$x ni $list} {lappend list $x} }
- if {$list != ""} {set num [lindex $list [expr $n-1]]} else {putserv "PRIVMSG $chan :Временно наблюдаются проблемы с сайтом m.gismeteo Погода временно не доступна . $data"; return}
- if {$num != ""} {set url "https://m.gismeteo.ru/weather/$num/current/"} else {set n [llength $list]; set url "https://m.gismeteo.ru/weather/[lindex $list [expr [llength $list]-1]]/$d"}
- ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
- if {[catch {set parsing [::http::geturl $url -binary true -timeout 10000]} error]} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: $error"; return} elseif {[http::ncode $parsing] == "404"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: [http::code $parsing]"} elseif {[http::status $parsing] == "ok"} {set data [regsub -all -- {\n|\r|\t|\v} [encoding convertfrom utf-8 [::http::data $parsing]] ""]; regsub -all -- {\s+} $data " " data} elseif {[http::status $parsing] == "timeout"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Таймаут соединения."} elseif {[http::status $parsing] == "error"} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ошибка: [http::error $parsing]"}
- ::http::cleanup $parsing; if {![info exists data]} {return}
- }
- if {[regexp -nocase -- {<div class="menu__item bold">(.*?)</div>} $data -> region]} {
- regsub -all -- {<.*?>} $region {} region
- regsub -all -- { /} $region {} region
- set strana [lindex $region 0]
- set gorod [lindex $region 1]
- regexp -nocase -- {<div class="title">(.*?)</div>} $data -> sdata
- regexp -nocase -- {<td class="weather__temp"><span>(.*?)</span></td>} $data -> temp
- regexp -nocase -- {<td class="weather__desc">(.*?)</td>} $data -> cloud
- regexp -nocase -- {<p>(.*?)</p><p>(.*?)</p><p>(.*?)</p><p>(.*?)</p><p>(.*?)</p><p>(.*?)</p><div class="detail__more"><p>(.*?)</p><p>(.*?)</p><p>(.*?)</p><p>(.*?)</p></div>} $data -> temp1 wings pressure humidity wtemp geo sun sun1 day moon
- set ser "*85.173*"
- if {[string match $ser $host]} {return}
- putserv "PRIVMSG $chan : $::gcolor(3)$strana; $::gcolor(8)$gorod $::gcolor(10)Прогноз на: $::gcolor(4)$sdata; $::gcolor(11)$cloud $::gcolor(10)Температура: $::gcolor(7)$temp $::gcolor(13)$temp1 $::gcolor(11)$wings $::gcolor(10)$pressure $::gcolor(11)$humidity $::gcolor(13)$sun $::gcolor(7)$sun1 $::gcolor(3)$day $::gcolor(15)$moon"
- #::ccs::put_msgdest $chan ": $::gcolor(3)$strana; $::gcolor(8)$gorod $::gcolor(10)Прогноз на: $::gcolor(9)$sdata; $::gcolor(11)$cloud $::gcolor(10)Температура: $::gcolor(7)$temp $::gcolor(13)$temp1 $::gcolor(11)$wings $::gcolor(10)$pressure $::gcolor(11)$humidity $::gcolor(8)$sun $::gcolor(7)$sun1 $::gcolor(3)$day $::gcolor(15)$moon"
- } {putserv "NOTICE $nick :Ошибка парсинга. $d"}
- }
- }
- proc pgorod {nick} {
- variable file
- if {![file exists $file]} {set f [open $file w+]; close $f}
- set f [open $file r]; set res [lrange [split [read $f] \n] 0 end-1]; close $f
- foreach _ $res { if {[string equal -noc [lindex $_ 0] $nick]} {return [lindex $_ 1]} }
- return 0
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement