如何在Perl中使用POE::Component::IRC::State检查用户是否通过NickServ进行身份验证?

如何在Perl中使用POE::Component::IRC::State检查用户是否通过NickServ进行身份验证?,perl,irc,poe,Perl,Irc,Poe,我正在尝试测试用户是否已在FreeNode上注册。nick_info()似乎不返回有关此的信息,因此我想使用$irc->yield(whois=>$nick);然后获取irc_whois事件的回复。问题是我想等到触发此事件,所以我创建了一个全局变量$whois_result,并编写了一个子变量,如下所示: sub whois { my $nick = $_[0]; $whois_result = 0; $irc->yield(whois => $nick);

我正在尝试测试用户是否已在FreeNode上注册。nick_info()似乎不返回有关此的信息,因此我想使用$irc->yield(whois=>$nick);然后获取irc_whois事件的回复。问题是我想等到触发此事件,所以我创建了一个全局变量$whois_result,并编写了一个子变量,如下所示:

sub whois {
    my $nick = $_[0];
    $whois_result = 0;
    $irc->yield(whois => $nick);
    while($whois_result == 0) { }
    return $whois_result;
}
irc_whois处理程序看起来像:

sub on_whois {
    $whois_result = $_[ARG0];
    print "DEBUG: irc_whois fired.\n";
}

不幸的是,在循环运行时无法触发事件,因此挂起。我相信有更好的方法可以做到这一点,但我对这种编程还不够熟悉。任何帮助都将不胜感激

我在Freenode上运行了一个bot,并通过向Nickserv发出以下命令解决了问题: ACC[nick]*

Nickserv随后将以以下格式回复通知: [昵称]->[registerd nickservname]ACC[级别]


其中级别3表示用户被标识为nickserv。

以下内容至少适用于FreeNode(或任何支持标识消息功能的服务器)


如果您对来自用户的消息(
irc\u msg
irc\u public
、或
irc\u ctcp\u action
)做出反应,您可以通过查看提供给事件处理程序的第三个参数(
$[ARG3]
)来判断他是否已识别为NickServ。如果用户已识别,则为真,否则为假。

关于POE中状态的子项。。。你必须屈服,或者在另一个状态下调用它

另外,当您有来自IRC命令的数据时,请转到另一个状态来处理它

_开始 -启动计时器等。 计时器 -屈服于谁

关于谁 -跑谁是 -设置数据 -让位给下一个计时器

_停止 -停止计时
-刷新数据

谢谢,但我的主要问题不是IRC端,而是POE端。我想询问用户是否已注册,在得到答复之前不要做任何其他事情。我遇到的问题是,这些东西都是事件驱动的,请求和响应是独立的事件。这意味着我必须发送请求,然后让机器人做一段时间,然后每当出现响应时,我就开始处理它。我上面的解决方案是让响应处理程序设置一个全局变量并轮询该变量,但它失败了。我所做的是创建了一个全局队列。每次执行whois调用时,我都会将一个匿名函数取消移动到队列上,该队列将处理结果信息。我的whois响应处理程序看起来就是这样的:sub on_whois{My$function=pop(@whois_queue);$function->($wu[ARG0])}