Страница 1 из 1

Дорабатываем calc.tcl

СообщениеДобавлено: 20 июн 2010 12:13
tvrsh
calc.tcl - Система хранения записок на боте с поддержкой их линковки. База ведется отдельно для каждого канала.
В скрипте есть команда поиска кальков по ключевому слову. В дефолтной версии скрипта результатом такого поиска является первый найденный кальк:
#egghelp @ IrcNet.ru писал(а): <@tvrsh> !findcalc eggdrop
<@lamestbot> эггдроп = eggdrop [tvrsh]
<@tvrsh> !findcalc *eggdrop*
<@lamestbot> эггдроп = eggdrop [tvrsh]

Сегодня мы сделаем так, чтобы в результате отображался список всех кальков удовлетворяющих поисковому запросу.
Откройте скрипт и найдите в нем процедуру ::calc::findcalc
Рассмотрим в нем данное условие:
TCL: [ Скачать ] [ Скрыть ]
        foreach cdata $chandata {
                if {[string match [::calc::tolower $mask] [::calc::tolower [lindex $cdata 4]]]} {
                        set res $cdata
                        break
                }
        }

Тут перебираются все кальки данного канала, и при первом совпадении с поисковым запросом цикл прерывается. Нам надо, чтобы цикл поиска совпадающих кальков продолжался и дальше. Для этого заменяем
                        set res $cdata
                        break
на
        lappend res [lindex $cdata 3]

Далее нам надо изменить способ вывода результатов. Замените
        if {$res != ""} {::calc::out $nick $chan "[lindex $res 3] = [lindex $res 4] \[[lindex $res 1]\]"
        } else {::calc::out $nick $chan "Кальк не найден..."}
на
        if {$res != ""} {::calc::out $nick $chan "По маске '$mask' [lindex {. найден найдено найдены} [::calc::numgrp [llength $res]]] [llength $res] [lindex {. кальк калька кальков} [::calc::numgrp [llength $res]]]: [join $res ", "]."
        } else {::calc::out $nick $chan "По маске '$mask' кальки не найдены..."}
и в конец скрипта добавте эту процедуру:
TCL: [ Скачать ] [ Скрыть ]
 proc ::calc::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}
    }
}

В измененном способе выводы мы полученный список кальков разделяем запятыми и выводим его в канал:
#egghelp @ IrcNet.ru писал(а): <@tvrsh> !findcalc eggdrop
<@lamestbot> * По маске 'eggdrop' найден 1 кальк: эггдроп.
<@tvrsh> !findcalc *eggdrop*
<@lamestbot> * По маске '*eggdrop*' найден 121 кальк: эггдроп, statstcl, bseen, погода, ping, ...

Re: Дорабатываем calc.tcl

СообщениеДобавлено: 20 июн 2010 12:43
tvrsh
Если вам нужно знать время добавления калька, то откройте скрипт и найдите в нем процедуру ::calc::showcalc
Найдите в ней строку
                 if {$res != ""} {::calc::out $nick $chan "\00304*\003 [lindex $first 0] = [lindex $res 4] \[[lindex $res 1]\]"
и после нее добавьте
                ::calc::out $nick $chan "\00304*\003 Добавлен [clock format [lindex $res 2] -format "%d.%m.%Y - %I:%M:%S"]."
ниже найдите строки
                } else {set res [::calc::getbyname [lindex [::calc::randomdata] 3] ""]}
                ::calc::out $nick $chan "\00304*\003 [lindex $res 3] = [lindex $res 4] \[[lindex $res 1]\]"
и после них добавьте
                ::calc::out $nick $chan "\00304*\003 Добавлен [clock format [lindex $res 2] -format "%d.%m.%Y - %I:%M:%S"]."

Теперь кальки будут показываться вот так:
#egghelp @ IrcNet.ru писал(а): <@tvrsh> man eggdrop
<@lamestbot> * eggdrop = Скачать архив бота(handlen32) с исправлением отображения версии в ботнете и с модулями gseen, stats, social: http://www.ircnet.su/files/eggdrop1.6.19+ctcpfix+(gseen+stats+social).mod.tgz Для установки бота смотри !calc install [tvrsh]
<@lamestbot> * Добавлен 26.05.2009 - 09:25:45.

Re: Дорабатываем calc.tcl

СообщениеДобавлено: 04 фев 2012 12:09
tvrsh
Чтобы при анонсе кальков была возможность выбирать в каком порядке их показывать, надо сделать следующее:
В настройки добавляем строки
# random calcs in announcements? (1/0)
set calc(random)        1
 

Далее, в процедуре ::calc::randomdata заменяем
TCL: [ Скачать ] [ Скрыть ]
                set rnum [rand [llength $chandata]]
                set num 0
                foreach cdata $chandata {
                        if {$num == $rnum} {return $cdata}
                        incr num
                }
на
TCL: [ Скачать ] [ Скрыть ]
        if {$calc(random) == "0"} {
            if {[info exists calc(num)] && $calc(num) != "" && $calc(num) <= [expr [llength $chandata] - 1]} {
                incr calc(num)
                return [lindex $chandata $calc(num)]
            } else {
                set calc(num) 0
                return [lindex $chandata $calc(num)]
            }
        } else {
                set rnum [rand [llength $chandata]]
                set num 0
                foreach cdata $chandata {
                        if {$num == $rnum} {return $cdata}
                        incr num
                }
            }


Теперь можно выбирать, выводить случайные кальки, или в порядке добавления в базу.

Re: Дорабатываем calc.tcl

СообщениеДобавлено: 14 сен 2012 21:42
Blans
Скрипт вообще отличный :) За дополнения спасибо :)

Re: Дорабатываем calc.tcl

СообщениеДобавлено: 04 окт 2015 09:43
Bart
tvrsh писал(а):
if {$res != ""} {::calc::out $nick $chan "По маске '$mask' [lindex {. найден найдено найдены} [::calc::numgrp [llength $res]]] [llength $res] [lindex {. кальк калька кальков} [::calc::numgrp [llength $res]]]: [join $res ", "]."
        } else {::calc::out $nick $chan "По маске '$mask' кальки не найдены..."}

Если искать по маске *, то будет вывод из всех кальков. Как можно сделать, например, По маске 'https*' найдено 11 кальков, показаны первые 10: варианты...

Re: Дорабатываем calc.tcl

СообщениеДобавлено: 04 окт 2015 09:54
Vertigo
Bart писал(а): Как можно сделать, например, По маске 'https*' найдено 11 кальков, показаны первые 10

Заменить
if {$res != ""} {::calc::out $nick $chan "По маске '$mask' [lindex {. найден найдено найдены} [::calc::numgrp [llength $res]]] [llength $res] [lindex {. кальк калька кальков} [::calc::numgrp [llength $res]]]: [join $res ", "]."

на
TCL: [ Скачать ] [ Скрыть ]
if {$res != ""} {
if {[llength $res] > 10} {
::calc::out $nick $chan "По маске '$mask' [lindex {. найден найдено найдены} [::calc::numgrp [llength $res]]] [llength $res] [lindex {. кальк калька кальков} [::calc::numgrp [llength $res]]], показаны первые 10: [join [lrange $res 0 9] ", "]."
} else {
::calc::out $nick $chan "По маске '$mask' [lindex {. найден найдено найдены} [::calc::numgrp [llength $res]]] [llength $res] [lindex {. кальк калька кальков} [::calc::numgrp [llength $res]]]: [join $res ", "]."}