Я собираюсь разработать простой irc-бот в php. Половина выше - это реализация для IRC-бота с нуля (подключение сокета ... и т. Д.) Функция, которую я хочу добавить, это «Уведомление о расписании» Когда приходит определенное время, отправляются некоторые сообщения.Не удалось отправить запланированное сообщение в PHP IRC-BOT
Например, , когда приходит время Tue Apr 19 16:32
, отправляется сообщение с уведомлением.
Поэтому, если вы установили что-то вроде (date("D") == "Tue" && date("H") == 15)
, , это должно продолжаться до отправки сообщения до 16:00.
Но как только бот входит в канал, он прекращает отправку сообщений.
Я предполагаю, что это вызвано соединением сокета, однако я действительно не знаю подсказки.
<?php
// Time zone setting
date_default_timezone_set('Asia/Tokyo');
// Our bot's configuration parameters.
$server = '192.168.59.103';
$port = 6667;
$nickname = 'Bot';
$ident = 'Bot';
$gecos = 'Bot v1.0';
$channel = '#bot-test';
// Connect to the network
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$error = socket_connect($socket, $server, $port);
// Add some error handling in case connection was not successful.
if ($socket === false){
$errorCode = socket_last_error();
$errorString = socket_strerror($errorCode);
die("Error $errorCode: $errorString \n");
}
// Send the registration info.
socket_write($socket, "NICK $nickname\r\n");
socket_write($socket, "USER $ident * 8 :$gecos\r\n");
// Finally, loop until the socket closes.
while (is_resource($socket)) {
// Fetch the data from the socket
$data = trim(socket_read($socket, 1024, PHP_NORMAL_READ));
echo $data . "\n";
// Splitting the data into chunks
$d = explode(' ', $data);
// Padding the array avoids ugly undefined offset erros.
$d = array_pad ($d, 10, '');
// Our ping handler.
// Ping: $servername.
if ($d[0] === 'PING') {
socket_write($socket, 'PONG ' . $d[1] . "\r\n");
}
if ($d[1] === '376' || $d[1] === '422') {
socket_write($socket, 'JOIN ' . $channel . "\r\n");
}
// Bot collections
// "$d" parameter format
// [0] [1] [2] [3]
// :[email protected] PRIVMSG #bot-test :@arukas.
// Scheduler bot
if (date("D") == "Tue" && date("H") == 15) {
$saying = "REALLY SLEEPY!!";
socket_write($socket, 'PRIVMSG ' . "CIRC1989" . " :$saying\r\n");
}
}
Обратите внимание, что timeout_until_next_event должна быть выше, чем вы действительно хотите уйти с (как много секунд, как на следующий тик таймера для запланированного события, на самом деле). Слишком много велосипеда в цикле while с низким тайм-аутом выбора может привести к чрезмерному использованию процессора. – braindigitalis