PHP IRC Bot Неопределенное смещение - PullRequest
0 голосов
/ 29 января 2012

Хорошо. Я строю IRC-бот в PHP. Я в некотором роде noob для PHP, поэтому держите меня в руках, если это глупая ошибка. Ошибка показывает строки 45 и 50 с ошибкой «Неопределенное смещение: 4 в /*//*/Grue.php в строке 50 «

Вот эти строки: Строка 45: $command = str_replace(array(chr(10), chr(13)), '', $this -> ex[3]);

Строка 50: switch($this -> ex[4]) {

Вот он, остальной код:

<?php
//So the bot doesn't stop.
set_time_limit(0);
ini_set('display_errors', 'on');

//Sample connection.
$config = array('server' => 'irc.foonetic.net', 'port' => 6667, 'channel' => '#lingubender', 'name' => 'KiBot', 'nick' => 'Grue', 'pass' => '',);  

class Grue {
var $socket; // TCP/IP Connection
var $ex = array(); // Messages

function __construct($config)
{
    $this -> socket = fsockopen($config['server'], $config['port']);
    $this -> login($config);
    $this -> main($config);
}
/* Log into server
@param array
*/
function login($config)
{
    $this -> write_data('USER', $config['nick'].' :'.$config['name']);
    $this -> write_data('NICK', $config['nick']);
    $this -> enter_channel($config['channel']);
}

//* Grabs/displays data
function main($config)
{
    $data = fgets($this -> socket, 256);

    echo nl2br($data);

    flush();

    $this -> ex = explode(' ', $data);

    if ($this -> ex[0] == 'PING') {
        write_data('PONG', $this -> ex[1]); 
    }

    $command = str_replace(array(chr(10), chr(13)), '', $this -> ex[3]);

    strtolower($command);

    if ($command == ':grue' || ':gu') {
        switch($this -> ex[4]) {
            case 'join':
                enter_channel($this -> ex[5]);
                break;

            case 'part':
                $this -> write_data('PART'.$this -> ex[5].' :', $this -> ex[6]);
                break;

            case 'repeat':
                $message = "";

                for ($i = 5; $i <= (count($this -> ex)); $i++) {
                    $message .= $this -> ex[$i]." ";    
                }

                $this -> write_data('PRIVMSG '.$this -> ex[4].' :', $message);
                break;

            case 'restart':
                echo "<meta http-equiv=\"refresh\" content=\"5\">";
                exit;

            case 'shutdown':
                $this -> write_data('QUIT', $this -> ex[5]);
                exit;
        }
    }
    $this -> main($config);
}

function write_data($cmd, $msg = null) {
    if ($msg == null) {
        fputs($this -> socket, $cmd."\r\n");
        echo '<strong>'.$cmd.'</strong><br>';   
    } else {
        echo '<strong>'.$cmd.' '.$msg.'</strong><br>';
    }
} function enter_channel($channel) {
    if (is_array($channel)) {
        foreach ($channel as $chan) {
            $this -> write_data('JOIN', $chan); 
        }
    } else {
        $this -> write_data('JOIN', $channel);
    }   
}
}

$bot = new Grue($config);
?>

Я проверил все скобки и скобки; Все, о чем я мог думать, не сработало. О, это помогает, когда я запускаю его, он проигрывает вышеупомянутые ошибки (45 и 50) около 60 раз.

Заранее благодарю за любую помощь.

Ответы [ 3 ]

0 голосов
/ 29 января 2012

Прежде всего это:

if ($command == ':grue' || ':gu') {

должно быть:

if ($command == ':grue' || $command == ':gu') {

, а для ошибки смещения вы должны проверить, установлен ли он первым:

if (isset($this -> ex[4]))
0 голосов
/ 29 января 2012

Это сообщение об ошибке указывает на то, что вы пытаетесь получить элемент в массиве, который не существует; например, у вас есть массив с 3 элементами, и вы пытаетесь получить 5-й элемент.

В вашем конкретном случае, поскольку $this->ex генерируется с помощью разнесения, вы можете сказать, что разнесенный текст не содержит ожидаемого количества частей. Я бы посоветовал вам использовать var_dump($this->ex) после выполнения разнесения, чтобы вы могли получить представление о том, как разделяется ваш текст и почему это не то, что вы ожидали.

0 голосов
/ 29 января 2012

Ну, я вижу в вашем коде несколько проблем, постараюсь их решить и предложить решения:

  • Вы используете рекурсивные функции. Метод main должен включать цикл while:

    while (!feof($this->socket)) {
    
        ...
        ...
        ...
    
    }
    

    Таким образом, сценарий завершится, когда сокет соединение с сокетом.

  • Ваш PING PONG потерпит неудачу. Вы вызываете метод без $this->.

  • Вы не опускаете регистр команды. Вам нужно присвоить strtolower($command) что-то ($command = strtolower($command); может быть?)

  • Ваше состояние всегда верно. if ($command == ":grue" || ":gu") ":gu" всегда верно. if ($command == ":grue" || $command == ":gu") может быть?

Кроме этого, у вас должна быть каждая команда с методом.

Что касается ошибки, попробуйте var_dump($this->ex) при возникновении ошибки, также выведите print_r(debug_backtrace()), чтобы точно узнать, какая функция была вызвана при возникновении ошибки.

...