Описание
Скрипт забирает с сайта http://www.timeserver.ru точное время в городах России. Работает на боте _без_ Suzi патча.
Скрипт
namespace eval newtime {
# Сбрасываем значения всех переменных.
foreach p [array names newtime *] { catch {unset newtime($p) } }# Указываем канальный флаг(.chanset #chan +newtime для включения скрипта).
setudef flag newtime### ###
# Меню настроек ниже этой линии: #
# ______________________________ #
### ###
variable newtime
array set newtime {
pref {!}
binds {time время dhtvz ешьу}
msg 1
delay 5
color1 \00314
color2 \00303
color3 \00305
version "newtime.tcl version 1.1"
author "tvrsh"
}### ###
# Ниже этой линии начинается код, не изменяйте его если не знаете TCL: #
# ____________________________________________________________________ #
### #### Обработка биндов.
foreach bind [split $newtime(binds) " "] {
bind pub -|- "$newtime(pref)$bind" ::newtime::newtime_pub
if {$newtime(msg) >= 1} {
bind msg -|- "$newtime(pref)$bind" ::newtime::newtime_msg
}
}# Процедура обработки приватных команд.
proc ::newtime::newtime_msg {nick uhost hand text} {
variable newtime
::newtime::newtime_proc $nick $uhost $hand $nick $text
}# Процедура обработки паблик команд.
proc ::newtime::newtime_pub {nick uhost hand chan text} {
variable newtime# Проверяем наличие флага.
if {![channel get $chan newtime]} {
return
}
::newtime::newtime_proc $nick $uhost $hand $chan $text
}# Процедура обработки запроса.
proc ::newtime::newtime_proc {nick uhost hand chan text} {
global lastbind
variable newtimeif {[info exists newtime(lasttime,$chan)] && [expr $newtime(lasttime,$chan) + $newtime(delay)] > [clock seconds]} {
putserv "NOTICE $nick :$newtime(color1)Запрос не чаще одного раза в $newtime(color2)$newtime(delay) $newtime(color1)[lindex {. секунду секунды секунд} [newtime_numgrp $newtime(delay)]]."
putserv "NOTICE $nick :$newtime(color1)Подождите $newtime(color3)[expr $newtime(delay) - [expr [clock seconds] - $newtime(lasttime,$chan)]] $newtime(color1)[lindex {. секунду секунды секунд} [newtime_numgrp [expr $newtime(delay) - [expr [clock seconds] - $newtime(lasttime,$chan)]]]] до следующего запроса."
return 0
}set newtime(start) [clock clicks]
if {[llength [split $text]] == "0"} {
putserv "PRIVMSG $chan :$newtime(color1)Используйте $newtime(color3)\002$lastbind город\002 $newtime(color1)для просмотра точного текущего времени в городах России.\003"
return 0
}set text [stripcodes bc [::newtime::en2ru $text]]
#regsub -all -nocase -- {\s} $text "" textif {[llength [split $text]] < "2"} {
# Поддержка Suzi?
if {[info exists ::sp_version]} {
set text [lindex [split $text] 0]
} else {
set text [encoding convertfrom cp1251 [lindex [split $text] 0]]
}set newtime_tok [::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"]
set newtime_tok [::http::geturl "http://www.timeserver.ru/city/$text" -timeout 15000]
set data [::http::data $newtime_tok]
::http::cleanup $newtime_tok
if {[info exists ::sp_version]} {
putlog "\[newtime\] $nick/$chan/$text"
set data [encoding convertfrom cp1251 $data]
} else {
putlog "\[newtime\] $nick/$chan/[encoding convertto utf-8 $text]"
}regsub -all -- "\n" $data "" data
regexp {<div class="city">(.*?)<br >} $data "" data
foreach line [split $data "\n"] {
set nmsg [list]
if {[regexp -nocase -- {<h2>(.*?) <span>\((.*?)\)</span>} $line -> city region]} {
lappend nmsg "$newtime(color1)Точное текущее время в г. $newtime(color2)$city$newtime(color1), $newtime(color2)$region$newtime(color1):"
}
if {[regexp -nocase -- {<div class="clock" id="clock_search">(.*?)</div>} $line -> ntime]} {
lappend nmsg "\002$newtime(color3)$ntime\002$newtime(color1),"
} else {
putserv "PRIVMSG $chan :$newtime(color3)\002$nick\002$newtime(color1), Такого города не существует или нет в нашей базе городов $newtime(color1)..."
set newtime(lasttime,$chan) [clock seconds]
return 0
}
if {[regexp -nocase -- {<div class="info">(.*?)</div>} $line -> ninfo]} {
regsub -all -- {\s+} $ninfo { } ninfo
regsub -all -- {<br>} $ninfo {$newtime(color1),$newtime(color2)} ninfo
set ninfo [string trim $ninfo]
lappend nmsg "$newtime(color2)[subst -nocommand $ninfo]\003$newtime(color1)."
}putserv "PRIVMSG $chan :[join $nmsg] \00315([expr ([clock clicks] - $newtime(start))/1000.0]мc.)\003"
set newtime(lasttime,$chan) [clock seconds]
return 0
}
} else {
# Поддержка Suzi?
if {[info exists ::sp_version]} {
set ntext $text
} else {
set ntext [encoding convertfrom cp1251 $text]
}set newtime_tok [::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"]
set newtime_tok [::http::geturl "http://www.timeserver.ru/compare/[lindex [split $ntext] 0]/[lindex [split $ntext] 1]" -timeout 15000]
set data [::http::data $newtime_tok]
::http::cleanup $newtime_tokif {[info exists ::sp_version]} {
putlog "\[newtime\] $nick/$chan/Compare: [lindex [split $ntext] 0]/[lindex [split $ntext] 1]"
set data [encoding convertfrom cp1251 $data]
} else {
putlog "\[newtime\] $nick/$chan/Compare: [encoding convertto utf-8 [lindex [split $ntext] 0]/[lindex [split $ntext] 1]]"
}regsub -all -- "\n" $data "" data
regsub -all -- {\s+} $data { } data
if {[regexp -nocase -- {</fieldset> </form> </div> <div>(.*?)\..*?<a } $data -> error]} {
regexp {<div>\ (.*?)\ -} $error "" city
putserv "PRIVMSG $chan :$newtime(color3)$nick$newtime(color1), города $newtime(color2)$city $newtime(color1)не существует или нет в нашей базе городов.\003"
set newtime(lasttime,$chan) [clock seconds]
return 0
}regexp {<div class="difference">(.*?)</div>} $data "" diff
regsub -all -- "<strong>| </strong>" $diff "\002" diff
regexp {<div\ class=\"compared\ \">(.*?)<br } $data "" data
regsub -all -- "<div class=\"city\">" $data "|" data
regsub -all -- "<a .*?>" $data "" data
regsub -all -- "</a>" $data "" data
regsub -all -- "<br>" $data "," data
foreach line [split $data "|"] {
if {[regexp -nocase -- {<h2>(.*?) <span>\((.*?)\)</span>.*?</h2> <div class="time"> <div class="clock" id=".*?">(.*?)</div> <div class="info">\ (.*?),} $line -> ncity nregion ntime ninfo]} {
lappend compare "$newtime(color2)$ncity$newtime(color1), $newtime(color2)$nregion $newtime(color1)($newtime(color3)$ntime$newtime(color1), $newtime(color2)$ninfo$newtime(color1))"
}
}putserv "PRIVMSG $chan :$newtime(color1)Между [lindex $compare 0] $newtime(color1)и [lindex $compare 1] $newtime(color3)$diff \00315([expr ([clock clicks] - $newtime(start))/1000.0]мc.)\003"
set newtime(lasttime,$chan) [clock seconds]
return 0
}
}# Процедура переводит текст набранный в неправильно раксладке.
proc ::newtime::en2ru {t} {
return [string map {f а \, б d в u г l д t е \` ё \; ж p з b и q й r к k л v м y н j о g п h р c с n т e у a ф \[ х w ц x ч i ш m ь o щ \] ъ \' э s ы \. ю z я} [string tolower $t]]
}# Возвращает правильное окончание слов.
proc newtime_numgrp {number} {
switch -glob -- "$number" {
*11 {return 3}
*12 {return 3}
*13 {return 3}
*14 {return 3}
*1 {return 1}
*2 {return 2}
*3 {return 2}
*4 {return 2}
default {return 3}
}
}# Выводим сообщение о том, что скрипт удачно загружен.
putlog "\[newtime\] $newtime(version) by $newtime(author) loaded"
}