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.