Com um bot, como evito ou manipulo o MOTD do servidor de IRC?

1

Eu tenho um bot de IRC escrito em Python que funciona razoavelmente bem. Eu acho que a questão é com o meu conhecimento limitado do protocolo IRC, então os gurus do IRC são particularmente bem-vindos aqui: D

Quando você se conecta pela primeira vez a uma rede de IRC, um MOTD geralmente é exibido. A rede não aceitará comandos até que o MOTD seja concluído. Então, com o meu bot, eu tenho que ter um loop que verifica o final do MOTD. Isso não é particularmente modular, pois, na minha experiência, nem todos os servidores finalizam seus MOTDs da mesma maneira. Existe uma maneira de dizer ao servidor para não enviar o MOTD ou, na verdade, uma maneira melhor de esperar pelo final do MOTD para informar ao servidor qual canal eu desejo conectar?

Meu código atual para aguardar o final do MOTD consiste em um loop while lendo o buffer de entrada e analisando cada comando completo em uma lista. Ele pega essa lista e procura cada objeto de string por uma certa string que aparece no final do MOTD do FreeNode, se for encontrado, o loop termina e um comando para entrar em um canal é enviado antes de entrar no loop principal.

Existe uma maneira melhor de lidar com o MOTD? Eu não posso deixar de sentir que este caminho é um pouco desajeitado.

    
por LiamMeron 01.11.2013 / 19:46

1 resposta

2

Is there a way to tell the server to not send the MOTD, or indeed a better way to wait for the end of the MOTD to tell the server what channel I wish to connect to

Não, não há como desativar o MOTD. No entanto, nem deveria ser necessário, porque sua suposição de que "A rede não aceitará nenhum comando até que o MOTD seja concluído" não é verdadeira em primeiro lugar.

Todas as redes começam a aceitar comandos imediatamente assim que você se registra (ou seja, envia NICK e USER ) - alguns deles apenas atrasam agindo nesses comandos um segundo ou dois. É perfeitamente válido começar a enviar comandos o mais rápido possível.

Em qualquer caso, você não precisaria atrasar o loop principal para conseguir isso - de fato, todas as entradas recebidas devem ser manipuladas pelo mesmo loop. Em vez disso, você deve apenas acompanhar se já viu uma linha "end of MOTD" e enviar a JOIN s na primeira vez que a vir.

Além disso, a partir da sua descrição, parece que você está usando um método pouco confiável para detectar o fim do MOTD. Se você está procurando pela string "End of / MOTD" - não. Em vez disso, analise a linha inteira conforme especificado na RFC 1459 § 2.3.1 (aqui está uma particularmente analisador do Python e verifique o comando em cada linha, uma vez que o texto descritivo pode variar entre diferentes daemons de IRC. Você também deve verificar a mensagem "no / MOTD".

Por exemplo, você teria:

# raw input is ":leguin.freenode.net 376 grawity :End of /MOTD.\r\n"
# split input is [":leguin.freenode.net", "376", "grawity", "End of /MOTD."]
# parsed input is {"prefix":  "leguin.freenode.net",
#                  "command": "376",
#                  "args":    ["grawity", "End of /MOTD."]}

RPL_WELCOME   = "001"
RPL_ENDOFMOTD = "376"
ERR_NOMOTD    = "422"

if not sent_initial_join:
    if command in {RPL_WELCOME, RPL_ENDOFMOTD, ERR_NOMOTD}:
        conn.send("JOIN %s\r\n" % ",".join(channels))
        sent_initial_join = True

Mas como dito acima, isso nunca deve ser necessário. Basta enviar o JOIN s imediatamente após NICK , USER e coisas como CAP END .

E pelos deuses, o não usa algo tão bobo quanto um tempo limite de 10 segundos para isso.

    
por 01.11.2013 / 19:59