PHP IRC Bot Undefined Offset

时间:2012-01-29 18:44:53

标签: php undefined offset bots

好。我正在用PHP构建一个IRC bot。我对PHP有点 noob ,如果这是一个愚蠢的错误,那么我就袒露。这个错误给我的是第45行& 50错误“Undefined offset:4 in /*//*/Grue.php on line 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&amp; 50)上玩了大约60次。

感谢您提前提供任何帮助。

3 个答案:

答案 0 :(得分:0)

好吧,我在你的代码中看到了几个问题,我会尝试解决它们并提供解决方案:

  • 您正在使用重复功能。 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()),以确切了解错误发生时调用的函数。

答案 1 :(得分:0)

首先:

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

应该是:

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

并且对于偏移错误,您应该检查它是否先设置:

if (isset($this -> ex[4]))

答案 2 :(得分:0)

该错误消息表明您正在尝试获取阵列中不存在的元素;例如,你有一个包含3个元素的数组,而你正试图获得第5个元素。

在您的特定情况下,由于$this->ex是使用explode生成的,您可以说分解文本没有您期望的部分数量。我建议您在进行爆炸后使用var_dump($this->ex),这样您就可以了解文本是如何分开的,为什么它不符合您的预期。