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

Posted

技术标签:

【中文标题】如何在 Perl 中使用 POE::Component::IRC::State 检查用户是不是通过 NickServ 的身份验证?【英文标题】:How do I check if a user is authenticated with NickServ using POE::Component::IRC::State in Perl?如何在 Perl 中使用 POE::Component::IRC::State 检查用户是否通过 NickServ 的身份验证? 【发布时间】:2009-12-13 18:51:59 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

_开始 - 启动计时器等。 计时器 - 产生 on_whois

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

_停止 - 杀死计时器 - 刷新数据

【讨论】:

【参考方案2】:

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

Nickserv 然后会回复格式如下的通知: [昵称] -> [注册昵称] ACC [级别]

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

【讨论】:

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

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

如果您正在对来自用户的消息(irc_msgirc_publicirc_ctcp_action)做出反应,您可以通过查看提供给事件处理程序。如果用户已经识别则为真,否则为假。

【讨论】:

以上是关于如何在 Perl 中使用 POE::Component::IRC::State 检查用户是不是通过 NickServ 的身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 脚本中使用 Perl 变量(使用反引号)

如何使用多个版本的 Perl 在 Perl 模块中安装脚本?

如何使用 Perl 模块中的常量?

在 Perl 中如何使用变量作为哈希键?

在 Perl 中使用 nohup 时如何抑制系统输出?

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]