-=# Содержание #=- 1. Основные вопросы и проблемы a) Введение b) Общая информация c) Безопасность d) Компиляция e) Конфигурирование f) Запуск g) Языковые проблемы и возможности 2. Администрирование и управление ботом a) Общая информация по управлению b) Администрирование (для +n и +m) c) Управление (для +o) d) Botnet (для +t) 3. Программирование скриптов для бота a) Общая информация по программированию b) Основы программирования c) Работа с пользователями и userfile d) Работа со списками и строками e) Работа с файлами f) Работа с базами данных SQL g) Работа с таймером, временем и датами h) Работа с сообщениями i) Работа с логами -----=# Введение #=---------------------------------------------------------- Данный FAQ освещает общие вопросы связанные с IRC-ботом Eggdrop, а также с его компиляцией, запуском и управлением. Здесь же вы найдете полезную информацию о программировании скриптов на TCL (Tool Command Language) для расширения возможностей бота. Благодарности: Дмитрий Федичкин (Dmitry), Сергей Чайка (_SeaGull_) -----=# Общая информация #=-------------------------------------------------- Q: Где можно скачать Eggdrop? A: ftp://ftp.eggheads.org/pub/eggdrop/GNU/stable Q: Где можно скачать уже собранного Eggdrop? A: http://johoho.eggheads.org/eggdrop/ Q: Как скачать свежую версию бота с CVS? A: В unix-shell наберите: 1) 'export CVSROOT=:pserver:anonymous@cvs.eggheads.org:/usr/local/cvsroot' 2) Затем наберите 'cvs login' 3) На запрос пароля нажмите <enter> 4) Наберите 'cvs checkout eggdrop1.6' (или нужную версию) 5) Далее произойдет обновление исходников в вашу локальную директорию 6) После завершения наберите 'cvs logout' В дальнейшем можно будет просто заходить в локальную директорию с исходниками и набирать 'cvs update' для автоматического обновления. Q: Где можно скачать скрипты для бота? A: Коллекция: ftp://ftp.eggheads.org/pub/eggdrop/scripts/ Поиск скриптов: http://mars.age.psu.edu/search.html А также с персональных сайтов разработчиков скриптов. Q: Где взять shell-account для запуска на нем бота? A: 1) Купить (большинство крупных провайдеров продают shell-account'ы) 2) Взять бесплатно (выиграть, взломать, украсть) 3) Взять у знакомых владельцев серверов (обычно все так и делают) 4) Поднять свой сервер (или запустить бота на локальной машине, которая 24h в сети) Q: Какие еще полезные ссылки по Eggdrop? A: http://www.egghelp.org/ http://www.eggfaq.com/ http://johoho.eggheads.org/eggdrop/ Q: Есть ли какой-нибудь хороший форум по Eggdrop? A: http://www.egghelpforum.com/ Q: Есть ли IRC-каналы по ботам и TCL? A: Канал от eggheads.org - irc.undernet.org #eggdrop Канал от eggfaq.com - irc.efnet.org #eggfaq Русский канал - irc.forestnet.org #eggdrop Канал от eggdrop.cx irc.gate.ru #eggdrop Канал TCL-девелоперов irc.gate.ru #tcl Q: Куда сообщать о найденой баге в Eggdrop? A: http://www.eggheads.org/bugzilla/ или e-mail: bugs@eggheads.org Q: Есть ли сайты поддержки "живых" ботов? A: SG - http://seaguard.boom.ru/ SyTech - http://sytech.euro.ru/ TAHK - http://bot.net.ru/ B-on - http://center.nstu.ru/b-on/ -----=# Безопасность #=------------------------------------------------------ Q: Какие есть известные "дыры" в ботах или скриптах? A: Если вы используете скрипты от ботов семейства SG, то в скрипте ping20.tcl есть уязвимость позволяющая проникнуть в систему и получить полный контроль над ботом. Для закрытия дыры, в скрипте ping20.tcl найдите строку: set reply [expr [unixtime] - $pdelay] и до нее вставьте: if {[isnumber $pdelay]} { Затем после строки: if {$reply<30} { putchan $pchan ....... } вставьте: } -----=# Компиляция #=-------------------------------------------------------- Q: Как лучше собирать Eggdrop. Dynamic или Static? A: Static - будет занимать меньше, чем eggdrop + dynamic-модули, и будет в одном файле. Таким образом менять версию бота для тестов или проверок намного проще, так как менять надо всего лишь один файл. Dynamic - будет в виде нескольких файлов (сам eggdrop и модули) и займет чуть больше, из-за заголовков и служебной информации в скомпилированных файлах. Но динамик выигрывает за счет экономии памяти при запуске нескольких ботов. Если запустить несколько ботов, то память будет общей. А также dynamic-модули можно загружать/выгружать на лету. Q: Должен ли я буду делать loadmodule, если бот собран как Static? A: Да. Все работает также, как и с внешними модулями. Они неактивны (хотя и занимают память) до использования команды loadmodule <имя модуля>. Q: В какой последовательности собирать бота? A: 1) Скачать бота с сайта или ftp (архив будет с именем eggdrop-1.x.x-tar.gz) 2) Если не установлен TCL - скачать и поставить (установать можно как из исходников, так и из пакетов tgz, rpm, deb и т.п.) 3) Развернуть архив с ботом в нужную директорию. (tar -zxf <имя архива>) 4) Далее обычно хватает команды: ./configure Но если собирать нужно с конкретной версией TCL, то указывайте: ./configure --with-tcllib=<path>/libtcl8x.so --with-tclinc=<path>/tcl.h 5) make config (для ) 6) Для сборки бота как dynamic (обычно): make Для сборки бота как static: make static 7) make install DEST=<path> (для установки) -----=# Конфигурирование #=-------------------------------------------------- Q: Какой минимум надо сконфигурировать, чтобы бот запустился? A: Настроить логи, путь до userfile/chanfile/notesfile, telnet-порт, ник, alt-ник, сервер, а закомментировать две строки с die. Q: Мне надоело ползать в конец сорока-килобайтного конфига, чтобы добавить или убрать скрипты. Есть какой-нибудь решение? A: Конечно. Просто в конце конфига напишите: source myscripts А в файл myscripts перепишите все ваши source scripts/<имя вашего скрипта> Q: Скачал новую версию бота. Как мне узнать, добавлены ли были в конфиг какие-нибудь новые опции? A: Да. Это можно сделать с помощью утилиты diff (идет со всеми версиями Unix) Берете старый конфиг, новый и сравниваете строчкой: $ diff eggdrop.config.old eggdrop.config.new > eggdrop.config.changes В файле eggdrop.config.changes вы получите все изменения. -----=# Запуск #=------------------------------------------------------------ Q: Как сделать, чтобы бот запускался автоматически, если он "упал"? A: Используйте прилагаемый к боту файл botchk. Для создания готового botchk используйте прилагаемый же скрипт autobotchk. Q: Я все сконфигурировал, но бот все равно не запускается, говорит, что я что-то там еще не доконфигурировал. Почему? A: Если вы действительно уже все сконфигурировали, то найдите две строки в конфиге начинающиеся со слова "die" и закомментируйте их. Q: Почему бот не запускается и говорит "User file not found"? A: Это видимо это ваш первый запуск бота. Запускайте с ключом -m. Этот ключ используйте только для создания нового userfile. Q: Почему-то не запускается бот, пишет что не может открыть userfile или channel file. Хотя они есть. A: Вероятнее всего это проблема с правами доступа к файлам. Установите их в 0644 (rw-r--r--). Если проблема не исчезла, пропишите в строке конфига: set userfile-perm 0644 Q: При запуске получаю сообщение "Hostname self-lookup failed". A: Бот не может определить свой hostname. Задайте его вручную, прописав в конфиге: set my-hostname <hostname> и set my-ip <ip> Q: При запуске получаю сообщение "Couldn't grab nearby port". A: Это означает, что бот не может открыть сокет на данном порту. Это может случиться, если: a) порт указанный в конфиге занят и конфликтует с другими программами b) неверные установки set my-hostname и set my-ip в конфиге c) если в каталоге лежит файл pid.<botnick> Проблема "a" решается сменой порта на другой. Проблема "b" решается исправлениями переменных в конфиге. Проблема "c" решается удалением файла. Если ничего не помогло, то просто закомментируйте строку с "listen", но это отключит возможность соединять бот с другими ботами и работать с ним через telnet. Q: При запуске получаю сообщение "Please select an encryption module". A: Вы забыли активизировать модуль blowfish. Найдите в конфиге строку со словами "checkmodule blowfish" и уберите перед ней символ "#", то есть, раскомментируйте строку) Если такой строки не нашли - создайте ее. Q: Как посмотреть, что делает бот при запуске? A: Запустите его в shell с параметрами -nt -----=# Языковые проблемы и возможности #=----------------------------------- Q: Бот пишет в канал какой-то мусор. В чем проблема? A: Проблема в том, что TCL с версии 8.1 применяется UTF8 для хранения фраз. Решений несколько: a) Вернуться на TCL 8.0.x (стабильный вариант) b) Поставить Eggdrop 1.6.5 и выше и прописать в конфиге строчку: encoding system iso8859-1 Но это не избавляет от некоторых проблем. И на данный момент самым стабильным вариантом является любой eggdrop с tcl 8.0.x Q: Как полностью переключить основную кодировку в боте? A: Для этого у вас должен быть установлен TCL версии 8.1 и выше. И вы должны быть в курсе его глюков (читайте предыдущий вопрос). А для переключения, в конфиге пропишите: encoding system <имя кодировки> Кодировки: koi8-r, cp1251, cp866, iso8859-1, iso8859-5, macCyrillic Для корректной работы бота с русским языком рекомендуется устанавливать кодировку iso8859-1 Q: При написании буквы "я" в DCC Chat бота (partyline) он теряет ее, а заодно и символ справа от буквы. Что за дела? A: Да. Это ошибка самого бота. Почему ее до сих пор не исправили, нам не известно, но есть "домашнее" решение этой проблемы. ВНИМАНИЕ! ВНЕСЕНИЕ ЭТОГО ПАТЧА В КОД ЛИШАЕТ ВАС ВОЗМОЖНОСТИ РАБОТЫ С БОТОМ ЧЕРЕЗ TELNET!!! Но если вам telnet не нужен, а больше нужна буква "я", то откройте файл dcc.c из каталога с дистрибутивом ("src/dcc.c"). Найдите строки: static void strip_telnet(int sock, char *buf, int *len) { unsigned char *p = (unsigned char *) buf, *o = (unsigned char *) buf; int mark; [добавьте в код следующие две строки] unsigned char *dima = buf; while (*dima!=0) { if (*dima==0xFF) *dima=0xB1; dima++; } while (*p != 0) { while ((*p != TLN_IAC) && (*p != 0)) *o++ = *p++; Затем найдите строки (в конце функции strip_telnet): *len = *len - mark; } } *o = *p; [добавьте в код следующую строку] dima = buf; while (*dima !=0) { if (*dima==0xB1) *dima=0xFF; dima++; } } Затем соберите бота как обычно. Автор решения: DlMA. -----=# Общая информация по управлению #=------------------------------------ Q: Какие бывают флаги и что они означают? A: Флаги дают или отнимают право получать доступ к ресурсам бота или канала, а также указывают прочие технические параметры. Пользовательские флаги делятся на две группы: глобальные и локальные. Глобальные действуют в пределах бота и везде, где он сидит, а локальные только в том канале для которого они поставлены. Флаги пользователей (глобальные): 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'у. s (share) Данный флаг указывает, что бот будет принимать общий userfile. p (passive) Данный флаг указывает, что бот будет отсылать общий userfile. l (leaf) Помечает бота как конечную точку. Он может подключаться к ботам, к нему никто. 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-сетях с ChanServ. Указывает на то, что канал зарегистрирован в сервисах. v (vhost) Есть только в IRC-сетях (и то не во всех) с сервисами. Указывает на то, что хост пользователя защищается сокрытием его части. Q: Как заставить бота послать мне запрос на DCC Chat? A: /ctcp <botnick> chat -----=# Администрирование (для +n и +m) #=----------------------------------- Q: Я забыл свой пароль owner'a на бота, что делать? A: 1) "Убить" бота (kill -9 <pid-бота>) 2) Зайти редактором в userfile бота ("<имя бота>.user") 3) Найти запись о вашем аккаунте 4) Удалить в ней строку начинающуюся с "--PASS" 5) Запустить бота и сделать "/msg <botnick> pass <password>" 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 <nick> <hostmask> .chattr <nick> [flags] [#chan] Q: Как сменить ник бота на ходу? A: .set nick <newnick> Q: Как запустить и убрать бота на другой канал? A: Для этого потребуются права +n. Запустить: .+chan <#chan> Убрать : .-chan <#chan> Но .-chan удалит всю созданную информацию о канале. Для простого "cycle" можно сделать /msg <botnick> go <#chan> Для временного запрета канала: .chanset <#chan> +inactive Q: На моем канале стоит +k, как сделать, чтобы бот входил на такой канал сам? A: .chanset <#chan> chanmode "+k <keyword>" Q: Каждые несколько минут приходит новая копия бота. Почему? A: Вероятно вы неправильно настроили botchk скрипт. Проверьте все параметры и пути в нем. Q: Как давать пользователям опа на входе? A: Включите режим канала +autoop и дайте пользователям +o. .chanset <#chan> +autoop .chattr <nick> +o [#chan] Если не хотите давать всем пользователям имеющим +o оп на входе, то отключите autoop и дайте этим пользователям +a. .chanset <#chan> -autoop .chattr <nick> +a [#chan] Q: Как давать пользователям войса на входе? A: Включите режим канала +autovoice и дайте пользователям +v. .chanset <#chan> +autovoice .chattr <nick> +v [#chan] Если не хотите давать всем пользователям имеющим +v войс на входе, то отключите autovoice и дайте этим пользователям +g. .chanset <#chan> -autovoice .chattr <nick> +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 <hand> m| для установки локального флага: .chattr <hand> |m <#chan> Если вы не будете применять вертикальную черту все устанавливаемые флаги будут считаться глобальными, что может в дальнейшем привести к недоразумениям на каналах, где висит бот. Q: Я сменил параметры канала в конфиге, перезапустил бота, а ничего не изменилось. В чем дело? A: Параметры всех каналов хранятся в динамическом файле "chanfile". Чтобы их сменить воспользуйтесь командой ".chanset <#chan> <argument>" Например, установка режима +autoop делается через: .chanset <#chan> +autoop Q: Как установить флаги канала? A: .chanset <#chan> chanmode <flags> Например, чтобы бот всего держал флаги +nt и выключал флаги +mki, надо сделать: .chanset <#chan> chanmode +nt-mki Чтобы посмотреть текущие настройки канала, наберите: .chaninfo <#chan> Q: Когда я делаю .relay на бота, в строках появляются лишние символы типа: "<bot> 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 или выше. -----=# Управление (для +o) #=----------------------------------------------- Q: Как дать/отнять оп пользователю на канале? A: Дать : .op <nick> [#chan] Отнять: .deop <nick> [#chan] Q: Как дать/отнять войс пользователю на канале? A: Дать : .voice <nick> [#chan] Отнять: .devoice <nick> [#chan] Q: Как кикнуть пользователя с канала? A: .kick [#chan] <nick> [за что] Q: Как забанить пользователя? A: .kickban [#chan] [-|@]<nick> [comment] Банит и кикает пользователя с конкретного канала. .+ban <hostmask> [#chan] [%bantime <XdXhXm>] [comment] Добавляет постоянный (если не указан bantime) бан. Он также будет действовать на всех каналах, где сидит бот. Q: Как забанить весь домен *.domain.net, но кроме хоста host.domain.net? A: .+ban *.domain.net .+exempt host.domain.net -----=# Botnet (для +t) #=--------------------------------------------------- Q: Как слинковать ботов? A: Предположим, что есть два бота и назовем их "A" и "B". На боте A: .+bot B <bot-b.host>:<port> На боте B: .+bot A <bot-a.host>:<port> На боте A: .link B Q: Как сделать, чтобы боты слинковывались автоматически? A: Если бота два, то на сделать следущее: На боте A: .botattr B +h На боте B: .botattr A +h Если ботов больше, то одного выделить как hub и на всех ботах, кроме него самого, на него сделать +h. Q: Как залинковать/разлинковать ботов вручную? A: .link <botnick> .unlink <botnick> Q: Зачем нужен alternate hub? A: Это нужно в больших Botnet на случай, если основной hub "упадет". Допустим, наш Botnet выглядит так: HUB |-- A |-- B `-- C Для этого сделаны следующие команды: На боте A: .botattr HUB +h На боте B: .botattr HUB +h На боте C: .botattr HUB +h На боте HUB: .botattr A +h На боте B: .botattr A +a На боте C: .botattr A +a И теперь в случае падения HUB, боты B и С перелинкуются на A. Q: Как расшарить userfile между ботами? A: Решите какой из ботов будет содержать мастер-лист и рассылать его на других ботов. Сделайте на нем на всех других ботов: .botattr <ShareBot> +s|+s <#chan> На всех passive-ботах сделайте: .botattr <MasterBot> +p|+s <#chan> .botattr <MasterBot> +h (последнее только, если вы хотите соединить ботов) "|+s" для установки share флага на заданный канал. Для того, чтобы это работало, вам также надо сделать: .chanset <#chan> +shared Q: Как посмотреть какой бот к кому подключен (карту botnet)? A: .bottree Q: Как посмотреть более подробную информацию по ботам? A: .botinfo (по всем) .who <botnick> (по конкретному) Q: Как узнать какие порты слушает мой бот? A: .dccstat Q: Как выполнить "action" в Botnet'e или послать сообщение (private message) только одному пользователю? A: Для "action" - .me <message> Для "private message" - .msg <nick> <message> -----=# Основная информация по программированию #=--------------------------- Q: TCL трудный язык? A: Нет :) Q: Где можно скачать TCL и документацию к нему? A: http://dev.scriptics.com/ ftp://ftp.eggheads.org/pub/tcl/ 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 для Eggdrop? A: Guide To TCL: http://www.suninet.nl/tclguide/ 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 <proc_name> "" 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 <hand> XTRA <имя поля> Записать: setuser <hand> XTRA <имя поля> <что записать> Стереть : setuser <hand> XTRA <имя поля> Q: Как проверить флаги пользователя? A: [matchattr $hand <flag|flag> $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 вырезать текст между <pre> и </pre>? A: Сначала найти <pre> через lsearch, потом найти </pre>. И выбрать серединку через lrange. set a [lrange $str [expr [lsearch $str "<pre>"] + 1] [expr [lsearch $str "</pre>"] - 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 - <mask> 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 <flag> <#chan> "<сообщение>" Пример: putloglev p $chan "hello, world!" Q: Поскольку бот сам себя не логирует. Я делаю это через putloglev, но фраза бота отписывается раньше, чем фраза вызвавшая эту процедуру! A: Кидать в лог только после того, как бот увидит самого себя на канале bind * <proc> <proc>: если то, что появилось от <botnick> = <отправленное в канал>, то кинуть в лог. А <отправленное в канал> держать в глобальном списке и при выполнения условия - удалять из списка.
Вернуться