### # # Название: books.tcl # Версия: 1.0 # Автор: tvrsh # Оффсайт: http://www.egghelp.ru/ # ### # # Описание: Скрипт ищет книги по файл-эхе SU.BOOKS # ### # # Установка: # 1. Скопируйте скрипт books.tcl в папку scripts вашего бота. # 2. В файле eggdrop.conf впишите строку source scripts/books.tcl # 3. Сделайте .rehash боту. # ### # # Версион хистори: # # 1.0(17.07.2010) Первая паблик версия. # ### namespace eval books { # Сбрасываем значения всех переменных. foreach p [array names books *] { catch {unset books($p) } } # Указываем канальный флаг(.chanset #chan +books для включения скрипта). setudef flag books ### ### # Меню настроек ниже этой линии: # # ______________________________ # ### ### variable books array set books { pref {!} binds {books book книги книга} msg 1 notice 0 delay 10 maxlines 5 color1 \00314 color2 \00303 color3 \00305 version "books.tcl version 1.0" author "tvrsh" } ### ### # Ниже этой линии начинается код, не изменяйте его если не знаете TCL: # # ____________________________________________________________________ # ### ### # Обработка биндов. foreach bind [split $books(binds) " "] { bind pub -|- "$books(pref)$bind" ::books::books_pub if {$books(msg) >= 1} { bind msg -|- "$books(pref)$bind" ::books::books_msg } } # Процедура обработки приватных команд. proc ::books::books_msg {nick uhost hand text} { variable books ::books::books_proc $nick $uhost $hand $nick $text } # Процедура обработки паблик команд. proc ::books::books_pub {nick uhost hand chan text} { variable books # Проверяем наличие флага. if {![channel get $chan books]} { return 0 } ::books::books_proc $nick $uhost $hand $chan $text } # Процедура обработки запроса. proc ::books::books_proc {nick uhost hand chan text} { variable books global lastbind putlog "\[books\] $nick/$chan" if {$text == ""} { ::books::books_out $nick $chan "$books(color1)Используйте $books(color2)$lastbind $books(color3)\[-количество книг для отображения\] $books(color2)<автор или название книги>$books(color1).\003" return 0 } if {[info exists books(lasttime,$chan)] && [expr $books(lasttime,$chan) + $books(delay)] > [clock seconds]} { ::books::books_out $nick $chan "$books(color1)Запрос не чаще одного раза в $books(color2)$books(delay) $books(color1)[lindex {. секунду секунды секунд} [::books::books_numgrp $books(delay)]]." ::books::books_out $nick $chan "$books(color1)Подождите $books(color3)[expr $books(delay) - [expr [clock seconds] - $books(lasttime,$chan)]] $books(color1)[lindex {. секунду секунды секунд} [::books::books_numgrp [expr $books(delay) - [expr [clock seconds] - $books(lasttime,$chan)]]]] до следующего запроса." return 0 } if {[lindex [split [lindex [split $text] 0] ""] 0] == "-"} { set marker [lindex [split [lindex [split $text] 0] "-"] 1] set text [lindex [split $text] 1] } set request $text set text [::egglib::urlencode [encoding convertto utf-8 [encoding convertfrom cp1251 $text]]] set url "http://lib.rus.ec/booklib?a=$text" set books_tok [::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"] set books_tok [::http::geturl "$url" -timeout 15000] set data [::http::data $books_tok] ::http::cleanup $books_tok if {[info exists ::sp_version]} { set data [encoding convertfrom utf-8 $data] } else { set data [encoding convertto cp1251 [encoding convertfrom utf-8 $data]] } regexp {(.*?)} $data "" title regexp -all -nocase -- {(.*?)
} $data "" data regsub -all -nocase -- {
} $data {|} data foreach line [split $data "|"] { if {[regexp -nocase -- {.*?\((.*?)\)(.*?) href size descr]} { if {[lindex [split $size] 0] > 5} { regexp { - (.*?) - } $descr "" descr incr a lappend bookbase "\00312\037http://lib.rus.ec$href\037\003 - $books(color2)$descr \003- $books(color3)[::books::bytify [lindex [split $size] 0]]$books(color2).\003" } } } if {[info exists marker] && $marker != ""} { ::books::books_out $nick $chan "$books(color1)По вашему запросу $books(color3)\"$books(color2)$request$books(color3)\" $books(color1)[lindex {. найдена найдены найдены} [::books::books_numgrp $a]] $books(color2)$a $books(color1)[lindex {. книга книги книг} [::books::books_numgrp $a]]. Первые $books(color3)$marker $books(color1)из них:" set i 0 while {$i < $marker} { ::books::books_out $nick $chan "[lindex $bookbase $i]" incr i } } else { ::books::books_out $nick $chan "$books(color1)По вашему запросу $books(color3)\"$books(color2)$request$books(color3)\" $books(color1)[lindex {. найдена найдены найдены} [::books::books_numgrp $a]] $books(color2)$a $books(color1)[lindex {. книга книги книг} [::books::books_numgrp $a]]. Первые $books(color3)$books(maxlines) $books(color1)из них:" set i 0 while {$i < $books(maxlines)} { ::books::books_out $nick $chan "[lindex $bookbase $i]" incr i } } set books(lasttime,$chan) [clock seconds] return 0 } # Байтомизация данных. proc ::books::bytify {bytes} { for {set pos 0; set bytes [expr double($bytes)]} { $bytes >= 1024} {set bytes [expr $bytes/1024]} {incr pos} set a [lindex {"Б" "КБ" "МБ" "ГБ" "ТБ" "ПБ"} $pos] format "%.3f%s" $bytes $a } # Процедура вывода строк. proc ::books::books_out {nick chan text} { variable books if {$books(notice) == "1"} { putserv "NOTICE $nick :$text" } else { putserv "PRIVMSG $chan :$text" } } # Процедура подстановки окончаний к числам. proc ::books::books_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 "\[books\] $books(version) by $books(author) loaded" }