我用Phredds Irc bot是因为我想做一个机器人来和我的抽搐聊天。它能很好地连接和响应ping,但不会响应其他任何东西。我好像在做他在垃圾桶里做的事,这有什么问题吗?
import socket #imports module allowing connection to IRC
import threading #imports module allowing timing functions
#sets variables for connection to twitch chat
bot_owner = 'TwitchPlaysFightingGames'
nick = 'MagicalCakeBot'
channel = '#TwitchPlaysFightingGames'
server = 'irc.twitch.tv'
password = 'oauth:~redacted~'
queue = 0 #sets variable for anti-spam queue functionality
irc = socket.socket()
irc.connect((server, 6667)) #connects to the server
#sends variables for connection to twitch chat
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')
def message(msg): #function for sending messages to the IRC chat
global queue
queue = queue + 1
print queue
if queue < 20: #ensures does not send >20 msgs per 30 seconds.
irc.send('PRIVMSG ' + channel + ' :' + msg + '\r\n')
else:
print 'Message deleted'
def queuetimer(): #function for resetting the queue every 30 seconds
global queue
print 'queue reset'
queue = 0
threading.Timer(30,queuetimer).start()
queuetimer()
while True:
data = irc.recv(1204) #gets output from IRC server
user = data.split(':')[1]
user = user.split('!')[0] #determines the sender of the messages
print data
if data.find('PING') != -1:
irc.send(data.replace('PING', 'PONG')) #responds to PINGS from the server
if data.find('!test') != -1: #!test command
message('Hi')
我浏览了一下您的实现,现在您已经编辑它以包含
message
函数定义,它看起来应该可以工作了(在大多数实际情况下)。我简要地测试了您在编辑后发布的实现,它在两次测试运行期间对我有效。虽然它对我有效,但我不认为它完全是万无一失的。当我测试它时,我在一个安静的通道中测试它,这个通道不会让大量的数据淹没套接字。根据代码中包含的通道名称(
"#TwitchPlaysFightingGames"
),我怀疑您可能正在将这个基本的Twitch IRC客户端加入到一个不断推送大量数据的通道中。我将要描述的这个案例触及到了为什么这对你来说可能是个问题。分消息问题
我看到的一个明显的问题是如何处理从对
socket.recv()
的调用中接收到的数据。您的代码在每次调用socket receive函数时接收硬编码的有限数量的数据,然后假设它始终包含一个完整的“消息”。在您的例子中,您感兴趣的“消息”是"!test"
,这取决于各种因素,包括对socket.recv()
的调用之间的延迟和接收的数据包长度,当一个“消息”被分成对socket.recv()
的两个调用时,您的“消息”检查逻辑可能会失败。在下面的简化代码片段中,考虑如果套接字的缓冲区包含数据
"[x][y:1]"
,会发生什么情况:在第一次迭代中,
response
将等于"[x][y"
。在第二次迭代中,response
将等于":1]"
。这两个迭代都不包含消息"[y:1]"
。在这个例子中,"success"
永远不会被打印。这是我上面描述的问题的显著缩小版本。也就是说,如果您想创建一个完全万无一失的实现,您可以考虑构建一个单独的缓冲区来容纳未解析的“消息”片段。例如,在上面的示例中,如果解析消息
"[x]"
,并将接收缓冲区的剩余部分("[y"
)保存在单独的未解析消息缓冲区中,则可以稍后将下一个接收缓冲区的内容与未解析消息缓冲区连接,以生成完整的“消息”(在本例中为"[y:1]"
)。潜在的
IndexError
异常问题另一个问题是,您正在执行字符串拆分操作,并立即尝试访问可能不包含任何元素的列表的索引。您将知道何时发生这种情况,因为尝试将引发
IndexError
异常。我猜这不会发生在你身上,因为你没有提到任何例外。调试问题的建议
因为我不能轻易地复制你的问题,所以了解你的情况可能会有帮助。我会先在一个安静的通道中测试代码。接下来,您应该考虑保存代码的第二个副本并对其进行简化,以便在问题仍然存在时缩小范围。
考虑删除以下代码以简化问题:
queuetimer()
的调用及其函数定义和对queue
变量的任何其他引用message()
函数,使其只调用irc.send()
data.split()
和user.split()
行,因为您没有使用它们如果您仍然无法找出问题所在,请使用您发现的任何其他信息回帖到此线程。
附加Twitch.TV IRC客户端示例
我想这可能有助于您看到一个示例,它可能需要采取一些步骤来解析更多的Twitch.TV IRC协议;因此,我将一个快速演示应用程序上载到GitHub,并牢记这一点:请参见https://github.com/jwilges/twitchtvircclient以获取演示代码。
相关问题 更多 >
编程相关推荐