Wrapper для UAFS.tcl (Universal Anti-Flood Script)
Скрипт UAFS.tcl for eggdrop представляет собой средство для контроля количества событий в определенный промежуток времени. Применительно к eggdrop'y, события, как правило, представляют собой команды пользователя, посланные боту, хотя в общем случае это могут быть и joins/parts/nick changes/all messages.
( читать readme )
Поскольку сам UAFS не относится к категории plug'n'play, и в освоении может быть труден, особенно для новичков в eggdrop/tcl, то я решил написать этакую оболочку, которая позволяла делать практически то же самое, но проще, хотя и за счет некоторой потери гибкости настройки.
С точки зрения пользовательского скрипта, враппер предоставляет ОДНУ функцию, которая делает проверки на флуд, и если флуд не обнаружен, то вызывает указанную пользователем функцию, причем эта функция (addbind) практически идентична стандартной eggdrop'овской функции установки bind'a, что и обеспечивает легкость использования.
::uafswrapper::debugmode - определяет в будет ли скрипт работать в режиме отладки или в обычном режиме.
::uafswrapper::uafsloaded - если переменная выставленна в 1, значит враппер загружен нормально, существует для того чтобы другие скрипты могли проверить наличие/отсутствие враппера.
::uafswrapper::numver - версия враппера, существует для того чтобы другие скрипты могли проверить наличие/отсутствие враппера.
Функция собственно одна - addbind или, если точнеe ::uafswrapper::addbind.
Ее параметры:
::uafswrapper::addbind bindcmd [floodsettings] [hostmask type] [ignore flags] [callback_function] [strict mode]
где параметры в квадратных скобках
необязательные, смысловые значения те же
самые что и у ::uafs::registerhandle,
параметр bindcmd является стандартной
командой eggdrop'a на привязывыние, то есть что-то
вроде:
bind pub -|- "!slap" proc_slap
подробнее в примерах
#--- demo script for uafswrapper.tcl ---
#определяем наше собственное пространство имен
#если вы никогда до этого не использовали namespaces,
#неплохая идея начать использовать их прямо сейчас
namespace eval testscript {
#прежде всего, если вы пишите хороший код,
#то необходимо делать обработку ошибок, в данном случае
#нужно проверить,а загружен ли враппер? для этого wrapper
#создает переменную $::uafswrapper::uafsloaded, если ее значение
#равно 1, значит враппер обнаружил uafs и загрузился успешно.
#хотя,конечно,неплохо бы выставить проверку на package require tcl 8.3 и
#package require eggdrop 1.6,но это я пропущу,
#все таки для новичков описание,а не мануал по написанию скриптов :)
putlog ""
putlog "--- Loading UAFS wrapper demo script ---"
putlog "Checking if UAFS wrapper is installed..."
#для удобства использование команду бинда я выношу в отдельную переменную
#чтобы не писать ее несколько раз и не экранировать кавычки и другие
#специальные символы ( если они конечно будут )
#Обратите внимание,что лучше использовать в таком случае фигурные скобки {}
#set bindcmd {bind pub -|- "!slap" ::testscript::proc_slap}
#собственно проверка значения переменной
#сначала проверим,существует ли она, чтобы tcl не выдавал ошибок
if {[info exists "::uafswrapper::uafsloaded"]} {
#далее проверяем значение
##########################
#тут конечно же можно было обойтись одним catch'em,но я решил раз уж
#разжевывать,так всё резжевывать :)
##########################
if {$::uafswrapper::uafsloaded=="1"} {
putlog "UAFS wrapper script found,continue loading"
#поскольку скрипт загружен,можно вызывать функцию addbind
if {[::uafswrapper::addbind "$bindcmd"]<0} {
#ошибка во время добавления бинда - отредактируйте uafswrapper.tcl
#установите значение debugmode в единицу,и посмотрите лог
putlog "---UAFS wrapper demo script: an error occured while adding bind"
putlog "---UAFS wrapper demo script: UAFS wrapper isn't loaded or wasn't properly initialized,flood protection disabled"
#чтобы не терять функциональность, делаем бинд обычным способом
#здесь мы и используем тот плюс что задали команду бинда в виде переменной,
#теперь можно просто передать ее оператору eval,который эту самую команду и исполнит.
eval $bindcmd
}
} else {
#значение переменной отличается от единицы,враппер работать не будет
putlog "UAFS wrapper isn't loaded or wasn't properly initialized,flood protection disabled"
#чтобы не терять функциональность, делаем бинд обычным способом
#здесь мы и используем тот плюс что задали команду бинда в виде переменной,
#теперь можно просто передать ее оператору eval,который эту самую команду и исполнит.
eval $bindcmd
}
} else {
#переменной не существует,враппер работать не будет
putlog "---UAFS wrapper demo script: UAFS wrapper isn't loaded or wasn't properly initialized,flood protection disabled"
#чтобы не терять функциональность, делаем бинд обычным способом
#здесь мы и используем тот плюс что задали команду бинда в виде переменной,
#теперь можно просто передать ее оператору eval,который эту самую команду и исполнит.
eval $bindcmd
}
}
#а это сама процедура,которая будет исполнятся если флуд не обнуружен.
proc ::testscript::proc_slap { nick uhost hand chan text } {
putserv "PRIVMSG $chan :\001ACTION slaps $text with baka-powder\001"
}
#--- конец скрипта - end of script ---