【问题标题】:PHP IRC bot not responding to commandsPHP IRC bot 不响应命令
【发布时间】:2012-03-04 17:07:50
【问题描述】:

这是我的代码:

<?php

$sock = fsockopen("localhost", 6667);
fwrite($sock, "NICK PHP_thang\r\n");
fwrite($sock, "USER fikeh fikeh fikeh :Fikeh's Thang\r\n");
fwrite($sock, "JOIN #LightSpike\r\n");

while (True) {
        echo fgets($sock);
        if (strpos(fgets($sock), "!about")) {
                fwrite($sock, "PRIVMSG #LightSpike :\x02Fike's PHP Bot:\x02 Fike's test bot.\r\n");
        }
}
?>

基本上,它会查看从套接字接收到的行,如果找到“!about”,它会向通道写入一条消息。但事实并非如此。谁能帮我吗?谢谢!

【问题讨论】:

  • 为您准备两件事... 1) 如果您需要帮助,请接受您之前的一些回答 2) 发布更多代码,以便我们查看发生了什么
  • 对不起,我忘记接受答案了。我现在将发布更多代码。

标签: php irc


【解决方案1】:

您正在使用echo fgets($sock); 读取流,这会清除流。当执行到有条件的下一行时,fgets( $sock ) 为空。要么删除 echo 行,要么先将内容放入变量中:

while (True) {
    $buffer = fgets( $sock );
    echo $buffer;
    if( strpos( $buffer, "!about" ) !== false ) {
        ...
    }
}

另请注意,如果搜索字符串位于行首和0 == false,则strpos() 返回0。对于strpos(),您应该始终使用strpos( $needle, $haystack ) === false(或!== false)。

【讨论】:

  • 虽然您对strpos 的看法绝对正确(这是一个常见的陷阱),但我想指出,在这种情况下实际上并不重要,因为由于协议规则,响应行无论如何都不能以!about 开头。
【解决方案2】:

请注意,fgets 将从套接字读取一行,但该行仅读取一次。下次您再次调用fgets 时,将读取下一行。因此,您应该读取变量中的行,然后只对变量进行处理。按照您现在设置的方式,一半的服务器响应将是echo'd,一半将检查!about 命令。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2020-12-15
    • 2021-08-28
    • 2021-02-17
    • 2020-09-12
    • 2023-03-09
    相关资源
    最近更新 更多