1

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

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

POE::会话->创建(
        inline_states => {
                irc_disconnected => \&bot_reconnect,
                irc_error => \&bot_reconnect,
                irc_socketerr => \&bot_reconnect,
                连接 => \&bot_reconnect,
.
.
.
        },
);

如果bot_reconnect出现任何问题,它将连接回 IRC:

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

        if (1 == $heap->{shutting_down}) {
                $heap->{irc}->yield(shutdown => 'blah');
        } 别的 {
                some_log_func("60 秒后重新连接");
                $内核延迟(连接=> 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. 如您所见,我试过了,但它似乎不起作用。

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

如何正确关闭 Bot::BasicBot 机器人(基于 POE::Component::IRC)?

然而,这与我现在所拥有的非常相似,而且它的行为似乎也没有任何不同。

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

有任何想法吗?

4

1 回答 1

0

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

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

我并没有尝试在 Freenode 上执行此操作,但事实证明我正在执行此操作的网络确实执行此操作。他们正在使用 Charybdis:

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

于 2012-10-15T18:10:33.293 回答