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

时间:2009-12-13 18:52:00

标签: 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);
    while($whois_result == 0) { }
    return $whois_result;
}

使用irc_whois处理程序看起来像:

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

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

3 个答案:

答案 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_msgirc_publicirc_ctcp_action)作出反应,您可以通过查看第三个参数来判断他是否已通过NickServ进行了识别( $_[ARG3]}提供给事件处理程序。如果用户已经识别,则为true,否则为false。