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 ---