尝试使用 Roll Your Own Haskell Bot 连接到 IRC 时出现“No Ident response”和 "Notice -- You need to identify via SASL to use this server"

'No Ident response" and "Notice -- You need to identify via SASL to use this server" when attempting to connect to IRC with Roll Your Own Haskell Bot

我在 Haskell wiki 上使用 Roll Your Own IRC Bot,当 运行 指南提供的代码时,我收到了这两个错误。

怎么了?为什么我无法连接?

我正在使用 Ubuntu,我尝试用 ghc 编译它,运行 用 ghci 编译它。

import Network
import System.IO
import Text.Printf

server = "irc.freenode.org"
port   = 6667
chan   = "#tutbot-testing"
nick   = "tutbot"

main = do
    h <- connectTo server (PortNumber (fromIntegral port))
    hSetBuffering h NoBuffering
    write h "NICK" nick
    write h "USER" (nick++" 0 * :tutorial bot")
    write h "JOIN" chan
    listen h

write :: Handle -> String -> String -> IO ()
write h s t = do
    hPrintf h "%s %s\r\n" s t
    printf    "> %s %s\n" s t

listen :: Handle -> IO ()
listen h = forever $ do
    s <- hGetLine h
    putStrLn s
  where
    forever a = do a; forever a

No Ident Response 通知指的是 Internet 历史深处的一个非常古老的协议。在过去,当 multi-user Unix 机器是规则而不是例外时,有时服务器想要获得有关发起连接的连接客户端上的特定用户的一些信息。 Ident protocol 就是为此目的而创建的。我猜 IRC 服务器仍然包含尝试查询 Ident 服务器的代码,但它们收到的响应可能微乎其微,因此您可以忽略此错误。

SASL错误比较严重。它表明您要连接的特定 IRC 服务器已配置为在允许连接之前需要通过 SASL 协议进行用户识别和身份验证。您可能不希望为您的机器人添加 SASL 支持而增加复杂性!

但是,我无法重现您的问题。当我 运行 你上面发布的代码时,我连接到主机 kornbluth.freenode.net [2001:1bc0:c1::6667/6667],看到关于 No Ident response 的通知,但是我的连接被接受,设置我的昵称和的命令也是如此加入 #tutbot-testing 频道,我看到了当天的消息。我还看到一些可怜的人(也许是你?)发来的消息,寻求他或她的机器人的帮助,但我无法回复,因为上面的 tutbot 代码无法发送任何命令!

是否有可能您在测试它时使用的 servernick 与上面代码中的不同,这导致了问题?如果不是,则可能有一个特定的 "irc.freenode.org" 服务器被配置为需要 SASL,而其余服务器工作正常。尝试将服务器名称切换为:

server = "kornbluth.freenode.net"

这似乎对我有用。

更新: 看起来 freenode 需要来自 Amazon Web Services IP 地址的 SASL 身份验证(如此 bug report for an IRC client 中所述),这样就可以解释您的问题重新拥有。