Wrapper для UAFS

Описание

Переменные

Функции

Примеры


Описание

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