【问题标题】:Is it possible to get POE::Component::IRC to receive events for its own PRIVMSGs?是否可以让 POE::Component::IRC 接收其自己的 PRIVMSG 的事件?
【发布时间】:2014-09-17 07:22:07
【问题描述】:

我目前正在与POE::Component::IRC 一起开发一个机器人,他的工作除其他外,是按计划向频道列表发布通知,为期一周。

不过,我似乎找不到检查消息是否已成功发送到频道的方法。旧的Net::IRC 包会为发送到通道的每条消息触发一个消息接收事件,包括它自己发送的消息。 POE 似乎没有这样做 - 至少,当机器人自己的消息在频道上发布时, irc_public 事件没有触发。

是否有一个标志我可以传递给事件处理程序来表示“我真的很想接收所有消息,甚至是我自己的”?或者有没有办法通过某种 RAW 事件处理程序来做到这一点?

【问题讨论】:

    标签: perl irc poe


    【解决方案1】:

    IRC 协议不将您的 PRIVMSG 回显给您,因此您只需要相信服务器已收到您的消息并按应有的方式处理它。

    如果您只想接收您发送的消息的 POE 事件,可以使用插件:POE::Component::IRC::Plugin::BotTraffic。但是,它实际上并没有做任何事情来验证消息是否到达了服务器。

    幸运的是,IRC 运行在 TCP 之上,它提供了有保证的按订单交付。因此,只要连接没有断开或无限期挂起,您就可以非常安全地假设您的命令将到达服务器。

    如果您想绝对确定,您可以随时在您的 PRIVMSG 后面加上一些您知道服务器会回复的命令,例如 TIME 或 PING;如果是这样,您就会知道它也收到了您的 PRIVMSG。当然,即便如此,仍然不能保证服务器确实将消息传递给了预期的接收者;网络分裂之类的事情确实时有发生,并且可能导致消息被丢弃。

    【讨论】:

    • 有趣 - 我想我应该在某个时候真正阅读 IRC RFC - 我应该已经意识到这一点。我的假设是 Net::IRC 是根据我从同事那里继承的一些代码来做这件事的,他的 perl 检查了他收到的消息是否是他自己发送的消息。哼哼。我猜我得照你说的做,相信 TCP :)
    • RFC 实际上并没有清楚地说明这一点——事实上,它们似乎没有禁止服务器回显 PRIVMSG,它们只是不需要它, 任何一个。我能找到的最接近的是RFC 2810, section 5.2.1 中的示例 4,它表示发送到没有其他用户的频道的消息“到达服务器,然后无处可去”。然而,你可以做的是 telnet / netcat 到一个真正的 IRC 服务器,输入你自己的 IRC 命令,看看会发生什么。 (事实上​​,作为一个极端情况,如果您直接 PRIVMSG 自己的昵称,您确实似乎得到了回应。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多