如何使用perl的POE :: Component :: IRC发出退出消息?

时间:2012-10-14 16:42:34

标签: perl irc

我有一个使用POE :: Component :: IRC的简单IRC机器人。只有当我试图通过退出一个有用的消息来使它优雅地处理SIGINT时,我发现我根本不能让它退出任何消息,无论是作为信号处理程序的一部分还是仅仅是正常的调用退出。

假设我已经创建了这样的会话:

POE::Session->create(
        inline_states => {
                irc_disconnected => \&bot_reconnect,
                irc_error        => \&bot_reconnect,
                irc_socketerr    => \&bot_reconnect,
                connect          => \&bot_reconnect,
.
.
.
        },
);

bot_reconnect只是要连接回IRC 出了什么问题:

sub bot_reconnect
{
        my ($kernel, $heap) = @_[KERNEL, HEAP];

        if (1 == $heap->{shutting_down}) {
                $heap->{irc}->yield(shutdown => 'blah');
        } else {
                some_log_func("Reconnecting in 60 secs");
                $kernel-delay(connect => 60);
        }
}

如果代码中的任何其他地方我将shutting_down设置为1并告诉它 退出(例如$irc->yield(quit => "bye!"))它会立即退出 没有退出消息的IRC(“客户端退出”,ircd显示) 或“远程主机关闭连接”。

然后它接收到irc_disconnected事件 上面bot_reconnect,其中shutdown似乎无所作为 所有。事实上,如果我在exit 0之后没有明确shutdown 那么这个过程只是处于不稳定状态,没有连接到IRC 更多。

这是应该发生的事吗?

我找到了:

http://search.cpan.org/~bingos/POE-Component-IRC-6.79/lib/POE/Component/IRC/Cookbook/Disconnecting.pod

表示使用shutdown。正如你所看到的,我试过了,而且它 似乎不起作用。

我还在另一个问题中找到了一些示例代码:

How do I correctly shutdown a Bot::BasicBot bot (based on POE::Component::IRC)?

然而,这与我现在的非常相似,而且也没有 似乎表现得有所不同。

libpoe-component-irc-perl的软件包版本是6.78 + dfsg-1所以 如上面的URL所示,它应该大于6.50。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

事实证明这是ircd的“错误”。

我还向POE :: Component :: IRC的请求跟踪器报告了这个错误,Hinrik回答,问我是否试图在Freenode上执行此操作。 Freenode的ircd有一个功能,如果你没有连接很长时间,它会忽略你的退出消息。

我没有尝试在Freenode上做,但事实证明我在上做的网络确实这样做了。他们正在使用Charybdis:

https://github.com/atheme/charybdis/blob/master/modules/core/m_quit.c#L75