(Perl / POE)在POE :: Component :: IRC中,如何从外部子例程中的package_state返回/获取数据?

时间:2013-12-29 16:56:23

标签: perl bots irc poe

我试图从我的IRC bot中的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
}

1 个答案:

答案 0 :(得分:0)

听起来你想要一个异步问题的同步解决方案。由于IRC(和POE,就此问题......)的异步性质,您需要发出ISON查询并处理数字响应。

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

你有选择......

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

否则,您可以简单地使用'check_ison'发出ISON并从数字响应处理程序中产生某种“响应接收”事件,让您知道新数据可用。