【问题标题】:(Perl/POE) In POE::Component::IRC, How do you return/get data from a package_state in an external subroutine?(Perl/POE) 在 POE::Component::IRC 中,如何在外部子例程中从 package_state 返回/获取数据?
【发布时间】:2014-01-16 15:20:47
【问题描述】:

我试图从我的 IRC 机器人中的 package_state 获取输出数据,它使用 POE::Component::IRC 作为基础。但我似乎做不到。

基本上,在 POE 会话之外的子例程中,我希望在 POE 从服务器接收数据时从事件子例程中获取数据。 我尝试将数据保存在全局数组甚至外部文件中,但外部子例程会在数据更新之前从中读取旧数据。

更具体地说,我试图让这个机器人检查某人是否是 'ison',如果是,则返回 true(或从 irc_303 获取所有数据 (@_))。

类似这样的:

sub check_ison {
    my $who = "someguy";
    $irc->yield(ison => $who);
    $data = (somehow retrieve data from irc_303);
    return $data; #or true if $data
}

【问题讨论】:

    标签: perl bots irc poe


    【解决方案1】:

    听起来您想要一个异步问题的同步解决方案。由于 IRC(和 POE,就此而言......)的异步特性,您需要发出 ISON 查询并在收到数字响应时对其进行处理。

    据我所知,大多数客户端 NOTIFY 实现​​会定期发出 ISON(POE::Component::IRC 通过 POE::Component::Syndicator 提供计时器糖),更新它们的状态,并告诉用户是否有变化。

    你有选择...

    您可以在计时器上发出 ISON,在数字响应处理程序中适当地保存状态,并提供查询状态的方法。如果您的应用程序看起来更像一个客户端(用户/某事需要在某事发生变化时得到通知,也就是说)您的数字响应处理程序可以进行一些基本的列表比较,并为用户出现/消失发出适当的事件。

    否则,您可以简单地拥有一个“check_ison”,它发出 ISON 并从数字响应处理程序产生某种“收到响应”事件,让您知道有新数据可用。

    【讨论】:

    • 不幸的是,这两个选项都不适用于我调用 ISON 的方式。使用特定命令时只调用一次 ISON。更具体地说,在调用命令后,我想检查用户是否实际连接并通过 MemoServ 向他们发送消息而不是备忘录。
    • 在最简单的情况下,我想在一个子例程/函数中拦截来自 IRC 服务器的任何或特定传入消息。在这种情况下,我想在 check_ison 子例程期间调用 $irc->yield(ison => $who) 之后拦截 irc_303 消息,其中 $who 也是动态数据,而不是示例中显示的静态数据。
    • 这就是真正发生的事情:你发出 $irc->yield(foo => $bar),调用 POE::Component::Syndicator 的 yield() 方法,最终(当 POE 准备就绪时)向您的 POE::Component::IRC 会话发出一个事件,该会话最终将实际的 ISON 命令分派给服务器。两者之间可能还会发生许多其他事情——这都是异步的。您没有收到来自服务器的同步响应;除非您告诉它,否则没有什么会阻止等待响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多