IRC-бот Python, не остановит цикл

Хорошо, так что это просто повторяется, и я не знаю, как это остановить на Python3.4.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dat = ""
try:
    s.connect(("67.220.79.37", 6667))
    while True:
        s.send(bytes("NICK Conscience\r\n", "UTF-8"))
        s.send(bytes("USER Conscience chat.frostwire.com ident :realname\r\n", "UTF-8"))
        s.send(bytes("PASS ********\r\n", "UTF-8"))
        dat = dat + s.recv(1024).decode("UTF-8")
        s1 = str.split(dat, "\n")
        for line in s1:
            line = str.rstrip(line)
            line = str.split(line)
            print(line)
            if (len(line) == 0):
                continue
            if(line[0] == "PING"):
                s.send(bytes("PONG %s\r\n" % line[1], "UTF-8"))
                s.send(bytes("JOIN #nerdrage\r\n", "UTF-8"))
except Exception as e:
    print(e)

person tiefutss    schedule 15.06.2014    source источник
comment
Используйте break или создайте исключение.   -  person Christian    schedule 15.06.2014
comment
Пожалуйста, рассмотрите (если только не ради обучения) использование фреймворка, который позаботится обо всем этом. например: схемы и ircbot.py или Twisted и IrcLogBoy.py   -  person James Mills    schedule 15.06.2014
comment
@Christian Просто перерыв в конце сработает? Вы знаете, как заставить его реагировать на команды?   -  person tiefutss    schedule 15.06.2014
comment
Это зависит от того, когда вы хотите остановить цикл? Но, как предложил @JamesMills, вы должны использовать структуру IRC.   -  person Christian    schedule 15.06.2014
comment
@Christian Это не вернется, если я поставлю разрыв в s.send (bytes (JOIN #nerdrage\r\n, UTF-8))?   -  person tiefutss    schedule 15.06.2014
comment
ты на 3.4. используйте асинкио. вот моя попытка до сих пор, чтобы вы начали. github.com/eevee/dywypi   -  person Eevee    schedule 15.06.2014
comment
Вам нужно убрать цикл while из вашего try/except. Затем, когда вы хотите, чтобы он вышел, введите raise SystemExit (после вашего последнего s.send).   -  person Burhan Khalid    schedule 15.06.2014


Ответы (1)


Я понимаю, что это не отвечает на ваш вопрос. Я рекомендую не делать это вручную, а использовать структуру, разработанную для такого рода вещей. Смотрите мои комментарии выше.

Вот очень простой IRC-бот, использующий схемы.

Он также будет реагировать на очень простую команду при личном сообщении. hello. Все остальное приведет к ответу Unknown Command.

simpleircbot.py

Обновление: Если вы все еще настаиваете на изучении того, как все это работает, и написании тривиального irc-бота вручную, я рекомендую вам прочитать: http://hawkee.com/snippet/2497/ (или другие подобные статьи в Интернете) и учитесь на этом.

Пример вставлен сюда для вашего удобства:

import socket

network = 'irc.snm.co.nz'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
print irc.recv ( 4096 )
irc.send ( 'NICK botty\r\n' )
irc.send ( 'USER botty botty botty :Python IRC\r\n' )
irc.send ( 'JOIN #paul\r\n' )
irc.send ( 'PRIVMSG #Paul :Hello World.\r\n' )
while True:
   data = irc.recv ( 4096 )
   if data.find ( 'PING' ) != -1:
      irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' )
   if data.find ( '!botty quit' ) != -1:
      irc.send ( 'PRIVMSG #paul :Fine, if you don't want me\r\n' )
      irc.send ( 'QUIT\r\n' )
   if data.find ( 'hi botty' ) != -1:
      irc.send ( 'PRIVMSG #paul :I already said hi...\r\n' )
   if data.find ( 'hello botty' ) != -1:
      irc.send ( 'PRIVMSG #paul :I already said hi...\r\n' )
   if data.find ( 'KICK' ) != -1:
      irc.send ( 'JOIN #paul\r\n' )
   if data.find ( 'cheese' ) != -1:
      irc.send ( 'PRIVMSG #paul :WHERE!!!!!!\r\n' )
   if data.find ( 'slaps botty' ) != -1:
      irc.send ( 'PRIVMSG #paul :This is the Trout Protection Agency. Please put the Trout Down and walk away with your hands in the air.\r\n' )
   print data

ВНИМАНИЕ: Как уже было отмечено (см. мои предыдущие комментарии), делать это вручную сложно и трудно сделать правильно. Выполнение таких действий, как чтение произвольного количества байтов, слепой поиск по этим байтам в лучшем случае подвержено ошибкам, а в худшем - ненадежно. Используйте фреймворк!.

person James Mills    schedule 15.06.2014
comment
Я как бы делаю это, чтобы выучить синтаксис и протокол, я не хочу, чтобы это было просто, p - person tiefutss; 15.06.2014
comment
Будьте готовы к большому количеству работы и низкоуровневому вводу-выводу сокетов, а также к обработке протокола IRC. Учиться хорошо! - person James Mills; 15.06.2014
comment
Как будто нет проблем с подключением, он просто заливает окно NS, зацикливая его, и теперь, если я поставлю break под циклом, он по какой-то причине не ответит на pong. питон 3.4 гррр. - person tiefutss; 15.06.2014
comment
пожалуйста, не учитесь и в этой статье; я почти уверен, что чтение 4096 байт за раз, слепой поиск строк, а затем выбрасывание всего этого - не лучшая идея. - person Eevee; 15.06.2014
comment
Я ссылаюсь на свои оригинальные комментарии :) Не делайте этого вручную :/ - person James Mills; 15.06.2014