1

我正在尝试测试用户是否在 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";
}

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

4

3 回答 3

2

在 POE 中的状态下...您必须在另一个状态下让步或调用它。

此外,当你有来自 IRC 命令的数据时,让给另一个状态来处理它。

_start - 启动计时器等 timer - yield on_whois

on_whois - 运行 who is - 设置数据 - 让给下一个计时器

_stop - 终止计时器 - 刷新数据

于 2015-12-31T16:40:25.630 回答
1

我在 Freenode 上运行了一个机器人,并通过询问 Nickserv 命令解决了这个问题: ACC [nick] *

Nickserv 然后将回复格式为:[nickname] -> [registerd nickservname] ACC [level] 的通知

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

于 2009-12-13T21:55:48.853 回答
0

以下内容至少适用于 FreeNode(或任何支持 identify-msg 功能的服务器)。

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

于 2010-05-23T05:25:26.863 回答