Этот плагин задумывался в помощь администраторам конференций.

В первую очередь, его цель -- помочь вам банить нехороших людей
во всех конференциях, где у вас есть соответствующие права,
дабы не тратить на них своё драгоценное время.

===================
####  КОМАНДЫ  ####
===================

Использование:
---	Показать краткую справку с примерами команд:
/bldhelp

---	Забанить JID в комнатах, где у вас есть админские права:
/bldjid JID
Причина бана (необязательна).

---	Забанить список джидов в текущей комнате:
/massban JID1 JID2 JID3 etc.
Причина бана (необязательна).

---	Разбанить JID в таких комнатах:
/unbldjid JID

---	Если вы в хорошем настроении (например, у вас день рождения)
	и вас тянет на добрые дела, вы можете устроить амнистию --
	разбанить всех забаненных в какой-либо из своих комнат.
	Для этого выполните в ней следующую команду:
/amnesty
и после подтверждения все забаненные в ней люди будут разбанены.
Настоятельно советую не пользоваться этой командой в комнатах,
где вы не хозяин, а только администратор.
	Иногда вам может понадобиться лишь почистить бан-лист, не стирая его полностью.
	Например, за много лет ваш бот набанил множество атакующих,
	указывая какую-либо причину, и сейчас вы хотите удалить эти, скорее всего,
	временные дждиды из бан-листа, чтобы он открывался побыстрее.
	Для этого добавьте к команде паттерн, подходящий к нужной причине:
/amnesty ваш ник слишком длинный
	Люди (или боты), чья причина бана похожа на такую: "Ваш ник СЛИШКОМ ДЛИННЫЙ!!!",
	будут разбанены.

	Пожалуйста, имейте в виду, что обработка слишком больших бан-листов (более 700 джидов)
	может вызвать Ошибку потока (Нарушение политики) и отключение от сервера.
	Причина кроется в слишком большом размере станцы, отсылаемой на сервер.
	Чтобы избежать этого, был добавлен "клапан", срабатывающий, когда в станцу
	набирается 700 джидов. Это означает, что огромные бан-листы следует обрабатывать
	в несколько заходов.

---	Вы можете искать определённое слово в чёрном списке или в списке членов
	текущей комнаты с помощью следующих команд:
/inbanlist pattern
/inmemberlist pattern
	Если были указаны причины банов, они выведутся при поиске в бан-листе.
	На поиск в этих списках влияет состояние опции options(matching_rules).
	Например, вы хотите узнать, забанен ли конкретный Jabber-сервер.
	Включите у этой настройки "Точное совпадение" и введите для поиска
	точное имя сервера, иначе вы можете получить слишком много результатов,
	если забанено очень много пользователей с этого сервера.
	У этих команд есть расширение, позволяющее инвертировать результаты поиска.
	Например, вам надо найти все забаненные сервера (не пользователей).
	Как известно, адрес сервера не содержит символа "@", и задача решается просто:
/inbanlist ! @

Добавлены новые команды, которые могут быть полезны,
когда у вас выключена опция ::muc::options(gen_enter_exit_msgs).

---	Показать всех посетителей данной комнаты
/visitors

---	Показать посетителей в комнатах, названия которых подходят к *room*
/visitors room

---	Показать визиты человека, чей ник или джид подходит к *nick*
/visited nick

---	Показать визиты, сделанные *nick*, в комнаты, которые подходят к *room*
/visited nick
room

---	Команда /visited обогатилась новыми возможностями. Можно искать не только ники,
	но и джиды, роли, ранги и версии. Для этого зарезервированы следующие
	ключевые слова: jid, role, aff, hash, ver. Поисковый запрос не может содержать
	пробелы (если содержит, вся конструкция считается ником). Единственное исключение -
	ключевое слово "ver". Всё, что следует за ним, считается одним параметром.
	Например, команда
/visited ver Windows XP
	вернёт все элементы списка, содержащие в поле версии слова "Windows XP".
	Для задания ника нет нужды использовать ключевые слова. Если вам нужно
	сделать поиск по нику, включающему в себя ключевое слово, обрежьте его.
	Например, ник "jid revealer" ищите командой /visited id revealer
	Строгие правила к подобным поискам не применяются, например, команда
/visited jid pupkin
	найдёт джиды pupkin1@jabber.ru, pupkin2@jabber.org и vassily@pupkin.ru.
	По строгим правилам можно искать только ники.
	К сожалению, нет возможности (по крайней мере, сейчас) искать по отдельности
	имя клиента, версию клиента и версию ОС.
	Имеется ещё одна подкоманда для /visited под названием "log", позволяющая
	искать в файле лога:
/visited log aff owner
someroom
	Она выведет все посещения комнаты someroom её владельцами за всю историю
	ведения лога в файле, а не только за текущую сессию.
/visited log nick braveheart role admin ver Psi
someroom
	Искать можно ещё гибче! Можно указать несколько запросов в одной линии!
	Только помните, что если нужно искать ник, укажите это с помощью ключевого слова nick,
	чтобы поисковый движок знал, что ник -- следующее за ним слово, а не вся поисковая строка.
	К тому же, поисковый запрос "ver" должен быть последним в строке, потому что движок
	берёт весь текст, следующий за ним, как параметр запроса.
/visited hash 8q9vzJIp9rr2u3+Y76hMLHyp00E=
	Иногда может оказаться полезным поиск по хэшу версии. Посетите
	http://xmpp.org/extensions/xep-0115.html#ver для дополнительной информации,
	но знайте, что эти хэши, как самостоятельно, так и в сочетании с версией,
	могут достаточно хорошо идентифицировать посетителя. Также отметьте, что
	этот хэш может измениться, если пользователь переконфигурирует
	или обновит клиент, поэтому не следует слепо доверять этой информации.
	Всегда анализируйте данные в полном объёме!

--- В результате выполнения этих команд в окне текущего чата выведется
	нумерованный список. Из него можно выбрать кандидата на бан для команды,
	описанной выше, таким образом:
/bldjid ?n?
причина

где ?n? -- это целое число от 0 до последнего элемента в списке.

--- В плагине есть возможность перенаправлять вывод команд /visit* and /bldhelp
	в специальное окно-монитор. Подробности в разделе "Настройки" ниже.

--- Показывать/скрывать окно-монитор можно с помощью сочетания клавиш <Control-m>.

--- Чтобы очистить текущее окно-монитор (лог посещений и даже результаты
	последнего поиска не пропадут), воспользуйтесь командой:
/clearmon

--- Вы можете указать один или несколько элементов, чтобы плагин извещал вас
	об их заходах или смене ника. Естественно, вы должны быть модератором,
	чтобы видеть реальные джиды, но другие элементы доступны для наблюдения
	всем. Это ники, версии и хэши версий/caps. Чтобы различать параметры,
	необходимо предварять их ключевыми словами: nick, jid, hash, ver.
	Нельзя смешивать в одной строке несколько ключей. Избегайте использования
	специальных символов вроде * в никах или джидах. Например, лучше написать
	SomeUser вместо *SomeUser*, хотя второй и есть точный ник посетителя.
	Синтаксис команд следующий:
/watch ключ параметр
	Джиды должны быть указаны в виде регулярного выражения. У вас может быть
	несколько хэшей, но версия может ставиться только одна, потому что обычно
	она состоит из нескольких слов. Если вы установите новую версию, старая
	затрётся. То же самое относится и к нику, и к регэкспу, задающему джиды.
-	Установленные вами уведомления независимы друг от друга (пока что), то есть,
	если в комнату войдёт посетитель, удовлетворяющий только одному
	из нескольких уведомлений, только это уведомление и сработает.
	Таким образом, сейчас они проверяются в режиме "ИЛИ", хотя не помешало бы
	иметь возможность проверять и в режиме "И", чтобы получать предупреждения
	о входе кого-либо, удовлетворяющего сразу нескольким условиям,
	чтобы сузить область срабатывания.
-	Вы можете указать действие, которое нужно выполнить при заходе пользователя,
	удовлетворяющего одному из указанных условий:
/watch ключ параметр
?действие? тип_исключения исключение reason Причина (необязательна).
	Сейчас всё объясню.
.	?действие? может принимать следующие значения: say, devoice, kick или ban.
	Если действие не установлено, будет выведено окно уведомления, где вы
	сможете выбрать какое-нибудь действие вручную. Команда 'say' отправляет
	наблюдаемому человеку заданное вами приватное сообщение.
.	типов исключения два: !jid или !aff. Помните, что они начинаются с символа "!".
.	Поскольку джиды для исключения тоже задаются регэкспами, вы можете задать
	всё "одним словом". Совсем не обязательно давать несколько разных ролей или
	рангов, хотя вы и можете это сделать. Роли или ранги могут быть любыми
	из стандартных, например: member, admin, owner.
.	"reason" -- это ключевое слово, отделяющее причину от исключений. Всё, что
	идёт после него, будет использовано как причина для кика/бана. Позднее
	это поведение будет переработано, чтобы убрать ненужное ключевое слово.
-	Если у вас нет исключений, можно дать причину сразу после действия:
/watch ver Talkonaut
kick Пользователям Talkonaut тут не место!
-	Имейте в виду, что команда /watch находится в процессе разработки, так что она
	будет срабатывать (и девойсить, кикать или банить) любого посетителя, который
	удовлетворяет ЛЮБОМУ из данных вами условий (помните, что их, кроме ver,
	можно добавлять). Будьте очень осторожны, оставляя Ткаббер без присмотра
	со включённой командой /watch! Наилучшим решением будет создание
	правила только одного типа с исключениями, например:
/watch hash elm8Y1EdFMgEdpCnBo00Gc3h+hj= OlM2m2jxGd7ClfEpFUk3rJLypzB=
ban !aff member reason Вас сюда не звали.
	Так вы по крайней мере случайно не забаните кого-нибудь из членов конференции.
-	Вы можете удалить какой-нибудь элемент из списка с помощью этой команды:
/unwatch ключ параметр
	Следующая команда стирает все элементы указанного ключа:
/unwatch ключ all
	Следующая команда очищает список полностью:
/unwatch all
	Чтобы показать список наблюдения, наберите:
/listwatch
	ПОМНИТЕ, что настройка ::plugins::bldjid::options(rooms2log)
	влияет на извещения: плагин будет извещать вас о заходах наблюдаемых джидов
	только в комнаты, указанные в этой настройке! (См. её описание ниже.)

--- Для всех этих команд работает автодополнение:
	напишите первые несколько букв команды и понажимайте клавишу табуляции.
-	Точно так же автодополнение работает для джидов, если вы дописываете их вручную
	в качестве аргумента для команд /bldjid, /unban, /unbldjid
	после генерации списка посетителей с помощью любой из команд /visit*.
-	Если после команды вы не вводите начало джида, то автодополнение начнёт
	перебирать сначала ники и только потом джиды (если поиск дал результаты).
	Так что если вы решили пользоваться автодополнением, введите по крайней мере
	первые две-три буквы джида, чтобы не пришлось перебирать все ники
	(правда, ники, начинающиеся с этих букв, тоже будут показаны).
	В будущем я постараюсь исправить это поведение.
-   Помните, что автодополнение джидов не будет работать, если вы ещё не создали
	ни одного списка посетителей, то есть, не выполнили команду /visit* ни разу.

--- Давайте поговорим о защите комнат. Вы, вероятно, знаете, что комнаты можно
	защитить капчей, через которую не проходят спам- и флудоботы. В качестве
	более суровой, но и более эффективной меры можно назвать включение режима
	"только для членов" до тех пор, пока атакующие не устанут. Но капча утомляет,
	особенно пользователей мобильных клиентов, а "элитная" модель не подходит
	для большинства публичных комнат, поэтому обычно владельцы выключают
	эти настройки в конфигурации комнаты. Но чаще всего атаки начинаются
	неожиданно и могут "завесить" комнату за считаные секунды. Поэтому чем раньше
	вы заметите атаку и чем быстрее отреагируете, тем меньше неудобств будет
	доставлено посетителям.
	Следующие команды предоставляют быстрый доступ к этим двум настройкам:
/captcha ?n?
/monly ?n?
	?n? может принимать одно из следующих значений: '1', 'on' или 'ON' для
	установки капчи или режима "только для членов" в текущей комнате,
	и '0', 'off' или 'OFF' для снятия. Команда без параметра показывает
	в окне чата текущее состояние соответствующей настройки.

=====================
####  НАСТРОЙКИ  ####
=====================

Для плагина имеются настройки, которые можно найти тут:
Tkabber -> Customize -> Plugins -> Bldjid

--- ::plugins::bldjid::options(enable_jids_gathering)
	Включает сбор джидов посетителей. Если его не включать,
	команды типа /bldjid всё равно будут работать.

--- ::plugins::bldjid::options(rooms2log)
	Значение по умолчанию -- пустая строка, это значит, что логи будут вестись
	во всех доступных комнатах MUC. Если вы хотите вести сбор джидов посетителей
	только определённых комнат, вы можете указать здесь полные джиды этих комнат,
	разделяя их пробелами.

--- ::plugins::bldjid::options(log_file)
	Путь к файлу логов Bldjid. Если установить в качестве значения
	пустую строку, логи не будут сохраняться в файл.
	Эта опция полезна, если вы хотите вспомнить, кто заходил
	в определённую комнату в определённый день, даже если вы после этого
	перезапускали Ткаббер. Элементы каждой записи разделяются табуляцией,
	что позволяет использовать инструменты вроде grep, awk или sed
	для обработки лога. Кроме этого в лог записывается другая полезная
	информация вроде результатов выполнения команд /bldjid, /unbldjid,
	и /amnesty. Если вы не хотите сохранять логи в файл,
	сохраните вместо пути пустую строку.

--- ::plugins::bldjid::options(filter_admin_rooms)
	Если вы не хотите, чтобы в результаты поиска командами /visit*
	попадали комнаты, где у вас нет админских прав, включите эту опцию
	(по умолчанию включено). Плагин всё равно будет собирать джиды или ники,
	он просто не будет их показывать. Эта особенность может оказаться полезной,
	если вы хотите узнать джиды посетителей неанонимных комнат --
	временно выключите эту опцию и сделайте поиск в нужной комнате.

--- ::plugins::bldjid::options(strip_resource)
	Эта опция по умолчанию ВЫКЛЮЧЕНА, поскольку так она выдаёт
	более информативные результаты -- в логи пишутся полные джиды, с ресурсом.
	Если вы предпочитаете не сохранять ресурсы, включите эту опцию.

--- ::plugins::bldjid::options(log_role_aff)
	Эта настройка по умолчанию ВЫКЛЮЧЕНА.
	Она предназначена для лучшего отслеживания ролей и членства посетителей.
	Будучи включённой, эта опция выводит данную информацию в окно чата или монитора,
	а также сохраняет её в файл лога.

--- ::plugins::bldjid::options(log_ver_os)
	Эта настройка по умолчанию тоже ВЫКЛЮЧЕНА.
	Иногда может понадобиться знать, с каких клиентов и ОС заходят посетители.
	Если вы хотите использовать эту настройку, проверьте, что у вас выключена
	ткабберовская опция ::plugins::clientinfo::options(autoask), иначе вы
	будете опрашивать версию дважды.

--- ::plugins::bldjid::options(log_ver_hash)
	Эта настройка тоже выключена по умолчанию. Если вы включите её, bldjid
	будет собирать хэши, описанные в XEP-0115 (читайте его сами, если вам нужны
	подробности). Эта информация может помочь идентифицировать посетителей,
	но не следует переоценивать её значение. Эти данные могут измениться,
	если пользователь включит или выключит какие-нибудь фичи клиента
	обновит версию или просто воспользуется другой программой
	(а то и подделает хэш). Кроме того, различным версиям могут соответствовать
	одинаковые хэши. В общем, прежде чем банить кого-то, опираясь на эти данные,
	думайте хорошо :)

--- ::plugins::bldjid::options(ver_timeout)
	Некоторые параноидально настроенные/допиленные клиенты не извещают нас
	об отключении ответа на запрос о версии, и мы просто не получаем ответа.
	Сначала реализация запросов о версии в этом плагине предполагала
	добавление информации о пользователе в массив (текущая сессия) и лог
	в конце процедуры, обрабатывающей ответ на запрос о версии.
	Естественно, если ответ не получен, такой пользователь становился "невидимкой".
	Сейчас информация о пользователе (без версии) добавляется в массив,
	и затем делается запрос, при этом задаётся выполнение проверяющей процедуры
	после тайм-аута. Получив ответ на запрос, мы просто ищем нужную запись
	в массиве и заменяем содержимое версии (предварительно установленное в слово
	"Timeout") на версию, пишем данные в файл и отменяем выполнение процедуры.
	Если мы не получаем ответ, после тайм-аута срабатывает процедура и проверяет,
	добавилась ли версия. Если на её месте по-прежнему написано "Timeout",
	мы оставляем массив как есть и добавляем эту запись в файл, оставив в качестве
	версии слово "Timeout", чтобы быть в курсе. Если вы наблюдаете слишком много
	пользователей с версией "Timeout", вам следует увеличить тайм-аут,
	который по умолчанию равен 120 секундам.

--- ::plugins::bldjid::options(verbosity_level)
-	Минимальный уровень "надоедливости" означает, что в лог будет попадать
	лишь первое вхождение для каждого джида. Если точнее, то для каждой пары
	ник/джид, потому что пользователь может зайти с того же джида, сменив ник,
	или даже поменять ник, уже находясь в комнате.
	К каждой записи о входе будет добавлен тайм-штамп (время захода),
	чтобы было проще отслеживать историю заходов.
-	Максимальный уровень означает, что будет отмечен каждый заход каждого посетителя.

--- ::plugins::bldjid::options(matching_rules)
	Правила совпадений при поиске.
-	"Точное совпадение" обязывает вас вводить при поиске полный джид комнаты
	(если хотите получить релевантные результаты).
-	Поэтому по умолчанию поставлено "Нестрогое совпадение", что позволяет вам
	вводить лишь название комнаты, а то и его часть.
	То же самое относится и к никам.

--- ::plugins::bldjid::options(custom_separator)
	Разделитель полей для вывода команд /visit*. Значение по умолчанию -- "||".

--- ::plugins::bldjid::options(redirect_output)
	Перенаправление вывода. По умолчанию выключено.
	Эта опция позволяет показывать вывод команд /visit* и /bldhelp
	в специальном окне-мониторе, расположенном под окошком редактирования
	текста сообщений текущего чата.
	Его можно показывать/скрывать с помощью сочетания клавиш <Ctrl-m>.
-	Закрывая этот монитор, вы не потеряете результаты поиска.
	Вы можете банить и разбанивать посетителей с помощью автодополнения,
	если помните их джиды, или же с помощью номеров в списке.
	История результатов поиска никуда не девается, пока вы не очистите её
	командой /clearmon. Помните, что для "бана по номеру" используется
	_последний_ результат поиска, так что пользуйтесь им осторожнее,
	чтобы не забанить невиновного :) Перед тем как банить, лучше вызовите
	лишний раз команду /visit*, чтобы получить свежий список.
-	Вы можете прокручивать окно монитора вверх и вниз с помощью сочетаний клавиш
	Alt-Shift-PgUp и Alt-Shift-PgDown соответственно.
-	Монитор нельзя показывать/скрывать, если редирект выключен.

--- ::plugins::bldjid::options(send_chat_messages)
	Отправка в чат "умных" сообщений. По умолчанию выключена.
	Если её включить, кроме просто сбора джидов, в чат будут слаться сообщения
	о входе посетителей. В отличие от стандартных, отсылаемых по опции
	::muc::options(gen_enter_exit_msgs), эти шлются по одному на пару "ник/джид".
	Естественно, что они будут слаться лишь при установленном
	"Минимальном" уровне надоедливости.

--- ::plugins::bldjid::options(log_length)
	Устанавливает максимальный размер длины лога для каждой комнаты.
	0 означает отсутствие ограничений.
	Если вы хотите поставить верхний предел для лога, введите какое-нибудь значение
	(1000 будет достаточно, чтобы вести лог в течение нескольких дней
	в весьма оживлённой комнате и при установленном Минимальном уровне
	надоедливости). Если вы хотите включить Максимальный уровень, возможно,
	вам потребуется увеличить размер лога.
-	Если через некоторое время использования вы решили уменьшить размер лога,
	то, если новый размер окажется меньше существующего, старые записи потеряются
	(после того, как в комнату войдёт новый посетитель, либо кто-нибудь сменит ник --
	эти события служат триггером для смены размера).
-	Учтите, что нецелые и отрицательные значения этой настройки трактуются как 0.

--- ::plugins::bldjid::options(amoder)
	Вы можете указать здесь регулярное выражение, описывающее джид(ы), которые вы
	хотите назначать модераторами каждый раз, когда они заходят в определённую
	или любую комнату, где у вас есть права администратора или владельца.
	Если список пуст, ничего не произойдёт.

--- ::plugins::bldjid::options(amoder_groups)
	Здесь можно указать список комнат (разделённых пробелами), если вы хотите
	автоматически назначать модераторами указанных людей только в нужной комнате(ах).
	Имейте в виду, что этот список применяется ко всем джидам из списка автомодераторов.
	Например, если ваше выражение -- "j(ohn|ames)@jabber.org", а комнаты --
	"room1@server.org room2@server.ru", то вы не сможете назначить john модером только в room1,
	а james -- только в room2; оба они станут модераторами в обеих комнатах.
	Пустой список означает все комнаты.

--- ::plugins::bldjid::options(watch_groups)
	Эта настройка похожа на предыдущую, но она предназначена для комнат,
	в которых вы хотите наблюдать за входом определённых людей (и применять
	к ним некоторые меры). Иными словами, команда /watch будет игнорировать
	все остальные комнаты.

==================
####  РАЗНОЕ  ####
==================

Название плагина происходит от русского слова "блджад", записанного латиницей
как "bldjad", в сочетании с "JID." См. http://lurkmore.ru/Блджад
Также его можно толковать как акроним: "Ban Lousy Dorks (by) JID".
Значительная часть кода плагина укра^W взята из плагина "Urlcmd" и модуля muc.tcl.
