package require http namespace eval radionow { variable prefix "!" variable delay "10" variable binds [list "radio" "радио" "radionow"] variable pub_flags "-|-" variable msg_flags "-|-" variable use_antiflood "1" ################################################### # STOP! STOP! STOP! STOP! STOP! STOP! STOP! STOP! # # STOP! STOP! STOP! STOP! STOP! STOP! STOP! STOP! # # STOP! STOP! STOP! STOP! STOP! STOP! STOP! STOP! # ################################################### variable author "tvrsh@IrcNet.ru" variable co_author "Adium@RusNet" variable version "1.2 beta" variable release_date "12-Dec-2009" variable colors [list "\00314" "\00303" "\00310" "\003"] variable output_speed "2" variable unamespace [namespace tail [namespace current]] variable chflag $unamespace setudef flag $chflag foreach bind $binds { bind PUB $pub_flags ${prefix}$bind [namespace current]::pub bind MSG $msg_flags ${prefix}$bind [namespace current]::msg } if {![info exists egglib(ver)]} { setudef flag usecolors } proc pub {nick uhost hand chan text} { variable chflag if {![channel get $chan $chflag]} { return 0 } main $nick $uhost $hand $chan $text } proc msg {nick uhost hand text} { main $nick $uhost $hand $nick $text } proc main {nick uhost hand target text} { variable chflag; variable prefix; variable delay; variable colors variable isflood; variable use_antiflood set text [stripcodes ruagcb [split $text]] if {$text eq ""} { output $target "[lindex $colors 0]Используйте [lindex $colors 1]${prefix}radio [lindex $colors 0]<[lindex $colors 1]радиостанция[lindex $colors 0]>[lindex $colors end]" return 0 } set who "$nick!$uhost" if {$use_antiflood eq "0"} { if {![matchattr $nick n] && ![matchattr $nick m] && ![matchattr $nick o]} { if {[info exists isflood($who)] && [expr {$isflood($who) + $delay}] > [clock seconds]} { puthelp "NOTICE $nick :[lindex $colors 0]Запрос не чаще одного раза в [lindex $colors 1]$delay [lindex $colors 0] [lindex {. секунду секунды секунд} [numgrp $delay]].[lindex $colors end]" puthelp "NOTICE $nick :[lindex $colors 0]Подождите [lindex $colors 2][expr {$delay - [expr {[clock seconds] - $isflood(lasttime,$who)}]}] [lindex $colors 0][lindex {. секунду секунды секунд} [numgrp [expr {$delay - [expr {[clock seconds] - $isflood(lasttime,$who)}]}]]] до следующего запроса.[lindex $colors end]" return 0 } } } set isflood($who) [clock seconds] if {![regexp -- {^\d+$} $text]} { # список радиостанций # да, я запарился его составлять -- adium array set radio { 1 "DFM" 2 "Наше Радио" 3 "Радио 95.2 FM" 4 "Европа Плюс" 5 "Relax FM" 6 "Русское Радио" 7 "Серебряный дождь" 8 "Хит FM" 9 "Финам FM" 10 "Монте-Карло" 11 "Love Radio" 12 "Эхо Москвы" 13 "Мегаполис FM" 14 "NRJ" 15 "Радио Дача" 16 "Best FM" 17 "Maximum" 18 "Ретро FM" 19 "Кекс FM" 20 "Радио Classic" 21 "Newtone FM" 22 "Радио Алла" 23 "Радио Jazz" 24 "X-FM" 25 "Кино FM" 26 "Шансон" 27 "Радио Карнавал" 28 "Радио Звезда" 29 "Радио 7" 30 "Ultra" 31 "Добрые песни" 32 "Свежее радио" 33 "Милицейская волна" 34 "Первое Популярное" 35 "NEXT FM" 36 "Авторадио" 37 "Детское радио" 38 "Юмор FM" 39 "ЮFM" 40 "Моя Семья" 41 "Радио Маяк" 42 "Говорит Москва" 43 "Радио Культура" 44 "Русская Служба Новостей" 45 "Радио Спорт" 46 "Вести FM" 47 "Радио Свобода" 48 "Радио России" 49 "Радио Орфей" 50 "Бизнес FM" 51 "Сити-FM" 52 "Радио Лорнет" } foreach key [array names radio] { # $radio($key) содержит название радиостанции if {[string tolower $text] eq [string tolower $radio($key)]} { getdata $key $target return 0 } } regsub -all -- {(.)} [encoding convertto utf-8 [string map [list " " "+"] $text]] {%[format "%02lX" [scan \1 "%c"]]} text ::http::config -urlencoding utf-8 -useragent "Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.8.1) Gecko/2006101023 Firefox/2.0" set url [::http::geturl "http://radionow.ru/autocomplete.php?q=[subst $text]" -timeout 15000] set results [::http::data $url] ::http::cleanup $url if {$results eq ""} { output $target "[lindex $colors 0]Ничего не найдено.[lindex $colors end]" return 0 } if {[llength [split $results "\n"]] ne "2"} { output $target "[lindex $colors 1]По вашему запросу найдены следующие радиостанции: [lindex $colors 2][string range [string map [list "\n" "[lindex $colors 0], [lindex $colors 2]"] $results] 0 end-8][lindex $colors 1].[lindex $colors end]" return 0 } else { set id [expr [lsearch [array get radio] [lrange $results 0 2]] - 1] getdata [lindex [array get radio] $id] $target return 0 } } else { getdata $text $target return 0 } } proc getdata {value target} { variable colors ::http::config -urlencoding utf-8 -useragent "Mozilla/5.0 (X11; U; Linux i686; ru-RU; rv:1.8.1) Gecko/2006101023 Firefox/2.0" set url [::http::geturl "http://radionow.ru/?radio=$value" -timeout 15000] set html [::http::data $url] ::http::cleanup $url if {[regexp -nocase -- {
(.*?)
(.*?)
} $html -> a b] \ && [regexp -nocase -- {
А до нее играла:
(.*?)
} $html -> c]} { set data "[lindex $colors 0][string map [list "«" "<<" "»" ">>" "" "" "" ""] $a] \ [lindex $colors 2][string map [list "—" "-"] $b][lindex $colors 1] |[lindex $colors 0] А до нее играла: [lindex $colors 2][string map [list "—" "-"] $c][lindex $colors end]" output $target $data } else { output $target "[lindex $colors 0]Ничего не найдено.[lindex $colors end]" } } proc 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} } } proc output {target str} { variable output_speed if {[string index $target 0] eq "#" && ![channel get $target usecolors]} { set str [stripcodes ruagcb $str] } switch -- $output_speed { "1" { putserv "PRIVMSG $target :$str" } "2" { puthelp "PRIVMSG $target :$str" } "3" { putquick "PRIVMSG $target :$str" } "4" { set msg "PRIVMSG $target :[string range $str 0 end]\n" putdccraw 0 [string length $msg] $msg } default { puthelp "PRIVMSG $target :$str" } } } putlog "[namespace tail [namespace current]].tcl by $author (rewritten by $co_author) \[version $version\] \[$release_date\] successfully loaded" }