PHP IRC Robot, отправить команду, но теперь мне нужен бот для чтения команды - PullRequest
2 голосов
/ 06 января 2009

У меня есть PHP IRC-робот, который я использую в своем канале, и он мне нужен для того, чтобы я мог выполнять операции для определенных пользователей набора в сценарии. В любом случае я хочу, чтобы робот проверял, вошел ли пользователь в NickServ, чтобы предотвратить мошенничество любого рода или что-либо подобное.

В любом случае, вот мой код «подключай и делай», после чего мне нужна помощь. Вся помощь приветствуется. :) На Freenode ввод / NS ACC [user] вернет, вошел ли пользователь [user] с числовым значением, они решили, что 3 войдут в систему. И 0-2, так как какой-то не вошли в систему.

Итак, вот как бот входит в мой канал IRC ... (не стесняйтесь присоединиться к #tyreus на freenode, попросите BwaddArr (или его электронную почту))

<?php
set_time_limit(0);  //Stop the script timing out

$server = "irc.freenode.net";        //server to connect to
$channel = "#tyreus";               //channel to connect to initialy
$password = "sumpass";             //password for bot to login to irc
$pass2 = "anotherpass";               //password to make the bot do stuff
$users[0] = "0";                  //array of logged in users
$nickname = "Samcal";            //Set the bot's nick here
$logger = FALSE;                //for the channel logger
$takeover = FALSE;             //for the auto banner

$socket=fsockopen($server,'6667') ; //Connect and join the channel

stream_set_timeout($socket, 300);  //Set a timeout value (so the bot quits if it's disconnected)
fwrite($socket, "NICK ".$nickname."\r\n");
fwrite($socket, "USER ".$nickname." 8 * ::\x01VERSON 1.0 Brad's bot\x01\n");  //read rfc 1459 to understand this line

  while ($line=fgets($socket)) {
     echo htmlentities($line)."<br>"; 
       if (strpos($line, "433")>0) die("error nick in use");  //Quit if bot's nick is already taken (irc code 433 is received)

       if (strpos($line, "004")>0) {
          fwrite($socket, "JOIN ".$channel."\r\n"); //Join the channel if everything is ok (irc code 004 is received)
          fwrite($socket, "NickServ IDENTIFY ".$nickname." ".$password."\r\n");
          fwrite($socket, "ChanServ OP ".$channel." Samcal\r\n");
          fwrite($socket, "MODE ".$channel." +v Samcal \r\n");
          break;
       }
  }

И здесь мне действительно нужна вся помощь! :)

 if(strpos($line, "PRIVMSG ".$channel." :+oB\r\n")>0) { //Command to make the bot run the command
    $name = "BwaddArr"; // my username, this can be easily changed to the other users who will need opping
    $command = "NickServ ACC $name"; // the NickServ command I was talking about
    $result = fwrite($socket, "$command \r\n"); // my attempt at retrieving the result
    $accr = readline(strpos($line, "$result \r\n")); //part 2 of my failure to retrieve a result
    $loggd = str_replace("3","three","$accr"); // replace '3' with 'three'
 if($loggd != "three") { // if result is not three do below
    fwrite($socket, "PRIVMSG ".$channel." :$name is not logged in. \r\n"); // write into the chat that the user is not logged in
}
 if($loggd == "three") { // OP the user if they are logged in
    fwrite($socket, "MODE ".$channel." +ov $name\r\n"); // sends the OPping command
}
}
?>

Ответы [ 4 ]

1 голос
/ 06 января 2009

Я предполагаю, что второй фрагмент находится внутри вашего цикла while (fgets ()).

Ваш результат не будет в цикле, где вы будете использовать fwrite (). Либо добавьте еще один fgets () после

$result = fwrite($socket, "$command \r\n");

или, следовательно, используйте ваш цикл и, возможно, добавьте флаг состояния, чтобы знать, как обрабатывать следующее выполнение его тела.

0 голосов
/ 12 января 2009

В последнем фрагменте кода вы открываете сокет с именем $irc и записываете в сокет с именем $socket. Либо исправьте это, либо покажите нам еще немного своего кода, в котором вы используете / вводите $socket.

0 голосов
/ 06 января 2009

Я сделал один, когда был молодым.

Я использовал такой цикл:

$irc = fsockopen($server, $port);
// ...
while(!feof($irc))
{
     $line = fgets($irc, 2048);

     // ...
     // Parsing $line here
     // ...
}

Надеюсь, это поможет.

0 голосов
/ 06 января 2009

Прежде всего, удалите пароль для вашего бота. (Исправлено)

Дайте несколько советов по IRC, удачи, вы на правильном пути.

...