2016-04-19 21 views
0

私はPHPで単純なircボットを開発する途中です。 上記の半分は、ゼロからIRCボットの実装です(ソケットを接続する...など) 追加したい機能が「スケジュール通知」 特定の時刻になると、いくつかのメッセージが送信されます。PHP IRC-BOTでスケジュールされたメッセージを送信できません

たとえば、の場合は となり、何らかの通知メッセージが送信されます。

(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"); 
    } 

} 

答えて

1

あなたのコードは、読み出し/書き込みロジック部に壊れている - あなたの現在のコードは常に何かを書く、その後、(何かが起こるまでスリープします)何かを読んで想定しています。バッファを追加し、poll/selectを使用する必要があります。私はそれらの少なくとも1つとしてPHPを仮定します。

動作するはず擬似コード:

readbuffer[] 
writebuffer[] 

while (no_error) 
{ 
    if (writebuffer not empty) 
    { 
    select(socket, want_to_write, want_to_read, timeout_until_next_event); 
    } else { 
    select(socket, 0, want_to_read, timeout_until_next_event); 
    } 
    if (select return can write) 
    { 
    retval = write(socket, writebuffer); 
    if (no_error) 
     writebuffer.removefromstart(retval); 
    } 
    if (select return can read) 
    { 
    retval = read(socket, readbuffer + offset already filled); 
    if (no_error) 
    { 
     parse as much as possible in readbuffer, removing data as parsed; 
    } 
    } 
    check_timers(); 
} 
+0

timeout_until_next_eventは、あなたが本当に(本当に、あなたのスケジュールされたイベントのために次のタイマ刻みとして秒数として)と離れて取得したいほど高くなければならないことに注意してください。低選択タイムアウトでwhileループを頻繁に繰り返すと、CPU使用量が過剰になる可能性があります。 – braindigitalis

関連する問題