[c][size=12]Скрипты[/size][/c] [b]1.[/b] Скрипт выводит текст: [code]bind pub - !ком com proc com {nick uhost hand chan text} { putserv "PRIVMSG $chan :текст" }[/code] [b]2.[/b] Скрипт выводит случайный текст: [code]bind pub - !ком2 com2 proc com2 {nick uhost hand chan text} { set list {"текст1" "текст2" "текст3"} set text [lindex $list [rand [llength $list]]] putserv "PRIVMSG $chan :$text" }[/code] [b]3.[/b] Скрипт выводит случайный ник: [code]bind pub - !ком3 com3 proc com3 {nick uhost hand chan text} { set nicks [chanlist $chan] set dnick [lindex $nicks [rand [llength $nicks]]] while {[string equal -noc $::botnick $dnick]} {set dnick [lindex $nicks [rand [llength $nicks]]]} putserv "PRIVMSG $chan :$dnick" }[/code] [b]4.[/b] Скрипт выводит случайную строку из файла каждые 5 минут автоматически: [code]bind cron - "*/5 * * * *" com4 proc com4 {min hour day month weekday} { set chan #windrop set file baza.txt if {![file exists $file]} {putlog "Бызы нет."; return} set f [open $file r] set list [split [read $f] \n] close $f if {[llength $list] == 0} {putlog "База пуста."; return} putserv "PRIVMSG $chan :[lindex $list [rand [llength $list]]]" }[/code] [b]5.[/b] Cкрипт выводит текст на определённое слово в сообщении: [code]bind pubm - "*привет*" com5 proc com5 {nick uhost hand chan text} { putserv "PRIVMSG $chan :$nick здорова!" }[/code] Или: [code]bind pubm - * com5 proc com5 {nick uhost hand chan text} { set text [string tolower [string trim [string map { {}} [stripcodes bcur $text]]]] if {[string match "*привет*" $text]} {putserv "PRIVMSG $chan :$nick здорова!"; return} if {[string match "*пока*" $text] || [string match "*прощай*" $text]} {putserv "PRIVMSG $chan :$nick пока!"; return} }[/code] [b]6.[/b] Скрипт добавляет строку в файл: [code]bind pub - !строка com6 proc com6 {nick uhost hand chan text} { set file baza.txt if {[string is space $text]} {putserv "NOTICE $nick :Формат: !строка <текст>"; return} set f [open $file a+] puts $f $text close $f putserv "NOTICE $nick :Строка была успешно сохранена. Спасибо!" }[/code] [b]7.[/b] Скрипт выводит некую информацию с сайта: [code]bind pub - !ком7 com7 proc com7 {nick uhost hand chan text} { ::http::config -useragent "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; 240x320)"   set url http://windrop.clan.su if {[catch {set token [::http::geturl $url -timeout 10000]} error]} {putserv "NOTICE $nick :Ошибка: $error"; return } elseif {[::http::ncode $token] == "404"} {putserv "NOTICE $nick :Ошибка: [::http::code $token]" } elseif {[::http::status $token] == "ok"} {set data [regsub -all -- {\n|\r|\t|\v} [::http::data $token] ""] } elseif {[::http::status $token] == "timeout"} {putserv "NOTICE $nick :Ошибка: Таймаут соединения." } elseif {[::http::status $token] == "error"} {putserv "NOTICE $nick :Ошибка: [::http::error $token]"} if {[info exists data]} {::http::cleanup $token; set data [regsub -all -- {\s+} $data " "]} else {::http::cleanup $token; return} if {[regexp -nocase -- {Бот обновлён.*?>(.*?).*?(.*?)} $data -> dat ver]} { putserv "PRIVMSG $chan :$ver - $dat" } }[/code] [b]8.[/b] Задержка по времени. В данном случае при входе на канал даётся войс, а затем снимается: [code]bind join - * com8 proc com8 {nick uhost hand chan} { if {![isbotnick $nick] && ([botisop $chan] || [botishalfop $chan])} { putserv "MODE $chan +v $nick" after 120000 [list com8d $chan $nick] } } proc com8d {chan nick} { if {([botisop $chan] || [botishalfop $chan]) && [onchan $nick $chan] && [isvoice $nick $chan]} { putserv "MODE $chan -v $nick" } }[/code] [b]9.[/b] По команде определённому нику отправляет текст. [code]bind pub - !ком9 com9 proc com9 {nick uhost hand chan text} { if {[string is space $text]} {putserv "NOTICE $nick :Формат: !ком9 <ник>"; return} set dnick [lindex [split $text] 0] if {[onchan $dnick $chan]} { putserv "NOTICE $dnick :Текст сообщения." } else { putserv "NOTICE $nick :$dnick отсутствует на канале $chan." } }[/code] [b]10.[/b] Скрипт выводит всё что есть в файле: [code]bind pub - !ком10 com10 proc com10 {nick uhost hand chan text} { set file text/motd if {![file exists $file]} {putlog "Бызы нет."; return} set f [open $file r] set data [split [read $f] \n] close $f foreach line $data { putserv "PRIVMSG $chan :$line" } }[/code] [b]11.[/b] Скрипт сохраняет количество использования данной команды на каждый ник отдельно: [code]bind pub - !ком11 com11 proc com11 {nick uhost hand chan text} { # Путь к базе: set baza baza.txt # Проверка наличие базы, если нет то создадим пустой файл (директория должна существовать): if {![file exists $baza]} {set f [open $baza w+]; close $f} # Открываем файл, читаем его и закрываем: set f [open $baza r]; set data [lrange [split [read $f] \n] 0 end-1]; close $f # Проверяем каждую строку на совпадения ника, формируем базу без этого ника: set inick ""; set list {}; foreach line $data { if {[string equal -nocase [lindex $line 0] $nick]} {set inick [lindex $line 1]; continue} {lappend list $line} } # Если ник не найден, то записываем новую строку с ником в этот файл: if {$inick == ""} { set f [open $baza a+]; puts $f [list $nick 1]; close $f } { # Если ник найден то переписываем базу без ника: set f [open $baza w+] foreach line $list { puts $f $line } # Затем добавляем этот ник с изменением числа: puts $f [list $nick [expr $inick+1]]; close $f } # Выводим результат: if {$inick == ""} {putserv "PRIVMSG $chan :1"} {putserv "PRIVMSG $chan :[expr $inick+1]"} }[/code] [b]12.[/b] Скрипт каждую минуту будет менять топик на указанном канале из списка по порядку: [code]bind time - "* * * * *" com12 proc com12 {min hour day month year} { global topicend set chan #windrop set file baza.txt if {![file exists $file]} {putlog "Бызы нет."; return} if {![info exists topicend]} {set topicend 1} set f [open $file r] set data [split [read $f] \n] close $f set topicstart 0; foreach line $data { if {$line eq ""} {continue} incr topicstart if {$topicstart eq $topicend} {putserv "TOPIC $chan :$line"} } if {$topicstart eq $topicend} {set topicend 1} {set topicend [expr $topicend+1]} }[/code] [b]13.[/b] Скрипт запоминает последнее сообщение которое содержит в начале ip на том канале где включён флаг "ipsave" и выводит его по команде !ip: [code]namespace eval ipsave { setudef flag [namespace tail [namespace current]] variable ipvrem "" variable iptext "" bind pub - !ip [namespace current]::pub bind pubm - *  [namespace current]::parser proc parser {nick uhost hand chan text} { variable ipvrem; variable iptext if {[channel get $chan [namespace tail [namespace current]]]} { set text [string trim [string map { {}} [stripcodes cubr $text]]] if {[regexp -nocase -- {^[0-9\.]{7,20}$} [lindex [split $text] 0]] && [string match "*\.*" [lindex [split $text] 0]]} { set ipvrem [strftime %X] set iptext [list [lindex [split $text] 0] [join [lrange [split $text] 1 end]]] } } } proc pub {nick uhost hand chan text} { variable ipvrem; variable iptext if {$ipvrem ne "" && $iptext ne ""} { putserv "PRIVMSG $chan :\002$nick\002, последний ip был записан в \002$ipvrem\002 -> \037[lindex $iptext 0]\037 [lindex $iptext 1]" } { putserv "PRIVMSG $chan :\002$nick\002, данных пока нет :(" } } }[/code] [b]14.[/b] Скрипт добавляет топик для каждого канала отдельно и меняет его на случайный каждые 30 минут: [code]bind cron - "*/30 * * * *" autotopic bind pub  n !топик+        topicplus proc autotopic {min hour day month weekday} { set file data/baza.txt if {![file exists $file]} {putlog "Бызы нет."; return} set filep [open $file r]; set list [lrange [split [read $filep] \n] 0 end-1]; close $filep if {[llength $list] == 0} {putlog "База пуста."; return} foreach chan [channels]{ if {![botisop $chan] && ![botishalfop $chan]} {continue} set topic {}; foreach line $list { if {[string equal -nocase [lindex $line 0] $chan]} {lappend topic [lindex $line 1]} } if {[llength $topic] != 0} {putserv "TOPIC $chan :[lindex $topic [rand [llength $topic]]]"} } } proc topicplus {nick uhost hand chan text} { set file data/baza.txt if {[string is space $text]} {putserv "NOTICE $nick :Формат: !топик+ <текст>"; return} if {[string length $text] > 300} {putserv "NOTICE $nick :Лимит для топика = 300 символов! У вас [string length $text]."; return} set filep [open $file a+]; puts $filep [list $chan $text]; close $filep putserv "NOTICE $nick :Топик успешно добавлен. Спасибо!" }[/code] [b]15.[/b] Удаляем строку из файла по номеру или по тексту или все строки разом. [code]bind pub - !-строка com15 proc com15 {nick uhost hand chan text} { set file baza.txt # если команда без параметров то напоминаем их if {[string is space $text]} {putserv "NOTICE $nick :Формат: !-строка <номер/текст/все>"; return} # создаём файл если его нет if {![file exists $file]} {set f [open $file w+]; close $f} # читаем файл set filep [open $file r]; set list [lrange [split [read $filep] \n] 0 end-1]; close $filep # если файл пустой то сообщаем об этом if {[llength $list] == 0} {putserv "NOTICE $nick :База пуста."; return} # если указаны цифры то удаляем строку по номеру if {[string is digit $text]} { # проверяем есть ли такой номер if {$text <= [llength $list]} { # формируем новый список без этой строки set list [lreplace $list [expr $text-1] [expr $text-1]] # переписываем файл set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep # сообщаем что всё хорошо putserv "NOTICE $nick :Строка под номером $text удалена."; return } { # сообщаем что такой строки нет putserv "NOTICE $nick :Строки под номером $text не существует. Всего строк: [llength $list]."; return} } { # если указано слово "все" то чистим файл if {[string equal -nocase "все" $text]} {set f [open $file w+]; close $f; putserv "NOTICE $nick :Все строки удалены."; return} # в другом случае сравниваем строки, проверяем есть ли такая строка, если есть то получаем сразу её номер if {[set num [lsearch -exact -nocase $list $text]] != "-1"} { # формируем новый список без этой строки set list [lreplace $list $num $num] # переписываем файл set filep [open $file w+]; foreach line $list { puts $filep $line }; close $filep # сообщаем что всё хорошо putserv "NOTICE $nick :Строка \"$text\" удалена."; return } { # сообщаем что такой строки нет putserv "NOTICE $nick :Строки \"$text\" не существует."; return } } }[/code] [b]16.[/b] Как отловить ошибки в TCL скриптах для eggdrop с выводом на канал. [code]set ::erchan "#bots" set ::errtm 0; proc ::wrerr {args} { if {[incr ::errtm] >= 1 && ![string is space $::errorInfo]} { if {[string match -nocase "*state(sock)*" $::errorInfo] || [string match -nocase "*named \"sock*" $::errorInfo]} {set ::errtm 0; set ::errorInfo ""; return} putchan $::erchan "\00304 .---Error---" set i 0; foreach _ [split $::errorInfo \n] { if {[incr i] > 20} {break} else {putchan $::erchan "\00304| \017$_"} } putchan $::erchan "\00304`----End----" set ::errtm 0; set ::errorInfo "" } } trace add variable errorInfo write ::wrerr[/code]