Описание
Скрипт забирает с сайта 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 newtime

    if {[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 "" text

    if {[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_tok

        if {[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"
}