Итак, я создал чат-бот для 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, я бы с удовольствием узнал, но если вы знаете, как это исправить, я был бы очень благодарен.
спасибо.
Я не знаю python, но IRC-сообщения заканчиваются символом '\ r \ n' (новая строка), поэтому вы можете читать из потока до следующего' \ r \ n', а затем вам должно быть гарантировано читать одно сообщение. – stwalkerster
Это может сработать, да. Тот же сценарий с проверкой конца строки и сопоставлением с началом строки. Спасибо, я попробую это и, возможно, создаю список сообщений и выполняю основную функцию для каждого элемента, вместо того, чтобы выполнять основную функцию для каждого возвращаемого сигнала. – Oakmeyer
Когда я делал это раньше (в C#), я использовал функцию, которая читает строку из потока, а не определенное количество байтов. Это может быть более полезным для вас. Я не знаю, существует ли такая функция в Python, хотя – stwalkerster