Eggdrop/TCL Manual (FAQ) Version 1.36 (08-Nov-2001) (c) 2001 Efim Shuvikov http://www.amiga.org.ru/eggtcl.faq -----=# Содержание #=-------------------------------------------------------- 1. Общая информация a) Введение b) Что такое Eggdrop c) Что нужно для работы d) История бота e) Где взять Eggdrop f) Компиляция g) Конфигурирование бота h) Настройка CronTab i) Запуск j) Флаги k) Адреса и ссылки 2. Языковые проблемы и возможности 3. Безопасность 4. Администрирование 5. Botnet a) Введение b) Соединение ботов в сеть c) Разделение файла пользователей между ботами d) Работа с partyline 6. Программирование скриптов для бота a) Общая информация по программированию b) Основы программирования c) Работа с пользователями и userfile d) Работа со списками и строками e) Работа с файлами f) Работа с базами данных SQL g) Работа с таймером, временем и датами h) Работа с сообщениями i) Работа с логами 7. Список изменений 8. Благодарности -----=# Введение #=---------------------------------------------------------- Данный документ не претендует на полное описание бота Eggdrop, но по возможности максимально освещает главные моменты и основные вопросы обычно возникающие во время работы с ботом, его компиляцией, настройкой, запуском и управлением. Здесь же вы найдете полезную информацию по программированию скриптов на языке TCL (Tool Command Language) для расширения возможностей вашего бота. -----=# Что такое Eggdrop #=------------------------------------------------- Eggdrop это IRC-бот написанный на C, но также имеющий начинку основанную на языке TCL (Tool Command Language) для написания скриптов расширения. Следует, однако, помнить и о том, что бот имеет API для создания внешних модулей на C, которые будут работать намного быстрее, чем TCL-скрипты, но менее удобны в написании и использовании, так как при внесении изменений в них, вам потребуется перекомпилировать сам модуль, или даже весь Eggdrop, если вы его компилируете, как Static. -----=# Что нужно для работы #=---------------------------------------------- Для работы бота Eggdrop необходим shell. Shell'ом называют наличие доступа к серверу (обычно Unix-серверу) на котором у вас есть право работать как пользователь (закачивать, удалять, создавать, копировать файлы и, конечно же запускать). Обычно, shell-account можно получить следующими путями: 1) Купить (большинство крупных провайдеров продают shell-account'ы) 2) Взять бесплатно (выиграть, взломать, украсть) 3) Взять у знакомых владельцев серверов (обычно, все так и делают) 4) "Поднять" свой сервер (или запустить бота на локальной машине, которая 24h в сети) Совсем необязательно иметь Unix-машину для запуска бота, можно это делать и под AmigaOS, и под Windows. -----=# История Eggdrop #=--------------------------------------------------- Первый релиз бота Eggdrop для широкого применения появился в декабре 1993 года. Тогда это была версия 0.6 и ее автор был, теперь уже небезызвестный, Роби Поинтер (Robey Pointer). Есть данные, что бот Eggdrop "родился" из бота, который носил имя Unrest. А работа над Eggdrop до версии 0.6 велась несколько лет. С тех пор, Eggdrop является самым продвинутым и многофункциональным ботом для IRC. Для него написано более десятка тысяч скриптов расширяющих его возможности. До версии 1.2 бота разрабатывал сам Роби, а с версии 1.3 его заменила команда Белдина (Beldin's development team). Эти же ребята пытались сделать заведомо неудачный проект Eggdrop2. Народу не понравились те нововведения и глюки, которых было в избытке, поэтому Eggdrop2 так и "умер" не родившись. Активность Белдина завершилась на версии 1.3.23 Дальнейшую разработку Eggdrop решила взять на себя команда Eggheads. В большинстве своем состоявшая из активных пользователей бота. Исходный код был выложен на CVS (Concurrent Version System), где и велась работа над ним. На данный момент времени они до сих пор и ведут этот проект. Сейчас существует две ветви развития Eggdrop: 1.6 - отлаженые версии бота для повседневного использования (STABLE) 1.7 - экспериментальные версии (DEVELOPMENT). Бот переписан "с нуля", добавлена модульная система поддержки различных языков программирования (теперь скрипты можно писать не только на TCL), и прочие значительные изменения. Заметка: название Eggdrop было взято из кулинарной книги, где давался рецепт приготовления "Eggdrop soup". -----=# Где взять Eggdrop #=------------------------------------------------- ftp://ftp.eggheads.org/pub/eggdrop/GNU/ Исходные коды всех версий бота включая последнюю beta-версию http://johoho.eggheads.org/eggdrop/ Скомпиленные версии бота под разные платформы Также можно скачать самую свежую версию бота используя систему CVS. Обычно это делается для того, чтобы можно было отлавливать баги в еще невыпущенных версиях бота и сообщать их разработчикам. Ну, а также иметь в своем распоряжении самую последнюю версию бота. Если же вы все-таки просто используете Eggdrop, я бы вам не рекомендовал работать на версиях с CVS, так как это все-таки девелоперские (возможно, нестабильные) версии. Но если вы хотите скачать последнюю версию с CVS, вам необходимо иметь установленный пакет для работы с CVS-системой. Обычно все операционные системы класса Unix оснащены им. Наличие можно проверить набрав в shell команду: cvs Если система сказала, что-то типа "command not found", это значит, что у вас не установен пакет поддержки CVS. Установите его. Если же вы увидели вывод встроенного help команды cvs, то все в порядке. В unix-shell наберите: 1) 'export CVSROOT=:pserver:anonymous@cvs.eggheads.org:/usr/local/cvsroot' 2) Затем наберите 'cvs login' 3) На запрос пароля нажмите 4) Наберите 'cvs checkout eggdrop1.6' (или нужную версию) 5) Далее произойдет обновление исходников в вашу локальную директорию 6) После завершения наберите 'cvs logout' В дальнейшем можно будет просто заходить в локальную директорию с исходниками и набирать 'cvs update' для автоматического обновления уже без использования приведенных выше шагов. -----=# Компиляция #=-------------------------------------------------------- Для сборки Eggdrop вам обязательно необходим и TCL (язык программирования, который используется в ядре бота). Проверить наличие TCL можно набрав в shell команду: tclsh Если вы получите приглашение в виде символа "%", значит TCL есть. Если нет, то установите. Рекомендуемые к установке версии TCL: 8.0.x или 8.3.x Скачать TCL в исходниках можно с ftp-сайта: ftp://ftp.scriptics.com/pub/tcl/ Порядок сборки TCL: 1) Распакуйте архив с TCL (tar -zxf tcl8.x.x.tar.gz) 2) Зайдите в директорию с нужной платформой (cd tcl8.x.x/unix) 3) Наберите './configure' 4) Наберите 'make' 5) Наберите 'make install' И в /usr/local/lib появится libtcl8.x.x.so, в /usr/local/include директория tcl8.x.x, а в /usr/local/bin tcl-shell tclsh. Однако может наилучший вариант это установить TCL из пакета (rpm, tgz, deb). А вот Eggdrop лучше собирать самому, так как все зависит от того, как вы хотите потом использовать бота. Собрать Eggdrop можно в двух видах: Static - будет занимать меньше, чем eggdrop + dynamic-модули, и будет в одном файле. Таким образом менять версию бота для тестов или проверок намного проще, так как менять надо всего лишь один файл. А также, если ваш бот запускается в одном экземпляре и больше нет никаких других ботов запускающихся из этой же директории, то этот вид сборки тоже будет лучшим вариантом. Dynamic - будет в виде нескольких файлов (сам eggdrop и модули) и займет чуть больше, из-за заголовков и служебной информации в скомпилированных файлах. Но динамик выигрывает за счет экономии памяти при запуске нескольких ботов. Если запустить несколько ботов, то память будет общей. А также dynamic-модули можно загружать/выгружать на лету. Последовательность для сборки бота такова: 1) Скачать бота с сайта или ftp (архив будет с именем eggdrop-1.x.x-tar.gz) 2) Если не установлен TCL - скачать и поставить (установить можно как из исходников, так и из пакетов tgz, rpm, deb и т.п.) 3) Развернуть архив с ботом в нужную директорию. (tar -zxf <имя архива>) 4) Далее обычно хватает команды: ./configure Но если собирать нужно с конкретной версией TCL, то указывайте: ./configure --with-tcllib=/libtcl8x.so --with-tclinc=/tcl.h Где "x" нужный номер версии библиотеки. 5) Для автоматического подключения модулей: make config Для ручного подключения модулей: make iconfig 6) Для сборки бота как dynamic (обычно): make Для сборки бота как static: make static 7) make install DEST= (для установки) -----=# Конфигурирование бота #=--------------------------------------------- Сразу после этого, бота необходимо сконфигурировать для того, чтобы его можно было запустить. Для этого скопируйте или переименуйте eggdrop.conf.complete в eggdrop.conf и откройте его редактором. И начинайте настраивать: 1) Установить путь до Eggdrop: #! /eggdrop 2) Установить username бота: set username 3) Установить адрес владельца бота: set admin 4) Настроить или отключить логи: logfile 5) Установить имя файла пользователей: set userfile 6) Установить порт/порты для сетевых соединений: listen 7) Убрать или закомментировать строку: die "Please edit your config file." 8) Установить имя файла каналов: set chanfile 9) Отключить (или заменить на свои) все настройки для канала #lamest 10) Отключить (или заменить на свои) настройку для канала #botcentral 11) Установить ник бота: set nick 12) Установить альтник бота: set altnick 13) Установить строку для whois на боте: set realname 14) Установить адрес(а) IRC-сервера(ов): set servers 15) Настроить пути для файловой системы (только если активен модуль filesys): set files-path и set incoming-path 16) Установить путь файла для записок (только если активен модуль notes) set notefile 17) Убрать или закомментировать строку: die "You didn't edit your config file like you were told, did you?" 18) Раскомментировать строку: #checkmodule blowfish 19) Отключить/подключить скрипты: source scripts/* Естественно вы можете настраивать и все остальное, но этот тот минимум, чтобы запустить бота и начать работу над ним. Заметка: если вы уже имеете хорошо настроенного бота и хотите поставить свежую версию. То наверняка зададитесь вопросом: "А что нового было добавлено в конфиг?". Узнать это нам поможет команда "diff", которая есть во всех unix-системах. Для этого вам потребуются два eggdrop.conf.complete, из старого дистрибутива и нового. Положите их вместе как: eggdrop.conf.old и eggdrop.conf.new После этого запустите команду: diff eggdrop.config.old eggdrop.config.new > eggdrop.config.changes И в файле eggdrop.config.changes вы получите все изменения. Заметка: если вам часто приходится добавлять/удалять скрипты в конфиг, и приходится очень долго "ползать" в конец огромного конфига, то есть способ упростить вам жизнь. Создайте файл eggdrop.scripts (там же где и eggdrop.conf) и поместите в него все вызовы (source scripts/<имя скрипта>). А в самом конфиге их удалите и поместите в конце всего одну строку: source eggdrop.scripts Теперь все изменения по скриптам делайте только в eggdrop.scripts -----=# Настройка CronTab #=------------------------------------------------- Для того, чтобы не произошло ситуации, когда ваш бот по какой-то причине завершил работу, был закрыт или просто "упал процесс" - существует система его автоматического запуска. Работает она на базе Cron (стандартное средство Unix-систем). Для настройки себе этой системы, можно пойти двумя путями: 1) Настроить файл botchk В комплекте с ботом идет файл "botchk". Скопируйте его туда, где лежит сам бот и его конфиги. Зайдите в него редактором и настройте поля: botdir="/home/eggdrop" Путь до директории с ботом. botscript="eggdrop mybot" Файл бота. Если вы пускаете бота сразу из eggdrop, то напишите просто "eggdrop". Если из отдельного файла конфига, то "eggdrop <имя файла>" botname="MyBot" Ник бота. ОБЯЗАТЕЛЬНО с соблюдением больших и маленьких букв. userfile="mybot.user" Имя файла с пользователями. Смотри настройку бота. Затем (под root'ом) зайдите редактором в /etc/crontab и добавьте строку: Для проверки каждую минуту: * * * * * /<путь>/botchk Для проверки каждые 5 минут: */5 * * * * /<путь>/botchk Для проверки каждые 10 минут: 0,10,20,30,40,50 * * * * /<путь>/botchk Для проверки каждые 15 минут: 0,15,30,45 * * * * /<путь>/botchk Для проверки каждые 30 минут: 0,30 * * * * /<путь>/botchk Если вы не хотите, чтобы бот писал о своих падениях вам на email, то добавьте в конец строки еще этот кусок: ">/dev/null 2>&1" (без "") Пример: */5 * * * * /home/eggdrop/botchk >/dev/null 2>&1 2) Построить свой botchk используя autobotchk Также в комплекте с ботом идет скрипт для автоматической генерации файла botchk. Для его использования также скопируйте его туда же, где лежит бот. И запустите с указанием имени конфига: ./autobotchk <имя конфига> Также можно сразу указать интервал времени для проверки и слать ли почту при падении: ./autobotchk <имя конфига> -noemail -5 Скрипт сам установит правильные ник бота и пути до него, а также сам "пропишется" в CronTab (если для этого у него хватит прав). -----=# Запуск #=------------------------------------------------------------ Первый запуск бота обязательно делайте "вручную" и с указанием аргумента для создания файла пользователей "eggdrop -m". Иначе без этого файла бот вообще не будет работать. Порядок действий таков: 1) Запустить бота 'eggdrop -m' 2) Дождавшись его появления на IRC дать команду: '/msg <ник бота> hello' Если бот долго не приходит на IRC, ищите причину. Просмотрите логи. Запустите его еще с ключами "-nt". 3) После того как бот вас объявил владельцем, установите себе пароль: '/msg <ник бота> pass <пароль>' 4) Зайдите на partyline используя DCC Chat-соединение с ботом и установленный только что пароль. 5) В partyline дайте команду: .die После чего бот отключится. После этого запуск с ключом "-m" используйте ТОЛЬКО для создания нового (пустого) файла пользователей. Заметка: Помните! Если вы случайно или специально запустите бота применив ключ "-m", то он уничтожит старый файл пользователей. Сообщения об ошибках при запуске: "Hostname self-lookup failed" Бот не может определить свой hostname. Задайте его вручную, прописав в конфиге: set my-hostname и set my-ip "Please select an encryption module" Вы забыли активизировать модуль blowfish. Найдите в конфиге строку со словами "checkmodule blowfish" и уберите перед ней символ "#" (то есть, раскомментируйте строку) Если такой строки не нашли - создайте ее. "Couldn't grab nearby port" Это означает, что бот не может открыть сокет на данном порту. Это может случиться, если: a) порт указанный в конфиге занят и конфликтует с другими программами b) неверные установки set my-hostname и set my-ip в конфиге c) если в каталоге лежит файл pid. Проблема "a" решается сменой порта на другой. Проблема "b" решается исправлениями переменных в конфиге. Проблема "c" решается удалением файла. Если ничего не помогло, то просто закомментируйте строку с "listen", но это отключит возможность соединять бот с другими ботами (Botnet) и работать с ним через telnet. "No userfile found" или "No channel file found" Отсутствует или недоступен файл пользователей. Отсутствие исправляется запуском с ключем "-m". Подробнее читай выше. Недоступность может быть вызвана неверными правами доступа к файлу. Установите их в 0644 (rw-r--r--). Если проблема не исчезла, пропишите в строке конфига: set userfile-perm 0644 -----=# Флаги #=------------------------------------------------------------- Флаги дают или отнимают право получать доступ к ресурсам бота или канала, а также указывают прочие технические параметры. Пользовательские флаги делятся на две группы: глобальные и локальные. Глобальные действуют в пределах бота и везде, где он "сидит", а локальные только на том канале для которого они установлены. Флаги пользователей (глобальные): n (owner) Владелец бота. Доступны все команды. m (master) Мастер бота. Доступны практически все необходимые команды для управления ботом. t (botnet) Оператор Botnet'a. Дает право управлять связями бота. x (xfer) Доступ к приему/передачи файлов от/на бота. j (janitor) Оператор файловой системы бота. Позволяет копировать, удалять файлы, создавать папки и ссылки. c (common) Отключает использование поля HOSTS пользователя. Обычно нужно для пользователей, которые приходят с Web-интерфейса IRC, и имеют один и тот же хост. p (party) Дает право иметь доступ на partyline бота. b (bot) Бот. Дальнейшие флаги устанавливаются командой .botattr u (unshare) Не посылать информацию этого пользователя при работе userfile в режиме share. h (hilite) Использовать коды bold, inverse, и т.д. при отображении help-файлов этому пользователю. Флаги пользователей (локальные): o (op) Имеет право получить статус опа на канале. d (deop) Не имеет право получить статус опа на канале. k (kick) Кикать пользователя, как только он войдет в канал. f (friend) Если включен режим revenge, бот не будет трогать пользователей с этим флагом. m (master) Мастер канала. Дает право делать add/delete/modify пользователей канала. n (owner) Владелец канала. Дает доступ к многим командам. a (auto-op) Автоматически давать статус опа при входе в канал. Даже, если канал не имеет статус +autoop. v (auto-voice) Автоматически давать статус войса при входе в канал, только если канал имеет +autovoice. g (auto-voice) Автоматически давать статус войса при входе в канал. Даже, если канал не имеет +autovoice. q (quiet) Не позволять брать статус войса на канале, где установлен +autovoice. Флаги ботов: h (hub) Бот-uplink. К боту имеющему такой флаг раз в минуту, пока не произойдет соединение, будет производится попытка подключиться. a (alternate) Если подключение к hub-боту невозможно. Бот поключится к альтернативному-hub'у. l (leaf) Помечает бота, как конечную точку. Он может подключаться к ботам, к нему никто. s (share) Данный флаг указывает, что бот будет принимать общий userfile. p (passive) Данный флаг указывает, что бот будет рассылать общий userfile. g (globalshare) С этим флагом, боты будут обмениваться ВСЕЙ информацией. Все баны, пользователи на одиночных каналах и другое. Уже не нужно будет прописывать флаги +s и |s для каналов. i (isolate) Изолирует локальный partyline бота от общего Botnet'ного. r (reject) Запретить боту подключаться к Botnet. Эквивалент Q-Line. Флаги каналов: t (topic protection) Разрешить установку топика только операторам. n (no messaging) Не позволять писать в канал сообщения не находясь в нем. s (secret) Не отображать канал в глобальном списке каналов. i (invite only) Разрешить вход в канал только по приглашению. p (private) Не отображать топик канала в глобальном списке каналов. m (moderated) Разрешить отправку сообщений в канал только операторам и войсам. l (limit) Лимит количества пользователей в канале. k (keyword) Закрытый ключем канал. Войти в который можно только зная ключ. Дополнительные (сервисные) флаги: r (registered) Есть только в IRC-сетях с NickServ и ChanServ. Указывает на то, что ник/канал зарегистрирован в сервисах. v (vhost) Есть только в IRC-сетях (не во всех) с сервисами. Указывает на то, что хост пользователя защищается сокрытием его части. Пример: 215.41.56.x-12 Последний октет IP-адреса скрыт. -----=# Адреса и ссылки #=--------------------------------------------------- При возникновении проблем с ботом или вопросов, их можно задать на одном из IRC-каналов: Канал от eggheads.org irc.undernet.org #eggdrop Канал от eggfaq.com irc.efnet.org #eggfaq Канал от egghelp.org irc.efnet.org #egghelp Канал от этого документа irc.amiga.org.ru #eggdrop Канал от eggdrop.cx irc.gate.ru #eggdrop или в форуме по боту Eggdrop: http://www.egghelpforum.com/ Если же вы считаете, что нашли ошибку в боте, то немедленно сообщайте ее команде разработчиков по адресу: bugs@eggheads.org А если же вы просто хотите побродить по сайтам посвященным боту и скриптам для него, то начните с самых главных, а далее по ссылкам. http://www.eggheads.org/ Официальный сайт разработчиков http://www.egghelp.org/ Популярный сайт пользователей бота http://www.eggfaq.com/ Сайт поддержки канала #EggFAQ http://johoho.eggheads.org/eggdrop/ Полезные ссылки и бинарные версии бота http://mars.age.psu.edu/search.html Поиск TCL-скриптов ftp://ftp.eggheads.org/pub/eggdrop/scripts/ Крупнейшая коллекция скриптов http://www.baschny.de/eggdrop/ Сайт Ernst'a http://www.goblet.net/scripts/ Сайт Goblet'a http://lolstoolz.pwh.ch/indexen.html Сайт автора скрипта Lol's TooLz http://www.eggsource.com/ Скрипты для Eggdrop, BitchX, TCL Так же есть сайты, где можно найти описание команд для public-ботов, которых можно нередко встретить в IRC: http://seaguard.boom.ru/ Боты серии SG http://www.sy-tech.net/ Боты серии Credo http://center.nstu.ru/b-on/ Бот B-on http://bot.net.ru/ Боты серии TAHK -----=# Языковые проблемы и возможности #=----------------------------------- Данный вопрос заслуживает отдельного внимания, так после выхода TCL версии 8.1 у бота Eggdrop начались проблемы с языками отличными от английкого (iso8859-1). Случилось это потому что в TCL была введена поддержка, а вернее он был полностью переведен на языковой стандарт UTF8. По какой причине до сих пор не могут перевести туда и бота не ясно. Все это безобразие выглядит так: любая фраза бота на русском в канал/приват превращается в набор странных символов состоящих частично из псевдографики. Если вы 100% не хотите встретиться с этой проблемой, просто не устанавливайте TCL версии 8.1 и выше. Но в этом есть и свой минус, особенно если вы пишите свои собственные скрипты. TCL 8.0 уже устарел и в нем отсутствует большое количество процедур, команд и аргументов функций, которые нужны для написания современных и быстрых скриптов. А также на TCL 8.0 не будут работать скрипты написанные используя новые команды и аргументы, которые появились c версией TCL 8.1 и выше. Так что этот вариант тоже нельзя назвать панецеей. Второй вариант и на данный момент вполне рабочий это установка бота с патчем для совместимости с UTF8 в TCL. Этот патч появился с версии Eggdrop 1.6.4, но сам 1.6.4 лучше не ставить, так как он содержит ошибки, ровно как и 1.6.5. Советую всегда устанавливать последний Eggdrop и читать список изменений. И единственное, что вам надо будет сделать, это в конфиге где-нибудь в самом начале дописать строку: encoding system iso8859-1 Именно iso8859-1, иначе русский будем не русским. После этого у вас будет работать и самый последний TCL. А также еще есть одна проблема это маленькая буква "я" в DCC Chat (Partyline) при написании что-либо туда с ней бот теряет ее, а заодно и символ справа от буквы. Команда разработчиков вкурсе этой проблемы, но видимо не знает как ее решить. Некоторые находят выход из ситуации переводя "я" в "Я". -----=# Безопасность #=------------------------------------------------------ #1 [8-Jul-2001] SG-bot ping_reply security hole Описание: В скрипте ping20.tcl бота SG найдена уязвимость позволяющая проникнуть в систему и получить полный контроль над ботом. Exploit: С атакуемого бота строка TCL-кода: putserv "PRIVMSG :\001PING \[restart\]_#chan\001" замените на ник атакуемого бота. \[restart\] можно заменить на любую TCL-команду. Решение: Для закрытия дыры, в скрипте ping20.tcl (это также касается всех ботов на базе скриптов, или использующих ping20.tcl от SG) найдите строку: set reply [expr [unixtime] - $pdelay] и до нее вставьте: if {[isnumber $pdelay]} { Затем после строки: if {$reply<30} { putchan $pchan ....... } вставьте: } -----=# Администрирование #=------------------------------------------------- ### Данный раздел еще не переведен из состояния FAQ в Manual :) Q: Как заставить бота послать мне запрос на DCC Chat? A: /ctcp chat Q: Я забыл свой пароль owner'a на бота, что делать? A: 1) "Убить" бота (kill -9 ) 2) Зайти редактором в userfile бота ("<имя бота>.user") 3) Найти запись о вашем аккаунте 4) Удалить в ней строку начинающуюся с "--PASS" 5) Запустить бота и сделать "/msg pass " Q: Как подделать CTCP-запросы VERSION и USERINFO? A: В строках конфига прописать: set ctcp-version "MyIRC v1.0 pizza" set ctcp-userinfo "Kewl bot in the World!" Q: Почему не отрабатывается CTCP-Flood за CTCP запросах? A: Установите "2" в строке конфига: set ctcp-mode 2 Q: В сети, где висит мой бот, длина ников более девяти символов. Как сказать боту, чтобы запоминал длинные ники? A: Установите в строке конфига: set nick-len 32 Q: Пытаюсь сделать .adduser, а он говорит "user isn't on the channel". A: .+user .chattr [flags] [#chan] Q: Как сменить ник бота на ходу? A: .set nick Q: Как запустить и убрать бота на другой канал? A: Для этого потребуются права +n. Запустить: .+chan <#chan> Убрать : .-chan <#chan> Но .-chan удалит всю созданную информацию о канале. Для простого "cycle" можно сделать /msg go <#chan> Для временного запрета канала: .chanset <#chan> +inactive Q: На моем канале стоит +k, как сделать, чтобы бот входил на такой канал сам? A: .chanset <#chan> chanmode "+k " Q: Каждые несколько минут приходит новая копия бота. Почему? A: Вероятно вы неправильно настроили botchk скрипт. Проверьте все параметры и пути в нем. Q: Как давать пользователям опа на входе? A: Включите режим канала +autoop и дайте пользователям +o. .chanset <#chan> +autoop .chattr +o [#chan] Если не хотите давать всем пользователям имеющим +o оп на входе, то отключите autoop и дайте этим пользователям +a. .chanset <#chan> -autoop .chattr +a [#chan] Q: Как давать пользователям войса на входе? A: Включите режим канала +autovoice и дайте пользователям +v. .chanset <#chan> +autovoice .chattr +v [#chan] Если не хотите давать всем пользователям имеющим +v войс на входе, то отключите autovoice и дайте этим пользователям +g. .chanset <#chan> -autovoice .chattr +g [#chan] Q: Если попытаться дать +o пользователю, бот сразу его снимает! Почему? A: a) Включен режим bitch, который не дает пользователям без +o получать статус опа на канале. Отключите режим bitch с помощью: .chanset <#chan> -bitch b) Включен режим revenge, который не дает пользователям с +d получать статус опа на канале. Флаг +d появляется у пользователей, если включен режим revenge и пользователь делает "плохо" боту. Например, deop'ает или kick'ает его. Отключите режим revenge: .chanset <#chan> -revenge c) Пользователя опнул сервис (ChanServ). Бот недоумевает, почему опов раздает тот, кого нет на канале. Чтобы этого не происходило, включите режим канала +nodesynch: .chanset <#chan> +nodesynch Q: Как правильно устанавливать флаги пользователям, чтобы потом не пришлось переделывать или не было проблем? A: Как вы уже знаете флаги делятся на глобальные (на все каналы, где сидит бот) и локальные (в пределах заданного канала). Разделяются они символом вертикальной черты "|". Соответственно для установки глобального флага применяйте команду: .chattr m| для установки локального флага: .chattr |m <#chan> Если вы не будете применять вертикальную черту все устанавливаемые флаги будут считаться глобальными, что может в дальнейшем привести к недоразумениям на каналах, где висит бот. Q: Я сменил параметры канала в конфиге, перезапустил бота, а ничего не изменилось. В чем дело? A: Параметры всех каналов хранятся в динамическом файле "chanfile". Чтобы их сменить воспользуйтесь командой ".chanset <#chan> " Например, установка режима +autoop делается через: .chanset <#chan> +autoop Q: Как установить флаги канала? A: .chanset <#chan> chanmode Например, чтобы бот всего держал флаги +nt и выключал флаги +mki, надо сделать: .chanset <#chan> chanmode +nt-mki Чтобы посмотреть текущие настройки канала, наберите: .chaninfo <#chan> Q: Когда я делаю .relay на бота, в строках появляются лишние символы типа: " Hey [1mNick![0m My name is [1mBot1.1[0m". Как исправить? A: Все верно. Таким образом отображается ANSI на не-ANSI терминалах. Для исправления наберите: .fixcodes off Q: Не могу зайти на боте через Telnet. В лог пишет, что Bad password, хотя все правильно. Хосты верные. Мистика какая-то! A: Вероятно вы успели поставить патч буквы "я", который лишает возможности логиниться через telnet. Пересоберите бота без этого патча. Q: Есть бот (eggdrop v1.6.4) и скрипт, который делает bind фразы и отвечает на нее. Но после первого ответа бот больше не реагирует на внешние раздражители. Кривые руки или баг в боте? A: Баг в боте. Исправить можно либо установив патч на 1.6.4 или обновив его до новой версии, 1.6.5 или выше. Q: Как дать/отнять оп пользователю на канале? A: Дать : .op [#chan] Отнять: .deop [#chan] Q: Как дать/отнять войс пользователю на канале? A: Дать : .voice [#chan] Отнять: .devoice [#chan] Q: Как кикнуть пользователя с канала? A: .kick [#chan] [за что] Q: Как забанить пользователя? A: .kickban [#chan] [-|@] [comment] Банит и кикает пользователя с конкретного канала. .+ban [#chan] [%bantime ] [comment] Добавляет постоянный (если не указан bantime) бан. Он также будет действовать на всех каналах, где сидит бот. Q: Как забанить весь домен *.domain.net, но кроме хоста host.domain.net? A: .+ban *.domain.net .+exempt host.domain.net -----=# Botnet - Введение #=------------------------------------------------- Botnet'ом называют сеть из ботов. Ботов можно объединить как в свой собвстенный Botnet, так и в уже существующий. Что может дать Botnet: 1) Разделение файла пользователей между ботами (Sharing). Это когда файл пользователей будет вести один бот (MasterBot), а другие боты (ShareBots) будут просто из него черпать информацию. 2) Можно просто объединить ботов для общего partyline. Тогда люди имеющие доступ на разных ботах к partyline смогут видеть и общаться с пользователями других ботов. 3) Создавать сетевые сервисы. Например, сетевой seen, когда пользователь запросив информацию о последнем местонахождении интересующего его человека получит ответ от бота, который в свою очередь посмотрит в своей базе, а также спросит по Botnet у других ботов. Тем самым можно получить более информативный ответ. Команды: .+bot - Добавление бота в userfile. .+bot .-bot - Удаление бота из userfile. .-bot .botattr - Устанавка флагов для бота. .chaddr - Установка хоста бота. .chaddr .link - Линковка ботов. .link .unlink - Разлинковка ботов. .unlink .bots - Список всех ботов в сети Botnet. .bottree - Дерево Botnet. Выводит карту сети ботов, где ясно видно все ветви сети и даже какие из ботов являются Share. .botinfo - Информация по всем ботам. Подробнейшая информация: имена ботов, владелецы, каналы, версии. .who - Информация о боте. Тоже самое, что и .botinfo, но только по конкретному боту. .who .relay - Прозрачный переход на другого бота. Для входа не требуется отключаться от текущего. Удобно для отладок и просто временной необходимости зайди в partyline с другого бота. .trace - Путь от вашего бота до тестируемого. .trace .dccstat - Статистика сокетов. Выводит статистику всех портов, что слушает бот и к кому он подключен. -----=# Botnet - Соединение ботов в сеть #=---------------------------------- Чтобы связать ботов вместе, вам необходимо добавить информацию о линкуемом боте. То есть занести в userfile новую запись. Предположим, что есть два бота: Бот "Azure" на хосту "bot.azurez.net" и слушаещим порт "7812" Бот "Binny" на хосту "binny.eggy.org" и слушаещим порт "4554" Тогда на боте Azure делаем: .+bot Binny binny.eggy.org:4554 Тогдв на боте Binny делаем: .+bot Azure bot.azurez.net:7812 После этого вы можете попробовать слинковать ботов вместе используя команду .link Чтобы боты "слинковывались" автоматически, вам необходимо один из ботов сделать хабом (Hub). Допустим, сделаем хабом Azure. Тогда на боте Binny нужно для записи Azure в userfile поставить один флаг: .botattr Azure +h Также есть понятие "alternate hub". Им называют бота, на который стоит флаг +a. Нужен он для того, чтобы стать хабом, если основной хаб по какой-либо причине отключился или недоступен. Допустим, наш Botnet выглядит так: Azure |-- Ado |-- Binny `-- Caramba И на ботах были сделаны следующие команды: На боте Azure: .botattr Ado +h На боте Ado: .botattr Azure +h На боте Binny: .botattr Azure +h На боте Caramba: .botattr Azure +h На боте Binny: .botattr Ado +a На боте Caramba: .botattr Ado +a И теперь в случае падения Azure, боты Binny и Сaramba перелинкуются на Ado. -----=# Botnet - Разделение файла пользователей между ботами #=-------------- Эта возможность дает преимущества, особенно, если у вас несколько ботов на одном канале. Вам не нужно будет добавлять одного пользователя в userfile всех ботов, а потом также во всех ботах расставлять флаги этому пользователю. Боты сделают это сами. Внимание! Если вы будете настраивать Sharing на уже слинкованых ботах, то ради безопасности снимите флаг +h. Чтобы боты сами не послинковались и не поперезаписывали свои userfile. И естественно, в объяснениях шаг N1 вы можете пропускать. В качестве примера применим наших двух виртуальных ботов: Azure и Binny. Azure будет MasterBot'ом (который ведет userfile, это также называется Passive Share), а Binny - ShareBot'ом (который этот userfile использует, это называется Aggressive Share). На Azure вам потребуется: 1) Поместить Binny в userfile, как бота. .+bot Binny binny.eggy.org:4554 2) Установить его как ShareBot. .botattr Binny +s 3) Указываем какие флаги каких каналов обменивать через Share. .botattr Binny |s #channel Если этого не указать, в обмен пойдут только глобальные флаги пользователей. На Binny вам потребуется: 1) Поместить Azure в userfile, как бота. .+bot Azure bot.azurez.net:7812 2) Установить его как MasterBot. .botattr Azure +p 3) Указываем какие флаги обменивать через Share. .botattr Azure |+s #channel Заметка: если вам нужно обменивать между ботами ВСЮ информацию, то вместо того, чтобы прописывать каждый канал, применяйте флаг "g" для бота. Он означает "global share". Подробнее читайте в описании флагов. Напоминание: если вы отключали +h, не забудьте вернуть. -----=# Botnet - Работа с partyline #=--------------------------------------- Как уже говорилось, после того, как вы слинкуете вашего бота с крупным Botnet'ом. В вашем partyline будут доступны все пользователи других ботов имеющих доступ к partyline. Это будет чем-то напоминать IRC. В partyline даже есть каналы. Команды для работы в partyline: .chat - Команда переключения между каналами partyline. .chat Каналы в partyline цифровые (текстовый вариант создается с помощью модуля assoc). Основной partyline канал имеет номер "0". Для того, чтобы остаться на боте, но отключиться от partyline: .chat off .away - Помечает вас, как отсутствующего в partyline. .away Для возвращения из режима away, либо просто что-то скажите в partyline, либо наберите .away без параметров. .me - Делает action в канале partyline. Аналог /me в IRC. .me .msg - Посылает сообщение заданному пользователю. Аналог /msg в IRC. .msg @ .whom - Выводит список всех, кто сейчас в partyline. .whom Параметр channel необязателен и применяется только для просмотра пользователей заданного канала partyline. В выданном списке напротив каждого пользователя может быть знак: @ - оператор + - мастер * - владелец Если пользователь не оператор, не мастер и не владелец, напротив него знака не будет. .note - Посылает сообщение заданному пользователю. И если он сейчас не в сети, то оставляет ему сообщение. .note @ .boot - Выбросить пользователя в partyline. Аналог /kick в IRC. .boot .assoc - Именование partyline-каналов символьными именами. .assoc Чтобы просто вывести список именованных каналов: .assoc Для удаления имени у канала: .assoc -----=# Основная информация по программированию #=--------------------------- ### Данный раздел еще не переведен из состояния FAQ в Manual :) Q: TCL трудный язык? A: Нет :) Q: Где можно скачать TCL и документацию к нему? A: http://dev.scriptics.com/ ftp://ftp.eggheads.org/pub/tcl/ Канал TCL-девелоперов - irc.gate.ru #tcl Guide To TCL: http://www.suninet.nl/tclguide/ Q: Есть русская документация на TCL? A: http://www.florin.ru/win/tcl-tk/I_gu10.htm Q: Где описаны все внутренние процедуры Eggdrop для скриптов? A: Прилагаемый к боту файл docs/tcl-commands.doc или перевод его на русском: http://bot.net.ru/tcl-commands.rus.txt Q: Есть ли книги по TCL на русском языке? A: Командный язык программирования TCL (Tool Command Language) Автор Алексей Петровский. Издательство Майор 2001. Книга серии "Мой Компьютер". ISBN 5-901321-16-2, Тираж: 4000 экз. Формат: 60x84/16, 192 страницы. Цена около 50 рублей. В Bolero: http://www.bolero.ru/catalog/book/pages/pages-1512897.html В Ozon: http://www.ozon.ru/detail.cfm/ent=2&id=43173 В Mistral: http://www.mistral.ru/content/46250.shtml Q: Есть ли форум по программированию на TCL для Eggdrop? A: http://www.egghelpforum.com/ -----=# Основы программирования #=------------------------------------------- Q: Как вызвать и передать параметры процедуре? A: proc myproc {a b c} { ... } myproc 1 2 3 Процедура myproc получит: a=1, b=2, c=3 Q: Как запустить shell-команду и вывести output в канал? A: Если на выходе одна строка, можно просто: set output [exec command] Например: set serveruptime [exec uptime] А если на выходе несколько строк или вы не знаете сколько их будет, то лучше применять следующий код: foreach temp [split [exec command] "\r\n"] { putserv "PRIVMSG $chan :$temp" } Q: Как проверить содержит ли переменная цифру? A: if {![catch {expr $var}]} { # $var is a number } else { # $var is not a number } Q: Как узнать какие события bind'ит мой бот? A: '.binds all' или '.binds <тип> all' (например '.binds dcc all') Q: Как из скрипта "убить" процеруду? A: rename "" Q: Как прочитать/установить ENV-переменную? A: Прочесть : set myenv $env(DISPLAY) Установить: set env(DISPLAY) unix:0 Проверить : if {[info exists env(VARNAME)]} Q: Как узнать IP бота? A: set ip [myip] foreach v {d c b a} { set $v [expr $ip & 255] set ip [expr $ip >> 8] } set botip "$a.$b.$c.$d" Q: После каких изменений в скрипте надо делать .restart, потому что .rehash не помогает? A: После удаления bind'ов и после изменения количества переменных в процедурах. Q: Какие буквы или цифры я могу использовать в флагах пользователей для своих скриптов, чтобы не конфликтовали с ботовскими? A: Все большие буквы (A-Z) и цифры (0-9). Но если вы ставите еще и чужие скрипты, то следите, чтобы их флаги уже не конфликтовали с вашими. -----=# Работа с пользователями и userfile #=-------------------------------- Q: Как посчитать количество пользователей в канале? A: set usersnum [llength [chanlist $chan]] Q: Как "вынуть" из userfile пользователей с конкретными флагами? A: userlist AB - покажет пользователей с флагом "A" или "B" userlist AB& - покажет пользователей с флагами "A" и "B" Q: Можно ли каким-либо образом держать свои данные, не относящиеся к пользователям в userfile? A: По идее нет. Но можно прибегнуть к хитрости и содержать эти данные в XTRA-полях самого бота :) Q: Как читать/писать информацию в XTRA-полях пользователей? A: Прочесть: getuser XTRA <имя поля> Записать: setuser XTRA <имя поля> <что записать> Стереть : setuser XTRA <имя поля> Q: Как проверить флаги пользователя? A: [matchattr $hand $chan] Флаги расположены так: <глобальный>|<локальный> Если канал не указать, будут проверены только глобальные флаги. -----=# Работа со списками и строками #=------------------------------------- Q: Как создать список? A: Список создается с помощью команды: set list "one two three four five" В итоге мы получим список в пятью элементами. Пустой список создается командой: set list "" Q: Как взять один элемент списка? A: Первый элемент всегда имеет номер "0". Значит для получения первого элемента сделайте: lindex $list 0 Q: Как найти по списку в списке? A: set mainlist "a b c d e" set mylist "h z y c k" foreach i $mylist { if {[lsearch $mainlist $i]>=0} {return 1} } Q: Как добавить новый элемент в список? A: lappend $list "newelement" Для добавления нового элемента не в конец списка, а в заданную позицию (номер в списке) используйте: linsert $list <позиция> "newelement" Q: Как заменить или удалить заданный элемент списка? A: lreplace $list <с позиции> <по позицию> <на что заменить> если <на что заменить> не указать, элемент будет удален. Например, имея список: set list "a b c" и проведя операцию с ним командой: lreplace $list 1 1 мы получим список $list с элементами "a c" Q: Как выбрать строку из списка наугад (RND)? A: set list { "number one" "number two" "number three" } set random [lindex $list [rand [llength $list]]] Q: Как заменить символ в строке на другой? A: regsub -all -- "windows" "$string" "unix" mystring Заменит слова "windows" на "unix" в строке $string и запишет новую строку в $mystring. Q: Как из куска HTML вырезать текст между
 и 
? A: Сначала найти
 через lsearch, потом найти 
. И выбрать серединку через lrange. set a [lrange $str [expr [lsearch $str "
"] + 1] [expr [lsearch $str "
"] - 1]] Q: Как взять один символ (или два/три символа) из строки? A: set string "eggdrop" Пример с одним символом (результат будет "d"): string index $string 3 Пример с группой символов #1 (результать будет "dr"): string range $string 3 4 Пример с группой символов #2 (результать будет "drop"): string range $string 3 end -----=# Работа с файлами #=-------------------------------------------------- Q: Как прочитать данные из файла на диске? A: set file [open myfile.txt r+] set result [read $file] close $file Q: Как записать в файл на диске? A: set file [open myfile.txt w+] puts $file hello close $file Q: Как взять из файла строку наугад? A: Правда не стоит это делать на больших файлах. set file [open myfile.txt r] set data [read $file] close $file set lines [split $data \n] set randline [lindex $lines [rand [llength $lines]]] -----=# Работа с базами данных SQL #=---------------------------------------- Q: Есть ли возможность доступа к SQL из TCL? A: Конечно. Есть четыре пакета для работы с SQL. 1) Tcl-SQL (http://www.binevolve.com/~tdarugar/tcl-sql/) SQL-интерфейс для любых баз данных, но впервую очередь для MySQL. 2) MyTCL (http://www.mytcl.cx/) - Альтернатива Tcl-SQL. Расчитан на MySQL. Уже поддерживается скриптами: mysqlseen 1.1, mysqlfaq 1.0, mysqlbans 1.0. Один из самых удобных и быстрых. 3) MySQLTcl (http://www.xdobry.de/mysqltcl/) - Переделан из mSQLTcl. Расчитан на MySQL. Наибольшее количество поддерживаемых команд. 4) fbSQL (http://www.fastbase.co.nz/fbsql/index.html) Таблица поддерживаемых команд: | MyTCL | MySQLTcl | Tcl-SQL | fbSQL -------------------------------------------------- affectedrows | X | | | col | | X | | connect | X | X | X | X disconnect | X | X | X | X endquery | X | X | X | X escape | | X | | exec | X | X | X | fetchrow | X | | X | X info | | X | | insertid | X | X | | isconnected | X | | | map | | X | | next | | X | | numrows | X | | X | X query | X | X | X | X result | | X | | seek | | X | | selectdb | X | X | X | X state | | X | | version | X | | | X Рекомендуемые пакеты: MyTCL и MySQLTcl -----=# Работа с таймером, временем и датами #=------------------------------ Q: Как отрабатывать процедуру по времени? A: bind time - my_time_proc proc my_time_proc {min hour day month year} { } bind time - "00 * * * *" my_time_proc (каджый час) bind time - "05 05 * * *" my_time_proc (в 5:05 утра) bind time - "?0 * * * *" my_time_proc (каждые 10 минут) Q: Как отрабатывать процедуру каждые XX минут? A: if {![info exists my_proc_running]} { timer 20 my_proc set my_proc_running 1 } proc my_proc {} { # начало вашего кода # конец вашего кода timer 20 my_proc return 1 } Q: Как сделать чтобы процедура иногда срабатывала, а иногда нет? A: Можно просто сделать выборку по RND, и если одно число, то работать, если нет, то не работать. Пример выборки одного из трех: set x [rand 3] if {$x==3} { } Q: Как получить дату/время заданного вида? A: clock format [unixtime] -format <вид> Флаги форматов даты/времени в документации на TCL. Пример: Получить из unixtime дату формата "01 May 2001 12:05" [clock format [unixtime] -format "%d %m %Y %H:%M"] Q: Имеем строку с датой формата "2001-05-27 11:22:33". Как ее преобразовать в "27-05-2001 11:22"? A: set date [split "2001-05-27 11:22:33"] set a [split [lindex $date 0] "-"] set b [split [lindex $date 1] ":"] set output "[lindex $a 2]-[lindex $a 1]-[lindex $a 0] [lindex $b 0]:[lindex $b 1]" Q: Как сделать задержку перед выполнением процедуры? A: Первый вариант (замораживает общий поток): after 1000 putserv "PRIVMSG $chan :test" Второй вариант (создает свой поток для работы): after 1000 putserv "PRIVMSG $chan :test" 1000 - это миллисекунды (ms). 1000ms = 1s. -----=# Работа с сообщениями #=---------------------------------------------- Q: Как создать стили (bold/color/inverse/underline) для текста? A: Bold : \002Bold text\002 Inverse : \022Inverse text\022 Underline: \037Underline text\037 Color : \00312,4Blue text on red background\003 Номера цветов для режима Color: 0 - черный 8 - желтый 1 - белый 9 - салатовый 2 - темно-синий 10 - морской волны 3 - зеленый 11 - голубой 4 - красный 12 - синий 5 - коричневый 13 - фиолетово-розовый 6 - темно-фиолетовый 14 - темно-серый 7 - оранжевый 15 - серый Q: В чем отличие puthelp от putserv и что лучше использовать? A: Они используют различные очереди (queue) для вывода сообщений в канал или пользователю. Но putserv, вроде как, имеет более высокий приоритет в очереди, чем puthelp. Поэтому для простой нотификации пользователю лучше использовать puthelp, а для всего остального putserv. Q: Как послатать сообщения в канал/пользователю? A: Сообщение в канал: putserv "PRIVMSG $chan :message from bot..." NOTICE пользователю: putserv "NOTICE $nick :my notice to you..." ACTION в канал: putserv "PRIVMSG $chan :\001ACTION вернулся...\001" CTCP-запрос пользователю: putserv "PRIVMSG $nick :\001VERSION\001" Q: Как узнать откуда пришел ACTION. Из канал или из привата? A: proc action_bind {nick uhost hand dest keyword text} { if {[string index $dest 0] == "#"} { return "from channel" } return "from private" } Q: Как сделать, чтобы бот отвечал на CTCP CLIENTINFO? A: Написать свою процедуру ответа на этот запрос. bind ctcp - CLIENTINFO cinfo_answer proc cinfo_answer {nick uhost hand dest keyw arg} { putserv "NOTICE $nick :\001CLIENTINFO my own clientinfo message\001" return 1 } Q: Как "отловить" Notice и Action? A: Notice: bind notc - "*текст*" notice_proc Action: bind ctcp - "ACTION" action_proc -----=# Работа с логами #=--------------------------------------------------- Q: Как вручную записать данные в лог-файл? A: putloglev <#chan> "<сообщение>" Пример: putloglev p $chan "hello, world!" Q: Поскольку бот сам себя не логирует. Я делаю это через putloglev, но фраза бота отписывается раньше, чем фраза вызвавшая эту процедуру! A: Кидать в лог только после того, как бот увидит самого себя на канале bind * : если то, что появилось от = <отправленное в канал>, то кинуть в лог. А <отправленное в канал> держать в глобальном списке и при выполнения условия - удалять из списка. -----=# Список изменений #=-------------------------------------------------- 1.0 o Первая версия документа 1.1 - 1.33 o История изменений не велась, но документ вырос в размере с 5kb до 35kb 1.34 [Public Beta] o Глобально перестоена структура документа (он уже больше, чем просто FAQ) o Добавлена история Eggdrop o Переписан раздел о языковых проблемах o Вынесен отдельно и расширен раздел Botnet o Расширен раздел о программировании на TCL o Многое другое 1.35 [Public Beta] o Документ переименован из FAQ в Manual (URL пока сохранен) o Дополнения в истории Eggdrop o Изменения в языковых проблемах 1.36 o Последняя версия Данный документ больше не поддерживается Новые ищите по адресу http://www.amiga.org.ru/eggdrop/ -----=# Благодарности #=----------------------------------------------------- Выражаю благодарность следующим людям за вовлечение в интересный мир бота Eggdrop, а также за помощь в освоении языка TCL: Дмитрий Федичкин (Dmitry) и Сергей Чайка (_SeaGull_) ----------------------------------------------------------------------------- End Of File