gpt4 book ai didi

python - python中的IRC机器人不会发送消息

转载 作者:太空狗 更新时间:2023-10-30 00:56:05 25 4
gpt4 key购买 nike

我正在使用 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 函数定义。我简要测试了您在编辑后发布的实现,并且在两次测试运行期间对我有用。

虽然它对我有用,但我不会说它是完全万无一失的。当我测试它时,我在一个安静的 channel 中进行了测试,该 channel 没有用大量数据淹没套接字。根据您在代码中包含的 channel 名称 ("#TwitchPlaysFightingGames"),我怀疑您可能正在将这个基本的 Twitch IRC 客户端加入一个持续推送大量数据的 channel 。我将要描述的案例涉及为什么这对您来说可能是一个问题。

分割消息问题

我看到的一个明显问题涉及您如何处理从调用 socket.recv() 中收到的数据。您的代码每次调用套接字接收函数都会接收到硬编码的有限数据量,然后假设它总是包含一个完整的“消息”,可以这么说。在您的情况下,您感兴趣的“消息”是 "!test" 根据各种因素,包括调用 socket.recv() 之间的延迟和接收到的数据包长度,您的“消息”检查逻辑可能会在单个“消息”分为对 socket.recv() 的两次调用。

在以下简化的代码片段中,考虑如果套接字的缓冲区包含数据 "[x][y:1]" 会发生什么:

while True:
response = socket.recv(5)
if response.find("[y:1]") != -1:
print("success")

在第一次迭代期间, response 将等于 "[x][y" 。在第二次迭代期间, response 将等于 ":1]" 。这些迭代都不会包含消息 "[y:1]" 。在此示例中,永远不会打印 "success"。这是我上面描述的问题的显着缩小版本。

也就是说,如果您想创建一个完全万无一失的实现,您可以考虑构建一个单独的缓冲区来容纳未解析的“消息”片段。例如,在上面的示例中,如果您解析消息 "[x]" 并将接收缓冲区的其余部分 ( "[y") 保留在单独的未解析消息缓冲区中,则稍后可以将下一个接收缓冲区的内容与未解析的消息缓冲区连接起来以产生完整的“消息”(在本例中为 "[y:1]" )。

潜在的 IndexError 异常问题

另一个问题是您正在执行字符串拆分操作并立即尝试访问可能不包含任何元素的列表的索引。您会知道这种情况何时发生,因为该尝试会引发 IndexError 异常。我猜这不会发生在你身上,因为你没有提到任何异常(exception)。

调试问题的建议

由于我无法轻松重现您的问题,因此了解有关您情况的更多信息可能会有所帮助。我会首先在一个安静的 channel 中测试代码。接下来,您应该考虑保存代码的第二个副本并对其进行简化,以便在问题仍然存在时缩小问题的范围。

考虑删除以下代码以简化您的问题:
  • 删除对 queuetimer() 的调用及其函数定义和对 queue 变量
  • 的任何其他引用
  • 简化了 message() 函数,使其只调用 irc.send()
  • 删除 data.split()user.split() 行,因为您没有使用它们

  • 如果您仍然无法找出问题所在,请将您发现的任何其他信息发回此线程。

    额外的 Twitch.TV IRC 客户端示例

    我认为它可能会帮助您了解采取一些步骤来解析更多 Twitch.TV IRC 协议(protocol)可能需要什么的示例;因此,考虑到这一点,我向 GitHub 上传了一个快速演示应用程序:有关演示代码,请参阅 https://github.com/jwilges/twitchtvircclient

    关于python - python中的IRC机器人不会发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21926495/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com