【问题标题】:IRC-Bot in Ruby: PRIVMSG sends only last word of stringRuby 中的 IRC-Bot:PRIVMSG 只发送字符串的最后一个字
【发布时间】:2011-06-03 06:22:29
【问题描述】:

我正在学习 ruby​​,我从网上获取了一个已经完成的 IRC-Bot,它只连接到给定的服务器,仅此而已。 然后我添加了一些功能(在我的例子中,我尝试实现在哪里吃午餐的投票)。

到目前为止,这些工作正常,但我不知道 ruby​​ 脚本是否有问题或 IRC 服务器有问题。

在我测试过的 Bot 上,它运行良好,输出如下:

09:14 < Wayne> !EssNA
09:14 < EssNABot> [-=EssNA-Vote=-]
09:14 < EssNABot> Options are: 
09:14 < EssNABot> McDonalds. 0
09:14 < EssNABot> Currywurst 0
09:14 < EssNABot> Hendl..... 0
09:14 < EssNABot> Salatbar.. 0
09:14 < EssNABot> Griechr... 0
09:14 < EssNABot> Metzger... 0
09:14 < EssNABot> Merowinger 0
09:14 < EssNABot> Lidl...... 0
09:14 < EssNABot> Voting time is 600 seconds.

机器人本身是这样看的:

--> PRIVMSG #test [-=EssNA-Vote=-]
--> PRIVMSG #test Options are:
--> PRIVMSG #test McDonalds. 0
--> PRIVMSG #test Currywurst 0
--> PRIVMSG #test Hendl..... 0
--> PRIVMSG #test Salatbar.. 0
--> PRIVMSG #test Griechr... 0
--> PRIVMSG #test Metzger... 0
--> PRIVMSG #test Merowinger 0
--> PRIVMSG #test Lidl...... 0
--> PRIVMSG #test Voting time is 600 seconds.

但是在完成后应该运行的 irc 上,用户将看到的输出如下所示:

09:14 < Wayne> !EssNA
09:14 < EssNABot> [-=EssNA-Vote=-]
09:14 < EssNABot> are:
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> 0
09:14 < EssNABot> seconds.

机器人提供的输出与用户输出工作所在的服务器上的输出相同。

在我看来问题出在 IRC 服务器上,也许有人可以指出我正确的方向?

你的, 马吕斯

【问题讨论】:

    标签: ruby irc


    【解决方案1】:

    昵称后好像需要加冒号(':'),即PRIVMSG #channel :Message

    【讨论】:

    • 这似乎有效:) 谢谢!所以必须有一个配置,其他 IRC-Server 让 PRIVMSG 完全发送,尽管通道后没有冒号......
    • 其实IRC服务器就是这样处理格式不正确的消息的。根据 IRC 协议 RFC,消息应包含该冒号。
    • 哦,很高兴知道!然后我显然在不符合 RFC 的服务器上进行了测试,也感谢 :)
    【解决方案2】:

    NIckolay O.'s answer 是正确的,但只是为了澄清这里发生了什么:

    每个 IRC 协议命令由多个字段组成,以空格分隔。例外情况是字段的第一个字符是冒号 : - 在这种情况下,冒号后面的命令的其余部分是单个字段(这允许命令中的最后一个字段包含空格)。

    所以,当您的机器人发送这样的错误消息时:

    PRIVMSG #test Voting time is 600 seconds.
    

    ...消息包含 7 个字段(PRIVMSG#testVotingtimeis600seconds.)。但是,PRIVMSG 命令应该只包含PRIVMSG 之后的两个字段——通道和要发送的消息。在这种情况下,服务器显然选择了 last 字段作为消息(它选择通道后面的字段也不足为奇)。

    正确的信息,像这样:

    PRIVMSG #test :Voting time is 600 seconds.
    

    ...而是包含三个字段(PRIVMSG#testVoting time is 600 seconds.)。现在这是一个格式正确的PRIVMSG 命令。

    【讨论】:

    • 感谢您的澄清,没有深入研究 IRC 协议。
    猜你喜欢
    • 2021-11-02
    • 2020-11-14
    • 2022-07-06
    • 2016-08-12
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    相关资源
    最近更新 更多