03.03.2013 Views

LXFDVD - Журнал Linux Format

LXFDVD - Журнал Linux Format

LXFDVD - Журнал Linux Format

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!