Пишем своего eggdrop`а

IRC-маньякам посвящается

Xakep, номер #041, стр. 041-079-3


my ($chan,$opt)=@_; # Определяем параметры...

foreach (@channels) {

chomp;

&send("JOIN $_")

# Для каждого имени канала: удаляем символ перехода на новую строку (\n) и отправка команды JOIN #имя_канала

}

$defaultchan=$channels[0];

# Формируем главный канал (первый канал в списке)

return # Возврат

}

Процедура захода на IRC-каналы (заход на каждый канал массива @channels) и определение главного канала.

## irc.pl ##

#!/usr/bin/perl

print "Plug in irc module\n";

### Модуль irc.pl - работа с IRC-командами и событиями

sub logging { # Выводим сведения на экран либо в файл

my ($string, $to)=@_; # Определяем параметры

if (!$to) {

print "Console: $string\n";

return

# Если не указано имя файла - пишем на экран и завершаем процедуру

}

open("LOG",">>$to") || &logging("$!\n");

print LOG "$string\n"; # Иначе производим запись в файл.

close("LOG")

}

Процедура записи чего-либо в лог файл. Если файл не задан - идет запись на консоль.

sub irc_cmd { # Процедура обработки irc-команды

my ($prefix, $command, $params, $servername, $nick, $user, $host, $trailing, $middle, $params2, $trailing2) = &get_vars($_[0]);

# Отправляем локальные переменные на обработку (формирование частей строки)

&send("PONG :$params") if ($command eq 'PING');

# Если пришла команда PING - посылаем PONG

if ($command eq 'PRIVMSG') { # Если пришла команда PRIVMSG

if ($middle eq $botnick) { &priv_msg($prefix, $servername, $nick, $user, $host, $trailing, $middle, $params2, $trailing2)

# Сценарий ответа на приват-сообщения

} else {

&pub_msg($prefix, $servername, $nick, $user, $host, $trailing, $middle, $params2, $trailing2) }

# Иначе переход на сценарий ответа на сообщения в канал

}

}

Самая главная процедура - обработка команд, вначале - обработка переменных в процедуре &get_vars, затем выборка команд. Если пришел запрос на PING - отпинговываемся, посылая PONG. Если кто-то что-то сказал - разделение на 2 процедуры - приватный базар либо фраза на канале.

sub get_vars { # Формируем части из целой строки

my ($prefix, $command, $params);

my ($servername, $nick, $user, $host);

my ($trailing, $middle, $params2, $trailing2);

# Набор локальных переменных...

$_[0] =~ /(:(\S+) )?([a-zA-Z0-9]+) (.+)\x0D+/;

# Разделяем главную строку на: $prefix (имя сервера, ник,

# идент, хост), $middle (середина строки), $params2 (параметры команды)

($prefix, $command, $params) = ($2, $3, $4);

# И заносим эти значения в переменные

$prefix =~ /((\S+)!(\S+)@([a-zA-Z0-9.]+))|([a-zA-Z0-9.]+)/;

# Разбиваем $prefix на имя сервера и полной irc-маски

($servername, $nick, $user, $host) = ($5, $2, $3, $4);

$params =~ /:(.*)|(\S+) (.+)/; # Разбиваем параметры команды

($trailing, $middle, $params2) = ($1, $2, $3);

# Заносим значения в переменные

$params2 =~ /:(.*)/;

$trailing2 = $1; # Отделяем ":" от параметров irc-команды

return ($prefix, $command, $params, $servername, $nick, $user, $host, $trailing, $middle, $params2, $trailing2)

Назад на стр. 041-079-2  Содержание  Вперед на стр. 041-079-4