Advertisement
Guest User

Untitled

a guest
Jun 13th, 2019
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
TCL 6.99 KB | None | 0 0
  1. namespace eval gismeteo {
  2.  
  3. setudef flag no[namespace tail [namespace current]]
  4.  
  5. variable file  "data/city.dat"
  6. variable timer 5
  7. variable pbind 1
  8. variable clock 0
  9.  
  10. foreach bind {пп} {bind pub - $::gprefix(1)$bind [namespace current]::pub; if {$pbind} {bind msg - $::gprefix(1)$bind [namespace current]::msg}}
  11.  
  12. proc msg {nick host hand text} {pub $nick $host $hand $nick $text; return}
  13.  
  14. proc pub {nick host hand chan text} {
  15. variable timer; variable clock
  16. 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]}
  17. if {[regexp -nocase -- {-(\d+)} $text -> n]} {set text [string trim [regsub -- {-\d+} $text ""]]; if {$n < 1} {set n 1}} else {set n 1}
  18. if {[regexp -nocase -- {\+(\d+)} $text -> d]} {set text [string trim [regsub -- {\+\d+} $text ""]]} else {set d 0}
  19. 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}
  20. if {$text == 0 || [string match -nocase "хелп" $text] || [string match -nocase "help" $text]} {
  21. putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Формат: \[-номер\] \[+день\] \<город\> - погода с gismeteo.ru."
  22. if {$gorod != 0} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Ваш город: $gorod. Вы можете не указывать город в команде."} else {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Добавьте свой город командой \002!город\002 для автоматического определения вашего города."}
  23. } else {
  24. if {[expr [clock seconds]-$clock] < $timer} {putserv "[expr {$nick == $chan ? "PRIVMSG":"NOTICE"}] $nick :Команда недавно запрашивалась. Повтори попытку через [expr $timer-([clock seconds]-$clock)] сек."; return}; set clock [clock seconds]
  25. if {$d == 0} {set d ""} else { if {$d > 13} {set d "13/"} else {set d "$d/"} }
  26.  
  27. ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
  28. array set meta [::http::meta [::http::geturl https://m.gismeteo.ru/citysearch/by_name/?gis_search=[::http::formatQuery $text] -timeout 10000]]
  29. 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]"}
  30. ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
  31. 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]"}
  32. ::http::cleanup $parsing; if {![info exists data]} {return}
  33. if {$r} {
  34. 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} }
  35. if {$list != ""} {set num [lindex $list [expr $n-1]]} else {putserv "PRIVMSG $chan :Временно наблюдаются проблемы с сайтом m.gismeteo Погода временно не доступна . $data"; return}
  36. 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"}
  37. ::http::config -urlencoding utf-8 -useragent "Mozilla/6.0"
  38. 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]"}
  39. ::http::cleanup $parsing; if {![info exists data]} {return}
  40. }
  41.  
  42. if {[regexp -nocase -- {<div class="menu__item bold">(.*?)</div>} $data -> region]} {  
  43. regsub -all -- {<.*?>} $region {} region
  44. regsub -all -- {&nbsp;/} $region {} region
  45. set strana [lindex $region 0]  
  46. set gorod [lindex $region 1]
  47. regexp -nocase -- {<div class="title">(.*?)</div>} $data -> sdata
  48. regexp -nocase -- {<td class="weather__temp"><span>(.*?)</span></td>} $data -> temp
  49. regexp -nocase -- {<td class="weather__desc">(.*?)</td>} $data -> cloud
  50. 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
  51. set ser "*85.173*"
  52. if {[string match $ser $host]} {return}
  53. 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"
  54. #::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"
  55. } {putserv "NOTICE $nick :Ошибка парсинга.  $d"}
  56.  
  57. }
  58. }
  59. proc pgorod {nick} {
  60. variable file
  61. if {![file exists $file]} {set f [open $file w+]; close $f}
  62. set f [open $file r]; set res [lrange [split [read $f] \n] 0 end-1]; close $f
  63. foreach _ $res { if {[string equal -noc [lindex $_ 0] $nick]} {return [lindex $_ 1]} }
  64. return 0
  65. }
  66. }
  67.  
  68.  
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement