【问题标题】:How do I issue a quit message with perl's POE::Component::IRC?如何使用 perl 的 POE::Component::IRC 发出退出消息?
【发布时间】:2012-10-16 02:10:33
【问题描述】:

我有一个使用 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。如你所见,我试过了,它 好像没用。

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

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。

有什么想法吗?

【问题讨论】:

    标签: perl irc


    【解决方案1】:

    原来这是ircd的“错”。

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

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

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

    【讨论】:

    • 这是所有许多 ircd 的共同点(当然在 ircd-hybrid 谱系中)。在此实施之前,垃圾邮件发送者意识到他们可以让机器人连接,快速加入最大数量的频道,然后退出垃圾邮件退出消息,该消息将广播给所有这些频道中的每个人。
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多