You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Программирование Учебник<br />
личный IRC-бот<br />
$x = 64;<br />
if ($x == 64) {<br />
print “Yep, x is 64!\n”;<br />
}<br />
И, наконец, подпрограммы (функции) объявляются просто командой<br />
sub:<br />
sub saystuff {<br />
print “This is saystuff!\n”;<br />
}<br />
saystuff();<br />
Таковы «колесики и винтики» программирования на Perl – все, что<br />
нам нужно, чтобы начать писать IRC-бота!<br />
Установка<br />
Воспользуемся специальным модулем расширения языка Perl Net::IRC,<br />
предоставляющим интерфейс для протокола IRC – тогда нам не придется<br />
писать тонны кода для работы с сокетами и соединениями. Вместо<br />
этого мы попросим Net::IRC позаботиться о сетевых взаимодействиях, а<br />
сами будем дрессировать бота: пусть делает то, что нам нужно.<br />
Вы можете найти Net::IRC с помощью своего менеджера пакетов<br />
(он называется perl-irc или net.pm или как-то вроде этого). А не найдете,<br />
не беда: собрать его из исходных текстов проще простого [даже<br />
термин «собрать» здесь избыточен: Net::IRC написан на Perl, так что<br />
речь идет просто о копировании его в нужный каталог, – прим.ред.].<br />
Зайдите на сайт http://search.cpan.org/dist/Net-IRC/ или откройте раздел<br />
Development/Net-IRC нашего DVD (первая сторона) и скопируйте<br />
файл Net-IRC-0.75.tar.gz.<br />
Распакуйте архив, зайдите в образовавшийся каталог и введите<br />
команды:<br />
perl Makefile.PL<br />
make<br />
make install<br />
Последнюю из них нужно выполнять с правами администратора.<br />
Она установит модуль Net::IRC, и программа, которую мы напишем,<br />
сможет его применить!<br />
Далее создадим две учетных записи для IRC: первая – для вас,<br />
вторая – для бота (если вы завсегдатай IRC, то первая у вас уже есть).<br />
Это важный этап, поскольку из-за борьбы со спамом на многих IRCсерверах<br />
пользователь должен зарегистрироваться, чтобы иметь возможность<br />
отправлять приватные сообщения другим участникам чата.<br />
Зайдите в IRC и переключитесь в вашего обычного пользователя.<br />
Если вы еще не зарегистрированы, введите такую команду:<br />
/msg nickserv register <br />
( замените на подходящий пароль). Примеры команд приведены<br />
для серверов Freenode, в других сетях они могут отличаться.<br />
Теперь ваш пользователь зарегистрирован на сервере IRC – то есть<br />
никто другой это имя не отберет. Сказать IRC-серверу, кто вы такой,<br />
можно с помощью команды:<br />
/msg nickserv identify <br />
Нужно также зарегистрировать как пользователя нашего, пока<br />
нерожденного, бота. Переключитесь в другого пользователя и задайте<br />
ему пароль таким образом:<br />
/nick UltraCoolLXFBot<br />
/msg nickserv register thisismypassword<br />
Конечно, можно взять другое имя пользователя и пароль, но<br />
запомните их, ведь они понадобятся коду нашего бота! Итак, мы завели<br />
две зарегистрированные учетные записи, себе и боту.<br />
Покажи мне код<br />
Мы готовы к запуску бота. Вот его код. Его не придется набирать вручную:<br />
он приведен на нашем DVD в разделе Magazine/Perl (файл bot1.<br />
pl). Но прежде чем запускать бота, не мешает просмотреть код и его<br />
описание...<br />
use Net::IRC;<br />
$server = ‘irc.freenode.net’;<br />
$channel = ‘#blergh’;<br />
$botnick = ‘MegaMikeBot’;<br />
$password = ‘foobar’;<br />
$botadmin = ‘M-Saunders’;<br />
$irc = new Net::IRC;<br />
$conn = $irc->newconn(Nick => $botnick,<br />
Server => $server, Port => 6667);<br />
$conn->add_global_handler(‘376’, \&on_connect);<br />
$conn->add_global_handler(‘disconnect’, \&on_disconnect);<br />
$conn->add_global_handler(‘kick’, \&on_kick);<br />
$conn->add_global_handler(‘msg’, \&on_msg);<br />
$irc->start;<br />
sub on_connect {<br />
$self = shift;<br />
$self->privmsg(‘nickserv’, “identify $password”);<br />
$self->join($channel);<br />
$self->privmsg($channel, “Lo! I’m just a silent bot.”);<br />
}<br />
sub on_disconnect {<br />
$self = shift;<br />
$self->connect();<br />
}<br />
sub on_kick {<br />
$self = shift;<br />
$self->join($channel);<br />
Первая версия<br />
бота: по нашей<br />
просьбе он выдает<br />
информацию<br />
о времени работы<br />
системы.<br />
Но он способен<br />
на большее...<br />
Январь 2008 <strong>Linux</strong> <strong>Format</strong> 83