Предистория

Установил я значит как-то IRC сервер и радовались пользователи... Но захотели пользователи иметь возможность еще и логи читать (слово ж не воробей!).

Первым, что пришло в голову - запустить на сервере mIRC на постоянную и с него вести логи нужных каналов. Сказано - сделано. Однако не совсем удобно - постоянно держать законектеным mIRC. Вот тогда и зародилась идея о боте...

До этого я с IRC (и с ботами тем более) особо не сталкивался и потому пошел сразу в гугел. После 5 страниц полного бреда (как по моему) я нашел одну статейку (жаль урл не помню!) в которой была на мой взгляд самая что ни на есть ключевая фраза: "чтобы понять как общаются сервер и клиент можно включить в обычном mIRC опцию /debug on и все данные будут сохранятся в лог-файле". Дальше я не читал... Включив опцию, активно пообщавшись - за 2 часа у меня было достаточно информации.

Собственно скрипт бота (IRC Bot script):

#!/usr/local/bin/php
// Параметры IRC сервера
$irc_server["ip"]='XXX.XXX.XXX.XXX';
$irc_server["port"]=6669;
$irc_server["name"]='irc.mine.net';

// Список каналов на которых будет присутствовать бот
$channels[0]="somechannel0";
$channels[1]="somechannel1";
$channels[2]="somechannel2";

// Таймер для отсчета времни чтобы выдать случайную фразу
$timer=0;

$privates=Array();

// Параметры бота
$bot["nick"]='PHP_Bot';
$bot["user"]='PHP_Bot';
$bot["host"]='bot.mine.net';
$bot["ip"]='XXX.XXX.XXX.XXX';
$bot["hz"]='PHP_Bot';

// Функция из мана используемая для получения "наиболее случайных чисел"
function make_seed() {
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}

// Функция установки коннекта к IRC серверу
// Устанавливает начальный коннект
function connect_IRC () {
global $irc_server, $bot, $fp;
// Открываем сокет с заданым сервером и портом
$fp = fsockopen($irc_server["ip"], $irc_server["port"], $errno, $errstr,30);
$flag=0;
// Вычитываем все что даст нам сервер, до ключевой фразы, после которой,
// можно отсылать данные о пользователе
while (!$flag && !feof($fp)) {
$line=fgets ($fp);
if (preg_match("/bFoundsyourshostnameb/", $line)) {
$flag=1;
}
}
// Пишем в сокет данные о авторизации бота
fputs ($fp, sprintf ("NICK %sn", $bot["nick"]));
fputs ($fp, sprintf ("USER %s "%s" "%s" :%sn",
$bot["user"], $bot["host"], $bot["ip"], $bot["hz"]));
$flag=0;
// Снова вычитываем все до ключевого номера 700, после которого можно
// начинать заходить в каналы
while (!$flag && !feof($fp)) {
$line=fgets ($fp);
if (preg_match("/b700b/", $line)) {
$flag=1;
}
}
// Возвращаем указатель на открытый сокет основной части
return ($fp);
}

// Функция для подготовки вывода в канал
// одного из предопределенных случайных выражений
function is_time($chan) {
global $timer, $log_file, $bot;
// Полный путь к текстовому файл в котором определены возможные выражения
$texts=file('/home/myaccount/bot_conf/lyaps');
$message='';
$now=mktime(date ("H"), date("i"), date("s"), date ("m"),
date ("d"), date ("Y"));
// Определяем интервал с которым бот будет что-то говорить в канал
// (в этом примере - 10 минут)
$time_to_say=mktime(date ("H"), date("i")-10, date("s"),
date ("m"), date ("d"), date ("Y"));
// Если пора что-то говорить - формируем фразу,
// если нет - возвращаем пустое значение
if ($timer

Ключевые моменты

Все отсылаемые команды должны обязательно заканчиваться символом конца строки "n".

Файлы в которых храняться варианты приветствий и пр. - просто текстовые файлы, каждая отдельная фраза с новой строки. На эти файлы у пользователя под которым запускается бот должны минимально быть права на чтение.

Заключение

Вот вроде бы и все... Разбирая фразы - можно добавлять боту любую свою логику... В ближайшее время намереваюсь выложить скрипт для форматирования логов в HTML, хотя... надо ли? Это настолько очевидно...