gpt4 book ai didi

python - IRC bot 只接收 1/2 的消息

转载 作者:行者123 更新时间:2023-11-28 21:56:53 26 4
gpt4 key购买 nike

我的 IRC 机器人不会收到大约一半的输入聊天命令。我在自定义 channel 上使用 freenode 服务器。无论如何我可以改进这个吗?

图片:

import sys
import socket
import string

HOST="irc.freenode.net"
PORT=6667
NICK="FedoraCoinBot"
IDENT="CephonBot"
REALNAME="CephonBot"
CHAN="#cephbot"
readbuffer=""

s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" % NICK)
s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("JOIN :%s\r\n" % CHAN)
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "Hi! I am a FedoraCoin Bot!"))
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "Designed by Cephon ;)"))

# Loop
while 1:
text=s.recv(2040)
print text
readbuffer=readbuffer+s.recv(1024)
temp=string.split(readbuffer, "\n")
readbuffer=temp.pop( )
if text.find('!help') !=-1:
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "You said help"))

for line in temp:
line=string.rstrip(line)
line=string.split(line)

# Let's make it so that we don't get kicked -.-
if(line[0]=="PING"):
s.send("PONG %s\r\n" % line[1])

最佳答案

让我们来看看输入处理的一些部分:

text=s.recv(2040)
print text

所以首先,您会收到一些文本并打印出来。这是您在控制台输出中看到的唯一内容。

readbuffer=readbuffer+s.recv(1024)

接下来,您将阅读更多文本——这些文本以后再也不会打印出来了。因此它不会出现在您的控制台输出中,但是它是唯一被考虑用于实际命令解析的文本(您再也不会从上面访问 text)。

temp=string.split(readbuffer, "\n")

你把它分成几行——没关系。请注意,仅仅因为您收到了 1024 个字节,这并不意味着最后行已经是来自服务器的完整响应。它可能会在两者之间被打断,所以你应该等到你也收到另一个换行符(即在你读完之前不要处理最后一行)。

readbuffer=temp.pop( )

您得到第一行,但将其分配给 readbuffer,我认为这是包含所有剩余文本的缓冲区?您应该更清楚地说明变量的用途。

if text.find('!help') !=-1:
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "You said help"))

在这里,您再次检查 text。所以只有当 !help 恰好在最初的 2040 字节中时,它才会被处理。那里的其他命令将被忽略;和 !help 该 block 之外的命令也将被忽略。此外,这还将(错误地)处理诸如“要查看机器人可以做什么,请键入 !help” 等消息。

for line in temp:
line=string.rstrip(line)
line=string.split(line)

您正在迭代其余的行,并修改它们。之后,您将更改丢弃。修改 line 不会更改 temp 列表中的值。

if(line[0]=="PING"):
s.send("PONG %s\r\n" % line[1])

line 将是一行的单个字符串。因此访问 [0],即第一个字符,永远不会等于一个包含四个字符的字符串。


因此,要解决此问题,您应该清理消息解析。您应该始终将新读取的文本附加到同一个缓冲区。当您处理一行时,只需从该缓冲区中获取一行(第一行)并进行处理。并真正分别处理每一行。像这样:

buffer = ''
while True:
buffer += s.recv(1024)

# are there completed lines we can parse?
if '\n' in buffer:
# only split once, keep the rest of the buffer
line, buffer = buffer.split('\n', 1)

# handle line
if line.startswith('PING'):
s.send('PONG {}\n'.format(line[5:]))
elif line.startswith('PRIVMSG'):
# this is an actual message; parse it, and handle the message
pass

最后,根据我自己的经验,你真的不应该放弃这样的连接命令(NICKUSERJOIN那些)。当您过早发送它们时,许多服务器会忽略它们。而是先等待适当的响应,例如欢迎消息,告诉您服务器已准备好接收您的消息。

关于python - IRC bot 只接收 1/2 的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761786/

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