В наше время, как сказал Sintez в предновогоднем номере X, каждый человек должен иметь 7 вещей. Одна из первых - это мобила

У кого сей нет (или они не хотят порекомендовать эту статью друзьям) - могут пропустить эту статью - сей материал будет для них бесполезен.
Сегодня мы опять вернемся к закладке IRC->eggdrop->scripting

По моему личному мнению, язык tcl (Tool command Language) - слишком громоздкий язык. Конечно же, он уступает perl (ни для кого не секрет, что это мой любимый язык). Но... как известно, разработчики eggdrop-бота, не согласны с моим мнением, поэтому постараемся изучить, как tcl, так и perl
Итак, что же мы сегодня будем писАть? И почему для, казалось бы, другой "оперы", нам понадобиться мобила? (ты конечно, можешь и не использовать мобилу - отправляя почту с обычного ящика - опять же забегаю вперед - дальше ты все сам поймешь).
Механизм действия скрипта такой: ты, скучая в универе (в школе, в баре за кружкой пива - нужное подчеркнуть) решил поделиться с корешами по IRC - чем ты в данный момент занят =) У большинства операторов сети, стандарта GSM, есть услуга - отправка SMS-сообщений на e-mail. Если у тебя такой оператор - то возможно следующее: твое сообщение, попадая на определенный ящик, и состоящим из первого слова "IRC" - может попасть в IRC (его скажет бот от твоего имени, сообщая всем, чем ты занят). Сейчас я научу тебя писать такой скрипт. Точнее - 2 скрипта:
1. checker.pl - проверка новых сообщений на e-mail
2. sms.tcl - передача сообщения в IRC через бота
1. Perl`овка
Описываю скрипт checker.pl (с комментариями), который будет коннектиться к твоему ящику и проверять наличие новых сообщений. Внимание! Данный скрипт расчитан на стягивания одного сообщения (поэтому рекомендую зарегистрировать отдельный ящик для SMS).
#!/usr/bin/perl
### POP3 checker v1.0 by Forb < forb@kamensk.ru />
## Трейдмарк - можешь убрать, я не обижусь
### Uses modules
use IO::Socket;
## Подключаем IO::Socket
### MAIN variables ###
$positive='+OK';
$negative='-ERR';
## Строки ответа pop3d (как правило такие)
$server='mail.ru';
$port=110;
$user='vasya';
$password='forSMS';
## Данные, для соединения с pop3-сервером
$success='/home/vasya/eggdrop/scripts/mail.txt';
## Полный путь к файлу, куда будет скидываться SMS (из ящика)
### Main part of script
&sock($user,$password);
## Вызываем коннект к серверу
sub sock {
my($banner,$socket);
my($user,$passwd)=@_;
## Объявляем локальный переменные и параметры процедуры
$socket=IO::Socket::INET->new( PeerAddr => $server,
PeerPort => $port,
Proto => tcp)
or return -1;
$socket->autoflush(1);
## Создаем сокет и отрубаем буферизацию
chomp($banner=<$socket>);
print $socket "USER $usern";
chomp($banner=<$socket>);
print $socket "PASS $passwdn";
chomp($banner=<$socket>);
$banner=~s/r//g;
## Логинимся на сервер, и очищаем ответ от символа возврата каретки
print $socket "LISTn";
chomp($banner=<$socket>);
$banner=~s/r//g;
while ($banner ne '.') {
chomp($banner=<$socket>);
$banner=~s/r//g;
push(@banners,$banner);
}
## Получаем данные о новых сообщениях
$string=$banners[scalar(@banners)-2];
## Берем последний номер сообщения
($num,$size)=split ' ',$string;
chomp($size);
$num=~s/r//g;
if ($num == 0) { exit }
## Если номер=0 - выходим
if ($size < 1000) {
print $socket "RETR $numn";
chomp($banner=<$socket>);
$banner=~s/r//g;
## Если сообщение не превышает 1кб - стягиваем его и очищаем ответ от символа возврата каретки
while ($banner ne '.') {
chomp($banner=<$socket>);
$banner=~s/r//g;
push(@banner2,$banner);
}
$message=$banner2[scalar(@banner2)-2];
## Выделяем сообщение
open (FILES,">$success") || die print "cant openn";
## Открываем файл на запись
if ($message=~/^IRC /i) {
print FILES "$messagen"
} else {
print FILES "emptyn"
}
## Если сообщение начинается с "IRC" - пишем его в файл, иначе пишем "empty"
close(FILES);
print $socket "DELE $numn";
print $socket "QUITn";
close($socket);
## Закрываем файл, удаляем сообщение и закрываем сокет
}
}
Итак, что мы имеем? Perl-скрипт снимет новое сообщение, если оно содержит IRC, или напишет в файл empty в противном случае. Но, вручную его запускать, никто не будет, поэтому воспользуемся crontab. Пусть он запускается через каждые 10 минут.
Пишем на твоем шелле команду: "crontab -e", затем нажимаем "i" (вставка), и набираем следующее:
0,10,20,30,40,50 * * * * /home/vasya/eggdrop/scripts/checker.pl 2>&1
(разумеется с правильным путем к скрипту).
И выходим с сохранением (ESC, ":wq" (без кавычек), Enter).
Теперь, скрипт будет запускаться автоматически, через каждые 10 минут.
2. Мучим бота
Теперь заставим бота, с помощью таймеров, читать файл (каждые 10 минут) и анализировать информацию из него.
Создадим скрипт в директории "/home/vasya/eggdrop/scripts" под названием sms.tcl.
В нем будет примерно следующее:
set mins 10
set actchan #vasya
set file "scripts/mail.txt"
set smsnick Vasya
## Устанавливаем интервал, анализирования файла, путь к файлу и ник (от которого придет SMS)
foreach tms "[timers]" {
if {([llength $tms] != 0)} {
set tmc [lindex $tms 1]
set tid [lindex $tms 2]
if {($tmc == "check")} {
killtimer $tid
}
}
}
## Убиваем ВСЕ таймеры этого скрипта при его повторном запуске (нам не нужны дубликаты)
proc check { } {
## Процедура проверки новых SMS
global file actchan smsnick
## Обьявляем переменные, заданные выше, как глобальные
set pipefile [open $file]
## Открываем канал, несущий в себе связь с файлом (хранящим email)
while { [gets $pipefile sms] >=0 } {
## Пока возможно считывание
if {($sms != "empty")} {
## Если сообщение НЕ равно "empty"
set arg1 [lindex $sms 0]
set maybe [lindex $sms 1]
## Установим переменные: arg1 - слово IRC, maybe - возможное действие на СМС (установка топика, если SMS состоит из первых слов "IRC topic", иначе - вывод простым текстом)
if {($maybe == "topic")} {
set irc [lrange $sms 2 end]
set predtopic [topic $actchan]
## Если есть слово topic - выделяем предыдущий топик канала и текст SMS (переменная irc)
if {([llength $predtopic] <= 100)} {
putserv "topic $actchan :$predtopic // $irc // Sms from $smsnick //"
## Если топик не слишком длинный - сохраняем старый и дописываем текст SMS в топик
} else {
putserv "topic $actchan :$irc // $irc // Sms from $smsnick //"
## Иначе создаем новый топик канала
}
} else {
set irc [lrange $sms 1 end]
putmsg $actchan "$irc // Sms from $smsnick //"
## Если в SMS нет слова topic - выдаем простым текстом
}
}
}
close $pipefile
## Закрываем связь с файлом
set tempfile [open $file w]
puts $tempfile "empty"
close $tempfile
## Открываем связь с файлом (но уже для записи), пишем в файл строку "empty" и закрываем его - для того, чтобы скрипт дважды не скидывал в IRC одно и тоже сообщение
timer mins check
## Создаем таймер на указанный интервал со ссылкой на процедуру check
}
check
## При запуске скрипта - сразу же выполним процедуру
Как видишь - все просто! Бот будет периодически смотреть файл, и если найдет в нем SMS, то напишет её на IRC.
А теперь - как подгрузить скрипт на бота.
1) лезь на DCC к боту и напиши команду ".tcl source scripts/sms.tcl"
2) допиши в eggdrop.conf строчку "source scripts/sms.tcl" и выполни команду "killall -1 eggdrop", либо ".rehash" на DCC
Чтобы узнать текущий таймер скрипта, напиши на DCC ".tcl timers"