$chan]
Флаги расположены так: <глобальный>|<локальный>
Если канал не указать, будут проверены только глобальные флаги.
-----=# Работа со списками и строками #=-------------------------------------
Q: Как создать список?
A: Список создается с помощью команды:
set list "one two three four five"
В итоге мы получим список в пятью элементами.
Пустой список создается командой:
set list ""
Q: Как взять один элемент списка?
A: Первый элемент всегда имеет номер "0". Значит для получения первого
элемента сделайте:
lindex $list 0
Q: Как найти по списку в списке?
A: set mainlist "a b c d e"
set mylist "h z y c k"
foreach i $mylist { if {[lsearch $mainlist $i]>=0} {return 1} }
Q: Как добавить новый элемент в список?
A: lappend $list "newelement"
Для добавления нового элемента не в конец списка, а в заданную позицию
(номер в списке) используйте:
linsert $list <позиция> "newelement"
Q: Как заменить или удалить заданный элемент списка?
A: lreplace $list <с позиции> <по позицию> <на что заменить>
если <на что заменить> не указать, элемент будет удален.
Например, имея список: set list "a b c"
и проведя операцию с ним командой:
lreplace $list 1 1
мы получим список $list с элементами "a c"
Q: Как выбрать строку из списка наугад (RND)?
A: set list { "number one" "number two" "number three" }
set random [lindex $list [rand [llength $list]]]
Q: Как заменить символ в строке на другой?
A: regsub -all -- "windows" "$string" "unix" mystring
Заменит слова "windows" на "unix" в строке $string и запишет
новую строку в $mystring.
Q: Как из куска HTML вырезать текст между и
?
A: Сначала найти через lsearch, потом найти
. И выбрать
серединку через lrange.
set a [lrange $str [expr [lsearch $str ""] + 1] [expr [lsearch $str "
"] - 1]]
Q: Как взять один символ (или два/три символа) из строки?
A: set string "eggdrop"
Пример с одним символом (результат будет "d"):
string index $string 3
Пример с группой символов #1 (результать будет "dr"):
string range $string 3 4
Пример с группой символов #2 (результать будет "drop"):
string range $string 3 end
-----=# Работа с файлами #=--------------------------------------------------
Q: Как прочитать данные из файла на диске?
A: set file [open myfile.txt r+]
set result [read $file]
close $file
Q: Как записать в файл на диске?
A: set file [open myfile.txt w+]
puts $file hello
close $file
Q: Как взять из файла строку наугад?
A: Правда не стоит это делать на больших файлах.
set file [open myfile.txt r]
set data [read $file]
close $file
set lines [split $data \n]
set randline [lindex $lines [rand [llength $lines]]]
-----=# Работа с базами данных SQL #=----------------------------------------
Q: Есть ли возможность доступа к SQL из TCL?
A: Конечно. Есть четыре пакета для работы с SQL.
1) Tcl-SQL (http://www.binevolve.com/~tdarugar/tcl-sql/)
SQL-интерфейс для любых баз данных, но впервую очередь для MySQL.
2) MyTCL (http://www.mytcl.cx/) - Альтернатива Tcl-SQL. Расчитан на
MySQL. Уже поддерживается скриптами: mysqlseen 1.1, mysqlfaq 1.0,
mysqlbans 1.0. Один из самых удобных и быстрых.
3) MySQLTcl (http://www.xdobry.de/mysqltcl/) - Переделан из mSQLTcl.
Расчитан на MySQL. Наибольшее количество поддерживаемых команд.
4) fbSQL (http://www.fastbase.co.nz/fbsql/index.html)
Таблица поддерживаемых команд:
| MyTCL | MySQLTcl | Tcl-SQL | fbSQL
--------------------------------------------------
affectedrows | X | | |
col | | X | |
connect | X | X | X | X
disconnect | X | X | X | X
endquery | X | X | X | X
escape | | X | |
exec | X | X | X |
fetchrow | X | | X | X
info | | X | |
insertid | X | X | |
isconnected | X | | |
map | | X | |
next | | X | |
numrows | X | | X | X
query | X | X | X | X
result | | X | |
seek | | X | |
selectdb | X | X | X | X
state | | X | |
version | X | | | X
Рекомендуемые пакеты: MyTCL и MySQLTcl
-----=# Работа с таймером, временем и датами #=------------------------------
Q: Как отрабатывать процедуру по времени?
A: bind time - my_time_proc
proc my_time_proc {min hour day month year} {
}
bind time - "00 * * * *" my_time_proc (каджый час)
bind time - "05 05 * * *" my_time_proc (в 5:05 утра)
bind time - "?0 * * * *" my_time_proc (каждые 10 минут)
Q: Как отрабатывать процедуру каждые XX минут?
A: if {![info exists my_proc_running]} {
timer 20 my_proc
set my_proc_running 1
}
proc my_proc {} {
# начало вашего кода
# конец вашего кода
timer 20 my_proc
return 1
}
Q: Как сделать чтобы процедура иногда срабатывала, а иногда нет?
A: Можно просто сделать выборку по RND, и если одно число, то работать, если
нет, то не работать. Пример выборки одного из трех:
set x [rand 3]
if {$x==3} {
}
Q: Как получить дату/время заданного вида?
A: clock format [unixtime] -format <вид>
Флаги форматов даты/времени в документации на TCL.
Пример: Получить из unixtime дату формата "01 May 2001 12:05"
[clock format [unixtime] -format "%d %m %Y %H:%M"]
Q: Имеем строку с датой формата "2001-05-27 11:22:33".
Как ее преобразовать в "27-05-2001 11:22"?
A: set date [split "2001-05-27 11:22:33"]
set a [split [lindex $date 0] "-"]
set b [split [lindex $date 1] ":"]
set output "[lindex $a 2]-[lindex $a 1]-[lindex $a 0] [lindex $b 0]:[lindex $b 1]"
Q: Как сделать задержку перед выполнением процедуры?
A: Первый вариант (замораживает общий поток):
after 1000
putserv "PRIVMSG $chan :test"
Второй вариант (создает свой поток для работы):
after 1000 putserv "PRIVMSG $chan :test"
1000 - это миллисекунды (ms). 1000ms = 1s.
-----=# Работа с сообщениями #=----------------------------------------------
Q: Как создать стили (bold/color/inverse/underline) для текста?
A: Bold : \002Bold text\002
Inverse : \022Inverse text\022
Underline: \037Underline text\037
Color : \00312,4Blue text on red background\003
Номера цветов для режима Color:
0 - черный 8 - желтый
1 - белый 9 - салатовый
2 - темно-синий 10 - морской волны
3 - зеленый 11 - голубой
4 - красный 12 - синий
5 - коричневый 13 - фиолетово-розовый
6 - темно-фиолетовый 14 - темно-серый
7 - оранжевый 15 - серый
Q: В чем отличие puthelp от putserv и что лучше использовать?
A: Они используют различные очереди (queue) для вывода сообщений в канал или
пользователю. Но putserv, вроде как, имеет более высокий приоритет в
очереди, чем puthelp. Поэтому для простой нотификации пользователю лучше
использовать puthelp, а для всего остального putserv.
Q: Как послатать сообщения в канал/пользователю?
A: Сообщение в канал: putserv "PRIVMSG $chan :message from bot..."
NOTICE пользователю: putserv "NOTICE $nick :my notice to you..."
ACTION в канал: putserv "PRIVMSG $chan :\001ACTION вернулся...\001"
CTCP-запрос пользователю: putserv "PRIVMSG $nick :\001VERSION\001"
Q: Как узнать откуда пришел ACTION. Из канал или из привата?
A: proc action_bind {nick uhost hand dest keyword text} {
if {[string index $dest 0] == "#"} { return "from channel" }
return "from private"
}
Q: Как сделать, чтобы бот отвечал на CTCP CLIENTINFO?
A: Написать свою процедуру ответа на этот запрос.
bind ctcp - CLIENTINFO cinfo_answer
proc cinfo_answer {nick uhost hand dest keyw arg} {
putserv "NOTICE $nick :\001CLIENTINFO my own clientinfo message\001"
return 1
}
Q: Как "отловить" Notice и Action?
A: Notice: bind notc - "*текст*" notice_proc
Action: bind ctcp - "ACTION" action_proc
-----=# Работа с логами #=---------------------------------------------------
Q: Как вручную записать данные в лог-файл?
A: putloglev <#chan> "<сообщение>"
Пример: putloglev p $chan "hello, world!"
Q: Поскольку бот сам себя не логирует. Я делаю это через putloglev, но
фраза бота отписывается раньше, чем фраза вызвавшая эту процедуру!
A: Кидать в лог только после того, как бот увидит самого себя на канале
bind *
: если то, что появилось от = <отправленное в канал>,
то кинуть в лог. А <отправленное в канал> держать в глобальном списке и
при выполнения условия - удалять из списка.