2015-03-04 2 views
0

Итак, я создал чат-бот для Twitch.tv, который работает нормально несколько месяцев, пока пару дней назад. Либо чат слишком затоплен, либо дергается, что-то изменило с помощью способа отправки сообщений. В любом случае, в каждом полученном сообщении я добавляю новую строку при печати в консоли, а некоторые сообщения не имеют этой добавленной строки, что означает, что несколько сообщений могут входить в один irc.recv(). Я попытался изменить размер recv, но не добился успеха. Это изображение печати, которое дает irc.recv(), в случае, если это помогает.Python IRC-бот для Twitch, получающий два сообщения в одном выходе

http://i.stack.imgur.com/pWeGt.jpg

Если вы посмотрите в середине, вы увидите, что два сообщения не имеют пространства между ними, что означает, если второй человек будет делать что-то bannable, первый пользователь будет запрещен.

И как вы можете видеть, было бы легко отделить сообщения, следуя «: nick! [email protected] PRIVMSG #channel:», но это также может быть легко для тех, кто понимает этот дизайн злоупотреблять ботом и таймаутом.

Что я надеюсь достичь, это способ изменить irc.recv() так, чтобы он только и получал ровно одно сообщение.

Вот пара фрагментов кода, чтобы лучше понять, что происходит.

# -*- coding: utf-8 -*- 
import socket 
import threading 
import datetime 
import time 


bot_owner = 'asd' 
nick = 'asdrobot' 
channel = '#asd' 
server = 'irc.twitch.tv' 
password = 'asd' #login authentication 

global irc 
irc = socket.socket() 
irc.connect((server, 6667)) #connects to the server 
irc.send('PASS ' + password + '\r\n') 
irc.send('USER ' + nick + ' 0 * :' + bot_owner + '\r\n') 
irc.send('NICK ' + nick + '\r\n') 
irc.send('JOIN ' + channel + '\r\n') 

while True: 
     senderdata = irc.recv(1024) #gets output from IRC server 
     sendermessage = ''  #Empties variable 
     senderuser = ''   #Empties variable 
     senderusertemplist = [] #Empties variable 
     if(senderdata.find('PRIVMSG') != -1): 
       print senderdata 
       try: 
        senderuser = senderdata.split(':')[1] 
        senderuser = senderuser.split('!')[0] #determines the sender of the messages 
       except IndexError as e: 
        senderuser = 'ERRORERROR' 
        print 'can not split this data' 
        print e 
       sendermessage = senderdata.split(channel)[-1] 
       sendermessage = sendermessage.split(':', 1)[-1] 
       sendermessagelow = sendermessage.lower() 

Это только самые важные части, и к моменту достижения кода эта проблема уже возникла.

Если нет возможности «исправить» проблему, и это часть того, как работает IRC, я бы с удовольствием узнал, но если вы знаете, как это исправить, я был бы очень благодарен.

спасибо.

+0

Я не знаю python, но IRC-сообщения заканчиваются символом '\ r \ n' (новая строка), поэтому вы можете читать из потока до следующего' \ r \ n', а затем вам должно быть гарантировано читать одно сообщение. – stwalkerster

+0

Это может сработать, да. Тот же сценарий с проверкой конца строки и сопоставлением с началом строки. Спасибо, я попробую это и, возможно, создаю список сообщений и выполняю основную функцию для каждого элемента, вместо того, чтобы выполнять основную функцию для каждого возвращаемого сигнала. – Oakmeyer

+0

Когда я делал это раньше (в C#), я использовал функцию, которая читает строку из потока, а не определенное количество байтов. Это может быть более полезным для вас. Я не знаю, существует ли такая функция в Python, хотя – stwalkerster

ответ

0

Я решил пойти с эффективностью> безопасности, так как безопасность в этом случае не такая уж большая. Вот как я ее решил:

senderdata = irc.recv(2048) #gets output from IRC server 
    linecount = senderdata.count('\r\n') 
    if(linecount == 1): 
     print senderdata 
     print "Single message" 
     tryComment(senderdata) 
    elif(senderdata.find('tmi.twitch.tv JOIN ' + channel) != -1): 
     print linecount-1, 'People joined' 
    elif(senderdata.find('tmi.twitch.tv PART ' + channel) != -1): 
     print linecount-1, 'People left' 
    elif(linecount > 1): 
     print "Multiple messages" 
     messagelist = [] 
     messagelist = senderdata.split('\r\n') 
     print len(messagelist) 
     for i in range(0, len(messagelist)): 

      if (len(messagelist[i]) > 0): 
       print messagelist[i] 
       tryComment(messagelist[i]) 
       print "message number: " 
       print i 
      else: 
       print "This message is empty" 
       print i 

И если кто-то пытается повторить это «решение» «tryComment()» это оригинальный основной цикл, который проверяет сообщение. Функция проверки игнорируется, если это кто-то, кто присоединился, кто-то ушел или если сообщение пустое.