Записки о TCL.

Решение вопросов при работе с TCL скриптами.

Модератор: Модераторы

Записки о TCL.

Сообщение tvrsh » 30 июн 2009 19:37

В этой теме будут публиковаться небольшие заметки о TCL скриптинге, маленькие примеры кода, создание новых тем для которых нецелесообразно на ваш взгляд. Проще говоря, будем оставлять тут свои записки.

Ну и первая записка от меня. Можно отправлять текст сразу на несколько каналов или пользователям, указав их в отдной строке, а не отправляя каждому по очереди:

TCL: [ Скачать ] [ Скрыть ]
# Эта строка отправит слово test на каналы #egghelp и #erotic
putserv "PRIVMSG #egghelp,#erotic :test"
# Вместо
putserv "PRIVMSG #egghelp :test"
putserv "PRIVMSG #erotic :test"

# А эта отправит слово test на канал #egghelp и в приват tvrsh
putserv "PRIVMSG #egghelp,tvrsh :test"
# Вместо
putserv "PRIVMSG #egghelp :test"
putserv "PRIVMSG tvrsh :test"


Точно также работает и с NOTICE.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Дописываем отсутствующие строки в файл.

Сообщение tvrsh » 13 июл 2009 10:59

Как дописывать в файл только те строки, которых в нем еще нет?
Создаем процедуру
TCL: [ Скачать ] [ Скрыть ]
proc existstitle {query} {
set file [open file.txt r]
set data [read $file]
close $file
    foreach line [split $data \n] {
    if {![string match -nocase "*$query*" "*$line*"]} {
        continue
    }
    if {[string match -nocase "*$query*" "*$line*"]} {
        catch {unset data}
        return 1
    }
}
catch {unset data}
return 0
}


И в процедуре, которая пишет в файл нужные нам строки добавляем проверку:
TCL: [ Скачать ] [ Скрыть ]
if {[existstitle "$query"] eq "1"} {
    return
} else {
    set file [open file.txt a]
    puts $file "$query"
    close $file
}


(с) Vertigo @ eggdrop.org.ru
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Перевод из формата longip.

Сообщение tvrsh » 07 янв 2010 01:01

Переводим длинный ip адрес из команды [myip] в обычный формат.
Длинный ip используется ботом для DCC чата и отправки файлов. Чтобы привести его к более привычному виду нам понадобится эта процедура:
# longip: Converts the long value of an ip to it's dotted quad ip.
proc longtoip {long} {
  format "%u.%u.%u.%u" [expr $long>>24] [expr ($long>>16)&255] [expr ($long>>8)&255] [expr $long&255];
}

Взято из fsck.tcl
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Байтомизация данных.

Сообщение tvrsh » 08 янв 2010 12:37

Еще одна интересная процедура, взятая из той же библиотеки, представляет количество байт в более читабельном виде переводя их в кило, мега, гига и т.д байты.
TCL: [ Скачать ] [ Скрыть ]
# bytify: Converts the specifiednumber of bytes into a more human-friendly string.
proc 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
}
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Проверка валидности даты в формате dd.mm.yyyy

Сообщение tvrsh » 28 янв 2010 19:19

Проверяем дату на валидность.
proc isdate {str} {
    if {![regexp {^(?:(?:[0-2]\d|30)\.(?:1\d|0[^2])|31\.(?:0[13578]|1[02])|([0-1]\d|2\d)\.02)\.(\d{4})$} $str "" t y] || ($t == 29 && ($y % 4 || ($y % 100 == 0 && $y % 400)))} { return 0 }
    return 1
}

Процедура проверяет дату на возможность существования. 28.01.2010 вернет 1, 29.02.2010 также как и 88.01.2010 вернет 0.

(c) http://tclhelp.net/unb/71
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Округление чисел.

Сообщение tvrsh » 24 фев 2010 20:26

Процедура округления в большую или меньшую сторону в зависимости от числа. Также можно указать количество цифр после запятой.
proc round {number {digits 0}} {
    return [expr {round(pow(10,$digits)*$number)/pow(10,$digits)}]
}


(с) http://tclhelp.net/unb/169
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Прогрессбар.

Сообщение tvrsh » 07 июн 2010 23:30

Удобно использовать для отображения процентного соотношения чего-либо.

TCL: [ Скачать ] [ Скрыть ]
      bind PUB n !hpbar hpbar
      bind PUB n .hpbar hpbar
      proc hpbar { nick user hand chan text } {
              set max 100
              set len 25
              if {$text <= $max} {
                      set green [expr {( $text * $len ) /$max}]
                      set red [expr {$len-$green}]
                      set green [string repeat "l" $green]
                      set red [string repeat "l" $red]
                      set green "\00303,03$green\003"
                      set red "\00304,04$red\003"
                      putserv "PRIVMSG $chan :$text: $green$red"
              }
      }

(c) http://tcl.pastebin.com/axHEBNGx

Пример работы:
#egghelp @ IrcNet.ru писал(а): <@tvrsh> !hpbar 30
<+bionic> 30: lllllllllllllllllllllllll
<@tvrsh> !hpbar 90
<+bionic> 90: lllllllllllllllllllllllll
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Записки о TCL.

Сообщение FallFromGrace » 27 янв 2011 00:54

Отладка переменной:

TCL: [ Скачать ] [ Скрыть ]
proc dset {gvar value} {
        upvar 1 $gvar var
        set var $value
        putlog "value in $gvar = $value"
}


очень часто бывает нужно посмотреть значение переменной, например, узнать почему же оно глючит. Не всегда это можно сделать из dcc чата, поэтому я сделал такую обертку для set'a.

Использование:
Точно также как и set. Прописав dset x 10, переменной Х будет присвоено значение 10, а в консоли появится сообщение "value in x = 10"
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21

Re: Записки о TCL.

Сообщение tvrsh » 27 янв 2011 01:18

Почему нельзя сразу вот так:
proc dset {gvar value} {putlog "value in $gvar = $value"}

Или у апвара какой-то совсем тайный смысл?
Если можно, покажи конкретный пример использования.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Записки о TCL.

Сообщение FallFromGrace » 27 янв 2011 01:41

Вот например, у тебя есть скрипт:

TCL: [ Скачать ] [ Скрыть ]
proc AddSomethingToUser {user value} {

   set random [expr { [rand 25] - $value  }  ]
   UpdateSomething $user $random
}


И у тебя он иногда вылетает. Ты не можешь понять, почему. Тебе нужно отследить, как это происходит. Ставим переменную random на отладку всего лишь одной буквой:

TCL: [ Скачать ] [ Скрыть ]
proc AddSomethingToUser {user value} {

  # меняем set на dset, оно продолжает работать как было, но добавляет запись в лог
   dset random [expr { [rand 25] - $value  }  ]
   UpdateSomething $user $random
}


тыкаем команду раз 10, и в один момент мы видим что рандом равен нулю. И из-за этого не работала команда UpdateSomething, в ней не было проверки на ноль

Можно было писать вот так:

TCL: [ Скачать ] [ Скрыть ]
proc AddSomethingToUser {user value} {

   set random [expr { [rand 25] - $value  }  ]
   putlog "value in random = $random"
   UpdateSomething $user $random
}


Но если тебе нужно просмотреть значение 10 разных переменных, команда dset становится незаменимой.
FallFromGrace
 
Сообщения: 9
Зарегистрирован: 26 янв 2011 22:35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Версия бота: Eggdrop 1.6.21

Процедура получения последнего цвета в строке.

Сообщение tvrsh » 13 мар 2011 23:26

Данный код забирает из строки последний идентификатор цвета. Использую при разбиении строки на отдельные отрезки, чтобы окрасить отрезки в тот цвет который был задан в начале строки.

Например. Есть строка "\00301Начало строки\00302Середина строки\00303Конец строки" Нам надо разбить ее на 2 части таким образом: часть 1: "\00301Начало строки\00302Середина" и часть 2: "строки\00303Конец строки". С выводом в канал первой части строки проблем не возникнет. Но при выводе второй части первое слово будет без цвета, так как его указатель остался в первой части. Тут нам и пригодится этот код.

set color [string range [lindex [split $text "\003"] [expr [llength [split $text "\003"]] - 1]] 0 1]


Берем первую часть и получаем последний указатель цвета в ней, его мы подставим в начало второй части строки.

<tvrsh> $$ set text "\00301Начало строки\00302Середина"; return [string range [lindex [split $text "\003"] [expr [llength [split $text "\003"]] - 1]] 0 1]
<@bionic> Return: 02 - 0.05 ms.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi


Вернуться в TCL скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

cron