|

Пишем своего 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
|