У вас есть некоторые ошибки.
Глючит, потому что при проверке строго первого результата разнесения вы разбиваетесь на пробел и в протоколе реализации IRC все команды должны бытьзавершается символом новой строки, затем сервер отправляет вам "PING\n"
не "PING"
, тогда ваш массив $exData
находится в этом состоянии.
array(1) {
[0]=>
string(5) "PING
"
}
Тогда ваш $exData[0] == "PING"
равен false , потому что"PING"
не равно "PING\n"
.Хорошее решение - не добавлять "\n"
в конец команды в анализаторе, потому что "\n"
- это не только маркер новой строки (для плохой реализации протокола IRC я рекомендую это, вы никогда не знаете, что может использовать разработчик маркера новой строки IRC-протокола, подумайте о Delphi INDY Buggy IRC Server Control ), лучшее решение не проверять ее.
if (strstr(strtolower($exData[0]), "ping"))
{
$cmd = "PONG";
if (sizeof($exData) == 1)
{
$cmd .= "\n";
}
else for ($Index=1; $Index < sizeof($exData); $Index++)
{
$cmd .= " " . $exData[$Index];
}
/*
* Not adding newline marker, because is.
* already exists in last element of $exData
* array at last position if for was executed
*/
fwrite($ircSocket, $cmd);
}
Я заменю while($data = fgets($ircSocket, 128))
на while ($data = fgets($ircSocket))
, потому что в длинных именах серверовВы можете просто переполнить 128 байтов.
А ваша строка fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
не делает то, что вам нужно, потому что ваша команда JOIN
была отправлена после команд USER
и NICK
Сервер анализирует ваш запрос до того, как пользователь был зарегистрирован, и если пользователь не зарегистрирован, вы можете JOIN
направить, IRC-серверы не выдают команду СБОЙ, потому что это не имеет никакого смысла.Лучше всего использовать команду send JOIN
после получения от сервера команды MOTD
и после получения команды left from channel, если вы хотите реализовать некоторые функции, такие как AUTOJOIN
.
// End of /MOTD command.
if (sizeof($exData) > 1) if (strstr($exData[1], "376"))
{
fwrite($ircSocket, "JOIN " . $ircChannel . "\n");
}
Что касается дизайна вашего скрипта, если вы пишете простого бота, мне нечего сказать в этой теме, но если вы планируете написать какой-то большой кусок кода, вы должны разработать свой скрипт другим способом.Вы должны разделить некоторые уровни, такие как реализация протокола IRC и ваши действия с ботом IRC.Вы должны использовать какой-то класс, чтобы перенести ответственность за IRC-протокол на нее, потому что при большем смешении кода управление IRC-протоколом с вашим кодом действий бота - это хорошо Техническая задолженность .