Установил я значит как-то 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);
}