ct_add_list - команда добавляет на определенное правило созданный лист
Пример:
ct_add_list "block_rule" "main_block_list" - на правило block добавлен лист main_block_list ( main_block_list - может именть любое другое название.. )
всего доступны следующие правила
block_rule - блокирование команд от сервера
forcibly_fwd_to_sv_by_sv_rule - принудительная переправка команд от сервера на сервер
forcibly_fwd_to_sv_by_cl_rule - принудительная переправка команд от клиента на сервер ( например повесив new можна релогаться так.. врочем с ct_write_to_chan "{$03}new{$00}" будет правельнее )
block_fwd_to_sv_by_sv_rule - блокирование исходящих команд пришедших от сервера не найденых на клиенте и ( как должно было быть ушедших обратна на сервер )
block_fwd_to_sv_by_cl_rule - блокирование исходящих от клиента команд ( в отличие от гуарда и 1-ого щита блокируются не толька команды при cmd_stringexuce.. но и все которые используют форвард ( тоесть добавив say вы не сможете писать в чат ) )
key_binds - блок команд которые выполняются при сварачивание - разворачивание окна ( команды на клавишах пример bind "k" "+voicerecord" при разворачивание будет -voicerecord )
test_rule - тестовое правило для праверки выбралась команда или нет ( проверять ct_filter_test ( тут args будет как бы тестовая команда )
ct_add_line - команда добавляет к листу шаблон
пример:
ct_add_line "main_block_list" "Tokenize" "String" "_restart" - добавить на лист main_block_list команду _restart
как это работает:
когда сервер присылает команды они разбиваются на линии пригодные для Cmd_ExecuteString( это такая линия в которой может быть толька одна команда )
далее эта линия проверяется по листам пока не совпадет по шаблону - если совпала то поиск дальше не идет ( в любом случае )
тоесть если есть
ct_add_list "block_rule" "main_block_list_1"
ct_add_list "block_rule" "main_block_list_2"
ct_add_list "block_rule" "main_block_list_3"
будет проверятся сначала в main_block_list_1 потом main_block_list_2 потом main_block_list_3
если шаблон найдет вернет True там где надо наобарот заблочить все кроме определенных можна инвертировать:
ct_add_list "block_rule" "!main_block_list_1"
ct_add_list "block_rule" "!main_block_list_2"
ct_add_list "block_rule" "main_block_list_3"
если линиия совпадет с шаблоном из листов main_block_list_1 / main_block_list_2 то вернет false ( сдесь по смыслу правила block_rule ясно что команда пройдет )
и есле дойдет до листа подходящего шаблона листа main_block_list_3 то будет true ( сдесь по смыслу правила block_rule ясно что команда не пройдет )
Сами шаблоны:
Пример:
ct_add_line "main_block_list" "Tokenize" "String" "_restart"
-- 2-й параметр Tokenize говарит что линию надо разбить на токены посредствам Cmd_TokenizeString
-- 3-й параметр String говарит что проверять 0-й параметр линии( сама каманда ) на сравнение тоесть: toLowerString( trim( Cmd_Argv^[0] ) ) == шаблон
если не совпало то дальше искать
до первого совпадания ( всгда до 1-ого )
Другой пример:
ct_add_line "main_block_list" "Tokenize" "RegExp" "^ct_.*"
RegExp - говарит что проверять 0-й параметр линии( сама каманда ) на math с шаблоном тоесть: math( toLowerString( trim( Cmd_Argv^[0] ) ) , шаблон )
шаблон формата регулярных выражений в данном случае проверяется совпадает ли префикс команды с "ct_"
Более сложный пример(если у ct_add_line >= 5 параметров то):
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
Tokenize также говарит что разобрать линию на токены пример
bind F3 "say /shop; connect 127.0.0.1:3; quit;"
распарсивается Cmd_TokenizeString как
Cmd_Argc^ = 3
Cmd_Argv^[0] = bind
Cmd_Argv^[1] = F3
Cmd_Argv^[2] = say /shop; connect 127.0.0.1:3; quit;
Cmd_Args^ = F3 "say /shop; connect 127.0.0.1:3; quit;"
argv говарит что проверять нада именно по оставшемся токенам ( примере по F3 и say /shop; connect 127.0.0.1:3; quit; )
если argv то команда идет на проверку толька в том случае если параметров у линии больше или равно описанных параметров в ct_add_line
тоесть
bind F3 "say /shop; connect 127.0.0.1:3; quit;"
пройдет мимо
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block"
выберется этой командой на проврку ( далее поиск не пойдет.. результат завист от совпадаения параметров с листами all_block )
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block"
команда
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
выберет плохие бинды с Cmd_Argc^ >= 4
после того как линия сошлась по названию команды и числу параметров проверяются сами параметры
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
"t^all_block" - t^ говарит что каждый под параметр от линии надо разбинть снова на линии и каждуюю линию проверять с под листом all_block пример
bind F3 "say /shop; connect 127.0.0.1:3; quit;"
распарсится на
bind
F3 => F3 так и пойдет на лист как Cmd_Argc^ = 1 Cmd_Argv^[0] = F3 C,d_Args^ = ""
say /shop; connect 127.0.0.1:3; quit; => разберется на под линии
say /shop - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...
connect 127.0.0.1:3 - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...
quit - пойдет на проверку на под лист ( алгоритм точна такойжа как проверка и распарсивание 1-й линии с bind F3 ...
и т.д. соответсвенно те под команды тоже разбиваются на токены и проверяются по такомже алгоритму либо идут на 3-й под лист
Более сложный пример по которуму реализована фильтрация биндов: Цитата Alex ()
// Exception bind
ct_add_list "block_rule" "exception_bind"
ct_add_line "all_block" "Tokenize" "RegExp" ".*"
// Зарпещаем выполнять бинд с >= чем 3 параметра( без команды )
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^all_block" "t^all_block" "t^all_block"
// Зарпещаем выполнять бинд с любыми командыами во 1-м парамтре кроме разрешенных в exception_bind_key листе... Запрещаем выполнять бинд с 2-м параметром содержащим команды из anti_detekt_list_cmd / anti_detekt_list_cvar / main_block_list листа кроме разрешенных в exception_bind_cmd( для всяких bind v "say /shop" )
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^!exception_bind_key|all_block" "t^!exception_bind_cmd|anti_detekt_list_cmd|anti_detekt_list_cvar|main_block_list"
// Запрещаем выполнять бинд с >= 0 параметром ( т.к. попорядку то блочатся все остальные бинды ( Cmd_Argc IN [ 1 .. 2 ] )
ct_add_line "exception_bind" "Tokenize" "String" "bind"
ct_add_line "exception_bind_cmd" "Tokenize" "String" "say"
ct_add_line "exception_bind_cmd" "Tokenize" "String" "say_team"
ct_add_line "exception_bind_key" "Tokenize" "String" "F1"
ct_add_line "exception_bind_key" "Tokenize" "String" "F2"
ct_add_line "exception_bind_key" "Tokenize" "String" "F3"
ct_add_line "exception_bind_key" "Tokenize" "String" "F4"
ct_add_line "exception_bind_key" "Tokenize" "String" "F5"
ct_add_line "exception_bind_key" "Tokenize" "String" "z"
ct_add_line "exception_bind_key" "Tokenize" "String" "x"
ct_add_line "exception_bind_key" "Tokenize" "String" "c"
ct_add_line "exception_bind_key" "Tokenize" "String" "v"
ct_add_line "exception_bind_key" "Tokenize" "String" "-"
ct_add_line "exception_bind_key" "Tokenize" "String" "="
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "t^!exception_bind_key|all_block" "t^!exception_bind_cmd|anti_detekt_list_cmd|anti_detekt_list_cvar|main_block_list"
"t^!exception_bind_key|all_block"
сначала каждая под линия параметра проверяются в exception_bind_key и если найдены то если вернет true то поиско по 2-му параметру не пойдет если false то пойдет..
т.к. !exception_bind_key Возвращает то поиск идет на следующюю под линию если и там false то проверяются по такомуже алгоритму следующие под линии след. параметра
в итоге не смогут пройти например такие команды:
bind "f3" "say /shop;say /get_m;"
пройдет и такое
bind "f3 connect 127.0.0.1:3; f4 quit; - writeid;" "say /shop;say /get_m;" - но в контескте 1-о параметра bind будет ошибка
не пройдет например такое:
bind "f3" "echo "
т.к. команда echo есть на клиенте и есть в anti_detekt_list_cmd листе
такое пройдет
bind "f3" "amx_csay writeid;menu quit;"
т.к. команд amx_csay / menu нет на клиенте а writeid и quit будут параметрами под линий;
ct_add_line "exception_bind" "Tokenize" "String" "bind" "argv" "s^!exception_bind_key|all_block"
если "s^!exception_bind_key|all_block" - s^ то передается вся под линия целиком
bind "f3; f4; f5" - передастся не по очеереди под лини f3,f4,f5 и вся линия f3; f4; f5 .. имеет смысл если лист проверяет как строку линию тоесть:
ct_add_line "exception_bind_key" "String" "String" "f3"
пройдет толька f3 и не символом больше.. можна и регулярные
ct_add_line "exception_bind_key" "String" "RegExp" "(f3)|(f4)|(f5)"
также есть возможность фильтровать по Args
ct_add_line "exception_bind" "Tokenize" "String" "bind" "args" "String" "f3 connect 127.0.0.1:3"
или регулярные
ct_add_line "exception_bind" "Tokenize" "String" "bind" "args" "RegExp"\s*f3\s*connect\s*127.0.0.1:3\s*"
выберет бинд: bind f3 connect 127.0.0.1:3
но тут проблема с невозможностью экранировать 2-ю ковычки...