【问题标题】:PHP IRC Robot, Send Command, but now I need the bot to read the commandPHP IRC 机器人,发送命令,但现在我需要机器人来读取命令
【发布时间】:2010-09-29 17:39:54
【问题描述】:

我有一个 PHP IRC 机器人,我在我的频道中使用它,我需要它来对脚本中的特定用户进行 OP。无论如何,我希望机器人检查用户是否登录到 NickServ 以防止任何形式的欺诈或任何事情。

无论如何,这是我的连接和操作代码,下面是我真正需要帮助的内容。感谢所有帮助。 :) 在 Freenode 上,输入 /NS ACC [user] 将返回 [user] 是否使用数值登录,他们决定 3 将登录。而 0-2 表示某种未登录。

这就是机器人如何登录到我的 IRC 频道...(随时在 freenode 上加入 #tyreus,询问 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
}
}
?>

【问题讨论】:

  • 也更改您机器人上的密码 :-) 如果您查看问题的编辑历史记录,旧密码仍然可用,恐怕。

标签: php command irc prompt robot


【解决方案1】:

我假设第二个 sn-p 位于您的 while(fgets()) 循环内。

您不会在使用 fwrite() 的循环中获得结果。在

之后添加另一个 fgets()
$result = fwrite($socket, "$command \r\n");

或者因此使用您的循环并可能添加一个状态标志以了解如何处理其主体的下一次执行。

【讨论】:

    【解决方案2】:

    首先,删除你的机器人的密码。(固定)

    在您的 IRC 上提供一些提示,祝您好运,您现在走在正确的轨道上。

    【讨论】:

      【解决方案3】:

      我年轻的时候做过一个。

      我使用了那种循环:

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

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        在上一个代码 sn-p 中,您打开名为 $irc 的套接字并写入名为 $socket 的套接字。 要么解决这个问题,要么向我们展示更多你使用/介绍$socket的代码。

        【讨论】:

          猜你喜欢
          • 2011-01-24
          • 2023-04-08
          • 2023-01-13
          • 2021-10-05
          • 2021-04-14
          • 2020-01-16
          • 2020-08-21
          • 2022-12-03
          • 2021-10-30
          相关资源
          最近更新 更多