我正在使用Phredds Irc bot,因为我正在尝试为我的抽搐聊天做一个机器人.它连接和响应ping很好但它不会响应其他任何东西.我似乎正在做他在pastebin中所做的事情,所以这有什么问题?
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')
Run Code Online (Sandbox Code Playgroud)
我浏览了一下你的实现,看起来它应该可以工作(在大多数实际情况下),因为你已经编辑它以包含message函数定义.我简要测试了您在编辑后发布的实现,它在两次测试运行期间为我工作.
虽然它对我有用,但我不会说它完全是万无一失的.当我测试它时,我在一个安静的通道中进行了测试,该通道没有充斥大量数据的插槽.根据您在代码中包含的频道名称判断("#TwitchPlaysFightingGames"),我怀疑您可能会将这个基本的Twitch IRC客户端加入到不断推送大量数据的频道中.这个案子我将描述为什么这对你来说可能是一个问题.
我看到的一个明显问题涉及您如何处理通过电话接收的数据socket.recv().您的代码在每次调用套接字接收函数时都会收到硬编码的有限数据,然后假设它总是包含一个完整的"消息",可以这么说.在您的情况下,您感兴趣的"消息" "!test"取决于各种因素,包括调用之间的延迟socket.recv()和接收的数据包长度,当"单个"消息时,"消息" - 检查逻辑可能会失败"分为两个电话socket.recv().
在下面简化的代码片段中,考虑如果套接字的缓冲区包含数据会发生什么"[x][y:1]":
while True:
response = socket.recv(5)
if response.find("[y:1]") != -1:
print("success")
Run Code Online (Sandbox Code Playgroud)
在第一次迭代期间,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协议; 所以,我将这个快速演示应用程序上传到GitHub:请参阅https://github.com/jwilges/twitchtvircclient获取演示代码.
| 归档时间: |
|
| 查看次数: |
5893 次 |
| 最近记录: |