如何使用perl';s POE::组件::IRC?
我有一个使用POE::Component::IRC的简单IRC bot。只有当我试图用一条有用的消息让它优雅地处理SIGINT时,我才发现我根本无法用任何消息让它退出,无论是作为信号处理程序的一部分还是仅仅是一个正常的退出调用 假设我已经创建了类似这样的会话: POE::Session->create( inline_states => { irc_disconnected => \&bot_reconnect, irc_error => \&bot_reconnect, irc_socketerr => \&bot_reconnect, connect => \&bot_reconnect, . . . }, ); 如果,在代码中的任何其他地方,我将如何使用perl';s POE::组件::IRC?,perl,irc,Perl,Irc,我有一个使用POE::Component::IRC的简单IRC bot。只有当我试图用一条有用的消息让它优雅地处理SIGINT时,我才发现我根本无法用任何消息让它退出,无论是作为信号处理程序的一部分还是仅仅是一个正常的退出调用 假设我已经创建了类似这样的会话: POE::Session->create( inline_states => { irc_disconnected => \&bot_reconnect, i
关闭设置为1并告诉它
要退出(例如,$irc->yield(quit=>“bye!”)
),它会立即退出
没有退出消息的IRC(“客户端退出”,ircd显示)
或者使用“远程主机已关闭连接”
然后,它接收到irc_disconnected(irc断开)事件,该事件将它带到
bot\u重新连接
,其中shutdown
在
全部的事实上,如果我没有明确地退出0
之后关闭
然后这个过程就处于不确定状态,没有连接到IRC
更多
这就是应该发生的事吗
我发现:
这表示要使用关机
。正如你所看到的,我试过了,而且成功了
似乎不起作用
我还在另一个问题中找到了一些示例代码:
然而,这和我现在的情况非常相似,而且也不一样
他们的行为似乎有所不同
libpoe组件irc perl的包版本是6.78+dfsg-1 so
正如上面的URL所说,应该大于6.50
有什么想法吗?原来这是ircd的“错误”
我还向POE::Component::IRC的请求跟踪器报告了这一错误,Hinrik回答说,问我是否试图在Freenode上这样做。Freenode的ircd有一个功能,如果您长时间未连接,它会忽略您的退出消息
我并没有试图在Freenode上做这件事,但事实证明我在网络上做这件事。他们正在使用Charybdis:
这是所有许多ircd的共同点(当然是在ircd混合血统中)。在此之前,垃圾邮件发送者意识到他们可以通过机器人连接,快速加入最大数量的频道,然后通过垃圾邮件退出消息退出,该消息将广播给所有频道中的所有人。
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);
}
}