Eggdrop Book - Всичко за Eggdrop от А-Я, прочетете ли това, проблемът ви вече няма да се казва 'Eggdrop'!!!

Ако ви се е повредил Windows, не знаете какво да правите с Linux или не знаете как се правят аквариуми - това е мястото за вас
Аватар
LuD
The Sinner's Priest ;-]
The Sinner's Priest ;-]
Мнения: 205
Регистриран на: 10 Окт 2012 15:44
Местоположение: Sofia
Обратна връзка:

Eggdrop Book - Всичко за Eggdrop от А-Я, прочетете ли това, проблемът ви вече няма да се казва 'Eggdrop'!!!

Непрочетено мнение от LuD »

Вероятно повечето то ваз знаят какво е IRC и Eggdrop и какво можете да правите с тях, но в помощ на тези които незнаят все
още ще направим кратко резуме преди да започнем същинската част.

IRC означава [Internet Relay Chat]. IRC мрежата е направена от многобройни сървъри свързани един към друг. В IRC имате
канали, колко зависи от мрежата на която сте. Ако сте съвсем бос в IRC, предлагаме ви да прочетете преди всичко http://irche
lp.unibg.org/irchelp/IRC/Documentation/bgnew2irc.htm

Вероятно използвате клиент като mIRC (http://www.mirc.com/) за Windows,
X-Chat (http://xchat.org/) за X11 или BitchX (http://www.bitchx.com/) за
Linux за да се свържете към IRC сървърът, но какво точно прави този клиент?

Тези клиенти изпращат специални команди до сървърът за да се уверят че това което пишете орива в правилната посока. Ако
трябва да правите скрипт които да изпраща информация към някой през msg, notice, ctcp или нещо друго не само можете да
направите нещо просто като [notice <nickname> <message>]. Трябва да изпратите специфични команди към сървърът точно както
mIRC, X-Chat и BitchX го правят, така че трябва да знаете малко повече как IRC сървърът работи с IRC клиентите ако искате
да осъществите намисленото.

Бот е съкращение от робот. Ботовете са доста често срещани на много IRC мрежи. Също както роботите от истинския живот те отг
оварят на команди и неща, на които са програмирани да отговарят. Някои могат да кажат, че те приличат на добре обучени кучет
а. В IRC ботовете често се използват, за да държат канал или да "забавляват" канал. Може би е по-точно да се каже, че бота п
озволява на потребителите да се забавляват, тей като бота отговаря на команди, които потребителя е изпълнил. Ботовете доста
често се използват само, за да държат операторските права в някой канал.

Eggdrop е най-популярния в света Open Source IRC бот написан на C, създаден за гъвкавост и лесно използване, а и неговата ди
стрибуция е безплатна под GNU General Public License (GPL). Ако НЕ знаете какво е IRC, тогава вероятно Eggdrop не е за вас!
Eggdrop е начално написан от Robey Pointer; както и да е, той отдавна не работи върху Eggdrop, така че моля ви не се свързва
йте с него за решение на някакъв проблем или бъг. Тей като той работи като background процес на shell акаунт, той може да ст
ои в IRC 24 часа 7 дни в седмицата.

Първоначално е създаден за война в IRC, но сега той може би е най-добрия IRC бот. Изглежда като нормален потребител, само че
има много други функции. Като например всички потребители, които имат права в бота (да правят това) могат да влезят на DCC
Chat с него и да пращат съобщения на други потребители, които не са в момента в IRC. Съобщенията автоматично ще бъдат запазе
ни в бота. Когато потребителят влезе в канала, в който е бота, той му праща съобщение.

Ако други потребители са в DCC с eggdrop бота те ще имат възможността да говорят един с друг в dcc chat прозореца, така какт
о си говорят в канал. Това е една от най-забележителните функции на eggdrop бота. Мислете за него като мулти DCC chat, или к
ато малко IRC (заедно с каналите). Вие можете да свържете други ботове и да увеличите partyline-а, докато накрая се получи н
аистина нещо приличащо досущ на IRC.

Eggdrop стои в канала и го пази: защитава го от TakeOvers (това в наши времена е почти невъзможно с наличието на Services),
да разпознава наказани потребители и да ги наказва, да разпознава привилигированите потребители и да им позволява да имат оп
ераторски права и т.н.

За да си направите бота по-добър, може би ще искате да му сложите определени скриптове. Това може да означава всичко, включв
айки игри, гласувания, скриптова за даване на помощ и т.н. Един интересен скрипт може да ви направи бота по такъв начин, че
той да говори като нормален потребител (почти като него...). На подобни неща може да се подлъже някой новак в IRC. После ще
засегнем въпроса за TCL скриптовете.

Имаше доста малко версии на Eggdrop ботове направени през последните години. Някои хора все още си използваха 1.3.x версиите
, но не и ние. Доста бъгове бяха оправени оттогава, и доста функции бяха добавени.

Препоръчваме ви ВИНАГИ да използвате най-новата egghead eggdrop 1.6.x версия, която винаги е считана за най-стабилната и най
-подържана версия.

Ако гледате Uptime страницата можете да забележете няколко eggdrop 1.7 ботове, които са пуснати. 1.7 е версия само за разраб
отчици и няма да бъде пусната за публично използване. Щом веднъж стане, версията ще се смени на 1.8. Ще бъде голяма крачка з
а eggdrop, но все още не е направена. Има повече бъгове отколкото новости :)

Друго разклонение на оргиналния eggdrop бот от Robey Pointer е Eggdrop Racbot. Различен е от стандартния (още наричан "Ванил
а Eggdrop") egghead eggdrop, който е рядко използван и неподържан от повечето помощни канали за eggdrop.

Каквото и да правите не използвайте eggdrop 2.x, който е стар забравен проект, в който са се опитали напълно да пренапишат e
ggdrop кода, но не са успели.

Ако си говорим за Windows, използвайте Windrop, или си компилирайте собствен бот използвайте Cygwin.

Разбира се има и други IRC ботове, даже и mIRC скриптове, които се опитват да приличат на ботове, ето и малко имена на ботов
е: Blootbot, Darkbot, Eggdrop Racbot, Energymech, Infobot... Разбира се има и още много много... И само вие можете да си отг
оворите на въпроса защо да използвам точно eggdrop. А и надявам се ще си отговорите на този въпрос след като прочетете това.

Първото нещо преди да си вземето eggdrop е да се питате имате ли нужда от него? Ако отговора е да, можете да вземете най-нов
ия eggdrop бот от http://www.geteggdrop.com или от ftp://ftp.eggheads.org/pub/eggdrop/source/1.6, http://irchelp.unibg.org р
азбирасе можете да го вземете и от нашата страница ;) стараем се винаги да бъдем в крак с новоизлезлите версии.

Можете да намерите помощ за eggdrop на следните страници: http://egghelp.org, http://www.eggfaq.com, http://www.eggheads.org
, http://irchelp.unibg.org/irchelp/IRC/Eggdrop.htm (на български). Можете и да потърсите различни страници с google или люби
мата си търсачка. В IRC винаги можете да потърсите помощ в #irchelp @UniBG, @eggdrop @Undernet, #eggfaq @IRCNet.

Трябва да планирате използването на поне два бота от различни шелове. Причината е, че шеловете падат от време на време. След
като си изберете добро място където да пуснете вашият eggdrop можете да продължите към инсталацията и конфигурацията му.

Обикновенно инсталацията е лесна. Ако шела ви има TCL инсталиран, всичко ще мине добре (ако имате достатъчно място). Моля не
забравяйте, че конфигурационния файл трябва да бъде добре прегледан.

За да подкарате eggdrop в трябват няколко неща:

Някакъв Unix акаунт (няма значение дали ще е локален или отдалечен, стига да ви дава възможността да пускате Eggdrop и да ос
тава процеса ви пуснат след като излезете).
Доста добри познания за IRC и Unix, както и да знаете какво е DCC chat.
Около 500k свободно място, или повече, зависи от системата(на Linux, изпълнимите файлове заемат около 400k -- ще е доста по-
голям на RISC системи)
TCL библиотеки (lib файлове), които могат да бъдат намерени на http://www.linuxberg.com/
Ако искате ботът ви да бъде пуснат 24/7 (24 часа на ден, 7 дни в седмицата), ви трябва шел акаунт на компютър, който е 24/7
в Интернет. Можете да получите такъв шел или като си го купите или като целунете администратора и го накарате да ви даде еди
н безплатно (нито един от онези "безплатни шел акаунт провайдери" няма да ви даде да си пуснете Eggdrop бот, защото веднага
след като излезете от системата вашият процес ще бъде спрян). Има много добри шел провайдъри в последно време. Aко искате бъ
лгарски шел опитайте регистрация на http://aquila.online.bg, http://shells.go-link.net (супер скапан шел), пък ако ви се зан
имава да търсите на http://www.bylur.net/free/ има няколко безплатни шел провидера.

Сега часта с TCL:

Преди да компилирате eggdrop, вие трябва да имате инсталиран TCL на системата. Повечето системи би трябвало да си имат TCL.
Пуснете ./configure скрипта, за да ви намери TCL-а вместо вас. Ако това се провали може би бихте искали да си го потърсите с
ами. Можете да проверите като напишете "tclsh". Ако работи, ще получите "%" промпт, и просто напишете "exit", за да излезете
. Това означава, че системата ви има TCL инсталиран. Ако tclsh не работи, това би трябвало да означава, че нямате TCL, и ще
трябва да го изтеглите и да го инсталирате. Има и още един доста болезнен начин за откриването на инсталиран TCL... Библиоте
ките се казват libtclX.X.so или libtclX.X.a. Тези "X.X" са версията на вашата библиотека. Разшиерението '.so' означава, че е
"динамично зареждаща се библиотека", а '.а'' означава, че ще е "статично свързана". Можете да опитате да го намерите така:
find /usr -name "libtcl*" -print
Чрез тази команда ще имате да си чакате доста време... Направете и същото за header файла: find /usr -name "tcl.h" -print
Веднъж щом сте ги намерили, кажете на ./configure скрипта, къде са. Това трябва да се направи като се дефинират стойностите
на TCLLIB и TCLINC. Направете следното:

За sh/bash/ksh шелове:
TCLLIB=/directory/of/the/library
TCLINC=/directory/of/the/header
export TCLLIB TCLINC

За csh/tcsh шелове:
setenv TCLLIB /directory/of/the/library
setenv TCLINC /directory/of/the/header

Можете да провете какъв шел ползвате като напишете echo $SHELL
Ако това не проработи, напишете 'ps' и виште какви процеси сте пуснали. Намерете този който започва с тире '-', това вероятн
о е вашият логин шел. Това може да е някой от следните: sh, bash, ksh, csh или tcsh (или други...).

След това пуснете ./configure отново, за да ви намери файловете.

Най-доброто FTP, от което можете да си вземете TCL е: ftp://ftp.scriptics.com/pub/tcl.

Най-добрата версия е 8.4.

Можете да си компилирате TCL 8.4 във вашата HOME директория, ако имате достатъчно място. Или да го компилирате в /tmp, там щ
е имате достатъчно свободно място. Направете следното:

$ mkdir /tmp/tcl
$ cd /tmp/tcl
$ ftp ftp.scriptics.com
Login: ftp
Password: your@email
ftp> cd /pub/tcl/tcl8_4
ftp> bin
ftp> get tcl8.4a3.tar.gz

..чакайте да се изтегли файла. След това:
ftp> quit

$ gzip -dc tcl8.4a3.tar.gz | tar xvf -
$ cd tcl8.4/unix
$ ./configure --prefix=/tmp/tcl --exec-prefix=/tmp/tcl --disable-shared

..чакайте configure да си свърши работата... След това:

% make (и чакате...)
% make install (чакате още...)

Е вече имате TCL библиотеките в /tmp/tcl. Сега кажете на eggdrop къде да ги намери, като направите следните настройки:

На bash/sh/ksh шелове:

% TCLINC=/tmp/tcl/include
% TCLLIB=/tmp/tcl/lib
% export TCLINC TCLLIB

На csh/tcsh шелове:

% setenv TCLINC /tmp/tcl/include
% setenv TCLLIB /tmp/tcl/lib

След това просто пуснете eggdrop 'configure' скрипта и стискайте палци да засече TCL версията 8.4. Ако го направи (а и би тр
ябвало, ако спазвате стъпките правилно), можете да си компилирате бота както обикновенно, и той ще има TCL 7.6 библиотеките.
След компилирането можете просто да изтриете всичко в /tmp/tcl, тей като всичко това вече е включено в бота ви. Или да си г
о оставите там, ако провайдера не ви го изтрие ще можете да си компилирате още някой друг бот в близкото бъдеще. Ако имате м
ясто можехте да направите цялата операция не в /tmp, а в $HOME директорията ви.

Ако си купите шел и знаете, че те ви дава да си пускате IRC ботове (такава важна информация би трябвало да е написана на тях
ната уеб страница), можете да сте 100% сигурни, че те ще имат TCL библиотеките.

Преди да започнете се питайте, трябва ли ми наистина бот. Много хора пускат бото само като "играчки" или за цел унищожение.
Ако искате да го използвате за унищожение, хайде давайте, но преди това изтрийте цялата си eggdrop директория. Почти невъзмо
жно е eggdrop да бъде използван за подобни цели. Има и ограничения за изпращането на командите към потребител/канал.

Трябва да намерите поне един сървър, който да ви позволи да пускате ботове (повечето сървъри в UniBG го разрешават). Можете
да направите това като прочетете MOTD-то. Ако правилата ви харесат просто пуснете вашият eggdrop на този сървър. Или на сърв
ърът който ви е най-бърз от шелът. Това можете да го разберете ако имате права за ping или traceroute. На колкото по малко h
op-а е един сървър от вашият шек толкова по бързо ще върви ботът ви.

Говорейки глобално, ботове ви трябват, ако канала ви има хора постоянно (24 часа на ден) и няма ботове. Ако канала ви има ня
колко бота, предполага се, че не ви трябват повече. Много ботове не вършат по-добра работа. Повече ботове просто губят скоро
стта на сървъра и мястото от където са пуснати. Трябват ви много ботове, само ако канала ви е твърде голям.

Ботовете НЕ могат да осигурят пълна защита. Нищо не може. Eggdrop ще се опита да направи това колкото се може по-добре, но н
яма гаранции.

Много хора ... (мързели като нас) ги мързи постояно да обновяват версията на ботът си като смъкват новия сорс и да прекомпил
ират блах блах... затова хората са измислили пачовете с които можете да направите ъпдейтът малко по безболезнен само с преко
мпилиране ;) За да си patch-нете eggdrop source-а ви трябва програмата 'patch', и то поне версия 2.1. Напишете:

patch -v

За да разберете, коя версия имате. Ако нямате отговор за версията, то може би вие пускате друг файл. Вижте

http://tick.informatik.uni-stuttgart.de ... drop/patch

и си намерете точния 'patch' за вашата система. Най-новите пачове се намират на

ftp://ftp.eggdrop.net/pub/eggdrop/unofficial/patches1.6
ftp://ftp.sodre.net/pub/eggdrop/patches1.6

Можете да си patch-нете eggdrop бота така:

Ако той завършва на .gz:
$ gzip -d patch-file

Влезте в source директорията на eggdrop бота ви. Сложете пача с:
$ patch -p1 < eggdrop1.6.12.patch

Дали нещо не е станало можете да разберете с:
$ find . -name "*.rej" -print

Ако нещо се е пообъркало по следният начин можете да изтриете rejected файловете и да опитате отново с друг пач.

$ find . \( -iname "*.rej" -or -iname "*.orig" -or -iname "*~" \) -exec rm -f {} \;

Ако програмата 'patch' ви попита "What file to patch", то сигурно нямате текущата версията на програмата. Ако я имате, то мо
же би сте объркали версията на eggdrop бота (пачвате с patch за 1.3 eggdrop 1.6 примерно). Убедете се, че версията на eggdro
p бота и версията на patch съвпадат. След това просто прекомпилирайте с 'make'.

За да си пуснете бота с SSL трябва да го patch-нете по следния начин:

$ cd eggdrop1.6.12
$ wget -c http://irchelp.unibg.org/Downloads/eggd ... .6.diff.gz
$ patch -p1 < eggdrop1.6.12-ssl-v1.6.diff.gz

или да изтеглите направо пачнат бот от c http://irchelp.unibg.org/Downloads/prec ... 12-ssl.tgz

Вече спокойно можете да започнете със инсталацията.

Влезте във вашата директория

# cd

Като за начало трябва да се здобиете с сорсе кода просто пишете следното във вашият шел.

# wget -cb http://irchelp.unibg.org/irchelp/Downlo ... .12.tar.gz

Ако нямате wget можете да се здобиете с архива използваики lynx или друг подобен инструмент.

# lynx -source http://irchelp.unibg.org/irchelp/Downlo ... .12.tar.gz > eggdrop1.6.12.tar.gz

След това просто разкомпресираите файла и влезте в новосъздадената директория. (можете да изтриете компресирания файл)

# tar xzvf eggdrop1.6.12.tar.gz
# rm -f eggdrop1.6.12.tar.gz
# cd eggdrop1.6.12/

ВНИМАНИЕ:Ако се опитвате да инсталирате eggdrop на платформа различна от Linux използваите следния начин:

# gzip -d eggdrop1.6.12.tar.gz
# tar xf eggdrop1.6.12.tar
# rm -f eggdrop1.6.12.tar
# cd eggdrop1.6.12/


Сега.. нека да стартираме конфигурационият скрипт. (тои не би трябвало да изписва грешки). Между доругото тои изписва доста
съобщения, просто ги игнорираите ако не изписват грешки. Напредналите потребители могат да напишат:

# ./configure --help

за да видят някои допалнителни опции които може да са им полезни, но ако сте новак в eggdrop започнете 'бърза' инсталация:

# ./configure

След като скрипта намери всичко което му е нужно за да продължи( главно Tcl,които се изисква за да се компилира бота) нека д
а пристапим към компилирането на eggdrop-а.Ето някой неща които трябва да направите( ако искате вашият eggdrop да достигне м
аксимума от способностите си).Така че нека да започнем от src/ директория.

# mcedit src/eggdrop.h

Тук можете да редактирате максималната далжина на псевдоними които можете да добавите във вашият бот.( по начало тя е 9, доб
ре е да я направите 15 или колкото е максимумат разрешен от мрежата на която стартирате вашият бот, така че ще сте способни
да добавяте всичките видове превдоними във вашата база данни).

#define HANDLEN 9 /* valid values 9->NICKMAX */

ВНИМАНИЕ:Бъдете внимателен това е колкото хубаво толкова и лошо, защото може да попречи на линкването на бота ви към бот кои
то е компилиран с началната далжина на псевдонима(9).Първо проверете дали далжината на псевдонима савпада на всичките ботове
от ботнет-а ви и тогава направете правилната промяна. Можете сега да обърнете внимание на някои по специфични настройки на
файловете в тази директория или да го оставите за после в случай че се зблъскате проблем от това естество. Във файлът mem.c
се намира описанието на това колко голяма че е memory таблицата на ботът ви. Какво ви касае това ли? Ако имате прекалено мно
го потребители ботът ви ще почне да пада със съобщение "Memory table full" . Трябва просто да отворите със някакъв текстови
редактор src/mem.c и заменете следното

#define MEMTBLSIZE 25000 /* yikes! */

с някаква по голяма стойност например 50000, след което прекомпилирайте ботът отново.Ако сложите лимитът на 75000 всичко ще
е ОК. Можете да проверите моментното използване на памет като напишете .status в ботът. Ако тя се напълни можете да срешнете
затруднения с добавянето на нови потребители или с рестартирането на ботът. Друг файл на който можете да обърнете внимание
е src/mod/server.mod/server.c който в последствие може да ви донесе главоболия. Ако ботът ви почне да излиза от IRC със съоб
шение Excess flood то е не от друго а защото стойностите на msgrate са твърде малки. Отворете файлът и потърсете за следните
редове:

/* Number of seconds to wait between transmitting queued lines to the server
* lower this value at your own risk. ircd is known to start flood control
* at 512 bytes/2 seconds.
*/
#define msgrate 2

и го променете на по висока стойност

#define msgrate 5

След което прекомпилирайте ботът.

Тази опция контролира колко бързо ботът изпраща съобщенията към сървърът. Ако сложите висока стойност, шансът ботът ви да из
лезе по подобен начин е минимален, но от друга страна ботът става по бавен. Мислим че това е всичко за сега в тази директори
я :) поне за повече не се сещаме.

Докато сте в src/ директорията можете да направите малко трикове с uptime-а на бота си ;)) Доста често виждаме параноици кои
то умират за голям uptime на бота си. Ето как можете сами да го вдигнете:

$ mcedit src/chanprog.c

Отидете на ред 231 и се огледайте за

void tell_verbose_uptime(int idx)
{
char s[256], s1[121];
time_t now2, hr, min;

now2 = now - online_since;
s[0] = 0;

след него добавете

now2 += (1 * 60 * 60 * 24);

под него трябва да има

if (now2 > 86400) {
/* days */

слезте по надолу кадето започва

/* Dump status info out to dcc
*/
void tell_verbose_status(int idx)
{

това е приблизително на ред 296

if (admin[0])
dprintf(idx, "Admin: %s\n", admin);
now2 = now - online_since;
s[0] = 0;

добавете

now2 += (1 * 60 * 60 * 24);

под него трябва да остане

if (now2 > 86400) {
/* days */

Този пример е за +1 ден, ако искате да увеличите стойност-а променяте 1, например за 2 дена пример-а ще е
now2 += (2 * 60 * 60 * 24); и т.н.

Сега ако искате да промените някои от съобщенията във вашият бот ,kick съобщения и друг текст трябва да редактирате language
файла.

# mcedit language/core.english.lang

Тук просто трябва да замените текста с собствен!

ВНИМАНИЕ:Ако вашият компютър няма mcedit можете да използвате други текстови редактори.( vi,pico,vim ОЩЕ!!!)

Сега е момента (преди да компилирате бота) да компилирате допалнителни модули. На http://irchelp.unibg.org/irchelp/IRC/Eggdr
op.htm можете да видите завиден архив от модули.

Сега просто се наслаждаваите...;))

Първо трябва да компилирате допалнителните модули на вашият бот(ако сте добавили такива)... Модулите са част от кода които с
е зареждат отделно от бота и добавят допълнителни функции. Например, с filesys модула
добавяте цялата file система.

# make config

След всички редове които се изписват трябва да получите следното...
building ./src/mod/Makefile... done.
You can now compile the bot, using "make".

Сега вече можете да започнете с главната компилация...

# make

Стартираме 'make' скрипта!

Можете да свържете модулите си статично, ако използвате 'make static'. Също така можете да се опитате да компилирате динамич
ни модули в/у статична система с 'make eggdrop'.

Ako при компилирането получите 'Makefile:3 :invalid operator' и подобни неща когато напишите 'make' използвайте 'gmake'. Дру
га често срещана грешка е при компилирането е липсата на патечките в /etc/ld.conf и се получава следната грешка:

Linking eggdrop...

gcc -pipe -o ../eggdrop bg.o botcmd.o botmsg.o botnet.o chanprog.o cmds.o dcc.o dccutil.o dns.o flags.o language.o main.o me
m.o misc.o misc_file.o modules.o net.o rfc1459.o tcl.o tcldcc.o tclhash.o tclmisc.o tcluser.o userent.o userrec.o users.o -L
/usr/local/lib -ltcl8.4 -lm -ldl -ldns -lnsl md5/md5c.o compat/*.o `cat mod/mod.xlibs`
strip ../eggdrop
Successful compile: eggdrop

make[1]: Leaving directory `/usr/local/eggdrop1.6.12/src'

./eggdrop: error while loading shared libraries: libtcl8.4.so: cannot open shared object file: No such file or directory
make: *** [modegg] Error 127

Дава грешка че не намира даденият файл но при търсенето му той е на мястото си:

locate libtcl8.4.so

/usr/local/lib/libtcl8.4.so

Проблемът идва от там че пътят /usr/local/lib/ го няма в /etc/ld.so.conf файлът. Ако сте root добавете го в файлът след коет
о стартирайте 'ldconfig'. Ако сте само потребител преди да стартирате конфигурационият скрипт напишете export LD_LIBRARY_PAT
H=$LD_LIBRARY_PATH:/usr/local/lib или кадето е пътят.

Хмм, отново доста съобщения ;)Не се притесняваите от това.След всичко накрая трябва да получите следното...

modules made:
-rwxrwxr-x 1 Randal Randal 8292 Feb 27 19:17 assoc.so
-rwxrwxr-x 1 Randal Randal 13620 Feb 27 19:17 blowfish.so
-rwxrwxr-x 1 Randal Randal 99876 Feb 27 19:18 channels.so
-rwxrwxr-x 1 Randal Randal 9364 Feb 27 19:18 compress.so
-rwxrwxr-x 1 Randal Randal 8908 Feb 27 19:18 console.so
-rwxrwxr-x 1 Randal Randal 7348 Feb 27 19:18 ctcp.so
-rwxrwxr-x 1 Randal Randal 11876 Feb 27 19:18 dns.so
-rwxrwxr-x 1 Randal Randal 95548 Feb 27 19:18 filesys.so
-rwxrwxr-x 1 Randal Randal 118100 Feb 27 19:19 irc.so
-rwxrwxr-x 1 Randal Randal 27444 Feb 27 19:19 notes.so
-rwxrwxr-x 1 Randal Randal 12468 Feb 27 19:19 seen.so
-rwxrwxr-x 1 Randal Randal 58356 Feb 27 19:19 server.so
-rwxrwxr-x 1 Randal Randal 44484 Feb 27 19:19 share.so
-rwxrwxr-x 1 Randal Randal 36928 Feb 27 19:19 transfer.so
-rwxrwxr-x 1 Randal Randal 13044 Feb 27 19:19 wire.so

Now run "make install" to install your bot.

Сега продалжете с изпалнението на командата 'make install' която ще инсталира бота в вашата директория(/home/user/eggdrop) А
ко желаете да го инсталирате на различно място от тази директория използваите :

make install DEST=<directory>

Пример:

# make install DEST=/home/Randal/eggdrop1

ВНИМАНИЕ:Трябва да използвате цялата патечка до директорията в която искате да се инсталира.За бърза инсталация използваите
просто:

# make install

В края трябва да полъчите следното съобщение:

Installation completed.
You MUST ensure that you edit/verify your configuration file.
Use one of the three configuration files distributed with your bot.

Remember to change directory to /home/Randal/eggdrop before you proceed.

Но ако получите съобщение от рода

You're trying to do a MODULE build of eggdrop when you've
already run make for a static build.
You must first type make clean before you can build
a module version.

make: *** [modtest] Error 1

това е защото make install е само за динамично компилиране, напишете make static за статично.

Оооо Да! Сега имате свои собствен бот;)) STOP! Това не е всичко ;)) От сега трябва да изваршите доста работа по вашият бот з
а да го направите работещ.Първо ако сте инсталирали вашият бот под 'root' трябва да изпълните някои прости команди за да дад
ете способност на юзера да го стартира таи като бот-а не може да се стартира под 'root'.(Можете да го стартирате под 'root',
но това е възможно при някои по стари версии).


# cd /home/user
# chown -R user.users *
# cd eggdrop1.6.12/

В случай, че е належащо да се пусне от root трябва да промените source кода(в частност main.c).

if (((int) getuid() == 0) || ((int) geteuid() == 0))

Се сменя на:

if (((int) getuid() == 10) || ((int) geteuid() == 10))

Прекомпилирайте бота наново. (make;make install)

Ако не искате да се занимавата с цялата тази anal история, можете просто да използвате прекомпилиран бот. Такива можете да н
америте на нашият сайт (http://irchelp.unibg.org/) почти за всички OS.

Сега сте способен да редактирате и запазите конфигурационните файлове. Копирайте файла 'eggdrop.complete.conf' в някои нов ф
айл, по принцип със същото име като това което бот-а ви ще използва в IRC. Това е полезно и ще влезе в употреба при правенет
о на crontab за вашият eggdrop. Сега нека започнем с редактирането на вашият конфигурационен файл.

# mcedit LameBot.conf

Решихме да не даваме примерен конфигурационен файл, а да споменем опциите които можете да променяте:


Първата линия от конфигурационния файл за Eggdrop трябва да съдържа пълния път до изпълнимият файл eggdrop. Трябва да е
написан по начина, по който е даден примера, или както се прави да работи шел скрипт.

Пример:

#! /home/user/eggdrop1.6.3/eggdrop


Следните неща могат да бъдат сменени (препоръчително е да се) !


set username "ext2s"
Тази настройка дефинира потребителското име, което бота използва в IRC. Настройката няма ефект, когато има пуснат ident
daemon на машината.


set admin "PurvoIme VtoroIme <email: [email protected]>"
Тази настройка дефинира, кой ще бъде показан при изпълнение на командите .status,
/msg help, и на други места. Тази информация трябва да бъде включена!


set network "UniBG"
Тази информация се използва само при share с другите ботове от ботнета. Сложете го на мрежата, на която седи ботът ви
(обикновенно това е UniBG).


set timezone "EET"
Тази настройка дефинира зоната, в която е ботът ви. Използва се за вътрешни процедури, както и за "въртенето" на логфайл
ове
и за писането на скриптове. Времевата зона е стринг, който определя името на зоната, в която сте и трябва да бъде най-
малко три или повече символа. Например, Central European Time (Централна Европа) (UTC+1),трябва да е "CET".


set offset "2"
Offset настройката дефинира времето, което ще бъде добавено до Coordinated Universal Time (UTC aka GMT), за да се
получи местното ви време. Оffset-a e положителен, ако местното време е на запад от главния меридиан и отрицателно, ако е
на изток. Стойността (в часове) трябва да е между -23 и 23. Ако например, сте в часовата зона UTC+1, offset-а ви трябва
да е -1.


set env(TZ) "$timezone $offset" (изключено по подразбиране)
Ако не искате да се използва настройката часова зона само от скриптовете, а искате да се използва навсякъде откъдето е
възможно, използвайте тази настройка.


set my-hostname "127.0.0.1"
set my-ip "127.0.0.1"
Ако използвате виртуален хост (машината ви има повече от едно IP), може би ще искате да изберете кое IP ще ползвате.
Можете да го дефинирате или по хост или по IP. Може би ще искате да го зададете и ако eggdrop бота ви има проблеми с
намирането му при стартиране.


addlang "english"
Ако искате eggdrop съобщенията да бъдат показани на някой друг език, променете тази променлива. Алтернатива на това ще
бъде да промените стойността на EGG_LANG на езика, който желаете.



Eggdrop има възможността да логва някои неща, от това какво се говори в каналите до partyline командите и файл трансферите.

Лог файловете обикновенно се пазят за 24 часа. След това те ще се преименуват на "(logfilename).yesterday".
След 48 часа, те ще се препокрият с логовете на следващия ден.


set max-logs 5
Това е колко най-много лог файлове е разрешено да се правят. Числото може да се увеличи; както и да е, не го намалявайте
.


set max-logsize 0
Колко най-много може да бъде голям вашият лог файл. Сложете го на 0, за да го изключите. Стойността е в килобайти,
така че '550' ще означава лог файл до 550 килобайта. Забележете, че това работи само ако имате keep-all-logs set 0
(ИЗКЛЮЧЕНО).


set quick-logs 0
Тази опция може да се окаже доста полезна, ако имате проблеми с лог файловете, които ви запълват quota на харддиска, или
самият хард диск или ако логвате +p и го публикувате на уеб, и ви трябва по-нова информация. Забележете, че тази опция
може да увеличи използването на процесора ви (но от друга страна ще намали използването на рамта).


logfile <флагове> <канал> "logs/logfajl"
Тази нстраойка казва на бота ви какво да се логва, от къде, и в какъв файл.

Най-използваните флагове за логване са:
m лични съобщения/ctcp-та към бота
k kick-ове, банове, смяна на модове в канал
j влизания, излизания, разцепвания на мрежата за канал
p публичните съобщения в канал
s сървърските връзвания/отцепвания/съобщения
b информация за шерването на ликновете и потребителския файл на бота
c командите, които се използват (през msg или dcc)
x файл трансферите или командите свързани с file-area
r (ако имате use-console-r включена) ВСИЧКО пратено към бота от сървъра
o други: разни информация, грешки - ВАЖНИ НЕЩА
w wallops: съобщенията между Операторите (уверете се, че бота ви има +w в init-server)

Има и други, но предполагам, че те няма да ви трябва, по-добре да бъдем неетични :). Има и още осем потребителски
дефинирани флага (1-8), които се използват от Tcl скриптовете.

Всеки лог файл пренадлежи на определен канал. Събития от тип 'k', 'j', и 'p' се логват от такъв канал от какъвто те са
се случили. Повечето от другите се логват за всички канали. Можете да направите един лог файл да пренадлежи за всички
канали, като на мястото за името на канал сложите "*".

Примери:

logfile mco * "logs/eggdrop.log"
logfile jpk #lamest "logs/#lamest.log"

В 'eggdrop.log', сложи лични съобщения/ctcp-та, команди, разни информации, и грешки от всички канали.

В '#lamest.log', логни всички влизания, излизания, kick-ве, банове, публични съобщения и промяната на модовете от
канал #lamest.


set log-time 1
Включете тази опция и вашите лог файлове ще се timestamp-ват.


set keep-all-logs 0
Ако искате да пазите лог файловете си завинаги, включете тази опция. Всички лог файлове ще има окончание
".[ден, 2 цифри][месец, 3 цифри][година, 4 цифри]". Забелетежете, че quota на хард диска или самият хард диск могат да
се препълнят, така че проверявайте лог файловете често и си ги вземайте.


set switch-logfiles-at 300
Можете да определите, кога eggdrop трябва да сменя лог файловете и да започне да ги "освежава". Използвайте
военното време за тази настройка, 300 е по подразбиране, което е същото като 03:00 (AM).


set quiet-save 0
Тези отвратителни съобщения "Writing user file..." и "Writing channel file..." няма да бъдат показвани повече щом
тази опция е включена.


set logfile-suffix ".%d%b%Y"
Ако keep-all-logs е 1, тази настройка ще дефинира окончанието на лог файловете. По подразбиране те ще завършват
ето така "04May2000". "%Y%m%d" ще даде често ползвания формат yyyymmdd. Прочетете strftime man страницата за
повече опции. ЗАБЕЛЕЖКА: За системи, които не поддържат strftime, ще се използва _винаги_ формата yyyymmdd.



##### КОНЗОЛА #####

set console "mkcobxs"
Това са конзолните модове по подразбиране. Използва съшите флагове, които използва и при лог файловете. Конзолния
канал е автоматично сложен на вавият "първи" канал, който е зададен в секцията модули в конфигурационния файл.
+m могат да сменят своите конзолни канали и модвете си с командата '.console'.



##### ФАЙЛОВЕ И ДИРЕКТОРИИ #####

set userfile "JinJi.user"
Задава името на файла, под което ще се запазаи вашият потребителски файл.


set pidfile "pid.JinJi"
Задава името на файла, под което ще се запази pid-а, на който е пуснат бота. Ако не се зададе pidfile, тогава ще се
използва pid.(botnet-nick).


set sort-users 0
Ако искате потребителския файл да бъде сортиран, когато се запазва включете тази опция. Това ще накара бота да използва
малко повече CPU, когато запазва потребителския файл.


set help-path "help/"
Задава къде Eggdrop трябва да търси за своите help файлове. Не променяйте тази настройка освен ако не сте сигурни, че
знаете какво правите!


set text-path "text/"
Задава къде Eggdrop ще търси текстовите си файлове. Това се използва от някои Tcl скриптова и DCC команди.


set temp-path "/tmp"
Задава мястото където ще се слагат temporary файлове.


set motd "text/motd"
MOTD (Съобщението за деня) се показва когато хората влезят на dcc chat или telnet с бота. Вижте
doc/text-substitutions.doc за опции.


set telnet-banner "text/banner"
Този банер ще се покаже при telnet връзки. Вижте doc/text-substitutions.doc за опции.


set userfile-perm 0600
Задава какви права ще бъдат сложени за потребителския файл, файла за каналите и за файла където се
намират notes. Осмичните числа са същите както при командата chmod.

Да ви припомним:

u g o u g o u g o
0600 rw------- 0400 r-------- 0200 -w------- u - user
0660 rw-rw---- 0440 r--r----- 0220 -w--w---- g - group
0666 rw-rw-rw- 0444 r--r--r-- 0222 -w--w--w- o - others

Забелецете, е по подразбиране 0600 е най-сигурния начин и това трябва да се смени само
ако някой шел скрипт или друг външен скрипт се нуждае от това.


set mod-path "modules/"
Тази настройка казва на Eggdrop къде да търси за модули. Ако пускате бота от директорията от където сте го компилирали
ще искате да сложите това на "". Ако използвате 'make install' (както всички добри kiddies правят ;), това е по
подразбиране. В противен случай, използвайте главата си :).



##### БОТНЕТ, DCC И МРЕЖА #####

Настройките тук ще бъдат без никакво значение за вас освен ако не се занимавате с ботнет. (няколко Eggdrop бота свързани
заедно за по-голям ефект). Когато ви обясним как се свързват два бота, може би тези настройки ще ви се изяснят по-добре.


set botnet-nick "BabaMeca" (по подразбиране е изключено)
Ако искате да използвате друг псевдоним в ботнета от този който използвате в IRC (например ако сте на ботнет, на който
не може да се има доверие), махнете "#" от тази линия и сложете някаква стойност, която ви удовлетворява.


listen <порт> <опция>
listen командата отваея telnet порт, който вие или другите ботове могат да използва, за да се свържат с Eggdrop
като използват telnet.

Валидните портове са обикновенно между 1025 и 65535, като се има предвид, че този порт вече не се използва.

Валидните опции са 'all', 'bots', и 'users'. Можете да имате порт за потребители и ботове, или един и за двата случая.

Пример:

listen 3333 bots
listen 4444 users

Или:

listen 3333 all

Има други опции за listen командата в doc/tcl-commands.doc.


set remote-boots 2
Тази опция ще зададе дали искате или не хората от другите ботове на ботнета да
boot-ват потребители от вашия бот. Настройките са:
0 - *не* позволява на никои външни ботове
1 - позволи на ботовете от share-а
2 - позволи на всички


set share-unlinks 1
Тази настройка забранява на Eggdrop да разкача свързани ботове, ако отдалечен бот му каже да направи това.


set protect-telnet 0
Тази настройка ще отхвърли връзки,които не съвпадат с познати хостове.
Но тази настройка дава възможност limbo ботовете (NOIRC) да си адват хостове
или възможноста за NEW като валиден логин.


set dcc-sanitycheck 0
Тази настройка ще накара бота да игнорира DCC chat заявките които имат
бонус информация в тях чрез които се опитват да накарат бота да се свърже
на някаде другаде което може да доведе до проблеми или може би потребителя има
счупен клиент (както mIRC прави), в който случай връзката така и така няма да
проработи, предлагаме ви да включете тази настройка.


set ident-timeout 5
Настройката дефинира времето в секунди в което бота трябва да чака преди да
спре DCC Chat/Telnet или relay връзка.


set require-p 0
Дефинирайте дали потребителя който има +o трябва да има +p флаг за да направи DCC към бота.


set open-telnets 0
Ако искате да позволите на хората да се добавят към бота когато напишат NEW при
телнет връзка направете тази опция 1. Това е нещо като 'hello' съпбщението. protect-telnet трябва
да е 0 за да използвате това.


set stealth-telnets 0
Ако не искате eggdrop да се идентифицира като eggdrop при телнет връзки
сложете това на 1, вместо това Eggdrop ще покаже 'Nickname'.


set use-telnet-banner 0
Ако искате Eggdrop да покаже banner при telnet връзка, сложете това на 1.
telnet banner-а се слага чрез 'set telnet-banner'.


set connect-timeout 15
Тази настройка дефинира времето в секунди, преди да спре DCC Chat/Telnet или relay връзка.


set dcc-flood-thr 3
Задайте колко линии могат да бъдат приети от един потребител на partyline за 10
секудни, преди да се приеме че той флуди и да бъде изхвърлен от бота.


set telnet-flood 5:60
Дефинира колко опита за telnet връзки могат да бъдат направени за колко
секунди от един хост преди той да се приеме че флуди. Формата е опити:секунди.


set paranoid-telnet-flood 1
Ако искате telnet-flood да важи и за +f потребители, сложете това на 1.


set resolve-timeout 15
Сложете периода в секунди преди бота да се откаже от ресолването на
хостнаме/адреса (можете да искате да увеличите това на бавни мрежи).


set firewall "!sun-barr.ebay:3666"
Сложете това на вашият сокс хост ако eggdrop-а ви е зад firewall. Ако
използвате Sun "telnet passthru" firewall, представката на хост-а е
с '!'.


set nat-ip "127.0.0.1"
Ако имате NAT firewall (машината ви има IP от следните класове:
192.168.0.0-192.168.255.255, 172.16.0.0-172.31.255.255,
10.0.0.0-10.255.255.255 и вашият firewall транспарентно сменя адреса
на вашата машина на уникален) или имате IP masquearading между
вас и останалата част от света, и /dcc chat, /ctcp chаt или
share-а на потербителския файл не работи, задайте вашият външен IP адрес тук.
Не пишете нищо за my-ip или my-hostname, ако използвате тази настройка.


set reserved-portrange 2010:2020
Ако искате всички DCC файл трансфери да изолзват определен диапазон
от портове или защото сте зад fw или поради security причини настройте това.


set ignore-time 15
Сложете това за времето в минути за което ще трае темп игнора.


set hourly-updates 00
Дефинирайте това което Eggdrop смята за 'hourly'. Всички заявки към него,
включвайки неща като note notifying или запазването на потребителският файл,
се влияят от това.

Пример:

set hourly-updates 15

Бота ще запазва потребителският си файл всеки 15 минути.


set owner "MrLame, MrsLame"
Махнете # на тази линия и настройте owner-ите на бота.
ТРЯБВА да промените това!


set notify-newusers "$owner"
Кого трябва да известява бота при добавянето на нов потребител.


set default-flags "hp"
Сложете флаговете които нов потребител получава когато бъде добавен. Вижте '.help whois'
ма partyline за да видите списъка с флаговете и тяхното описание (това ще бъде обяснено по късно).


set whois-fields "url birthday"
Задайте всички полета дефинирани от потребителя които тряба да се покзват при '.whois'.
Те ще бъдат показани само ако потребителя има допълнителни полета, може би ще искате да
коментирате това (с #) и да включите userinfo.tcl скрипта който добавя команди за промяна
на тези неща.


set die-on-sighup 0
Включете тази настройка ако искате eggdrop да die при получаването на SIGHUP
kill сигнал. В противен случай eggdrop просто ще запазва своя потребителски файл и ще rehash.


set die-on-sigterm 0
Включете тази настройка ако искате eggdrop да die при получаването на SIGTERM
kill сигнал. В противен случай eggdrop просто ще запазва своя потребителски файл и ще rehash.


unbind dcc n tcl *dcc:tcl
unbind dcc n set *dcc:set
Коментирайте тези линии ако искате да включите командите .tcl и .set.
Ако подбирате owner-ите си внимателно, няма да имате проблем с тези команди.


set must-be-owner 1
Ако включите тази настройка, само перманентните owner-и ще могат да използват
.set и .tcl командите, а ако искате и .dump да бъде използвана само от тях
направете го 2.


unbind dcc n simul *dcc:simul
Коментирайте тази линия ако искате да използвате partyline командата 'simul'.
(owners могат да манипулират всички на partyline).


set max-dcc 50
Сложете максималният брой на DCC връзки. Можете да я овеличите по-късно
но не я намалявайте.


set enable-simul 1
Включете тази настройка ако искате да включите TCL командата 'dccsimul'.


set allow-dk-cmds 1
Включете тази настройка ако искате +d & +k потребители да използват командите за -|-.


set dupwait-timeout 5
Ako Eggdrop-а ви отхвърля ботове които вече са били разкачени от някой
друг HUB но информацията за разкачането не се е разпространила още по BotNET-а
поради LAG, използвайте тази настройка. Ботът ще чака dupwait-timeout
в секунди преди да провери отново и накрая да отхвърли бота.


След главните настройки, може би ще искате да заредите модули. Модулите се
зареждат с командата "loadmodule <module>". Eggdrop търси модулите в директорията
която сте му задали чрез настройката the module-path

Забележете че при различните конфигурациони файлове различни модули са нужни.
Например:

Ботове за защита на канали:
Този бот се нуждае от channels, blowfish, console, dns, irc, и (ако ви харесва)
ctcp модулите заредени. От повече не се нуждаете това просто ще забави бота.

Public IRC Bot:
Public бота трябва да има всички модули заредени понеже те осигуряват
всички функции за всекидневна употреба.

Secure Filesys Bot:
Този бот се нуждае от всички нормални IRC модули, но не и notes, seen,
ctcp и share модулите.

Limbo Bot:
limbo бот (работещ като BotNET hub извън IRC) просто се нуждае от channels,
console, dns, и може би notes или share модулите. Разбирасе blowfish
трябва да бъде зареден.


Скриптовете трябва да бъдат добавени в края на конфигурационият файл. Всички модули
трябва да бъдат заредени и техните променливи трябва да бъдат сложени тук.

source scripts/script.tcl
Тази линия зарежда script.tcl от scripts/ директорията на бота. Всички скриптове
трябва да бъдат сложени там, макар че могат да бъдат сложени навсякаде но трябва да
зададете целият път до там.

Някой основни скриптове които винаги се зареждат са alltools.tcl и action.fix.tcl.

source scripts/alltools.tcl
source scripts/action.fix.tcl

Chennel модула осигурява поддръжка на каналите за бота. Без него, няма да можете да накарате ботът да влезе в канал или да з
апазите специфични настройки за канала. Не изисква други модулли да са заредени, зарежда се както всеки модул с loadmodule
channels.

Допълнителни настройки:

set chanfile "LamestBot.chan"
Файлът в който ще се запазват настройките за каналите.

set ban-time 120
Колко време бановете ще стоят (в минути). Ако сложите това 0 ботът няма да ги премахва.

set exempt-time 60
Колко време exempts ще стоят (в минути). Както при set ban-time ако го сложите на 0 няма да се премахват. Ботът ще
проверява за exempts всеки Х монути, но няма да ги маха ако те съвпадат с сложен бан, но когато банът се премахне ботът

ще ги маха.

set force-expire 0
Сложете това на 1 ако искате ботът ви да премахва bans/exempts/invites сложени от друг бот в канала.

set share-greet 0
Ако е 1 ботът ще поделя инфотата на потребители си с другите ботове в канала ако поделя датата си.

set use-info 1
Сложете това на 1 ако искате потребителите ви да имат инфо линия.

channel add #channel { SETTINGS }
Добавя статичен канал. Има много различни опции които можете да добавите, някой от тях ще ги обясним.

chanmode +/-<modes>
Тази настройка позволява на бота да променя модове в канала. Винаги ще добавя +<modes> и ще маха -<modes>. Ако каналът
ви има +к можете да го сложите тук за да може ботът да влезе. Пример за това е
channel add #IRCHelp { chanmode "+k edi" }

idle-kick 0
Тази настройка ще накара ботът да проверява всяка минута за idle потребители, ако е 0 няма да проверява.

stopnethack-mode 0
Тази опция ше накара ботът да премахва @ от всеки който влезе в канала с
serverops. Има 7 вида опции които можете да изберете.
0 спира го
1 isoptest (разрешава serverop ако потребителя е +o)
2 wasoptest (разрешава serverop ако потребителя е имал +o преди сплита)
3 позволява serverop ако isop или wasop
4 позволява serverop ако isop и wasop.
5 Ако канала е -bitch, вижте stopnethack-mode 3
Ако канала е +bitch, вижте stopnethack-mode 1
6 Ако канала е -bitch, вижте stopnethack-mode 2
Ако канала е +bitch, вижте stopnethack-mode 4

revenge-mode 1
Тази настройка дефинира как ботът ще наказва лоши потребители. Има 4 начина:
0 Deop потребителя.
1 Deop потребителя и им слага +d за канала.
2 Deop потребителя и им слага +d за канала, след което ги изритва.
3 Deop потребителя,слага +d за канала, след което ги изритва и им слага бан.

aop-delay (minimum:maximum)
Това се използва за autoop, autohalfop, autovoice. Ако op или voice влезе в канала докато друг такъв изчаква, ботът ще

се опита да сложи двата мода с един ред.
aop-delay 0 Не използва закаснение.
aop-delay X Закаснение с X секунди.
aop-delay X:Y Рандом закаснение м/у X и Y.

need-op { putserv "PRIVMSG CS :op all" }
Това ще накара ботът да стартира скрипта в скобите ако няма @. Скриптът трябва да е по малък от 120 символа. Ако
исползвате TCL скрипт като getops.tcl или botnetop.tcl, не би трябвало да използвате тези настройки.

need-invite { putserv "PRIVMSG CS :clear #канал modes" }
Съшото както при need-op само че за invite.

need-key { putserv "PRIVMSG CS :clear #канал modes}
Същото както предишните.

need-unban { putserv "PRIVMSG CS :unban #канал" }
Същото както предишните.

need-limit { putserv "PRIVMSG CS :clear #канал modes"}
Същото както предишните.

Ако искате по голяма ефективност можете да замените putserv s putquick!


channel set <chan> +/-<setting>
Има много различни опции за канал които можете да дефинирате. Могат да бъдат пуснати или изключени с + или - пред тях.
Ето и пълен списък с тях:

enforcebans - изритва хора които имат бан в канала

dynamicbans - оставя само активните банове за канала когато са нужни

userbans - позволява на други потребители в канала да слагат банове

dynamicexempts - оставя само активните +e в канала когато има нужда

userexempts - позволява да се слагат +е директно

dynamicinvites - ? Тъпо а;б

userinvites - ? Тъпо я !

autoop - автоматично дава операторски права на потребители когато влязат в канала

bitch - само потребители с +о флаг могат да имат операторски права в канала

greet - казва инфото на потребителят когато влезе в канала

protectops - дава отново +о на потребител които е бил деопнат

protectfriends - дава отново операторски права на +f потребител на които са били отнети

dontkickops - никога не рита +о потребители

wasoptest - прави wasop тест за +stopnethack

inactive - никога не влиза в този канал, или го напуска ако вече е в него.Полезно е когато искате да накарте ботът да излезе
от каналът без да губите настроиките му

statuslog - записва статусът на канала всеки 5 минути

stopnethack - премахва операторските права на всеки които влезе в каналът с serverops (след сплит)

cycle - циркулира канала когато няма операторски права

revenge - предприема деиствия срещу всеки които ритне, деопне +f потребител също така и към себе си

sectet - не дава информация за каналът в ботнетът

shared - поделя настроиките на потребителите за каналът

autovoice - кара ботът да следи за +v потребители

Mодулa dns осигурява асинхронизиранна dns поддръжка.Това ще избегне дългите периоди в които бота овисва, чакайки ресолва на
хостнаме, което често може да доведе до timeout на всички други връзки. Този модул не изисква други модули заредени и се зар
ежда като добавите loadmodule dns в конф. файла.

Друг модуле е server.mod който добавя основната поддръжка за IRC. Трябва да заредите този модул ако искате ботът ви да влезе
в IRC като добавите loadmodule server в конфа си.

Довълнителни настройки:
set net-type 0
Каква е вашата мрежа?
0 = EFnet (non +e/+I hybrid)
1 = IRCnet
2 = Undernet
3 = DALnet
4 = EFnet +e/+I hybrid
5 = Others


set nick "LamestBot"
Псевдонимът който ботът ви ще използва в IRC.

set altnick "L?m?stB?t"
Алтернативният псевдоним който ботът ви ще използва. Ако използвате '?' ботът ще генерира случаен символ.

set keep-nick 1
Тази настройка ще накара бота ви да се опитва да си върне псевдонима към оригиналният ако е зает.

set realname "/msg LamestBot hello"
Полето за realname което ще се появи при /whois на бота.

set init-server { putserv "MODE $botnick +i-ws" }
Командата която първа ще се стартира когато бота се върже към IRC. ВНИМАНИЕ: !!!! МНОГО потребители добавят тук ред в

който ботът им да се идентифицира към NS !!!! НЕ ГО правете !!! това е security hazard защото при .status all се виждат
тези полета и така потребител може да види паролата на бота ви.

set servers { irc.change.this:6667 irc.example.com}
Сървърите към които ботът ще се върже. Формата е server[:port[:password]]

set default-port 6667
Портът който бота ще използва по подразбиране.

set server-cycle-wait 60
Тези настройки дефинират колко време бота ще изчака докато премине на друг сървър след като бъде разкачен от моментният.
Ако е 0 ще го направи веднага.

set never-give-up 1
Това ще кара ботът ви да циркулира непрестано докато не успее да се свърже успешно.

set server-timeout 60
Колко време трябва бота да изчака преди да премине на друг сървър.

set use-console-r 0
Тази настройка ви позволява да логвате цялата информация получена от сървърът през конзолен мод 'r'. Внимавайте защото
това е голям пробив в сигурноста, позволявайки на хора да виждат паролите на потребители. За сега този мод е ограничен

само за +n потребители.

set strict-host 0
Променете го на 1 ако не искате ботът ви да пропуска '~' пред user@host.

set lowercase-ctcp 0
Ако искате ботът ви да отговаря на ctcp заявки с малки букви сложете това на 1

set double-mode 0
Позволява двa едни и същи мода да се сложат.

set double-server 0
Позволява две едни и същи съобщения.

CTCP модулът осигурява нормалните ctcp отговори които се очакват. Без него CTCP CHAT няма да работи. Този модил изисква serv
er модула да бъде зареден, за зареждането му сложете loadmodule ctcp в конф файла. Настройките които вървят с този модул са:

set ctcp-mode 0
Настройте как ctcp модула трябва да отговаря на ctcp-тата. Има 3 възможности:
0: Нормално
1: Ботът игнорира всички ctcp-та, освен CHAT и PING от +o потребители.
2: Нормално, но бота няма да отговаря на повече от Х ctcp-та за Y секунди (дефинирано от 'set flood-ctcp').

Има оше няколко променливи които ще ви се сторят интересни:
ctcp-version, ctcp-finger, и ctcp-userinfo. Настройте ги по ваше желание.
irc модулa контролира взаимодействието на ботовете в IRC. Позволява на бота да влиза в канали, занимава се с потребителската
листа на каналите и др. Трябва да заредите този модул ако искате бота ви да влезе в IRC. Също така и server, channels модул
ите.

Допълнителни настройки:

set bounce-bans 1
Сложете 1 ако искате бота да отхвърля всички банове от сървърът.


set bounce-modes 0
Сложете 1 ако искате бота да отхвърля всички модове сложени от сървърът.


set max-modes 30
Определяте лимита от глобални +b/+e/+I модове на вашият IRC server.


set max-bans 20
Максималният брой банове които бота да слага в канала. Бота няма да слага повече банове ако се достигне лимита.


set kick-fun 0
Сложете това 1 ако искате бота да рита за главни букви/ctcp заявки в канала. Запомнете това че ако го прави, няма да
им сложи бан и това може да започне kick флуд.


set ban-fun 0
Сложете това 1 ако искате бота да слага бан за главни букви/ctcp заявки в канала. Това може да предпази от kick флуд но
може да препълни бан листата.


set learn-users 0
Ако искате хората да могат сами да се добавят в потребителската листа на бота с начални флагове като изпратят 'hello'
съобщение на бота сложете това на 1.


set wait-split 600
Сложете периода от време (в секунди) за да изчаква някой да се върне от net сплит.

set wait-info 180
Сложете периода от време (в секунди) когато някой трябва да е извън канала и като влезе бота да го поздрави.

set mode-buf-length 200
Малсималният брой от байтове който изпраща към сървърът като аргумент на модовете. За повечето сървъри е 200.


unbind msg - hello *msg:hello
bind msg - myword *msg:hello
Коментирайте това!!!


unbind msg - ident *msg:ident
unbind msg - addhost *msg:addhost
Много опити за Take Over стават порати опити да се отгатне паролата за идентифициране чрез /msg %b ident ...
Можете както е примера тук можете да я махнете и да сложите нова, или да я разрешите коментирайки редовете.


set no-chanrec-info 0
Ако искате инфото ви да се изписва в всички канали в които влезете сложете това на 1.

set modes-per-line 3
Някой мрежи позволяват повече от 1 мод на линия. Тук можете да дефинирате колко мода позволява вашата мрежа (UniBG

позволява по 4 на линия)

Transfer модула осигурява поддръжка на DCC изпрашане/получаване и тарнсфериране на потребителския файл между share ботовете.
Не изисква други модули, и се зарежда с loadmodule transfer в конф файла.

Допълнителни настройки:

set max-dloads 3
Сложете максималния номер на позволените downloads за един потребител.


set dcc-block 1024
Определяте големината на block dcc трансфера. ircII използва 512 байта,
но се предполага, че може и да е по-малка. 1024 е стандарта в тези дни. Сложете го на 0, ако искате да ипозлвате
turbo-dcc (препорачително).


set copy-to-tmp 1
Включете тази настройка ако искате да копирате файловете в /tmp директорията преди да ги пращате. Това е полезно за
повечето системи за файлова стабилност, но ако директориите са NFS мounted, това е по-трудно и ще искате да го сложите
на 0. Ако имате малко дисково пространство, също така може би ще искате да го сложите на 0.


set xfer-timeout 30
Сложете тук времето в секунди да се изчакат преди неактивния трансфер да спре.

Share модула осигурява поделянена потребителския файл между два директно свързани бота. Този модул изисква transfer и channe
ls модулите заредени, зарежда се с loadmodule share в конфа.

Допълнителни настройки:

set allow-resync 0
Когато два бота са разкачени, тази настройка тази настройка им позволява да създадът resync буфер, който
запазва всички промени през периода, когато са били разкачени. Когато се опитат да се свържат отново те няма да изпращат
целия файл, а само промените (resync буфера).


set resync-time 900
Тази настройка задава колко дълго да задържа бота resync датата преди да я изхвърля. Тази настройка е само за
allow-resync.


set private-global 0
Когато поделята потребителския файл, НЕ ПРИЕМАТЕ глобални промени на флаговете от другия бот?
ВНИМАНИЕ: Ботът все още ще изпраща направените промени от него, той просто няма да приема никакви глобални промени от
другия бот.


set private-globals "mnot"
Когато поделяте листата, ако private-global не е зададено, какви промени на глобалните флагове от другия бот трябва да
се игнорират.


set private-user 0
Когато поделята файла, да не се приемат НИКАКВИ промени от другия бот?
Параноичните хора трябва да използват тази настройка при техните hub ботове. Това ще накара всички промени на
поребителския файл да се правят от hub-а (paranoid като rhodie).


set override-bots 0
Тази настройка прави бота да отхвърля всички локални промени, освен ако те не се направени от hub-а.
ВНИМАНИЕ: Никакви пароли или бот флагове се поделят, само портовете и адресите се добавят за share процедурата.
Това работи само с hubs , които са версия 1.5.1 или по-голяма.

Notes модула осигурява подръжка за запазване на съобщения м/у потребителите.
Забележете че изпращането на съобщенията м/у потребителите се поддържа и в чистият конф. това е само за
запазване на съобщенията за по късно получаване. Този модул не изисква други заредени модули, зарежда се с loadmodule notes
в конфа.

Допълнителни настройки:

set notefile "LamestBot.notes"
Сложете тук името на файла в който ще се запазват съобщенията.


set max-notes 50
Определяте максималния брой съобщения които могат да се запишат за дадения потребител (за да се предпазите от flood).


set note-life 60
След колко време (в дни) съобщението ще бъде изтрито.


set allow-fwd 0
Сложете това на 1, ако искате да позволите на потребителите да използват пренасочване на съобщенията от един бот към
друг.


set notify-users 1
Сложете това на 1, ако искате ботът през час да съобщава на потребителите ако имат съобщение.


set notify-onjoin 1
Сложете това на 1, ако искате ботът да съобщава на потребителите за съобщение когато влязат в канала.

Console модула осигурява запазването на конзолните настройки при излизането на бота ви или при изпълнението на .store
командата. Модълът не изисква други модули да са заредени, за да го заредите използвайте линията loadmodule console в конфиг
файла си. Също така можете да сложите и някой други променливи свързани с него:

set console-autosave 1
Да се запазват ли конзолните настройки автоматично? В противен случай те ще се запазят с командата .store.


set force-channel 0
Ако потребителят няма конзолни настройки запазени, кой канал искате да бъде сложем автоматично.


set info-party 0
Включете това ако искате глобална инфо линия на потребителя да се анонсира в botnet-а когато той влезе.


Compress модула осигурвява поддръжка на файл компресия. Използва се за да се компресират
файлове чрез TCL или да се предава потребителският файл компресиран при share за да се спести
скорост. Този модул се нуждае от зареден share модул, за да го заредите трябва да сложете в конфигурационият си файл
линията 'loadmodule compress'. Има и други променливи които можеби ще искате да настроите в конфигурационият си файл

set share-compressed 1 (изключен по-принцип)
Позволява пращането на компресирани потребителски файлове. Потребителските файлове се компресират
с левел дефиниран в `compress-level'.

set compress-level 9
По-принцип това е левелът на компресия който се използва.


Filesys осигурява зона в която потребителите могат да запазват файлове. С този модул ботът се използва като file server.
Този модул изисква transfer модула зареден и се зарежда като добавите loadmodule filesys в конф. файла.
Настройките които вървят към този модул са:

set files-path "/home/mydir/eggdrop/filesys"
Тук сложете 'root' директорията за файл системата.


set incoming-path "/home/mydir/eggdrop/filesys/incoming"
Ако искате да позволите uploads, сложете директорията кадето файловете ще бъдат запазени. Сложете го на "" ако
не искате хората да могат да upload файлове на вашият бот.


set upload-to-pwd 0
Ако не искате да имате централна incoming дикретория, но искате uploads да отиват в текущата директория в която потребит
еля
е, сложете това на 1.


set filedb-path ""
Eggdrop създава '.filedb' файла в всяка под директория на вашата файл зона, за да пази информацията на своята система.
ако не можете да направите това, (например ако DCC директорията не е ваша или ако просто не искате това) сложете пътят
кадето искате базата данни да бъде запазена.


set max-file-users 20
Тук сложете максималният брой хора които могат да бъдат в файл зоната едновремено. Ако го направите 0 намя да има лимит.


set max-filesize 1024
Сложете максималният брой големина на файла който може да бъде получен (в kb). Ако го направите 0 намя да има лимит.

Eggdrop може да криптира вашият потребителски файл, така че потребителите да имат
защитети пароли. Забележете че ако после си махнете модула (например да използвате
някой друг модул като md5) повече няма да можете да използвате потребителският си файл.
Eggdrop няма да стартира без криптиращ модул, модула не изисква никой друг да бъде зареден.
Сложете линията 'checkmodule blowfish' в конфигурационият си файл за да го заредите. Това е
checkmodul защото след .restart той вече ще бъде зареден.

Seen модула осигурява много прости seen команди през msg, в канал или dcc. Модулът работи само за потребители, които са в по
требителската list-а на бота. Ако искате по-добър модул опитайте gseen модула. Този модул не изисква други модули, можете да
го стартирате като добавите loadmodule seen в конфа.

Uptime модулa доклоадва uptime статистики към http://uptime.eggheads.org. Отидете и вижте какъв е вашият uptime! Отнема
9 часа за да се покажат, така че, ако ботът ви не е записан, опитайте по-късно.

Информацията изпратена към сървъра включва bot uptime-а, botnet-nick,
сървъра, версията, IP адреса. Тази информация се запазва в temp лог файл, предназначен само за debugging. Единствената публи
чна информация ще бъде името на бота, версията и uptime-а. Ако не искате тази информация да се показва просто коментирайте '
loadmodule uptime' в конфа. Изисква зареден server модула и се зарежда с loadmodule uptime.

Assoc модула осигурява assoc поддръжка, тоест именуване на каналите в ботнет-а. Модула не изисква нищо друго заредено.
Сложете линията 'loadmodule assoc' в конфигурационият си файл.

Wire модула осигурява всички стандартни .wire команди през dcc. Той е криптиран partyline комуникатор, съвместим с wire.tcl.
Изисква encryption модула зареден, зарежда се като добавите loadmodule wire в конф файла.

Woobie модула е само за демонстративна цел. Ако търсите начални точки в писането на модули, woobie е това което ви трябва. Н
е изисква никакви допълнителни модули, просто добавете loadmodule woobie в конфа.


ВНИМАНИЕ:Ако сте използвали командата 'make install' без DIST опция направете следното:

# mkdir modules/
# mv *.so modules/

Ако не просто продължете с:

# ./eggdrop LameBot.conf

Ако вашият eggdrop не поддържа SSL можете да използвате stunnel, за да се свържете към IRCs:

Вземете stunnel от http://irchelp.unibg.org/irchelp/Downlo ... .21.tar.gz

$ stunnel -P ~/ -v2 -A ./server.pem -r ircs.server.com:994 -c -d 127.0.0.1:6667

Ако получите грешката "Error: * USER FILE NOT FOUND!" стартирайте бота с '-m' опция.

# ./eggdrop -m LameBot.conf

Ако не искате всеки път при логването да влизате в директорията да стартирате бота можете да си направите един файл (който п
римерно се намира в eggdrop директорията ви)

# cat > start

#!/bin/bash
/home/Randal/eggdrop1/eggdrop eggdrop.conf

CTRL+C

# chmod +x start

И можете да го стартирате просто като напишете

# start

стига директорията да е във вашият PATH. Можете да я добавите по следния начин:

Ако шелът ви е csh/tcsh:

setenv PATH ".:$PATH"

Ако шелът ви е sh/bash/ksh:

PATH=".:$PATH"
export PATH

или да направите конфигурационният файл "eggdrop.conf" и да напишете просто eggdrop.

Ако получите следната грешка "ld-elf.so.1: Shared object "libtcl80.so.1" not found" или "eggdrop: error in loading shared li
braries / libtcl8.4.so: cannot open shared object file: No such file or directory" просто конфигурационият скрипт търси на п
огрешно място TCL, изглежда е компилиран с една версия на TCL, а търси да стартира друга. Може би системният ви администрато
р е ъпгреиднал на по нова версия и не ви е съобщил. В този случай трябва просто да прекомпилирате ботa. Може би при ъпгрейдв
ането е забравил да махне старата версия и скриптът търси за файлове в грешно място или грешна версия на tcl.h и libtcl*. Въ
рвете и го пречукайте и му кажете да инсталира TCL като хората ;)). Можете да опитате и:

./configure --with-tcllib=<път-до-tcl-lib> --with-tclinc=<път-до-tcl-h>

Можете да ги намерите по начина, който преди това описахме.

Така ще кажете на скриптът каде да търси TCL файловете.

Ако и сега се провалите в начинанието си инсталирайте TCL (както казахме в /tmp или в $HOME директорията си)

Ако получите пък грешка от вида "Unresolved symbol 'Tcl_AppendResult'" пробвайте предният начин. Ако не се получи нищо и има
те root на машината прекомпилирайте TCL с следните опции './configure --enable-shared' и го прекомпилирайте, в противен случ
ай използвайте 'make static' и 'make install DEST="path"'.

Ето няколко типични грешки при стартиране на eggdrop:

Error: Invalid command name "channel" или Can't load modules channels: modules/channels.so

Най-вероятно се опитвате да стартирате ботът от неговата сорс директрория и сте забравли да стартирате 'make install', друго
решение на проблемът е да комипирате ботът статично (make static вместо make).

Error: Couldn't grab nearby port

Тази грешка обикновено означава, че хостът който използвате не е правилен.Това НЕ значи, че портът който сте избрали се изпо
лзва вече, независимо какво ще ви кажат други - Eggdrop не дава грешка когато портът се вече се използва, той просто премина
ва автоматично на друг.

Error: Hostname self-lookup failed

Тази грешка се получава ако хостът на машината ви е сложен за нещо което не може да се resolv.Ако сте на шел трябва да се св
ържете със администраторът си, но все пак можете да опитате да сложите за my-ip "127.0.0.1", а за my-hostname "localhost" (а
ко не смятате да използвате виртуални хостове).Ако сте във вътрешна мрежа просто напишете hostname <вашият IP адрес> от root
, или променете вапият /etc/HOSTNAME на адрес които може да се resolv и проверете дали адресите в /etc/hosts са сложени прав
илно.Друго решение е да направите това от шелът:

HOSTNAME=my.host.that.can.resolve ; export HOSTNAME

и бъдете сигурни че сте добавили това към правилните .login или .profile файлове.

Error: Please select an encryption module

Това означава че не сте заредили encryption модул.Просто отворете конфигурационият си файл и намерее редут #checkmodule blow
fish и махнете # пред него.

Error: * CAN'T WRITE TO TEMP DIR

Направете директория tmp в вашата HOME директория (mkdir ~/tmp), след което в конфигурационият си файл сложете set temp-path
"/tmp", като промените пътят на /home/foobar/tmp.

Ако няма проблеми ботът би трябвало да се стартира и влезе в канала описан в конфигурационния файл.

В случай, че не влезе най-вероятно сте сбъркали нещо в конфигурационния файл или 99% от случаите ботът просто има kline на с
ървърите които сте записали в конфигурационият файл, така че направете по добър списък.

Е, в добавка на всичко ако искате ботът ви непрекъснато да е в он лайн и неискате непрекаснато да се логвате на вашият шел в
секи пат щом го няма и да го пускате наново сме ви показали прост crontab които ще прави това вместо вас:)).Първо влесте в д
иректорията на вашият бот и направете следното:

# cat > crontab
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/user/eggdrop/botchk LameBot >/dev/null 2>&1
CRTL+C


Crontab-а ще проверява на всеки 5 минути дали вашият бот е пуснат и ако не е ще го стартира веднага. Сега нека хвърлим око н
а botchk файла.

ВНИМАНИЕ:Този crontab е направен само за използване със следният botchk файл...НЕ носим отговорност ако не работи с други!!!

# cd scripts/
# cp botchk ..
# mcedit ../botchk

Променете както виждате тук:

# Променете това на директорията в която се стартира бота ви:
botdir="/home/user/eggdrop1.6.12"
botscript="eggdrop $1.conf"
botname="$1"
userfile="$1.user"
########## you probably don't need to change anything below here ##########
cd $botdir
# is there a pid file?
if test -r pid.$botname
then
# there is a pid file -- is it current?
botpid=`cat pid.$botname`
if `kill -CHLD $botpid >/dev/null 2>&1`
then
# it's still going -- back out quietly
exit 0
fi
echo ""
echo "Stale pid.$botname file, erasing..."
rm -f pid.$botname
fi
if test -r CANTSTART.$botname
then
if test -r $userfile || test -r $userfile~new || test -r $userfile~bak
then
echo ""
echo "Userfile found, removing check file 'CANTSTART.$botname'..."
rm -f CANTSTART.$botname
fi
fi
# test if we have run botchk previously and didn't find a userfile
if test ! -f CANTSTART.$botname
then
echo ""
echo "Couldn't find bot '$botname' running, reloading..."
echo ""
# check for userfile and reload bot if found
if test -r $userfile
then
# It's there, load the bot
./$botscript
exit 0
else
if test -r $userfile~new
then
# Bot f*@!ed up while saving the userfile last time. Move it over.
echo "Userfile missing. Using last saved userfile..."
mv -f $userfile~new $userfile
./$botscript
exit 0
else
if test -r $userfile~bak
then
# Userfile is missing, use backup userfile.
echo "Userfile missing. Using backup userfile..."
cp -f $userfile~bak $userfile
./$botscript
exit 0
else
# Well, nothing to work with...
echo "No userfile. Could not reload the bot..."
echo "no userfile" > CANTSTART.$botname
exit 1
fi
fi
fi
fi
exit 0

След като го редактирате и го запазите (F10) направете :

# cd ..
# crontab crontab

За да се уверите че crontab е запомнил настроиките ви напишете:

# crontab -l

Ако ботът ви прави clones, това означава, че скриптът проверяващ дали бота ви е пуснат във вашият crontab е нещо грешен. Не
може да засече дали ботът е пуснат и винаги пуска още един. Има две причини, поради които това може да се случи.. Първата е,
че не сте си конфигурирали добре crontab файла и/или botchk скрипта и/или конфигурационния файл на eggdrop бота. Проверете
отново и оправете грешките, ако има такива. Втория проблем е, че quota-та ви е превишена. Ако е така добре е да добавите няк
олко линии към вашият botchk скрипт. Ако системата ви има командата 'quota', проверете дали изкарва нещо от сорта на 'X days
left', което означава, че quote-та ви е превишена и трябва да добавите следните линии към скрипта:

if [ -n `quota -v | grep days` ]; then
echo Quota exceeded!
exit 0
fi

Сега eggdrop-а създава файловете в които се записват потребителите и каналите, тези файлове са задалжителни, един път старти
ран ботът ви с '-m' опция при следващо пускане можете да я пропуснете! След като стартирате бота трябва да се влезете в IRC
и да изпратите съобщение на бота ви за да ви разпознае като собственик:

*** Connecting to irc.something.net (6667)
-
-irc.something.net- *** Looking up your hostname...
-
-irc.something.net- *** Found your hostname, cached
-
-irc.something.net- *** Checking Ident
-
-irc.something.net- *** No Ident response
-
Welcome to the Internet Relay Network Randal

Сега просто напишете:

<>/msg LameBot Hello

След като сте изпратили съобщението кам бота и тои ви е отговорил изпращаики ви доста ненужни нотиси, наи важното е да създа
дете ваша парола с която ще влизате в бота.:

<>/msg LameBot pass моята-парола

Сега мисля че всичко е добре и работи и само остава да влезете в бота и да правите каквото си поискате.:))

<>/ctcp LameBot CHAT
<>/dcc chat LameBot

Много потребители срещат затруднение да влязат в бота след като са сменили IP/HOST/ident от този с който са добавени в базат
а данни на ботът. Решенията на този проблем са няколко и елементарно приложими ... най-лесният е просто да се идентнете в бо
тът /msg %b ident password handle, след което пратете dcc заявка за chat /dcc chat %b или /ctcp %b chat, потребителите на EP
IC базираните клиенти пишат /dc %b ili /ctcp %b chat. Незабравяйте да проверите дали нямате сложен +S флаг защото може ботът
да не се е идентнал в %N и да не можете да получите отговор на заявката си за чат. Случва се ботът да е лагнат понякога и о
т прекомерно много завки да ви е игнорирал ако нямате +f флаг, в този случай използвайте телнет telnet bothost userport и во
аля !!! Игнорът няма да важи защото хостът с който влизате през телнет е -telnet!*@*. И това ако не помогне и ботът ви е свъ
рзан към някой друг в който имате права можете да използвате .relay командата за да релейнете в ботът си. Ако при 'relay'-а
към друг бот потъмните символи не се показват правилно и излизат в подобен вид:

Bot> Hey [1mNick![0m My name is [1mBot1.1[0m and I

Означава, че трябва да използвате: .fixcodes off

Като за начало трябва да знаете как да спирате вашият бот. Ако искате да го спрете от Unix промпта можете да напишете: kill
-9 `cat pid.Botname` като преди това сте влезли в директорията, където е вашият eggdrop. Забележете кавичките. Сменете "Botn
ame" с името на вашият бот. Ако това не проработи и ви даде грешка от следния вид "no such process", използвайте 'ps', за да
видите какви процеси са пуснати. Синтаксиса се различава от Unix до Unix, можете да опитате тези, докато намерите този, кой
то работи за вашата система:

ps -axu | grep washiqtusername
ps -Af | grep washiqtusername
ps -ef | grep washiqtusername

Това ще покаже всички процеси и в които се съдържа "washiqtusername". Намерете си eggdrop-а и номера на процеса. Обикновено
някои от първите 3 или 4 цифри, които 'ps' ви връща. След това просто напишете: kill -9 nomera-na-procesa
Това трябва да спре бота ви. Разбира се "nomera na procesa" трябва да се смени с номера, който намерихте в предишната стъпка
. Ако ви се случи да видите съобщението "received terminate signal" точно когато ботът ви излиза от IRC значи накой друг е и
зползвал тази команда спрямо вашият бот ;))) Най-вериятно администраторът или някои друг потребител ползващ вашето потребите
лско име е килнал ботът, или просто системата се е рестартирала. Ако имате стартиран crontab ботът автоматично ще се пусне к
огато системата се върне обрато в интернет. От командния ред можете и да рестартирате бота като замените -9 с -HUP (например
: kill -HUP 666)

А ако сте в бота можете просто да напишете:

.die <pri4ina>

Сега може да дадем синтаксиса и кратко обяснение на най-важните команди (всички команди можете да видите на http://irchelp.u
nibg.org/irchelp/Articles/Egghelp.htm):

# help [команда]

Показва главния help или help за дадената команда.


# bots

Нужни флагове: -|-

Показва ви всички ботове, които са в момента в ботнета.


# status

Дава информация за бота. Ако напишете .status all ще видите пълна информация за бота включваща перманентни onwer-и, какви мо
дули са зарадени и общо взето всякаква информация. Много потребители като видят висок процент на 'cache hits' и си мислят че
това е нещо лошо че бота им е претоварен НЕ! Значението на 'cache hits' е следното то зависи от това колко потребители позн
ава които са в каналът в момента.Така че, ако има много потребители и той не познава никой от тях, то ще бъде ниско, когато
има няколко потребителя и ботът познава всичките 'cache hits' ще бъде високо.


# whois <псевдоним>

Нужни флагове: +о|о

Ще ви покаже информация за даденият потребител, ще ви покаже няколко полета:

HANDLE псевдонима на потребителят
PASS 'yes', ако си е сложил парола, 'no' ако не е
NOTES номерът на съобщенията, които чакат потребителя
FLAGS флаговете на потребителя
LAST последно, кога е видян потребителят в канал, в който е ботът
COMMENT коментар поставен на потребителя (Само мастъри могат да го виждат!)

Валидните флагове за FLAGS са:

o global op (ботът ще дава @ на този потребител във всички канали)
m master (потребителят е мастър на бота)
n owner (собственик на бота)
t botnet мастър
x xfer (потребителя има достъп до файл зоната)
j janitor (потребителят е мастър във файл зоната)
p party-line (потребителят има достъп до party-line)
c common (тъп флаг)
u unshared (потребителят не се изпраща на другите шернати ботове)
b bot (потребителят е бот)
d global deop (ботът ще маха операторските права на даденият потребител)
k global auto-kick (ботът автоматично ще рита потребителя от каналите, в който е)
f global friend (тъпо звучи а?;б) (потребителят не бива наказван от бота, ако върши лоши неща)
v global voice (потребителят полочава автоматично +v в +autovoice канали)
a auto op (потребителят получава автоматично операторски права в всички канали, в които влезе)
h потребителят може да вижда highlighting
w wasop-test (нуждае се от wasop test за +stopnethack процедура)
g give auto-voice (дава автоматично +v на дадения потребител независимо дали каналът е +autovoice)

За ботове има допълнителни флагове, които се добавят чрез 'botattr':

s share (ботът поделя базата си данни за потребителите, 'агресивно')
p share (ботът поделя базата си данни за потребителите, 'пасивно')
g ботът поделя всичките си канали
h ботът автоматично се свързва с дадения бот, има по голям преуритет
a алтернативен hub, ако hub-ът го няма ботът ще се опита да се свърже към дадения бот
l leaf (на ботът не му е позволено да се свързва с други ботове)
r reject (ботът няма да може да се свързва с никого)
i isolate

'|' и '$' имат специално значение когато се използват за листване на потребители.Те са сепаратори за глобални/канални флагов
е.така че използвайте:

.whois |nick|

Ако се нуждаете да проверите за потребители садържащи '|' символ, опитайте:

.match nick

# match <флаг> [канал] [[начало]лимит]

Нужни флагове: +o|o

Показва ви запис от потребителите и тяхните флагове.
Пример:

.match +o - ще ви покаже всички, които имат глобално 'o'
.match -o&+o - ще ви покаже всички локални 'o'
.match +f|f - ще ви покаже всички с глобални и локални флагове
.match |f #канал - ще ви покаже всички с локални права за дадения канал

Можете да мачвате и стойности.

# match <стойност> [[начало]лимит]

.match *.spnet.net 15

Ако искате да видите всичките потребители които са добавени в потребителският ви файл напишете .match * 100 в partyline. .ma
tch * ще ви покаже само първите 20, добавяйки номер след това ботът ще ви покаже потребителите до това число.


# jump [server]

Свързвате бота към дадения сървър.


# +user <псевдоним> <хост>

Нужни флагове: +m

Добавя нов потребител със зададеният псевдоним. Така добавен потребителят няма да има никакви флагове и парола.


# -user <псевдоним>

Нужни флагове: +m

Изтрива потребител.


# +host <псевдоним> <хост>

Нужни флагове: +m|m

Добавя хост на дадения потребител. Той е нужен, за да бъде разпознат потребителя от бота. По начало не се нуждаете от тази к
оманда, откакто потребителите могат да си добавят хостове чрез командата /msg bot ident password nick.


# -host <псевдоним> <хост>

Нужни флагове: +m|m

Махате хост от друг потребител. Ако не зададете псевдоним си махата хост от себе си.


# +chan <канал>

Нужни флагове: +n|

Добавяте нов канал за бота, в който ботът ще влезе. След промяната напишете '.chansave', за да се запази.


# -chan <канал>

Нужни флагове: +n|

Премахвате цялата информация за канала от бота.
ВНИМАНИЕ: Тази команда премахва всичко! Цялата информация за опциите на канала и потребителите в него. НЕ я използвайте, за
да накарате бота времено да излезе от канала!!! Използвайте 'inactive' опцията на 'chanset'!!!


# chanset <канал> <опция>

Нужни флагове: +n|n

Променяте опции за даден канал. Опциите обяснихме когато говорихме за конфигурационият файл. Ако искате ботът ви да си маха
бана и да си взема оп, не ви трябва TCL можете да го направите в DCC използвайки тази команда (chanset):

.chanset #jail need-op putserv "PRIVMSG CS :op #jail"
.chanset #jail need-unban putserv "PRIVMSG CS :unban #jail"
.chanset #jail need-key putserv "PRIVMSG CS :clear #jail modes"
.chanset #jail need-limit putserv "PRIVMSG CS :clear #jail modes"
.chanset #jail need-invite putserv "PRIVMSG CS :clear #jail modes"

Преди това ботът ви трябва да е идентифициран в NS (тук вече ви е нужен TCL за това ще поговорим по-късно).

Ако искате ботът ви да изпълнява функция подобна на MLOCK (/msg cs help set mlock) сложете модовете по следния начин:

.chanset #jail chanmode +ntsk-li jailbraker

Понякога се случва следната аномалия променяте настройките на канала си, но след като дадете 'rehash', 'restart' се връщат с
тарите! Ако ви се случи опитайте се да изтриете файлът с каналите преди да 'rehash'-нете, защото тези опции се зареждат след
конфигурационият ви файл, и те ще ги препокрият.


# chattr <псевдоним> [флагове] [канал]

Нужни флагове: +m|m

Разрешава ви да видите и да промените флаговете на даден потребител.
Например за да дадете на foobar p и f флагове напишете:

.chattr foobar +pf

или ако искате да му махнете операторските права:

.chattr foobar -o

това можете да го направите и по следният начин

.chattr foobar -o+pf

ако искате за канал просто добавете каналът след всичко това.

ВНИМАНИЕ: Само собственик (+n) може да изтрие +n,+m и +t флагове. Ако някой се добави като перманентен собственик той може д
а се изтриие само от конфигурационният файл.


# +ban <хост> [канал] [%времетраене на банът <XdXhXm>] [причина]

Нужни флагове: +о|о

Добавя бан в перманентната листа с бановете на бота, с опции за времетраене и причина. Този бан ще бъде активен за всички ка
нали, в които е бота, ако не бъде зададен канал при слагането му, и ще бъде записан с вашия псевдоним и причина. Ако постави
те @ преди причината ще я направите видима само за хората в бота. Времетраенето е в дни, часове, минути като замествате 'X'
със цифровите им стойности. Ако сложите преди причината "*" правите бана автоматично sticky.


# -ban <хост или номер>

Нужни флагове: +о|о

Премахва бан от листата с бановете на бота, можете да го премахнете използвайки номер, който ще видите след използването на
'.bans'.


# save

Нужни флагове: +m|m

Кара бота да запише последните промени по базата му данни.


# rehash

Нужни флагове: +m|-

Пуска наново конфигурационият файл на бота, като презарежда и скриптовете.


# relay <име на бот>

Нужни флагове: +t|-

Ще ви пренесе използвайки telnet в друг бот, независимо дали са директно свързани.


# reload

Нужни флагове: +m|m

Пуска наново базата данни с потребителите, като премахва всички промени направени след последният '.save'


# restart

Нужни флагове: +m|-

Рестартира TCL интерпретатора, и пуска наново всички таймери, и пуска наново конфигурациония файл.


# +bot <бот> <адрес:порт за ботове/порт за потребители> [хост]

Нужни флагове: +t

Добавяте нов бот в базата с дани на вашия.


# -bot <име на бот>

Нужни флагове: +t

Същото като '-user', изтрива потребител, в случая е добавено за обратна команда на '+bot'.


# botattr <псевдоним> [атрибути] [канал]

Нужни флагове: +t|-

Позволява ви да видите или да промените атрибутите (флаговете) на даден бот. За да видите всичките възможни флагове напишете
'.help whois'.

ВНИМАНИЕ: Тази команда не заменя 'chattr', тя променя бот флаговете като +s, +h, +a, +u - специфични флагове само за ботове.
НЕ можете да използвате тази команда за ботове, които са директно свързани.


# link <някой бот> <друг бот>

Нужни флагове: +t|-

Опитва се да свърже два бота, ако използвате формата .link <друг бот> тогава вашият бот ще се опита да се свърже с другият б
от.


# unlink <име на бот>

Нужни флагове: +t|-

Разкача избрания бот от ботнета. Ако напишете * вместо името на бота ще разкачите всички ботове.


# chpass <псевдоним> <нова парола>

Нужни флагове: +t|-

Променяте паролата на дадения потребител. Ако не зададете нова парола старата ще бъде премахната.


# nick <нов псевдоним>

Нужни флагове: -|-

Променяте си псевдонима, с който сте добавени в базата данни на бота.


# op <псевдоним> [канал]

Нужни флагове: +о|о

Ботът ще даде операторски права на дадения псевдоним в дадения канал.


# voice <псевдоним> [канал]

Нужни флагове: +о|о

Ботът ще даде +v на дадения псевдоним в дадения канал.

# note <псевдоним[@бот]> <съобщение>

Изпраща съобщение на дадения потребител, което само той вижда, ако той в момента е в бота и ако не е away ще го получи ведна
га, в противен случай бота ще го запази и в последствие потребителят ще си го прочете. Когато влезете в канал, в който е бот
а и имате оставено съобщение ботът ще ви съобщи.

Всички тези команди можете да използвате в DCC CHAT към бота като пред всяка от тях напишете "."

Например: .nick RaPID

Често се случва а и на нас да не харесаме псевдонимът на ботът който сме му избрали и искаме да го сменим но мързелът ни нал
яга да се кетрим по шела... затова можете да го смените от DCC като напишете .set nick "новият псевдоним" но незабравяйте че
в конфигурационият файл настройката keep-nick трябва да има стойност 0, можете да го направите и с следният скритп: http://
irchelp.unibg.org/irchelp/Downloads/TCLs/BOTNICK.TCL

Така вече щом знаете по-голямата част от командите би следвало да искате да свържете бота си към някой друг бот. Много потре
бители се затрудняват с това, но сега ще видите, че не е никак трудно. Ето нагледно как се получава свързването между два ил
и повече бота.

Нуждаете се от един който да изпълнява ролята на HUB, а другите ще изпълняват ролята на LEAFs.Ще покажа конфигурацията за вс
еки един от тях.

HUB-ът ще се казва JanaDark, a LEAF-а ще назовем ZoReNce

След като пуснете ботовете и сте сигурни че те са в iRC, процедираме по следният начин:

Трябва като за начало да се здобием с цифровите стойности на хостовете на ботовете ако в случей на проблеми с DNS-а те не мо
гат да бъдат резолвнати да няма проблем с свързването на ботовете.

/whois JanaDark
JanaDark is ~[email protected] * SuCh A BitCh As JanaDark
JanaDark using irc.UniBG.org
JanaDark has been idle 3mins 36secs, signed on Thu Jun 20 05:44:16
JanaDark End of /WHOIS list.

/dns s0m3.vhost.com

*** Looking up s0m3.vhost.com
-
*** Resolved s0m3.vhost.com to 212.36.9.124

/whois ZoReNce

ZoReNce is ~[email protected] * iN sWeET MemoriuM Of ZorniCa!
ZoReNce on @#lamerzone
ZoReNce using irc.UniBG.org
ZoReNce has been idle 1hr 18min
ZoReNce End of /WHOIS list.

/dns s0me.c00L.vhost.com

*** Looking s0me.c00L.vhost.com
-
*** Resolved s0me.c00L.vhost.com to 194.12.244.26

Сега влезте в JanaDark и добавете към потребителският файл ZoReNce:

DCC CHAT или Telnet сесия към JanaDark и пишем:

.+bot ZoReNce 194.12.244.26:6969 *!*PriNcesA@*.vhost.com

Ако ползвате само един порт да обслужва и двата вида потребители само него добавете.

Следва:

.chattr ZoReNce +fob

Ако искате да споделяте потребителският файл добавете и +s .

Ако искате да поделите потребителските файлове на бота с друг (JanaDark ще е HUB, ZoReNce LEAF), направете следното:

.botattr ZoReNce +p

ако искате само канал:

.botattr ZoReNce +s #канал


ВНИМАНИЕ: В случей, че незнаете кои са портовете на ботът към който искате да се свържете и нямате шел достъп за да проверит
е в конфигурационният файл влезте в него и напишете.

<ZoReNce> [17:50] #Randal# dccstat
<ZoReNce> SOCK ADDR PORT NICK HOST TYPE
<ZoReNce> ---- -------- ----- --------- ----------------- ----
<ZoReNce> 3 C20CF41A 6969 (telnet) * lstn 6969

В случаят 6969 е портът на който ботът очаква заявки.

Сега нека да добавим JanaDark в потребителският файл на ZoReNce.

DCC CHAT или Telnet сесия към ZoReNce и пишем:

.+bot JanaDark 212.36.9.124:35691
.chattr JanaDark +fob
.botattr JanaDark +h

Ако искате да приемате потребителската листа от HUB-a направете следното:

.botattr JanaDark +s

ако искате да поделите само за канал:

.botattr JanaDark +s #канал

За да приемате потребителски флагове за даденият канал трябва да сте активирали 'share' (.chanset #канал +share). Новите фла
гове тук са:

+h - ботът автоматично се свързва с даденият бот, има по голям преуритет
+p - share (ботът поделя базата си данни за потребителите, 'пасивно')

Можете да добавите +g, ако искате да поделяте всички канали.

Най-съществен етап при поделянето на потребителските листи е слагането на правилни флагове в ботовете, с което много потреби
тели се затрудняват.Когато бот има флаг 's' това означава, че той ще изпраща потребителската си листа на друг бот, а когато
има 'p' флаг - че ще приема потребителската листа която му е изпратена.

Ако стенаправили всичко правилно ботовете ви трябва да се свържат автоматично до няколко секунди.
Ако не се свържат напишете в ZoReNce.

<ZoReNce> [17:55] #RandaL# link JanaDark

Големите канали изискват сериозно администриране на ботовете и редовно почистване на потребителската листа от пренапълване..
. виждали сме доста ботове със стотици потребители добавени в тях които само затормозяват работата на бота ... ако искате да
се отървете от потребители и искате да го направите по някакъв подбър начин, а ви мързи да мачвате като луд и да триете изп
олзвайте в scripts/ директорията ви скрипта наречен 'weed' който върви с бота. За да го използвате напишете:

tclsh weed

и ше видите лист от опции с които да обработвате потребителският си файл. Можете да изтривате потребители които дълго време
не са влизали в даден канал или нямат сложена парола както и много други опции.

При използването на Eggdrop всеки администратор се цели към ефективност както на бота така и на потребителите и много от адм
инистраторите прибягват към публични команди (!op !devoice !ban). Тези команди НЕ вървят по принцим към сорсът на ботът. Тря
бва ви да заредите отделен скрипт който да биндва тези команди (за биндването на команди и за TCL ще отделим повече време по
късно).

В търсенето си на добри скриптове можете да погледнете нашите архиви на следните адреси: http://irchelp.unibg.org/irchelp/IR
C/tcls.htm, http://mirror.krychma.net/ftp.eggheads. ... p/scripts/.

Друга срещана приштявка на собствениците на ботове е те да правят статистика за каналите им. Като най-популярен и стабилен е
известен stats.mod той е много по добър и надежден от TCL скриптовите които изпълняват сходни процеси. Модулът включва в се
бе си следните команди: !top10/!top20/!stat/!place/!ttop10/!ttop20/!tstat/!tplace/!wordstats/!topwords.

А ако искате да добавите и !seen команда ви трябва или модул или скрипт който да прави това. Модулите са по бързи в това отн
ошение, но те трябва да се компилират на шелът ви заедно с ботът. Ако сте добре запознат как става това изберете модулът.
Модули: http://irchelp.unibg.org/irchelp/Downlo ... 1.0.tar.gz, http://irchelp.unibg.org/irchelp/Downloads/TCLs/m
ods/webseen.mod.0.3.1.tar.gz

Говорейки по горе за статистики можете да добавите статистики за потребителската база данни на бота както и още много други
статистики просто разгледайте страницата ни там мисля че ще намерите достатачно добри TCL-и които да задоволят прищявките ви
:)

Повечето потребители намират за забавно ботът да ги поздравява при влизането им в каналът, но доста от тях срещат и трудност
и при слагането на такива съобщения ;) Проблемите могат да бъдат няколко. Първият е ако не сте сложили +greet на каналът в к
ойто искате да ви поздравява ботът. Ако сте сигурни че това е оправено тогава погледнете към опцията wait-time в
конфигурационият си файл. По начало стойността и е 180 (секунди ака 3 минути). Трябва да сте 3 минути извън каналът за да из
пише ботът ви поздравление когато влезете, така че просто ако излезете и влезете няма да е достатачно да ви поздтави ботът о
свен ако не го правите за 3 минути ;))) Можете да опитате да дадете стойност 0 или 1 ако искате всеки път да ви поздравява.

Друг срещан проблем при повечето потребители които пускат ботовете си от шелове е мясото а ви оверяваме че един бот да глутн
е доста ако не внимавате какво правите. Ако бота ви пише 100Mb лог файлове може би връзката на бота се е побъркала, и бота в
и се опитва да се свърже към сървъра като луд, пишейки това радостно в лог файла. Понеже това може да стане ДОСТА бързо, ваш
ият лог файл ще расте с неизмерима скорост. Може да махнете логването на сървърските disconnect/connect съобщения (махнете '
+s' от logfile командата във вашият конфигурационен файл). Или просто се молете това да не се случва отново (това не се случ
ва често). Може да прегледате вашите скриптове, защото може някой от тях да прави тези поразии. Ако имате скриптове, които и
зползват 'control/listen' процедурите, те може да са проблем. Като заговорихме за логове ... да обърнем внимание и на парано
ичните бот администратори които искат да знаят нон стоп какво става с ботът им и искат да изпращат логовете си на e-mail, мо
гат да си сложат следната линия в crontab файла:

5 3 * * * mail [email protected] < /home/moquser/eggdrop/moqbot.log.yesterday

Това ще ви праща зададения файл в 5:03am. А ако искате можете да използвате следния скрипт за по-нагледно сортиране на лого
вете:

#!/bin/bash
# Каде се намира bash файла, променете това ако е нужно.

touch eggdropLogTemp
# създавате темп файла кадето ще се съдържа цялата текстова информация която ще пратим накрая на мейл.

echo "Subject: eggdropLog `date +%d-%B-%Y`" >> eggdropLogTemp
# тук добавяме файла (с >>) текста Subject: eggdropLog `date +%d-%B-%Y` . Може би вече сте разпознали date командата която
# е в кавичките. Използваме Subject: , защото това ще бъде subject-а който ще се изпрати на майла ви.

echo "eggdropLog `date +%d-%B-%Y`" >> eggdropLogTemp
# Това ще бъде първата ви истинска линия в body-то на майла. Отново се добавя към eggdropLogTemp с >>.

echo "" >> eggdropLogTemp
# Добавяме празна линия за по голяма ясното.

echo "Komandite izpylneni na partyline:" >> eggdropLogTemp
# Първата група от линии от логфайла на бота които искаме да саберем са командите извършвани на partyline. Разбирасе
# добавяме линия която точно ни ориентира каде са в маила ;)

grep '^\[.*\] #.*#' eggdrop.log >> eggdropLogTemp
# Нека да погледнем как тези лини изглеждат:
# [09:52] #Asmo# +host asmo *!*[email protected]
# Тук потребителят с handle edi използва +host командата за да си добави нов хост.

echo "" >> eggdropLogTemp
echo "Komandi prateni chrez MSG:" >> eggdropLogTemp
grep '^\[.*\] (.*) !' eggdrop.log >> eggdropLogTemp
# Първите две линии правят това което и по горе, първата добавя празен ред за по голяма нагледност, следващата каква секция
# следва. Трябва да използваме сега grep за да видим всички съобщения изпращани към бота през /msg.
# Нека да погледнем как това изглежда в лог файла. [09:51] (edi![email protected]) !edi! NOTES read ...
# Потребителят edi използва NOTES READ ALL командата за да види всичките си съобщения оставени в бота. Други команди които
# можете да видите често са OP, IDENT и др.

echo "" >> eggdropLogTemp
echo "Lichni syobshteniq izprateni kym bot:" >> eggdropLogTemp
# Трябва вече да ви говори само по себе си какво прави.

# Нека погледнем тук
if [ `grep -c '^\[.*\] \[.*\]' eggdrop.log` -gt 100 ]
then
echo "Poweche ot 100 syobsteniq, moje bi towa e flooded" >> eggdropLogTemp
else
grep '^\[.*\] \[.*\]' eggdrop.log >> eggdropLogTemp
fi

# Тук ще направим няколко допълнителни стъпки. Понеже не искаме да получаваме прекалено голям майл ако бота е бил floodнат
# със съобщения, но вместо това искаме да ни се прати съобщение, че вероятно сме flood-нати със съобщение.
# Нека ви обясним всяка стъпка:

if [ `grep -c '^\[.*\] \[.*\]' eggdrop.log` -gt 100 ]
# Ако [номерът на личните съобщения е по-голям от 100]. Забележете как grep е обграден в ` `, което изпълнява командата
# първо. Използваме -c опцията, която ни дава колко в колко линии се е срещнало това което търсим (числена стойност).
# След това го сравняваме със 100 чрез опцията -gt (по-голямо от)

# Тогава:

echo "Poweche ot 100 syobstenie, sigurno towa e flood" >> eggdropLogTemp
# просто слага в майла: "Poweche ot 100 syobstenie, sigurno towa e flood"

else
# Ако номерът на личните съобщенията НЕ е повече от 100, тогава:

grep '^\[.*\] \[.*\]' eggdrop.log >> eggdropLogTemp
# Правим grep командата както за по горните секции.

fi
# Край на if секцията.

echo "" >> eggdropLogTemp
echo "CTCP-ta kym bota:" >> eggdropLogTemp
# Това би трябвало да не ви се стори сложно :)

if [ `grep -c '^\[.*\] CTCP' eggdrop.log` -gt 100 ]
then
echo "Poweche ot 100 CTCP-ta, moje bi towa e flood" >> eggdropLogTemp
else
grep '^\[.*\] CTCP' eggdrop.log >> eggdropLogTemp
fi
# И същата история както при личните съобщения се разиграва тук, но този път за CTCP линиите. Това може да съдържа
# CTCP Ping, CTCP DCC Chat, CTCP Version, и т.н. И както вече знаете, премахва flood-а. Затова ние наистина искаме да
# използваме IF , за да видим дали имаме повече от 100 CTCP-та.

# Правим го по същият начин, по който проверявахме личните съобщения. Използваме -c опцията на gerp , за да видим общия
# брой на линиите, в които се съдържа търсения стринг и дали той е повече от 100. Ако е повече, то слагаме
# "The amount of CTCP's in the logfile exceeds 100, probably flooded" в мейла, а ако е по-малко от 100, тогава
# извършваме командата grep както в миналата секция и го слагаме в темпоралния файл.

less eggdropLogTemp | sendmail [email protected]
# Използваме програмата 'less', програма, която чете тесктови файлове (в този случай четем нашият темпорарен файл), и го
# пращаме към програмата sendmail с pipe, използвайки символа | (SHIFT \). С sendmail можем да изпращаме съдържанието на
# нашият файл на дадения e-mail адрес, който зададохме в командния ред.
# В случай, че sendmail не работи (bash: sendmail: command not found), опитайте да зададете къде е инсталирана програмата.
# Обикновенно това е /usr/sbin/sendmail И тогава вместо "sendmail" напишете целата пътечка.

rm eggdropLogTemp
# изтриваме темп файла защщото вече няма да ни трябва

# Сега chmod +x eggdropAnalyzer за да го направите изпълни и го стартирайте след което си проверете пощата да видите дали
# работи правилно.

Рано или късно ни се случва на всички. Компютърът ви се счупва или имате вирус или шелът кадето сте пуснали ботът ви
падне и т.н и т.н. Разрешението е лесн, но често не отделяме няколко минути да направим бак ъп на ценната си информация.
Пресен пример можем да ви дадем със стартирането на инфобот ... часове на ред сме си играли да добавяме нова и нова
информация и когато дб-са се прецака ни идваше да си изядем т<цензоред> .. ;б

За по голяма ясност на примера ще предположим че имате директория eggdrop в $HOME директорията си на шелът на която искате
да правите копие всеки ден. Пътеките и директориите които ще използвам могат да бъдат различни от тези на вашият шел. Ще
споменем кога трябва да видите какви са стойностите при вас.

Първо трябва да съберем малко информация. Скриптът ще бъде написан на bash, и трябва да знаем каде можем да го намерим на
шелът. Обикновенно това е /bin/bash .За да разберете дали и при вас е така просто напишете: whitch bash. Следващото нещо
което трябва да знаем е пътеката до вашата eggdrop директория (или друга такава на която искате да правите копие).
Използвайте 'cd' за да влезете във директорията след което 'pwd'. За този пример ще вземем че директорията ви е
/home/foo/eggdrop. Върнете се в $HOME директорията си написвайки 'cd'. Преди да започнете да пишете скриптът трябва да
създадем директорията кадето ще се пази копието, за да направите това напишете: mkdir backups

Сега да пристъпим към скриптът. Напишете 'pico backupBot' това ще стартира текстовият редактор pico.
На първият ред сложете пътят до bash. По този начин описваме кой език ползваме: #!/bin/bash
След това ще изтрием старите копия в директорията backups, все пак не искаме да изпълним quota-та на вашият шел ;).
Напишете: rm /home/user/backups/bot* Сега изтрихме всичко което започва с bot ... затова използваме wildcard. Всичкото
което остана да се направи е да направим копието на ботът в backups директорията с дата в името. Можем да направим двете
процедури със следният ред: tar czfp /home/user/backup/bot_`date +%d_%m_%y`.tgz /home/user/eggdrop/ .Нека да погледнем по
внимателно този ред, все пак това е туториал и би трябвало да научите нещо :)) Забележете `date +%d_%m_%y` часта в реда.
Този стринг добавя дата в краят на архивът който ще изглежда подобно на: bot_03_10_02.tgz. Забелегете че часта е оградена
с `` това означава че командата ще се изпълни преди tar командата. Така че tar czfp ще създаде файл bot_`date
+%d_%m_%y`.tgz в директорията /home/user/backup/ и този файл ще съдържа всичко в /home/user/eggdrop/. Това достатачно ли е
?!! ;))

За сега добре ... готови сме със скрипта. Натиснете ctrl-x за да излезете от pico, и отговорете с yes за да запазите
файлът. Ако сте направили всичко правилно трябва да имате файл backupBot. Следващата стъпка е да направите този файл
изпълним. За да направите това напишете chmod +x backupBot. За да проверите дали скриптът работи напишете ./backupBot ,
незабравяйте използването на './' преди файлът. Сега влезте в директорията и напишете 'ls' за да видите съдържанието и.
Трябва да има файл с името bot_Датата.tgz. Ако няма тогава трябва да се върнете обратно на pico операцията и да видите
какво сте пропуснали.

Ако скриптът е създал файлут в backups директорията тогава остава само едно нещо да се направи. А това е да добавите ред
в crontab-а на сървърът за да се изпълнява автоматично тази процедура. Ще го направим да стартира скриптът в 5 a.m,
незабравяйте че сървърът който ползвате може да има тотално различно време от това което вие ползвате. За да редактирате
crontab-а напишете: export VISUAL=pico; crontab -e което ще отвори crontab-а в pico и ще ни е по лесно да го редактираме.
Сега напишете вътре във файла: 00 05 * * * /home/user/backupBot . Това е .. вече сте готови.

Понеже повечето потребители използват Windows (meaw), ще покажем прост начин как автоматично да вземате бак ъп файловете
от шелът. Трябва да създадем скрипт за вашият ftp клиент. Внимавайте защото има разлика от ftp клиент до ftp клиент.
Проверете хелп файлът на вашият. Нека да погледнем скръптът който ще използваме с LeapFTP:

CONNECT:my.shell.com:myLogin:myPass:21
Connect to my shell using my login name and password on port 21.
CD-R:/home/user/backups
Change the remote directory to the directory with the backup.
CD-L:E:\backupBots\
Change the local directory where I want to save my backupped bot.
GET:*.tgz
Download all files that end with .tgz
DISCONNECT
Guess
EXIT
Guess again
END

Запазете този файл като botscript.txt в същата директория кадето ще правите копие на файла. E:\backupBots\botscript.txt За
да накарате w2k да изпълнява скриптът всеки път в 5.15am. Отворете Schedules Tasks панелът. Можете да го намерите на Start
--> Programs --> Accessoiries --> System Tools --> Schedules Tasks (pfew).

Натиснете в/ Add Scheduled Task, след това изберете името на FTP клиентът ви от листът или използвайте browse за да го
намерите след което натиснете next. За стартиране изберете 5.15am, и натиснете next след което въведете потребителското си
име и парола на windows потребителя и натиснете отново next. Изберете 'Open advanced properties for this task when i click
finish' и натиснете finish. Почти сме готови. В новият панел който се отвори трябва да добавим пътят към скриптът който ще
използва LeapFTP когато се стартира от Scheduled Tasks. Редактирайте линията:

"C:\Program Files\LeapFTP\LeapFTP.exe"
script=E:\backupBots\botscript.txt

Готово... както видяхте не е кои знае какво.

хммм мислим че с това поизчерпахме темата за използването на Eggdrop, сега да пръстипим към TCL скриптовете ... А ... и да н
е забравим нещо доста досадно и банално. Често влизат хора в канала които искат някои да им даде бот назаем или подобни диво
тии... не искаме да сме груби но просто ставате за смях ... никои не би дал ботът си да се ползва така. Вместо да се излагат
е и да молите хората направете си го сами. Факт е че повечето потребители ползват Win9x/NT системи и ботовете им трябват сам
о докато са в IRC... просто прищявка да имат бот в канала защото това поскоро стана доста популярно, а и дори да не сте на W
in... просото прочетете следните туториали и се научете как сами да си пуснете бот а не да се излагате по каналите молейки н
якои да ви даде бот. Все пак господ ви е дал мишка с 2 бутона монитор и интернет .... а чичо Гейтс вирус (Winblows) такаче с
е поразмърдайте!

За Win9x/NT: http://irchelp.unibg.org/irchelp/IRC/WEggtut.htm
За *NIX Базирани OS: http://irchelp.unibg.org/irchelp/IRC/Eggtut.htm
Eggdrop команди: http://irchelp.unibg.org/irchelp/Articles/Egghelp.htm

Говорейки за TCL ....

Ще ви разесним как да правите скриптове за eggdrop ботове.Ще бъдат използвани примери за да се обяснят командите и ще се
опитаме да направим всичко възможно най просто за обяснение и разбиране. След това би трябвало да знаете по принцип как да
пишете различни видове скриптове. Ще разберете описаното в tcl-commands.doc и man TCL страниците (поне се надяваме).
Предлагаме ви да погледнете в tcl-commands.doc след като прочетете това, защото ако разберете всичко за което се говори тук
и знаете повечето команди и binds в tcl-commands.doc ще бъдете експерт в писането на TCL скриптове за Eggdrops.

TCL езикът не идва специално от Eggdrop. Това е език използван от Eggdrop. За да ви помогнем да разберете нещата по-добре
ще започнем с какво точно е TCL и какво прави.

TCL е с отворен код. Това озбачава че програмата ви се пуска като изпраща сорс кода (самият скрипт) към TCL програма
която го обработва без да го компилира както другите езици като С но не и като Perl ;)). Това означава че хората
могат винаги да погледнат в програмата ви и да видят как е написана, затова ще имате по малко проблеми с несъвместимоста
на различните операциони системи защото TCL езикът е винаги един и същ навсякаде.

Командите в TCL скриптът могат да се разделят на две части. Първата е когато стартирате скриптът а другата когато ги
извикате. Командите които се стартират когато стартирате скриптът са извън процедурите (покъсно ще обясним как можете да
дефинирате процедури).

Както всички програмни езици трябва да слагате конкретни сепаратори м/у специалните символи за да знае езикът какво да
прави с тях. TCL използва следните символи за да дефинира събитията:

<> - по-голям от колкото и по-малко
Тези два знака не се използват в TCL сами, но се използват в документацията за да индикират какви параметри са нужни ако
искате да изпълните команда.

"" - кавички
Кавичките се използват за да маркират текст. Всичко м/у "" се счита за текст, освен ако не е заобградено със скоби или е
маркирано като променлива (за тях ще научите по късно).

[ ] - скоби
Скобите се използват за да се изпълни команда. Първата дума в скобите е командата която искате да изпълните а следващите
са параметрите на тази команда. Също така се използват в документацията за да индикират кои параметри са оптимални и кои
не се изискват за да се използва дадена команда.

{ } - скоби
Braces се използват за да покажат кога нещо започва и спира. Това може да бъде част от скрипт или команда.

( ) - скоби
Скобите се използват за да дефинират различни неща. Използват се също да дефинират че дадената променлива е масив и че отдел
ните части на [if] командата си пренадежат пример за това ще бъде даден по късно.

$ - променлива
Това дефинира, че думата която следва след $ (без празни места в нея) е променлива.
Казано накратко променливата е мястото където вие запазвате информацията за по-късно използване. Това ще бъде
дискутирано по-късно по-обширно.

; - точка и запетая
Когато TCL види точка и запетая, процедира с всичко, което е след него сякаш е на нов ред. По такъв начин можете да
сложите няколко команди на един ред да направите скриптаси по-кратък и все още работещ.
Ако не използвате точка и запетая и сложите втора линия след първата, TCL ще разбере това като параметър към първата
(която е пред нея) и в повечето случаи ще даде грешка, защото командата би трябвало да няма такъв параметър,
или прави скрипта ви грешен.

# - диез
Когато TCL види диез в началото на линията, той смята всичко след нея като коментар и ще го игнорира и ще прескочи на
следващата линия.
Много програмни езици казват от къде започва коментара и къде свършва , както в HTML дефинирате започването на
коментара с <!--, а където свършва коментара пишете --> или в C където коментара започва с /* и завършва с */.
Това не се отнася за TCL. Когато сте сложили диез в началото на линията, всичко след нея (на тази линия)
ще бъде игнорирано. Забележете,че не можете да сложите диез по средата на линията и да сложите коментара след нея, защото
това ще даде грешка, защото TCL няма да види коментара като коментар в този случай. Вместо това можете да сложите точка
и запетая отпред на диеза така че TCL да интерпретира нещата така сякаш всичко това е било на нов ред и така линията ще
започне с диез и всичко след нея ще се смята за коментар.
Малко е сложничко, но така е начина по който работи и не мисля, че някога ще се смени, ще свикнете ;). Веднъж щом разберете
как работи не е толкова сложно.

\ - наклонена черта
Наклонената черта се използва, за да накара TCL да види следващия символ като текст. По начало когато използвате скоба
във вашият скрипт TCL трябва да я види като начало или край на команда, но когато използвате наклонена черта пред нея
TCL ще я види като обикновен текст и ще преработи скобата вместо да се опитва да изпълни командата. Има няколко изключения
към това. Има няколко кода, които започва с наклонена черта последва с номер или буква, за да създадат специални символи.
В тези случаи наклонената черта означава, че има специален код и да не се гледа следващият символ като текст.
Например: \0 (това е числото 0, не буквата o) нормално TCL би трябвало да види 0 като текст (TCL вижда по принцип 0,но
наклонената черта го изпълнява и това не е точно пример за това как работи), но \037 не означава 037 като текст, а че
следващият текст трябва да бъде подчертан.
Това може да изглежда малко объркващо, както и да е един път разбрано как работи не е толкова трудно, както всичко в
TCL.

Понеже TCL не е нещо от Eggdrop, има два вида команди. Команди от самият TCL, които могат да работят и със скриптове
извън Eggdrop, и команди, които са добавени от Eggdrop.

Всички команди, които Eggdrop добавя към TCL са описани в tcl-commands.doc, който може да бъде намерен в doc/ директорията
на Eggdrop.

Можете да получите информация за командите в TCL от man страниците. Можете да ги видите като напишете
[man n <command>] на *nix компютър, който има тези страници инсталирани или да достигнете до тях чрез HTML
версията им на http://dev.scriptics.com/man/tcl8.0/TclCmd/contents.htm.

Сега ще обясним двете основни команди в TCL [bind] и [proc].
Тези две команди ви позволяват да накарете бота да изпълни действия, при конкретно събитие.

С [bind] командата можете да накарате ботът да отвръща на команди, съобщения или ctcp. Синтаксисът на [bind] командата е
[bind <type> <flags> <command> <procedure>]. Ще обясним това стъпка по стъпка.

<type> е на какво действие да реагира бота.
Например, [ctcp] ще отговаря на ctcp, а [msg] на съобщения.
Можете да намерите всичките възможни видове в eggdrop/doc/tcl-commands.doc.

С <flags> ще дефинирате какви флагове трябва да има потребителя във вашият Eggdrop във вид <глобален флаг|локален флаг>.
Ето няколко примера за да обясним по-бързо и просто:
# Отговаря на всички (включително и на тези, които не са аднати в бота).
bind <type> - <command> <procedure>

# Отговаря на всички (включително и на тези, които не са аднати в бота).
bind <type> * <command> <procedure>

# Отговаря на глобалните owners
bind <type> n <command> <procedure>

# Отговаря на глобалните оператори
bind <type> o <command> <procedure>

# Отговаря на локалните masters (НЕ на глобалните)
bind <type> -|m <command> <procedure>

# Отговаря на глоабални masters и на локални
bind <type> m|m <command> <procedure>

# Отговаря на глобални оператори и на локални owners
bind <type> o|n <command> <procedure>

<command> е за какъв параметър да се следи. Ако искате да следи за вид [msg],
параметърът трябва да е първата дума от съобщението или ако искате да използвате вид [dcc]
трябва да е нова команда, която искате да създадете за partyline.
Например [bind dcc <flags> test <procedure>] ще създаде partyline команда [test] или
[bind msg <flags> hello <procedure>] ще накара бота да отговаря когато получи съобщение започващо с "hello".

<procedure> е процедурата, която бота тярбва да стартира когато засече видът и командата, за която трябва да отговаря.

Процедурите не са нищо повече от команди, които можете да извикате навсякъде в TCL скрипта. Можете да извикате процедура
като напишете някъде в скрипта си [<procedure> [parameters]] (например процедура, някъде в скобите или просто в главния ви
скрипт).
Тези процедури изпълняват команди, които например могат да върнат стойност, след като проверят няколко фактора или могат да
изпратят нещо към IRC сървъра. Можете да следите за върнати RAW numerics от сървърът като на <type> сложите RAW, а за <comma
nd> numeric стойност-а. Обикновно се слага края на numeric-а и същинската част която връща. Всичките numeric стойности които
сървърът ви връща можете да видите на
http://irchelp.unibg.org/irchelp/IRC/Do ... eaders.htm можете да ползвате и следния TCL скрипт за
да видите за какво по точно става

С [proc] командата можете да създавате процедури. Синтаксиса е [proc <name> { <parameters> } { <body> }].

<name> е името на процедурата, която създавате. Това може да бъде всичко, което поискате и трябва да използвате това име
когато искате да я извикате.

<parameters> представляват стойностите, които процедурата трябва да приеме. Трябва да зададете стойности за всеки параметър,
който ще бъде изпратен към процедурата. Всички стойности, които дадете трябва да бъдат отделени с празно място.
Например, ако имате линията [proc test { nick channel } { <body> }]
и някъде другаде във вашият скрипт [test MyNick #test], процедурата ще сложи "MyNick" в стойността
"$nick" и "#test" в "$channel".

Процедурата винаги иска да знае точната големина на параметрите, които сте задали. Ако дадете на процедурата 4 стойности, а
тя изисква 5, Eggdrop ще даде грешка подобна на 'proc called with too many arguments', а ако я извикате с 3
"no argument given for ...".

Има изключение на това правило. Ако именувате последната стойност на <parameters> с името "args", тогава можете да я
извикате с повече параметри, отколкото са дефинирани.
В този случай всички параметри, които сте задали на процедурата, от "args" нататъка ще се съдържат в $args.
Те се поставят в $args сякаш е използвана командата
  • за тази цел. Ще научите повече за
    • командата, но вече
      трябва да знаете за разликата между "args" и всяко друго име.
      Например, ако извикате процедурата [proc test { nick channel args } { <body> }] с
      [test $nick $channel $handle $host], ще сложи $nick в $nick, $channel в $channel, а $handle and $host в $args,
      но ние ви разубеждавам да използвате командата "args" като параметър, поне докато научите какво е
      прави командата
      • .

        <body> са командите, които искате процедурата да изпълнява. <body> не трябва да бъде на една линия, затова
        процедурата започва с една отворена скоба. Можете да сложите отделна команда на нов ред и тя ще бъде част от процедурата
        докато не затворите <body> със скоба.

        Освен ако не извикате процедурите ръчно, в повечето ще искате да използвате [bind].
        [bind] командата стартира процедурата, когато конкретното действие е засечено. Освен за
        bind, tcl-commands.doc също така ви дава информация какви параметри са нужни на процедурата и информация за параметрите
        които садържа.

        Нека да разгледаме [bind msg] обяснението от tcl-commands.doc:
        (1) MSG
        bind msg <flags> <command> <proc>
        procname <nick> <user@host> <handle> <arg>

        Всичко след [procname] са параметри, които ще бъдат изпратени към процедурата. Повечето процедури за
        [bind msg] ще изглеждат подобно на [proc msg_test { nick host hand arg } { <body> }].

        Накрая разбира се затоверете body процедурата със скоба, можете да използвате командата [return], за да накарете
        процедурата да свърши където искате от body. Сега процедурата ще завърщи зависейки от това как използвате return командата.
        Синтаксисът на [return] командата е [return <message>.]

        <message> е това което процедурата трябва да изпише. По принцип завършвате процедурата с 0 или 1 като <message>.
        В повечето случаи 0 като <message> ще последва като бърз отговор, при което бота ще продължи нормално сякаш bind-а не
        съществува, това означава, че няма да логне нищо и няма да препокрие вградени функции като flood защиатата например.
        Когато връщате 1 бота обикновено логва командата която е била извършена като например [bind dcc] или изобщо не реагира на
        действието (когато използвате [bind flood], връщайки 1 бота няма да реагира на флуда но ще позволи на TCL скрипта да
        противодейства). Можете да намерите повече в tcl-commands.doc за това как повечето bind реагират на return стойността.

        Освен 0 или 1 процедурата return може да връща и текст ако го искате. Което грубо казано ще направи процедурата да действа
        като интерактивна променлива. Все още трябва да я извиквате с [proc [parameters]], но ще връжа информацията както променлива
        та би направила това. Например, [proc test { nick } { return "Hello $nick." }] ще бъде същото като [set test "Hello $nick."]
        само че ще го извикате по по-различен начин и можете да проверите някой неща с процедурата и евентуално да изпише нещо
        различно от входа, но все още да държите изходните като променлива.

        Вече се сблъскахте с термина променлива няколко пъти, но сега ще обясним какво точно е това.

        Променливите се използват в почти всички TCL скриптове. За сега не сме виждали TCL скрипт който да не ги използва.
        Променливата е нещо в което можете да държите информация. Тази информация може да бъде всякаква и е динамична. Може да бъде
        различна всеки път когато викате процедурата или скрипта.

        В много програмни езици има различни типове променливи. Трябва да обявите всяка променлива и също дали е номер или ще
        съдържа букви. Това не се отнася за TCL. В TCL всяка променлива е така нареченият string, което означава че няма значение
        дали съдържа числа или букви, може да бъде едно от тях или и двете.

        Това ограничава малко нещата които можете да правите с тях, но прави езикът доста по лесен. Сега вече ще разглеждаме
        променливите като стринг.

        Стринговете могат да бъдат дефинирани и изтрити с [set] и [unset] командите.
        Синтаксисът на set командата е [set <string> <value>] а на unset командата [unset <string>].
        Освен [set] и [unset] съществува също и [append].
        Тази команда работи по същият начин като [set] командата, но празликата е че тази команда добавя нещо към стринга без да го
        променя.[append] командата добавя нещо директно към краят на стринга което е също като [set <string> "$<string><value>"].


        <string> е името на стринга който искате да промените.
        Името трябва да съдържа букви, тирета (-) и/или само номера. Ако сложите някой друг символ в него може да доведе до грешки
        защото скрипта ги интерпретира грешно.

        <value> съдържа това което искате да има в стринга и това което искате да бъде добавено към стринга ако използвате [append].
        Това може да е число, някакъв текст, върнатата стойност от някаква команда или всичко което ви се струва правилно за тази
        цел. Това което можете да сложите в стринга не се ограничава с нищо, но някой символи трябва да бъдат избегнати чрез наклоне
        на черта за да сме сигурни TCL няма да ги интерпретира грешно. Забележете също че ако искате да сложите част от текст
        в стринг можете да го обградите в кавички.

        Освен да дефинирате стринг, можете и да го изтриете. Това просто ще направи стринга несъществуващ отново както е бил преди
        да го създадете.

        ВНИМАНИЕ: TCL ще върне грешка когато се опитате да използвате стринг който не съществува (макер че стринга може да
        съществива когато няма нищо в него, ([set test ""])).

        Освен нормалните стрингове има и масиви.
        Масива е група от стрингове свързани заедно "под един покрив". Можете да използвате тези масиви по същият начин по който
        използвате нормалните стрингове. Най-голямото преимущество на масивите над нормалните стрингове е това че те са под един
        покрив и могат да бъдат достигнати всичките наведнъж чрез някои команди, правейки го по лесно за вас, не е нужно да
        проверявате всички стрингове един по един понеже целият масив е вече зареден.

        Синтаксисът на масива е [$array(string)], кадето [array] е името на масива и [string] е името на стринга в масива.
        Веднъж създали масив не можете да създадете стринг със същото име. Например ако имате $test(<string>), няма да можете да
        имате и $test.

        Ето няколко примера:
        # Слагате думата "that" в стринга [what] от масива [test]
        set test(what) "that"

        # Слагате думата "now" в стринга [when] от масива [test]
        set test(when) "now"

        # Следното ще изкара грешка понеже вече има масив с името test!
        set test "testing"

        # Слага думата "what" в стринга [test_what]
        set test_what "what"

        # Слага думата "now" в стринга [test_when]
        set test_when "now"

        Веднъж щом сте създали масив може би ще искате да вземете списък с всичките стрингове които той съдържа, например вземане
        на списък от масива $test() от предишният пример.

        Командата използвана за тази цел е [array names].
        Синтаксисът на командата [arrayn names] е [array names <array>].
        В този случай <array> е името на масива от който искте да вземете имената, например "test" както е в нашият пример.

        Сега ако сложим [array names test] в предният пример, ще върне "what" и "when".

        Предполага се че това няма да ви потрябва но по късно може да ви се стори много полезно.

        Има два типа стрингове. Локални и глобални. Локалният стринг същестува само в процедурата в която е дифиниран, а глобалният
        стринг съществува през цялото време през което скриптът ви е пуснат и през което ботът е пуснат.
        Всички стрингове създадени извън процедура автоматично стават глобални като се използва командата [global]. Глобалните и
        локалните работят по сходен начин, единствената разлика кога и каде те съществуват.

        Синтаксисът на командата global е [global <strings>].
        Всеки стринг трябва да бъде разделен от празни места и ако искате да имате глобален масив, трябва просто да дадете името на
        масива, но не и името ма стринга от масива.

        Също и защото тази команда вече знае какво давате за вход към стринга, вие не трябва да слагате $ пред името на стринга ви.
        $ се използва за да се идентифицира нещо като стринг и да се препокрие часта със съдържанието на стринга.
        Когато сложите $ ще се препокрия цялото име на стринга заедно с $-то със съдържанието на стринга. Например ако $test съдържа
        "hello" и вие напишете [global $test], TCL ще го сметне за [global hello] а това не е това което искате в този случай, нали?

        Ще вземем [set] командата за пример кадето имаме масива [test] с стрингове "(when)" и "(what)" , също не е нужно да използва
        те
        команда като [global test(when) test(what)], но можете да използвате [global test] което ще даде достъп на глобалните стринг
        ове
        "(what)" и "(when)" до масива [test]. Глобалната команда превръща целият масив, не само индивидуалния стринг.

        За финал: командата [global] се обикновено се слага на първъят ред на процедурата. Това не е задължително, но е нещо като
        неписано правило. Също е и по лесно да се разгледа вашият скрипт ако [global] е на първият ред вместо да е някаде скрит в
        процедурата.


        С командата [incr] лесно добавяте/изваждате числа от стрингове.
        Синтаксисът на [incr] командата е [incr <string> [+/-][number]].
        Ето няколко бързи и лесни примера които обясняват командата:

        Here are a few simple examples to explain the command fast and easy:

        # Добавя 1 към стринга [test].
        incr test

        # Добавя 2 към стринга [test].
        incr test 2

        # Добавя 3 към стринга [test] (знакът + не е задължителен).
        incr test +3

        # Изважда 4 от стринга [test] (знакът - е логически, задължителен за изваждането)
        incr test -4

        С командата [incr] можете само да +/-. Делението, умножението и неща като тях трябва да бъдат направени с командата
        [expr], но това ще оставим за по късно. Забележете че, стрингът с който работите трябва да бъде число или [incr] командата
        ще върне грешка.

        Сега да обясним как да изписвате информация.
        Има много команди с които можете да изпишете някаква информация, някои от тях се използват да се изпраща информацията към
        различни места, а някои да се изпраща по по различен начин.


        Има 4 команди с които можете да накарате Eggdrop да логне нещо.
        Тези команди са [putlog], [putcmdlog], [putxferlog] и [putloglev].
        Разликата м/у тези команди е че всяка команда изпраща лог съпбщението с различен лог левел (различните лог левели са описани
        в конфигурационият файл на бота). Ето и списък с лог левелите според eggdrop.complete.conf:

        # Събитията се логват според различни категории, по такъв начин да зададете точно какво събитие искате да бъде пратено
        # към различните лог файлове.
        #
        # Различните глагове за логване са:
        # m private msgs/ctcps към бота
        # k kicks, bans, mode changes в канала
        # j joins, parts, netsplits в канала
        # p public msg в канала
        # s server connects/disconnects/notices
        # b информация за свързването на бота и поделянето на потребителския файл
        # c команди които се използват от хората през msg или dcc
        # x файл трансфер и file-area команди
        # r (ако use-console-r е включена) ВСИЧКО изпратено до бота от сървърът
        # o други: разни информации, грешки -- ВАЖНИ НЕЩА
        # w wallops: съобщенията м/у IRCops (обедете се че бота има +w в init-server, и ботът да е оператор)
        #
        # Има и други, но сигурно няма да искате да ги логвате, по добре да бъде неетично ;) Има също и 8 левела дефинирани за потре
        бителите
        # (1-8) които се използват от TCL скриптовете.

        [putlog] изпраща лог съпбщението с левел о, [putcmdlog] изпраща съобщенията с левел c, [putxferlog] изпраща съобщенията с
        левел х, и [putloglev] изпраща съобщенията с левел който зададете.

        Синтаксисът на командите [putlog], [putcmdlog] и [putxferlog] е [putlog "<text>"].
        Синтаксисът на командата [putloglev] е [putloglev <level(s)> <channel> "<text>"].

        <level(s)> е с какъв левел искате да пратите лог съобщението. Можете да изплзвате * за да пратите лог съобщението за
        всички левели.

        <channel> е за кой канал да се изпраща лог съобщение. Използвайте * за да се изпрати към главният лог.

        <text> е съобщението което искате да бъде логнато.

        Конзолните модове по подразбиране правят мастарите и овнърите да виждат всички съобщения с левел о в partyline.
        Защото [putlog] се използва главно за логване на команда и можете да бъдете сигурни че това което пратите ще се покаже на
        овнърите и мастърите в partyline-а. Което е добре понеже по този начин можете да направите скрипта ви да праща съобщения
        от събития към partyline-а за вашите мастъри и овнъри.
        Можете да го използвате и за debugging (намирайки каде нещо дава грешка). Слагайки [putlog] командата през няколко реда
        да изпраща съобщения към partyline-а много лесно можете да разберете къде скрипта ви греши, когато прави нещо което вие не
        искате. Без тези съобщения може да ви отнеме доста дълго време да откриете каде е грешката.

        Можете да изпратите съобщение на потребител от partyline-а с командата [putdcc].
        Стандартният синтаксис е [putdcc <idx> "<text>"].


        <idx> сочи към сокета към който съобщението ще бъде пратено. Всяко идващо и излизащо съобщение от вашият бот си има така
        наречен сокет номер. Такава връзка може да бъде връзката към IRC сървърът, към свързан бот или към потребител който е в
        partyline-а. Можете да видете сокет номерата на вашият бот които в момента се използват като използвате командата [dccstat]
        в partyline. Някой binds, като [bind dcc], изпращат сокет номера на потребителя който е изпълнил командата към процедурата
        след което вие можете да използвате сокет номера за да изпратите съобщение директно към него с командата [putdcc].

        <text> е съобщението. Например, [putdcc $idx "Hello"] ще изпрати "Hello" към сокет номера който се съдържа в $idx.

        Има 3 команди с които можете да изпращате команди към IRC сървъра.
        Тези команди са [putserv], [puthelp] и [putquick].
        Всички тези команди правят абсолютно едно и също нещо но се различават по привилегията която ползват.
        [putquick] командата има най-голяма привилегия и съобщението се изпраща веднага към сървърът.
        [putserv] командата използва нормални привилегии и се използва за изпращането на команда за която не трябва да се бърза.
        [puthelp] командата е с най-малки привилегии, използва се за пращане на съобщения и нотиси към други хора, защото това
        обикновено има много ниски привилегии.

        Синтаксисът на командите [putquick], [putserv] и [puthelp] е [putserv <text> [options]].


        <text> е командата и параметрите които искате да пратите към IRC сървърът.
        Ако искате да пратие съобщение към някой потребител или канал синтаксисът трябва да бъде
        ["PRIVMSG <nickname/channel> :<message>"] или ако искате да изпратите нотис
        ["NOTICE <nickname/channel> :<message>"], кадето nickname/channel е псевдонима или канала към който искате да изпратите
        съпбщението а <message> е съобщението което искате да пратите. Например [puthelp "PRIVMSG foo :Hi there."] ще изпрати съоб
        щение "Hi there." към псевдонима "foo".

        [options] са параметрите на командата. В момента има само един параметър и това е -next.
        Това ще придвижи вашата команда по напред и ще ви даде по големи привилегии и така ще я изшратите по бързо.
        Повече информация за IRC командите можете да намерите на http://irchelp.unibg.org/irchelp/IRC/Do ... fc1459.txt

        Има две команди с които можете да пратите команди към другите ботове.
        Те са [putbot] и [putallbots]. Както вече сте разбрали [putbot] ще изпрати командата само до определен бот, а [putallbots]
        ще изпрати команда до всички свързани ботове.
        Синтаксисът на командата [putbot] е [putbot <botnet-nick> <command>] а на командата [putallbots] - [putallbots <command>].

        <botnet-nick> е псевдонимът използван в BotNET-а (обикновено същият като нормалният) от бота към който искте да пратите
        съобщението.

        <command> е командата която ще бъде изпратена и параметрите към нея.
        Първата дума е обикновено командата която искате да пратите и на която [bind bot] ще реагира а останалото е допълнителна
        информация или параметри които искате да изпратите към нея които ще бъдат добавени като последен параметър към процедурата
        Забележете че и тук както при set командата, трябва да затворите <command> с кавички.

        Има два начина да промените модовете в канал.
        Това се прави ръчно с командата [putserv] или с предназначената за тази цел команда [pushmode] която е и по бърза.
        [pushmode] командата проверява всички мод промени докато скрипта или процедурата свърши и след това се опитва да прати
        колкото се може повече модове към IRC сървърът (ако направите 4х +о, ботът ще ги направи +оооо).
        Синтаксисът е [pushmode <channel> <mode> [parameters]].

        <channel> е каналът за който ще бъде направена промяната.

        <mode> е модът който искате да промените.
        Това може да е нещо за самият канал (като +i или -m) или може да е нещо спрямо потребител в канала (като например +v или
        -о).

        [parameters] са параметрите нужни за промяната на мода.
        Ако слагате или махате ключ на канал например това ще бъде ключът който искате да сложете или да махнете от канала или
        ако давате операторски права на някой това ще бъде неговият псевдоним.

        ВНИМАНИЕ: Можете да направите само ЕДНА промяна на мод чрез командата [pushmode].
        Така че използвайки -оooo за <mode> няма да проработи. Ботът ще направи всичко това след като свърши процедурата.

        Има два начина да изритате някой от канала.
        Да направите това ръчно чрез командата [putserv] или с командата [putkick] която е направена за това.
        Синтаксисът е [putkick <channel> <nickname(s)> [reason]].

        <channel> е каналът от който искате да изритате псевдонима/ите.

        <nickname(s)> са псевдонима/ите които искате да изритате. Това може да бъде или един псевдоним или много разделени с
        запетайки. Колко хора можете да изритате с тази команда зависи от вашият IRC сървър.

        [reason] е причината заради която ги изритвате от канала.

        Сега ще се научите как да изпълнявате команди само при някакви определени условия това също е една от най-важните части,
        почти няма скрипт или програма която да не използва това. С това можете да проверите какво е задал потребителя, да видите
        дали е валидно или да попитате какво да се направи.

        С [if] командата можете да направите скрипта ви да изпълнява дадена команда само когато нещо което сте задали е едно и също
        или различно с друго. Това може да е команда, която да бъде изпълнена 2 стринга, напрактика всичко. Незнаем как да обясним
        това с думи ... но е много проста команда щом я разберете веднъж. Просто ще ви кажем как работи и ще ви дадем няколко пример
        а
        по-късно, за да я разберете по добре.
        Синтаксисът е [if { <action> <compare method> <action>} { <body> }].

        Двете <action> са какво командата [if] трябва да сравни.
        Това може да са 2 стринга, команда (незабравяйте да я обградите в скоби като беше казано) или някакъв текст (заграден в
        кавички, и това също бе казано :)) или всичко друго което може да се използва за сравнение.

        <compare method> казва на [if] командата как да сравни двете actions. Това може да бъде 2 неща, по точно == за 'равно на' ил
        и
        != за 'различно от', когато една от <action> не е число.
        Ако и двета <action> са числа можете да използвате и 'по-голямо от' (>) и 'по-малко от' (<) знаци, да видите дали нещо е
        по-голямо от друго (можете да използвате за пример команда която смята колко символа има в <action> и връща числова стойност
        която се сравнява с втория <action>). Накрая но не на последно място, когато сложите 'е' (=) знака след 'е по-голямо от' или
        'е по-малко от' можете да получите 'е по-голямо/по-малко или равно на'.

        <body> е основната команда която ще бъде изпълнена ако [if] командата сполучи.
        Body не трябва да е на една линия, ето защо [if] командата започва с отворена къдрава скоба.
        Можете да сложите нова команда на всеки ред и тя все ще бъде част от [if] командата, докато затворите body с къдрава скоба
        както при процедурата.

        Понякога може да искате да проверите дали нешо е правилно или грешно.
        За компютърната програма 0 винаги значи грешла докато 1 е правилно. Можете да направите [if {$one == 1} { <body> }],
        но има и друг начин да направите това. За да видите дали нещо е правилно можете просто да направите [if {$one} { <body> }]
        и вместо [if {$one == 0} { <body> }] можете да направите [if {!$one} { <body> }]. Можете да замените стринга с команда
        или с каквото и да е друго. Слагайки само един <action> на [if] командата без <compare method> кара TCL да провери дали това
        е вярно. Като се добави ! пред <action> без да се дава параметар за <compare method> и за втори <action> кара TCL да провери
        дали това е грешно. Забележете че в този случай 'вярно' е еквивалентно на всяко число от 0, не само на 1.

        За мачвате на едно или две неща можете да имате няколко условия.
        След вторият action можете да добавите && за 'и' или || за 'или' и да сложите още една проверка. След това можете да направи
        те
        някой неща отново и отново и т.н., но това не означава че ще работи когато използвате и двете && и ||.

        За да предотвратите [if] командата да прави грешки когато види || и && в една и съща [if] команда, можете да ограничите
        частите в които искате && и || да действат като ги заградите в скоби. Не можем да кажем това по по-лесен начин затова ще
        ви дадем пример. Когато имате [if {$test(start) == $test(stop) && $test(when) != "" || $test(what) != ""} { <body> }]
        и искате [if] командата да работи само когато [ $test(start) == $test(stop) ] и [ $test(when) != "" || $test(what) != "" ],
        това вероятно няма да работи.

        [if] командата вероятно ще види това като [ $test(start) == $test(stop) && $test(when) != "" ] или [ $test(what) != "" ].

        Това ще се оправи като сложите последната част м/у скоби което ще го направи да изглежда като:
        [if {$test(start) == $test(stop) && ($test(when) != "" || $test(what) != "")} { <body> }].

        Експериментирайки с това ще е най-добрият начин да разберете как точно работи.

        Възможно е също да сложте втора [if] команда след първата. Това може да се използва ако искате първо да проверите стринг
        А и ако той не отговаря на условието да се провери стринг В.

        Начинът по който може да се направи това е да се сложи [elseif] след затварящата скоба.
        Всичко което идва след [elseif] работи по същият начин по който работи и [if] командата.
        Малък пример:
        if {$nick == "edi"} {
        <first body>
        } elseif {$chan == "#IRCHelp"} {
        <second body>
        }

        В този случай ако $nick съвпадне с "edi" <first body> ще се изпълни.
        Командите в <second body> ще бъдат игнорирани даже и ако $chan съвпадне с "#IRCHelp. Както и да е, ако $nick е различно от
        "edi", но $chan съвпадне с "#IRCHelp" тогава <second body> ще бъде изпълнено. Ако нито един от стринговете не съвпадне
        нито едно от двете ще се изпълни и скриптът ще продължи.

        Можете да сложите колкото искате [elseif] команди. След първата можете да бъде сложена втората и така нататак.

        Освен [elseif] можете да ползвате и [else].
        Body в [else] ще бъде изпълнено след като всички [if] и [elseif] проверки се провалят.
        Можете да използвате [else] без дори да имате [elseif] в вашата [if] команда.
        Ето два малки примера:

        if {$nick=="edi"} {
        (...)
        } elseif {$chan=="#IRCHelp"} {
        (...)
        } elseif {$host != "*![email protected]"} {
        (...)
        } else {
        (...)
        }
        if {$enabled} {
        (...)
        } else {
        (...)
        }


        За разлика от [elseif], [else] може да се използва само веднъж при [if] командата.

        Сега да обърнем внимание как се работи с lists и как да ги разбием на части.

        List е просто казано набор от обекти, за разлика от стирнговете които са набор от символи. Обектът сам по себе си може да
        бъде стринг или друг list с нов набор от обекти. Тези обекти са обикновено разделени с празни места но те могат да
        съдържат и празни места в себе си. Каде обектът в list започва и каде свършва може да бъде дефинирано с отваряща и затваряща

        скоба.

        Командите които ще бъдат дискутирани се отнасят към това което получат за вход като list.
        Това означава че ако входът е нещо което има в себе си скоби, той ще бъде третиран като начало и край на обекта в list,
        така че внимавайте с тези команди когато се занимавате с псевдоними например.

        Ако е нужно ще бъдат добавени и скоби, като например ако имате скоби във това което вкарвате като команда, в този случай
        скобите ще бъдат маркирани като начало и край на обект.

        Примерно ако имахте list "test {foo bar} temp", тогава първият обект от list-а ще бъде "test", втория "foo bar"
        (а не "{foo" и "bar}", защото скобите ще индикират началото и края на обекта) и третият "temp".

        Както беше казано, обектът може да съдържа и нов list с обекти. Това може да ви се стори странно но ще ви дадем пример.
        Ако имахте list "test {foo {foo bar}} temp" тогава "foo {foo bar}" ще бъде вторият обект. Ако искате да го разбиете
        на части отново тогава първият обект ще бъде 'foo' а вторият 'foo bar' и така нататак. Мислете за него сякаш е голяма кутия
        с малки кутии вътре които пък имат в себе си още по-малки кутии. Нещо като принципа на руската матриошка ако знаете какво е
        това ;))

        Lists могат да се съдържат в стринговете, но те могат и да бъдат и изхода на командата.
        Най-важното нещо е да внимавате с командата която използвате и да знаете дали те процедират с това което им пратите като lis
        t
        или като стринг и дали те връщат list или стринг, защото ако очакват list трябва да се уверите че обектите вътре са в реда в
        който ги искате и нямат забравени скоби или празни места които ще объркат цялата работа.

        Можете да създадете list с командата
        • .
          Синтаксисът е [list [object(s)]].

          [object(s)] са обектите които искате да има list. Трябва да разделите всеки един обект с празно място и можете да определите
          точно каде обекта започва и завършва с скоби точно както бе казано.
          • командата връща list с обектите които са му били дадени.
            Например [list "test" {foo bar} "temp"] ще върне list в който първият обект е 'test', вторият 'foo bar' а третият 'temp'.

            Вземането на обекти от list е доста лесно. Командата за това е [lindex].
            Синтаксисът е [lindex <list> <number>].


            <list> е list-а от който ще се вземат обектите.
            Това може да е всичко от стринг съдържащ list ($test може да съдържа list например като поставите изхода на
            • командата
              в него чрез [set]) до команди, стига да е валиден списък а не просто стринг.

              <number> е номера на обекта който искате да достигнете.
              Всеки обект в list има свой номер, те започват от 0. Първият обект е 0, вторият 1, третият 2 и така нататак. Малко е странно
              ,
              но ако програмирате това ще ви се стори доста познато.

              Малък пример: [lindex $test 5] връща шестият обект който се намира в $test.

              [lindex] командата връща стринг който съдържа само обекта без отварящи и затварящи скоби които да маркират началото и края
              на обекта ако тези скоби са в list.

              Когато искате да вземете повече от един обект ще смените малко командата. За това ще използваме [lrange].
              Синтаксисът е [lrange <list> <start number> <end number>].

              <list> е list от който ще се вземат обектите също като при командата [lindex].

              <start number> е номерът на обекта от който командата трябва да започне.
              Номерацията на обектите е по същият начин както при [lindex].

              <end number> е номерът на обекта кадето командата трябва да спре.
              Вместо номер да зададете и думата [end]. Това ще накара командата да вземе от даденият първи обект до последният от list.

              Пример: [lrange $test 3 7] връща обектите от 4 до 8 от list който се намира в $test или [lrange $test 4 end] ще върне от
              5-я обект до края на list в $test.

              [lrange] командата връща нов list от обекти които сте избрали, като оставя всяка отваряща и затваряща скоба която маркира
              началото и края на обекта който е бил в list-а и добавя скобите ако е нужно.

              Това може да се направи с [llength] командата.
              Синтаксисът е [llength <list>].

              <list> е листа от който обектите ще бъдат вземани точно както при [lindex].

              Тази команда връща стринг който съдържа номер, който е равен на броя на обектите които list съдържа като се започне от 1
              а 0 ще бъде върната ако list-а е празен.

              Можете и да препокриете обекти от list. За това ще използваме командата [lreplace].
              Синтаксисът е [lreplace <list> <start number> <end number> [object(s)]].

              <list> е листа от който обектите ще бъдат вземани точно както при [lindex].

              <start number> е номерът на обекта от който командата ще започне да препокрива обектите в list. Номерацията е същата както
              при командата [lindex].

              <end number> е номерът на обекта при който командата ще спре да препокрива обектите от list. Вместо номер можете просто да
              напишете [end]. Това ще накара командата replace да препокрие всички обекти от зададеният начален номер до края на list.

              [object(s)] е това s което искате командата да препокрие дадените обекти. Ако не зададете нищо като обект дадените обекти ще
              бъдат изтрити от list. Забележете че само по себе си това е валиден list.

              Пример: [lreplace $test 3 7 "foo" "bar"] връща list с обекти от 4 до 8 препокрити с обектите 'foo' и 'bar' или
              [lreplace $test 4 end] ще върне list с обектите от 5 до края на list изтрити.

              [lreplace] командата връща нов компилиран list с препокритите обекти които вие сте му задали оставяйки отварящите и затварящ
              ите
              скоби които маркират началото и краят на обекта, и преди са били в list непокътнати и добавя нови ако е нужно.

              Можете да превърнете стринг в list с командата [split].
              Синтаксисът е [split <string> [character]].

              <string> е стрингът който искате да превърнете, което може да бъде или стринг или изхода на команда който е в вид на стринг.

              [character] е символът който ще бъде използван за разделянето на стринга на обекти. Когато [split] срещне даденият символ
              той ще го види като маркировка за края на обекта и началото на нов. Ако не се зададе символ, символът по подразбиране ще ста
              не
              празното място.

              [split] командата връща нов list в който първият обект е всичко в <string> до [character], вторият обект е всичко м/у
              вторият и третият [character] и т.н. Всяка скоба в <string> ще бъде избегната като се добави нова скоба или наклонена черта.

              Пример: [split "test {foo bar} temp"] ще върне list в който първият обект е 'test' вторият "{foo", а третият "bar}", и
              четвъртият 'temp'. Същото нещо ще върне и [split "test.{foo.bar}.temp" .].

              Сега ще се научим да разделяме стринговете на части.

              Тази команда работи по абсолютно съшият начин както командата [lindex], само че е малко по различна.
              За да вземем символите от стринг ще използваме командата [string index].
              Синтаксисът е [string index <string> <number>].

              <string> е стрингът от който символите ще бъдат взети. Това може да е всичко от стринг както и променлива от команда.

              <number> е номерът от символи който искате да получите, където 0 е първият символ, 1 е вторият, 2 е третият и т.н.

              [string index] командата връща стринг който съдържа символите които вие сте задали. Ако дадете list който съдържа обект
              в скоби, скобите също ще се третират като символи в стринга а не като вимволи за започаване и завършване на обекта.
              Например, [string index "test {foo bar} temp" 5] ще върне "{" а не "f" или "foo bar".

              Тази команда работи по същият начин по които и командата [lrange] с малки разлики. За да получите няколко символа от стринг
              използвайте [string range]. Синтаксисът е [string index <string> <start number> <end number>].

              <string> е стрингът от който символите ще бъдат взети. Това може да бъде всичко от стринг както и променлива от команда.

              <start number> е номерът от който искате да започнете, където 0 е първият символ, вторият 1 и т.н.

              <end number> е крайният номер до който искате да достигнете, където 0 е първият символ, вторият 1 и т.н.
              Тук можете да използвате 'end' за да зададете че искате да вземете всичко от началният номер до края на стринга.

              [string range] командата връща стринг. Ако дадете list който съдържа обект в скоби, скобите ще бъдат третирани като символи
              в стринг, а не като специални символи за началото и края на обекта. Например, [string range "test {foo bar} temp" 5 8] ше
              върне "{foo" а не "foo ".

              Ако искате да видите колко символа има даденият стринг използвайте командата [string length].
              Синтаксисът е [string length <string>].

              <string> е стрингът от който искате символите да бъдат взети. Това може да бъде всичко от стринг както и променлива от коман
              да.

              [string length] командата обръща стринг който съдържа номер равен на броят символи които стринга съдържа. Ако дадете list ко
              йто съдържа обект в скоби, скобите ще бъдат третирани като символи
              в стринг, а не като специални символи за началото и края на обекта. Например, [string length "test {foo bar} temp"] ше
              върне 19 + скобите а не 17.

              В някой случаи ще искате да видите дали част от текст се съдържа в стринг. Можете да видите това с командата [string match].
              Синтаксисът е [string match <pattern> <string>].

              <pattern> е това за което искате да бъде търсено.
              Освен нормални символи можете да сложите и звездичка (*) или въпросителен знак. * означава че всичко ще бъде съвпадне, а ?
              само с един символ. Например ако имате "*foo*" за <pattern> [string match] ще намери съвпадение в "foo" навсякаде в стринга,
              така че ако търсим "*foo*" в "test foobar" ще имаме съвпадение. Ако тук използвате "?foo*" ще намери съвпадение само ако
              стринга има символите 'foo' от второто място до петото независимо от наставките, така че ако търсим "?foo*" в "test foobar"
              няма да имаме съвпадение но "*foobar" ще съвпадне.

              <string> е стринг в който [string match] ще търси <pattern>. Това може да бъде всичко от променлива до команда която връща
              стринг.

              [string match] връща 1 ако намери съвпадение и 0 ако не намери.

              Много неща в TCL правят разлика м/у малки и големи букви. Например в много случаи 'FOO' няма да бъде същото както 'foo',
              така че в някой случаи ще бъде по добре да превърнете всичко в малки или в големи букви преди да го използвате. Това може да
              бъде направено с командите [string tolower] и [string toupper]. Синтаксисът е [string <tolower/toupper> <string>].

              <tolower/toupper> е в какво искате да превърнете стринга, [tolower] ше го направи на малки а [toupper] на големи.

              <string> е стринга който искате да превърнете. Това може да бъде всичко от променлива до команда която връща
              стринг.

              [string <tolower/toupper>] командата връща стринг в който всички символи са само малки или големи букви. Ако зададете list
              който съдържа обекти в които има скоби те също ще бъдат сметнати за символи в стринг а не като специални символи за край и
              начало на обект. Например, [string tolower "test {foo BAR} temp"] ще върне "test {foo bar} temp" а не "test foo bar temp".

              Можете да превърнете list в стринг с командата [join].
              Синтаксисът е [join <list> [character]].

              <list> е list , който искате да превърнете в стринг, което може да е всичко от сринг, който съдържа list или
              команда, която връща list например.

              [character] е символът който ще бъде сложен м/у обектите от list в новият стринг. Ако не сте задали символ ще бъде използван
              о
              празно място.

              [join] командата връща стринг с всички обекти от <list> разделени с [character].
              Всяка скоба която е в <list> няма да бъде всключена в новият стринг, само обектите ще бъдат сложени в стринга.

              Пример: [join [list "test" {foo bar} "temp"]] ще върне стринг съдържащ "test foo bar temp" а [join [list "test" {foo bar} "t
              emp"] .]
              ще върне "test.foo bar.temp" (забележете че празното място на 'foo bar' НЕ е препокрито с . от командата [join] защото тя
              свързва _обектите_ от list а не думите!).


              Сега ще научим различните видови цикли (loops).
              При повечето случаи може да ви се стори доста полезно да накарате скрипта ви да повтори някоя команда няколко пъти, защото
              често нямате контрол над това колко големи са нещата и поради тази прична една команда трябва да бъде повторена.

              Най-простият цикъл е [while].
              Това ще продължи докато дадено действие е вярно.
              [while] командата доста прилича на [if] командата. Синтаксисът е [while { <check> } { <body> }].

              <check> работи по абсолютно същият начин като [if]. Възможно е да замените 'while' с 'if' и да накарате скрипта да извърши
              командата само веднъж без да се натъкне на някакви грешки освен на тези които идват от вашият скрипт но не и от самата [whil
              e]
              командата.

              <body> е същото като при [if].

              Пример:
              set test "[chanlist #IRCHelp]"
              set ops 0
              while {$test != ""} {
              if {[isop [lindex $test 0] #IRCHelp]} {
              incr ops
              }
              set test "[lreplace $test 0 0]"
              }
              puthelp "PRIVMSG #IRCHelp :There are currently $ops people opped in #IRCHelp."

              Друг цикъл е [foreach].
              В този цикъл слагате един или повече lists и след това команди които ще бъдат изпълнени за всеки обект от list.
              Синтаксисът е [foreach <string> <list> [<second string> <second list> ...] { <body> }].

              <string> е стринга в който ще бъде сложен обекта. Можете да сложите колкото си искате lists в цикъла, само да има стринг в
              който да се слагат обектите. Също защото foreach знае че става въпрос за стрингове няма нужда да слагате $ отпред.
              <string> ще съдържа обект от list се едно [lindex] е използван.

              <list> е list от който цикълът трябва да вземе обектите.

              <body> е командите които ще бъдат изпълнени и работи по същият начин както при [while].

              Ето пример как работи [foreach]:
              set ops 0
              foreach nickname [chanlist #IRCHelp] {
              if {[isop $nickname #IRCHelp]} {
              incr ops
              }
              }
              puthelp "PRIVMSG #IRCHelp :There are currently $ops people opped in #IRCHelp."

              Третият и последен цикъл е [for].
              Този цикъл е горе-долу лесен и се използва най-вече когато някой иска да цикли нещо за период от време.
              Синтаксисът е [for { <start> } { <check> } { <loop> } { <body> }].

              <start> е командата която ще бъде изпълнена преди цикълът да се стартира.
              Това може да е дефинирането на стринг на 0.

              <check> е проверката която ще бъде направена докато цикълът върви и работи по същият начин по който работи и [while].

              <loop> е командата която искате да бъде изпълнена всеки път когато цикълът свърши. Това може да бъде увеличаването на стринг
              с 1.

              Пример:
              set test "[chanlist #IRCHelp]"
              set ops 0
              for { set number 0 } { $number < [llength $test] } { incr number } {
              if {[isop [lindex $test $number] #IRCHelp]} {
              incr ops
              }
              }
              puthelp "PRIVMSG #IRCHelp :There are currently $ops people opped in #IRCHelp."

              Чудили ли сте се някога какво значат тези странни символи ((?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}). Това са просто регуларни и
              зрази, и не са никак сложни щом ги разберете веднъж. Команда с която можете да използвате регуларни изрази за да намерите съ
              впадение в стринг е [regexp]. Главният синтаксис на командата е [regexp <регуларен израз> стринг]. Ако имаме съвпадение кома
              ндата ще върне 1 в противен случай 0, ако се зададе -inline опцията (преди регуларният израз) ще се върне съвпадението. Сами
              те регуларни изрази ще обясним малко по късно, сега да поговорим малко за самата команда. Ако се зададат допълнителни аргуме
              нти след стринга то тогава в първият от тях ще се съдържа всичките символи от стринга които са съвпаднали с регуларният изр
              аз, а следващите елементи ще съдържат първият елемент после вторият и така нататак... Могат и да се зададат както споменахме
              за -inline и допълнителни опции преди регуларният израз. Сега ще споменем само най-важните от тях:


              -about Вместо да се прави съвпадение с регуларният израз ще върне list който съдържа информация за регуларния
              т израз. Използва се за debug за повече информация вижте man страницата.



              -expanded Използване на резширените регуларни изрази кадето празните места и коментарите се игнорират, същото ка
              то (?x) и както /x при perl ;).



              -indices Вместо да се слага в вторите, третите и т.н. аргименти след стринга, съвпаденията ще се прави list съд
              ържащ два елемента които ще са индексите кадето има съвпадение.


              -line Включва правенето на разлика на символа за нов ред (\n), по принцип новата линия е съвсем нормален сим
              вол без специално значение. С флага, `[^` и '.' никога няма да имате съвпадение с това. `^` съвпада с празен стринг след нов
              а линия в допълнение на нормалната му функция, и '$' съвпада с празен символ в допълнение на нормалната му функция.
              Този флаг е еквивалентен на двете функции -linestop и -lineanchor, или на опцията (?n).


              -linestop Това променя държанието на `[^` и '.' така че те да спират на новата линия. Това е също (?p).



              -lineanchor Това променя държанието на `^` и '$' (котвата) така че те да означават началото и края на линията. Същ
              ото като (?w).


              -nocase Прави големите букви в стринга на малки докато се търси съвпадение.


              -all Прави така че регуларният израз да съвпадне колкото се може повече пъти в стринга. Като връща целият б
              рой на съвпаденията.


              -inline За това можем да дадем един пример, мисля че го обяснихме по-горе:

              regexp -inline -- {\w(\w)} " inlined "
              => {in n}
              regexp -all -inline -- {\w(\w)} "
              inlined "
              => {in n li i ne e}


              -start index Определя се от каде да започне търсенето. Използвайки `^`,няма да има съвпадения с началото на линията
              , но \A все още ще се използва за началото на стринга.


              -- Индикира края на опциите. Всичко след това ще бъде третирано като регуларен израз нищо че започва с ти
              ренце.

              Ако зададете повече стрингове за да видите съвпаденията те просто ще бъдат напулнени с -1, ако сте задали -indicies или ще б
              ъдат празни.

              Сега дойде времето за същинската част - епа как да го направим това регуларния израз и яде ли се, щото излгежда много сложно
              , некфи чертички и такива работи :P

              Регуларните изрази в TCL sa написани от Хенри Спенсър, и са базирани на perl5.


              Примерно ако искате да видите дали има символ М в стринга се пище М на мястото на регуларният израз ;)). Ако искате да видит
              е дали има две съвпдения можете да използвате ММ което ще подразни разбирачите на регуларни изрази които биха го написали M{
              2} така изглежда доста по добре нали ? ;І Ако искате да следите за примерно 3 или повече (повечето могат да ви потрябват ако
              използвате -inline или по някакъв начин вкарвате съвпадението в стринг за по късно обработване) използвайте М{3,} ако след
              запетайката напишете число по голямо (ТРЯБВА да е по голямо от предхождащото го число) то тогава на български това би прозву
              чало така 'Искам 3 съвпадения или повече ненадхвърляйки Х, кадето Х е числото за което ставаше дума.' Пример:
              M{0,1} това ще съвпадне с 0 или 1 съвпадения, което е абсолютно същото с ?-я знак, тоест M? . Ето и още няколко дефинирани з
              а наше улеснение подобна група от символи: * - {0,} съвпада с 0 или с много символи; + - {1,) съвпада с 1 или повече символи
              .

              Звездичката и плюса (както и {m,}) са лакоми което ще рече че ще направят колкото се може повече съвпадения. Ако искате да г
              о направите колкото се може по-малко съвпадения, трябва да сложите '?' нещо като: *? +? {m,}? {m,n}?

              Тези съвпадения се правят само за един символ, ако искате да бъдат направени за повече от един трябва да ги заградите в скоб
              и. Пример: (qwerty)+, ще вземе колкото се може съвпадения с qwerty, които следват едни след други. Тоест qwertyqwertyqwerty1
              23787324qwerty ще съвпадне с първите 3 qwerty-та и после с последното.

              Щом група от символи се заградят в скоби, те биват върнати като съвпадение, в противен случай няма да бъдат върнати. Ако иск
              ате просто да имате групиране без това групиране да се върне като част от съвпадението използвайте (?:chars).

              Група от символи заградени в [] скоби ще се смята като един символ който може да бъде едно от тези неща в скобите. Тези симв
              оли могат да обхващат и диапазон от символи (A-Z - ABCD...Z ,a-z - abcd...z ,0-9 - 0123456789. Ако скобите започват с '^' то
              ест '[^' това означава всички символи които НЕ са ... Ако искате да имате съвпадение с '^' то тогава не трябва да я слагате
              в началото, а на всяко друго място но не и там или да я \!!! Не можете да си правите несъществиващи диапазони, ако искате да
              имате съвпадение с '-' можете да го сложите в началото или в края на скобите, не можете да правите и няколко диапазона слеп
              ени примерно A-B-G но можете да направите A-Za-z.

              Ако скобите започват и завършват с точка (.) тогава това което е в тях няма да се счита като поредица от символи а като един
              общ символ, примерно [.ab.] ще съвпадне с ab но не и с a.

              Точката (.) <- ще сувпадне с всеки символ но не и на новият ред. Примерно f.*bar в foobar ще съвпадне с двете о-та, но ако и
              маме perlprexer и напишем p.*e ще съвпадне с erlprex а не с erlpr защото * е лакома както казахме по-горе.


              Ако искте да имате съвпадение в началото на реда използвайте '^' , а за ограничител за края на реда '$'. Позитивното гледане
              напред се прави чрез (?=char), а негативно (?!char) ето няколко примера за да ви стане ясно:
              Имате foobar и изкате да има съвпадение с foo последван от bar използвайте foo(?=bar)
              имате IRCGame и искате да имате съвпадение с IRC което не е полседвано от Help тогава използвайте IRC(?!Help)
              и в двата примера ще има съвпадения. Регуларните изрази не могат да завършват с наклонена черта (\).

              Има няколко специални символа в регуларните изрази които могат да се използват направо (наготово). Те групират няколко симво
              ла. Сега ще ви дадем една голяма част от тях, те се използват като най-нормални символи в регуларен израз:

              \a символът камбанка както в C

              \b едно назад (две напред - just kidding kiddies) backspace, както в C

              \e `ESC', или окталната стойност 033

              \f formfeed, както в Perl

              \n newline, както при Perl

              \r carriage return, както при Perl

              \t horizontal tab, както при Perl

              \uwxyz
              (кадето wxyz са точно четори hexadecimal цифри) е Unicode символа U+wxyz

              \Ustuvwxyz
              (където stuvwxyz са точно осем hexadecimal цифри) запазени за някакви хипотетични Unicode екстензии за 32 бита
              .

              \v vertical tab, както навсякаде

              \0 символа която стойност е 0

              \xyz (където xyz е точно 3 октални цифри) символите чиито октална стойност е 0xyz.

              Hexadecimal цифри са `0'-`9', `a'-`f', и `A'-`F'.
              Octal цифри са `0'-`7'.


              *Малко съкращения за мързелите*
              \d - поредица от всички цифри - [0-9]

              \s - знак за интервал - табулация, интервал новред или връщане - [ \t\n\r]

              \w - знак за дума - [A-Za-z_]

              \D - обратното на \d - [^0-9]

              \S - обратното на \s - [^ \t\n\r]

              \W - обратното на \w - [^A-Za-z_]


              Забележете че тези символи могат да се използват и в '[ ]'.


              \A съвпадение само в началото на стринга

              \m само в началото на думата

              \M само в края на думата

              \y в началото или в края на думата

              \Y да не е началото или края на думата

              \Z съвпадение само в края на стринга

              \m (където m е цифра) ще споменем след малко

              \m ще съвпадне с същото което е съвпаднало при мачването на стринга което е заградено в скоби, малко сложничко затова един п
              ример ще ви дойде добре ([abc])\1 това ще съвпадне с два еднакви символа или aa или bb или cc.

              В допулнение на главният синтаксис има няколко специални форми. Примерно ако се започне с поредица (?xyz) кадето xyz са една
              или повече буквени символи дава определени указания на регуларният израз, сега ще кажем някой от тях:

              c разлика м/у малки и големи букви (по-принцип е включ.)

              i прави разлика м/у малки и големи букви

              m изторически символ за n

              n прави разлика за нов ред

              p частична разлика за нов ред

              s никаква разлика за нов ред (по-принцип е включ.)

              t малък синтаксис (по-принцип)

              x увеличин синтаксис

              Когато използвате увеличеният синтаксис, празните места и коментарите ще бъдат игнорирани (това вече бе казано) можете да из
              бегнете това като поставите \ пред тях.

              Можете да имате няколко регуларни израза разделенио с '|' като всеки регуларен израз е обграден в () или в (?:).


              Друга команда която използва регуларните изрази е regsub. Тя прави заместване на част от стринга с нещо друго. Синтаксиса е
              [regsub regexp string substspec varName].

              Прави се съвпадение на регуларният израз в стринга замествайки съвпадението със 'substspec' и копирайки новият стринг в 'var
              Name'. Ако 'substspec' съдържа '&' или '\0', тогава това ще бъде заместено с съвпадналата част от регуларният израз.
              Ако 'substspec' има '\n' кадето n е цифра м/у 1 и 9, тогава това ще бъде заменено с n съвпадението оградено в скоби.

              Можете да сложите допулнително наклонени черти (\) за да избегнете &, \0, \n или \. Допълнителни опции могат да бъдат зададе
              ни като преди регуларният израз се добавят една от:

              -all Всички съвпадения в стринга се заместват, иначе само първото съвпадение ще бъде замесено.


              -expanded Можете да използвате разширени регуларни изрази.


              -line Прави разлика м/у новата линия (това вече бе обяснено, като говорихме за regexp).

              -linestop Сменя държанието на '[^' и '.' (това вече бе обяснено, като говорихме за regexp).


              -lineanchor Сменя държанието на `^' и `$' (това вече бе обяснено, като говорихме за regexp).


              -nocase Големите букви ще бъдат направени на малки. (това вече бе обяснено, като говорихме за regexp).

              -start index Определя се от каде да започне търсенето. Използвайки `^`,няма да има съвпадения с началото на линията
              , но \A все още ще се използва за началото на стринга.

              -- Индикира края на опциите. Всичко след това ще бъде третирано като регуларен израз нищо че започва с ти
              ренце.

              Командата връща колко пъти са били направени замествания.

              Има няколко начина които се иползват монякога за да се избегнат проблемите с специалните символи в TCL. По-точно някой скрип
              тове филтрират входа с нещо като:

              proc filt {data} {
              regsub -all -- \\\\ $data \\\\\\\\ data
              regsub -all -- \\\[ $data \\\\\[ data
              regsub -all -- \\\] $data \\\\\] data
              regsub -all -- \\\} $data \\\\\} data
              regsub -all -- \\\{ $data \\\\\{ data
              regsub -all -- \\\" $data \\\\\" data
              return $data
              }

              Такъв скрипт може да премахне проблемите с специалните символи които могат да се получат при зле написани скриптове. Но дали
              ще го направи или не зависи от детайлите на скрипта. Може да не ви реши проблема или само частично. Стринга в който искате
              да бъдат избегнати специалните символи трябва да бъде маниполиран така:
              set string [filt $string]

              Сега е време да поработим малко с файлове. Това ще е малко по-трудничко но с тях ще можете да запазите информацията си даже
              и
              след рестартиране на бота.

              Преди да използвате файл трябва да го отворите. Това става с командата [open].
              Синтаксисът е [open <filename> [access]].

              <filename> е името на файла който искате да отворите.

              [access] е какво искате да направите с файла.

              Ето списък с различните access типове според ман страницатa:

              r Отваря файл само за четене; файлът трябва да съществува.
              Това е стойноста по подразбиране ако не се зададе такава.

              r+ Отваря файл за четене и писане; файлът трябва да съществува.

              w Отваря файл само за писане. Създава го ако не съществува,
              в противен случай изтрива всичко което има в него.

              w+ Отваря файл за писане и четене. Създава го ако не съществува,
              в противен случай изтрива всичко което има в него.

              a Отваря файл само за писане. Файлът трябва да съществува,
              и информацията се пише в края на файла.

              a+ Отваря файл за зачетене и писане. Ако файлът не съществува,
              той просто се създава. Ако вече е създаден се пише в края на файла.

              [open] командата връща така нареченият канал.
              Този канал ще ви потрябва ако искате да правите нещо с файла, така че трябва да 'хванете' този канал
              това може да бъде направено като каналът отиде в стринг. Пример за това е следният код в който каналът на отвореният $file
              ще се запази в $fs:
              set fs [open $file r]

              След като свършите работата си с файла трябва да го затворите.
              Затварянето е точно след писането и четенето, затова ще дадем по-добри и по-пълни примери по-късно, все пак какъв е смисала
              да отворим и затворим файл без да сме направили нищо с него нали ?!;П) Можете да затворите канал с [close].
              Синтаксисът е [close <channel>].

              <channel> е каналът в който файлът е хванат с [open].

              След като сте затворили файл трябва да го отворите наново за да можете да четете и пишете от него.

              Можете да четете от файл или линия по линия или парче по парче.
              С [gets] командата можете да четете файла линия по линия. Синтаксисът е [gets <channel> [string]].

              <channel> е каналът в който файлът е хванат с [open].

              [string] е стрингът в който ще бъде сложена линията която е взета. Ако зададете стринг gets командата ще върне колко символа
              е имала линията и ще сложи линията в стринга. Ако не зададете стринг ще се върне линията.

              Пример:
              set fs [open $file r]
              gets $fs line(first)
              gets $fs line(second)
              close $fs

              Това ще сложи първата линия от $file в $line(first) а втората от $file в $line(second).
              Можете да прочетете изхода на команда използвайки pipe и помандата open това става по долу-горе следният начин:

              set fs [open "| nslookup" r]
              puts $fs "irchelp.unibg.org"
              close $fs

              Ако искате да пишете към някаква команда можете да използвате отново pipe:

              set fs [open "|cat >> file" w]
              puts $fs "one line"
              puts $fs "two lines"
              puts $fs "three lines"
              close $fs

              Можете да четете файла парче по парче с командата [read].
              Синтаксисът е [read <channel> [bytes]].

              <channel> е каналът в който файлът е хванат с [open].

              [bytes] са номерата в байтове които искате да прочетете от файл.
              Ако не зададете номера в байтове целият файл ще бъде прочете,

              Пример:
              set fs [open $file r]
              set info [read $fs 10]
              close $fs

              Това ще сложи първите 10 байта от $file в $info.

              Можете да пишете в файлове с командата [puts].
              Синтаксисът е [puts <channel> <text>].


              <channel> е каналът в който файлът е хванат с [open].

              <text> е това което искате да напишете в файла.

              Пример:
              set fs [open $file w]
              puts $fs "$nick"
              close $fs

              Това ше напише $nick в $file.

              В някой случаи може да не знаете колко е голям файла и заради това да не знаете до каде да четете от файла.
              С [eof] командата можете да разберете дали това е краят на файла. Синтаксисът е [eof <channel>].

              <channel> е каналът в който файлът е хванат с [open].

              [eof] командата връща 1 ако последната команда която е работила с канала е върнала "end of file" и 0 ако не е.

              Един от начините да използвате [eof] командата е в [while] цикъл.
              set found 0
              set fs [open $file r]
              while {![eof $fs]} {
              gets $fs line
              if {$line == $nick} { set found 1 }
              }
              close $fs
              if {$found} {
              putdcc $idx "$nick was found!"
              } else {
              putdcc $idx "$nick was not found."
              }

              Това ще провери всяка линия от $file и ще ви каже дали тази линия е еквивалента на $nick.

              Ако работите с файлове трябва да знаете как да проверявате дали съществуват, иначе ще трябва да създавате нов файл всеки път
              когато стартирате TCL скрипта си, защото в противен случай скрипта ви ще даде грешка ако се опитате да отворите несъществува
              щ
              файл. Това може да бъде направено с командата [file exists]. Синтаксисът е [file exists <filename>].

              <filename> е файлът който искате да проверите.
              Забележете че патечката в която всички команди или файлове се изпълняват е директорията кадето е binary-то на бота, така че
              ако решите да пишете извън eggdrop директорията трябва да зададете целият път в <filename>.

              [file exists] командата връща 1 ако файла съществува и 0 ако не.

              Ако незнаете какво е сокет спокойно можете да прескочите тази глава ;)))
              Зараждането на модул е ненужно, използва се [socket options host port] командата.
              Тя връща сокет, който може да се използва за по-късно сега да обясним малко опциите, които можете да използвате при отваряне
              то на сокета.

              най-лесното

              set sock [socket 127.0.0.1 21]

              Което прави канал $sock.

              Ако искате да асинхронизирате връзката използвайте -async. Това означава че сокета ще се направи веднага, но няма да се свър
              же веднага с сървъра. Това не се препоръчва при писането на TCL-и за egg.

              set sock [socket -async 127.0.0.1 21]

              В случай че искате да използвате за връзка не локалния си адрес а друг от вашата машина пробвайте -myaddr

              set sock [socket -myaddr 12.35.61.1 127.0.0.1 21]

              За да пишете към сокета използвайте познатата функция puts channel

              puts $sock "user edi"
              flush $sock
              puts $sock "pass edolino"
              flush $sock
              puts $sock "QUIT"
              flush $sock

              така ще се логнете на сървъра и ще излезете от него (s u: edi, p: edolino).
              flush се използва за да flush-не всяка буферирана output информация
              Всяка информация която е вързана се пише в $sock, за да я извлечете използвайте gets channel

              set line [gets $sock]

              $line ще съдържа първата линия върната от сокета (обикновено 220 ProFTPD 1.2.5 Server (ProFTPD Default Installation) [irchel
              p.unibg.org])

              За четене само на част от информацията използвайте [read chan numchars], например:

              set first20chars [read $sock 20]

              Това ще вземе първите 20 символа върнати от $sock.
              За да затворите канала използвайте close $sock.

              Можете да използвате и fconfigure за да се настрои сокет канала върнат от socket командата.
              fconfigure с -error ще върне върне грешка при връзката с сокета. Хубавото е да ползвате това когато използвате -async, за да
              разберете дали имате успех.

              set returned [fconfigure $sock -error]

              Това ще върне "" ако всичко е ок, иначе ще върне грешка.

              set arr [fconfigure $sock -sockname]

              ще върне списък с 3 елемента (адреса на сокет-а, хост-а на сокет-а и порт-а на сокета). Ако хост name-а не може да се resolv
              ще се върне същото като адреса.

              set arr [fconfigure $sock -peername]

              пак връща 3 ел. но само за client socket -> address, хост и порт към който сокета се е вързал, отново ако хост name-а не мож
              е да се resolv ще се върне същото като адреса.

              Има и сървър връзка, ако ви интересува повече по въпроса `man n socket`.

              Сега ще засегнем малко темата за връзка с http сървъри, решихме само да кажем основното, а по късно вече можете да усъвърщем
              ствате наученото.

              Най-важното нещо е да имате http модула на TCL можете да го вземете от http://irchelp.unibg.org/irchelp/Downloads/eggdrop-tc
              lhttpd.tcl.gz, след това първъят ред трябва ВИНАГИ да е:

              package require http

              което означава че се изсиква модула http.

              http::config -accept "image/gif, "image/jpeg, text/*"

              С тази опция можете да зададете какви файлове могат да бъдат приети,
              по-принцип се приемат */* (всички), тази опция надали би ви помогнала много...

              http::config -proxyhost "proxy.beem.com" -proxyport 8080

              С това можете да минете през proxy сървър (proxy.beem.com), което е на порт 8080.

              Кой аксесва сайта ви? (Mozzila/5.0):

              http::config -useragent "Mozilla/5.0"

              По-принцип е "Tcl http client package 2.2."
              За да се смъкнете файл просто използвайте

              set token [http::geturl http://127.0.0.1/manual/index.html]
              set var [http::data $token]

              Което ще смъкне от http://127.0.0.1/manual/ файла index.html и ще го постави в $var (първо се слага в специална променлива з
              а модула и после се преработва в четим вид чрез http::data). Ако искате да свалите файла в bin мод (по-принцип това се детек
              тва по подразбиране) използвайте

              set token [http::geturl http://127.0.0.1/manual/index.html -binary 1]

              Ако искате да добавите допулнителен header изплзвайте

              set token [http::geturl http://127.0.0.1/manual/index.html -headers "My Header here!"]

              За да изпълните POST query:

              set token [http::geturl http://127.0.0.1/manual/index.html -query query]

              Timeout-a се определя от

              set token [http::geturl http://127.0.0.1/manual/index.html -timeout 100]

              Token-а бива рестартиран чрез:

              http::reset token

              както бе казано http::data token враща четима информация от http::geturl

              Използвайте

              ::http::status token

              да видите ефекта от използването на token-a

              За https използвайте или http::register, или LibCurl който върви отеделно от TCL (затова решихме да не пишем за него) и може
              да бъде взет от http:///irchelp.unibg.org/irchelp/Downloads/curl.zip .

              ::http::register протокол порт команда

              Протокола примерно е https, порт-а който използва протокола, и команда е командата която ще бъде изпълнена от TCL за да се с
              ъздаде сокет пример ::tcl::socket, но тя изисква tls да бъде инсталиран, така че внимавайте! Ето и малък пример:

              package require http ;# зарежда http модула

              package require tls ;# зарежда tls

              http::register https 443 ::tls::socket ;# регистрира използването на https на порт 443
              set token [http::geturl https://my.secure.site/] ;# взема информация от сайта my.secure.site/

              За да изключите използването на https използвайте

              ::http::unregister протокол

              Пример:
              http::unregister https

              Да обърнем внимание малко и на грешките:

              http::geturl ще изкара грешка ако:

              дадете грешна команда, URL, host или URL на грешен порт.

              Това означава че то не може дори и да започне прехвърлянето на данни. Ако се получи грешка при I/O сокета при четенето също
              ще има грешка. След подобни неща се използва ::http::cleanup token. Ако не се получи грешка няма да има проблем. Но ако иска
              те да проверите какво е станало можете да го направите с ::http::status token иначе можете да използвате ::http::error
              за да видите цялата грешка, status може да върне:

              ok - ако всичко е добре, все пак трябва да проверите http::code token или http::ncode token

              Това е ако се върне нещо като "HTTP 404 File not found", то не е грешка, а е върнат код, който може да бъде проверен с тези
              команди.

              eof - ако сървърът е затворил сокет-а, без да върне грешка
              error - ако сървърът е върнал error съобщение

              Като за последно малко да ви объркаме :))

              token може да бъде превърн в масив с

              upvar #0 $token state

              този масив ще съдържа елементите:

              state(body) - съдържанието на URL-то
              state(charset) - charset-а използван iso8859-1
              state(coding) - част от Content-Encoding meta-data променливата
              state(currentsize) - колко байтове са взето от URL-то
              state(error) - грешката, ако има такава при получаването на URL-то
              state(http) - HTTP statusa върнат от сървъра.
              state(meta) - meta елементите
              state(posterror) - грешка получена докато е писана POST заявката
              state(status) - или 'ok' за добре свършена работа, timeout, ако е имало timeout, reset, ако е имало user-reset, или error пр
              и грешка
              state(totalsize) - копие от Content-Length meta-data-та
              state(type) - копие от Content-Type meta-data-та
              state(url) - взето URL

              Бъдете внимателни когато използвате http с Eggdrop, защото Eggdrop спира когато има заявки което може да доведе до доста про
              блеми с управлението на бота и канала.

              Като цяло това е http.


              Сега ще обсъдъм разни тактики за писането на скриптове които могат да ви се сторят доста полезни и които могат да ви потрябв
              ат.

              За феновете на mySQL има специални модули за връзка с TCL->MySQL както за *NIX така и за Windows и Solaris. Можете да ги раз
              гледате към тях върви и достатачно допълнителна информация.

              http://irchelp.unibg.org/irchelp/Downlo ... /fbsql.zip
              http://irchelp.unibg.org/irchelp/Downlo ... 0.9.tar.gz

              Главната идея за изплзването на MySQL е статистиките да бъдат на MySQL, което ще улесни вашата работа. А като стана дума за
              статистики и не ви се занимава с MySQL можете да използвате доста добри TCL скриптове както и модули... хвърлете едно око на
              д http://irchelp.unibg.org/irchelp/IRC/Eggdrop.htm

              Много хора зареждат тоново скриптове наведнъж, и не искат да имат проблеми !!! Има няколко начина които могат да решат пробл
              емите. Използвайте колкото се може по _малко_ return 0 или в противен случай ще спре всички bind търсения преди процедурата
              ви.. Ето някой идеи:
              1. Наименувайте proc-а си смислено.
              proc mbti:antiidle {} {}

              НЕ нещо от сорта на:
              proc script {} {}

              2. Същото се отнася и за променливите ви. Ако използвате '-' в тях когато ги викате ги обграждайте в скоби така -> ${mbti-an
              tiidle}

              3. Ако скриптът ви използва таймери гледайте да не са много.

              Можете да накарате скрипта ви да изпълни някаква команда след определен период от време в минути или секунди. Това може
              да бъде направено с таймер с командите [timer] и [utimer].
              Синтаксисът е [timer <time> "<command> [parameters]"].

              <time> е след колко време командата ще бъде извършена.
              [timer] изисква това в минути а [utimer] в секунди.

              <command> е командата която ще бъде изпълнена. Това може да бъде TCL команда, Eggdrop команда или всичко друго стига то да е
              валидна команда.

              [parameters] са параметрите които искате да дадете към командата.

              С командите за [timers] и [utimers] можете да видите списък с текущите таймери. Тези команди не изискват никакви параметри
              и връща лист всеки обект от който съдържа информация за един от таймерите който върви в момента.

              Забележете че ако в таймера имаме $foo който съдържа примерно "[foo]" и след това извикаме таймера с [utimer 30 "test $foo"]
              ще се опита да изпълни командата 'foo' защото е заградена в скоби и изпраща изхода на командата към 'foo' а не това което е
              върнала командата. Така че бъдете много внимателни когато използвате таймери и избягвайте всяка скоба в стринга си с команда
              като
              • или като слагате наклонени черти пред скобите в стринга нещо като [set foo "\\\[foo\\\]"] което ще даде на $foo
                стойноста "\[foo\]".

                Поради тази причина синтаксисът на командата [timer] е добре да бъде [timer <time> [list <command> <parameters>]"] когато
                изпращате параметри към процедура за да предотвратите грешките които могат да се получат.

                Можете да получите радном числа с [rand] командата. Синтаксисът е [rand <number>].

                <number> е възможните номера от които искате [rand] да връща номер.
                Ако искате 2 възможности трябва да използвате [rand 2], но [rand] започва да брои от нула така че това ще върне или 0 или 1.
                Затова [rand] връща рандом номер м/у 0 и (<number> - 1).

                Например [rand 10] ще върне рандом номер м/у 0 и 9.

                Когато се опитвате да достигнете до стринг който не съществува TCL ще ви даде грешка, затова проверката дали стринга съществ
                ува
                е предимство. Това може да бъде направено с [info exists]. Синтаксисът е [info exists <string>].

                <string> е името на стринга който искате да промените. Ако стринг е масив можете или да проверите дали самият масив съществу
                ва
                или да проверите дали даден стринг от него съществува, така че и двете 'test' за масива и 'test(what)' за стринга 'what' от
                масива 'test' са валидни проверки.

                [info exists] командата връща 1 ако стрингът съществъва и 0 ако не.
                Например, ако направите [set test(foo) "bar"] и ако използвате [info exists test] то ще върне 1 и [info exists test(foo)]
                също ще върне 1.

                Вече знаете какво е [incr] но понякога бихте искали да направите малко по сложни математически операции, можете да ги направ
                ите
                с командата [expr]. Синтаксисът е [expr <calculation>].

                <calculation> е това което искате да сметнете.
                Можете да смятате колкото си искате дълги работи. Нормалните компютърни символи са валидни, които са +/- * (за умножение),
                / (за деление) и % (за деление с остатък). [expr] командата смята дадените <calculation> по официялният начин което значи че
                * и / имат по големи привилегии от +/-.

                [expr] може да прави доста други неща но няма да дискутираме това сега. Можете да намерите повече за това на ман страницата.
                Също така забележете че [expr] командата работи като [timer] и [utimer], затова трябва да избягвате скоби.

                Ботът има някой pre-set глобални променливи, като името на бота ($botnick).
                Можете да ги намерите в tcl-commands.doc.

                botnick
                # псевдонимът който ползва бота.

                botname
                # nick!user@host който сървърът вижда, пример 'Valis![email protected]'

                server
                # сървърът на който е бота в момента, пример 'irc.UniBG.oRG:6667'

                version
                # версията на бота (пример: "1.6.12+pl1 1010201 pl1");
                # първото е версията на бота, второто нумерик стойноста и, третото пачовете които са добавяни.

                uptime
                # unixtime стойноста от кога е пуснат бота

                # за да ги използвате в proc, трябва да ги декларирате като глобални в началото на proc-а си (global botnick)

                Възможно е да декорирате малко вашият текст.
                Както бе споменато за специалният код който подчертаваше текста ви. Освен да го подчераете можете да го оцветите или удебели
                те.
                Използвайте тези кодове като ги слоците м/у текста който искате да декорирате.

                Кодът за подчертаване е \037 (или \031), кодът за удебеляване \002, кодът за дветовете е \003 и след това добавяте номерът н
                а
                цвета, а кодът за reverse е \022. Най-новата версия на mIRC има pop-up прозорче което се показва когато натиснете CTRL+K, за
                да напишете нещо цветно. Цветовете в това прозорче са същитя както в TCL.

                Започвате и свършвате мястото кадето искате да декорацията да започне и да спре, със същият код с който сте я започнали.
                Пример е "Hello \002$nick\002, welcome in $chan." което ще одебели само '$nick' а "Hello \002\0034$nick\003\002, welcome in
                \037$chan\037."
                ще одебели и оцвети '$nick' в червен цвят а '$chan' го подчертава.
                Забележете че когато краят на цветовата декорация е дефиниран само кодът трябва да бъде споменат а номерът на цветът не.
                Ако го споменете той просто ще се смени на този цвят на който сте задали а няма да спре. Можете да оцветявате и с литерали
                (отваряте миднайт командер давате F9 избирате litheral натискате ESC и записвате кода на цвета).

                По някога бихте искали да проверите дали даден потребител има някакъв флаг в бота и дали той може да извърш нещо например да
                е поне мастер. Това може да бъде направено с командата [matchattr]. Синтаксисът е [matchattr <handle> <flag(s)> [channel]].

                <handle> е името на потребителя който искате да проверите, това трябва да бъде псевдонима с който потребителя е аднат в бота
                а не текуштият псевдоним на потребителя.

                <flag(s)> са флаговете които искате да проверите. Това може да бъде поредица от флагове или само един. Забележете че ако изп
                олзвате
                'of' за <flag(s)> ботът ще провери потребителят има +o ИЛИ +f, а не +o И +f. Моцете да разделите различните фалгове с | или
                &
                ако искате да проверите дали потребителят има само един от тях или всичките например "o&f" ще накара бота да провери дали
                потребителя има +o и +f.

                [channel] е каналът за който проверявате дали има флагове. Забележете че ако зададете канал се проверяват само флаговете на
                потребителя за канала, а не глобалните флагове. Например [matchattr $hand o|o $chan] ще провери дали потребителя има глобалн
                и
                операторски права или такива за $chan, [matchattr $hand o&m $chan] ще провери дали потребителят има глобални операторски пра
                ва
                и дали е мастер за $chan.

                Много полезна команда е [catch]. С тази команда можете да изпълнявате нещо и да 'хванете' грешката ако има такава и да
                предотвратите провала на целият ви скрипт. Под някой обстоятелстава ще е много по лесно да 'хванете' грешката отколкото
                да ви излязат милиони грешки. Синтаксисът е [catch <command>].

                <command> е това което изкате да изпълните заедно с параметрите. Просто го направете така както го бихте изпълнили нормално
                без да използвате командата catch.

                [catch] командата ще върне 0 ако няма грешки или положително число.

                Например ако unbind dcc командата die, е по добре да го направите така [catch { unbind dcc n die *dcc:server:die }], защото
                ако ботът не е свързан към IRC трябва да използвате [catch { unbind dcc n die *dcc:die }]. По този начин много лесно можете
                да unbind командата die без никакви проблеми, защото ако unbind команда която не съществува ботът ви ще даде грешка и ще пад
                не.

                Сега ще продължим с няколко основни команди които можете да пратите към сървърът. IRC командите са горе-долу лесни и се пращ
                ат
                направо към сървърът със server output командите.

                Това вече беше казано но ще го повторим. За да пратите съобщение командата към сървърът е [PRIVMSG]. Синтаксистт е
                [PRIVMSG <nickname/channel> :<message>].

                <nickname/channel> е псевдонимът или каналът към който искате да пратите съобшениято.

                <message> е съобщението което искате да бъде пратено. Забележете че двете : пред съобщението са задължителни.

                Можете да пратите notice по съвсем същият начин просто трябва да смените "PRIVMSG" с "NOTICE".

                Можете да пратите CTCP като декорирате кода малко в началото на вашето съобщение. Кодът за CTCP е \001 последван от типа
                CTCP който искате да пратите, след това можете да сложите параметри които искате да бъдат пратени. Например ако искате да
                пратите CTCP PING към някой синтаксисът е [putserv "PRIVMSG <nickname/channel> :\001PING $nick"].

                Забележете че много клиенти не поддържат CTCP-а с малки букви така че се обедете че го пишете с главни букви.

                Има един CTCP който всъщност не е CTCP, но се праща по същият начин по който се праща CTCP. Това е 'ACTION' типа.
                'ACTION' типа прави същото което прави командата /me в mIRC или BitchX. Например ако исакте да напишете
                "/me feels tired of lecturing" синтаксисът ще е [putserv "PRIVMSG <nickname/channel> :\001ACTION feels tired of lecturing"].

                Ако искате да следите за /me в канал трябва да използвате bind командата по следният начин: bind ctcp - ACTION proc_me

                За да invite някой просто изпратете следното до IRC сървърът "INVITE <nickname> <channel>".

                <nickname> е псевдонимът който искате да invite.

                <channel> е каналът в който искате да invite човека.

                За да вкарате бота в канал ръчно тряба да пратите "JOIN <channel> [key]" към сървърът.

                <channel> е каналът в който искате бота да влезе.

                [key] е ключът който ботът трябва да използва за да влезе в канала.

                Забележете че ако използвате тази команда каналът няма да бъде добавен към списъкът с канали на Eggdrop-а и той веднага ще
                излезе от него защото не го разпознава като валиден, това може да бъде направено с командата [channel add]. Можете да намери
                те
                повече за това в tcl-commands.doc.

                За да накарате бота ръчно да излезе от канал използвайте "PART <channel> :[message]".

                <channel> е името на канала от който искате бота да излезе.

                [message] е съобщението което искате бота да прати при излизане (UniBG няма подобни съобщения).

                Забележете че след излизането бота ще влезе отново в канала защото канала е в списъкъ с активните канали на бота. Ако искате
                да го изкарате перманентно използвайте [channel remove]. Можете да намерите повече за това също в tcl-commands.doc.
The quieter you become, the more you are able to hear! :AR! https://www.FreeUniBG.eu :YMDEVIL:
Публикувай отговор

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта