Есть ли способ сказать серверу не отправлять MOTD, или действительно лучший способ дождаться окончания MOTD, чтобы сообщить серверу, к какому каналу я хочу подключиться?
Нет, нет способа отключить MOTD. Однако в этом даже не должно быть необходимости, поскольку ваше предположение о том, что «Сеть не будет принимать никаких команд до завершения MOTD», в первую очередь неверно.
Все сети начинают принимать команды сразу же после регистрации (т. Е. Отправлять NICK
и USER
) - некоторые из них просто откладывают действие на эти команды на секунду или две. Вполне допустимо начать посылать команды как можно скорее.
В любом случае вам не нужно было бы задерживать основной цикл для достижения этой цели - действительно, все полученные входные данные должны обрабатываться одним и тем же циклом. Вместо этого вы просто будете следить за тем, видели ли вы уже строку «конец MOTD», и отправлять JOIN
s в первый раз, когда увидите.
Кроме того, из вашего описания, похоже, что вы используете несколько ненадежный метод для обнаружения конца MOTD. Если вы ищете строку «Конец / MOTD» - не надо. Вместо этого проанализируйте всю строку, как указано в RFC 1459 § 2.3.1 (здесь не особо-Pythonic синтаксический анализатор ), и проверьте команду в каждой строке, поскольку описательный текст может варьироваться между различными демонами IRC. Вам также следует проверить наличие сообщения «no / MOTD».
Например, вы бы имели:
# 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 : conn.send("JOIN %s\r\n" % ",".join(channels)) sent_initial_join = True
Но, как сказано выше, это никогда не должно быть необходимым. Просто отправить JOIN
сек сразу после NICK
, USER
и тому подобное CAP END
.
И, боги, не используйте что-то настолько глупое, как 10-секундный тайм-аут для этого.