Net::IRC

Сразу уточню, что статья для начинающих. Тех, кто освоил синтаксис и познал основы языка, но кому не хватает опыта. Все-таки, решение текущих задач — лучший способ учиться!

Быть новичком в Perl довольно нелегко. Особенно сейчас, когда сообщество программистов на этом эпично-прекрасном языке только-только возвращается из небытия: пишутся статьи, выкладывается код, функционирует т.н. Планета. Ломать рамки, формирующие границы мышления тяжело, а еще тяжелее было, когда не с кем посоветоваться. После прочтения книг и ознакомления с простыми методами программирования, новичку требуется опыт. Сколько книг и статей не читай, а чтобы знать язык и уметь программировать, надо писать код: заниматься и жить этим. Это одна из моих первых маленьких работ. Совместно с товарищем, мы захотели повесить на канал бота для викторины. Модуль викторины нашелся довольно быстро, хотя сам по себе он «кривоват» и заразил своей кривизной все остальное. Он был поправлен для того, чтобы работать с русским текстом. Модуль Net::IRC считается довольно старым. Ему на смену уже давно пришли многие другие пакеты. Одним из них является событийный AnyEvent::IRC, однако, для обучения и и работы простейшего бота на достаточно на данный момент Net::IRC.

#!/usr/bin/perl  # какие-то непонятные буквы (irony)
use warnings; # тоже объяснено в учебниках про предупреждения
use Net::IRC # используем класс
$irc = new Net::IRC; # собственно объект

Первый метод, который нам будет нужен, это метод newconn.

$conn = $irc->newconn(
Nick    => ‘HackBot’, # Ник в сети
Server  => ‘irc.r3al.ru’, # Сервер, к которому подключаемся
Port    =>  6667, # Порт сервера
Ircname => ‘I am bot, baby! (:’, # Имя
Timeout =>  5 # Важная вещь — таймаут. Время ожидания ответа.
);

Нетрудно догадаться, что с помощью него задаются важные для соединения бота с сервером данные. В принципе, уже можно подключаться с помощью метода start(), однако, нам же нужно, чтобы бот хотя бы зашел на канал и, желательно, выполнял какие-либо функции. Когда бот соединяется с сервером, то получает от него сообщение «376», которое означает, что соединение установлено. После этого можно заходить на каналы и т.д. Чтобы бот отреагировал на это сообщение, мы воспользуемся методом add_handler().

$conn->add_handler(‘376’, \&on_connect); # вызов функции on_connect(), при успешном подключении.

Сама функция уже может выполнять нужные нам функции. Например, заход на канал:

sub on_connect {
my $self = shift;

$self->join(‘#perl’); # заходим на канал #perl

$self->privmsg(‘#r3al’, «Всем привет! (:»); # Пишем сообщение на канал!

}

Обычно, боты реагируют на сообщения на канале, выполняя какие-то функции. Чтобы бот «читал» новые сообщения пользователей, используем тот же метод  add_handler(), только уже с параметром public.

$conn->add_handler(‘public’, \&on_public); # Вызываем функцию on_public(), если в чате появилось новое сообщение.

Ну а функция может хитро выделять команды, которые и нужно обрабатывать. Таким образом можно немного снизить нагрузку.

sub on_public {
my ($conn, $event) = @_;
my $text = $event->{args}[0]; # То, что сказано на канале кем-то.
if ($text =~ /^\!(.+)/) { # Простая регулярка, которая отличает команды, а не текст. (Командами обычно являются слова после знака «!», стоящего в самом начале текста.)
on_public_command($conn, $1, $event->{nick}); # Ну а дальше можно обрабатывать.
}

На самом деле, можно делать еще проще. Да и бот необязательно должен выполнять какие-то команды. Как говорится, то можно сделать несколькими способами. (;

Новичку стоит научиться читать чужой код, т.к. документации на модули мало и, зачастую, она на английском.Примеры и готовый аналогичный код покажет вам логику работы модуля, либо просто укажет путь. Конечно, в наше время от этого мало практической пользы, однако, это неплохой способ начать работать с языком Perl, выполняя практические работы, а не решая какие-то задачки. В качестве более сложного примера подойдет наш старенький кривой бот викторины, который с горем пополам выполнял одноименную функцию. Так же, любителям IRC я рекомендую канал #ru.pm, который находится в сети MAGnet.

Сервер: irc.perl.org

Порт: 6667

Канал: #ru.pm

Опытные программисты часто отвечали на мои вопосы. Помогали разобраться в некоторых проблемах. Сама сеть англоязычная, а на канале общение на русском (Кодировка UTF-8). УДАЧИ!

О нарциссизме

Родительское воспитание нас портит. С детства они хотят, чтобы дети были кем-угодно, но только не самими собой. Некоторые строят планы на жизнь своего ребенка. Они хотят, чтобы дети как бы продолжили их жизнь, решили ИХ нерешенные проблемы, реализовали их мечту. Отсюда погоня за деньгами и так называемым почетом, которые так легко потерять и так тяжело приобрести.
Ребенок растет. Его сознание становится все сильнее. А вместе с расширением влияния сознания и отходом бессознательного как-бы на второй план ему навязывают убеждения, ложные ценности, идеи, которые отнимают силы и сбивают его со СВОЕГО пути. Так он вырастает, живет несчастным, не достигает ничего, а если и достигает, то не получает удовлетворения. У этого человека появляются дети, которым он дает такое же свое воспитание… Таких миллиарды.