我正在尝试测试用户是否在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";
}
不幸的是,在循环运行时,事件无法触发,因此会挂起。我确信有更好的方法可以做到这一点,但我对这种编程知之甚少。任何帮助将不胜感激。
答案 0 :(得分:2)
在POE中的状态子...你必须在另一个状态下产生或调用它。
此外,当你有来自IRC命令的数据时,屈服于另一个状态来处理它。
_start - 启动计时器等 计时器 - 收益率on_whois
on_whois - 运行谁 - 设置数据 - 屈服于下一个计时器
_stop - 杀掉计时器 - 刷新数据
答案 1 :(得分:1)
我在Freenode上运行一个机器人并通过询问Nickserv命令解决了这个问题: ACC [nick] *
Nickserv将以格式通知回复: [昵称] - > [注册的nickservname] ACC [等级]
级别3表示用户被识别为nickserv。
答案 2 :(得分:0)
以下内容至少适用于FreeNode(或任何支持identify-msg功能的服务器)。
如果您对来自用户的消息(irc_msg
,irc_public
或irc_ctcp_action
)作出反应,您可以通过查看第三个参数来判断他是否已通过NickServ进行了识别( $_[ARG3]
}提供给事件处理程序。如果用户已经识别,则为true,否则为false。