2012-01-29 8 views
0

よろしくお願いします。私はPHPでIRCボットを構築しています。私は幾分noobをPHPにしているので、愚かな間違いであれば私と一緒に裸でいます。あるエラーが、私はエラーとライン45 & 50のためである与え、 "未定義のオフセット:4/* //* /Grue.phpにライン50に": ライン45PHP IRC Bot不定オフセット

は、ここでこれらの行です:$command = str_replace(array(chr(10), chr(13)), '', $this -> ex[3]);

ライン50:

<?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); 
?> 
01:ここで switch($this -> ex[4]) {

は、コードの彼の残りの部分です

すべての角かっことかっこをチェックしました。私が考えることができるすべてはうまくいかなかった。ああ、それは助けて、私がそれを実行したときに上記のエラー(45 & 50)を約60回演奏した。

ありがとうございました。

+0

これは、 '$ this-> ex [4]'(または3)が存在しないため、存在しない配列要素にアクセスしようとしていることを意味します。エラー。デバッグスタック( 'print_r(debug_backtrace())')を出力して、それがどこにあるのかを確認する必要があります。 –

+0

また、私はPHP IRCボットを持っています。あなたが望むなら、あなたよりもはるかに洗練されています(各ユーザはオブジェクトであり、各チャンネルはオブジェクトであり、動的なユーザ追跡とチャンネル監視、接続作業など)私はそれをあなたと共有することができます。 –

+0

確かに - – Kinz

答えて

0

まあ、私はあなたのコード内のいくつかの問題を参照してください、私はそれらに対処しようとソリューションを提供します:

  • あなたはrecoursive機能を使用しています。ソケット接続が死ぬときにスクリプトが終了します

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

    この方法:main方法は、whileループを含める必要があります。

  • あなたのPING PONGは失敗します。 $this->なしでメソッドを呼び出しています。

  • あなたはコマンドの大文字小文字を区別しません。 strtolower($command)に何かを割り当てる必要があります($command = strtolower($command);多分?)

  • 条件は常にtrueです。 if ($command == ":grue" || ":gu")":gu"は常にtrueです。 if ($command == ":grue" || $command == ":gu")かもしれませんか?

それ以外の場合、それぞれのコマンドにはメソッドが必要です。

エラーの場合は、エラーが発生したときにvar_dump($this->ex)を試してください。print_r(debug_backtrace())も表示して、エラーが発生したときにどの関数が呼び出されたかを正確に確認してください。このすべての

0

まず:

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

次のようになります。

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

、あなたが最初のセットかどうかをチェックする必要がありますオフセット誤差について:

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

ありがとうございます。 IF(OR)文に問題があることを知らなかった。 – Kinz

0

というエラーメッセージ配列上に存在しない要素を取得しようとしていることを示します。たとえば、3つの要素を持つ配列があり、5番目の要素を取得しようとしています。

特定のケースでは、explodeを使用して$this->exが生成されているため、分解されたテキストに予想される部品の数量がないと言うことができます。私は、explodeを行った後にvar_dump($this->ex)を使用することをお勧めします。そうすれば、どのようにテキストが区切られているのか、そしてなぜあなたが期待したものではないのかを知ることができます。

+0

ありがとうございます。私がコマンドを実行する前にex [3]に行っていたものを見てもらえるように助けてくれました。 – Kinz

関連する問題