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). УДАЧИ!

3 комментария

  1. Фокси — иди ты в андерграунд со своими темами — блог еле просматривается (как и мой), а если на норм сайте по разработке этой темы выложишься — то сметут нубы…

    Как и я в литературе — сборники не печатают — сначала нужно стать известным (((

  2. А вот и не все так грустно. Меня планета перла парсит, кажется. Точнее, ссылка есть на меня точно. Ридер видит, что меня читают. Надо практиковаться и в технических статьях. Вдруг, что пригодится. Я сам в начале такие вещи гуглом нискал, а на русском ну нихрена не было…

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *