gpt4 book ai didi

python - 我正在用 Python 创建一个以 Twitch 为中心的 IRC 机器人,但它得到响应的速度很慢。我究竟做错了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:21 26 4
gpt4 key购买 nike

正如标题所说,虽然这也是我第一次真正用Python来做大事。我还没有完全习惯这种语言,所以这可能是我遗漏的东西。代码相当短,如下所示,删除了用户名和私有(private)密码:

import re
import socket
import sys
import time
import string

HOST = "irc.twitch.tv"
PORT = 6667
NICK = ""
PASS = ""
CHAN = ""

RATE = (20/30) # messages per second
CHAT_MSG=re.compile(r"^:\w+!\w+@\w+\.tmi\.twitch\.tv PRIVMSG #\w+ :")

def chat(sock, msg):
sock.send("PRIVMSG #{} :{}".format(cfg.CHAN, msg))

public = socket.socket()
public.connect((HOST, PORT))
public.send("PASS {}\r\n".format(PASS).encode("utf-8"))
public.send("NICK {}\r\n".format(NICK).encode("utf-8"))
public.send("JOIN {}\r\n".format(CHAN).encode("utf-8"))

private = socket.socket()
private.connect((HOST, PORT))
private.send("PASS {}\r\n".format(PASS).encode("utf-8"))
private.send("NICK {}\r\n".format(NICK).encode("utf-8"))
private.send("CAP REQ :twitch.tv/tags twitch.tv/commands {}\r\n".format(CHAN).encode("utf-8"))

while True:
channelResponse = public.recv(1024).decode("utf-8")
privateResponse = private.recv(1024).decode("utf-8")

if privateResponse == "PING :tmi.twitch.tv\r\n":
private.send("PONG :tmi.twitch.tv\r\n".encode("utf-8"))
else:
privateResponseUsername = re.search(r"\w+", privateResponse).group(0) # return the entire match
privateResponseMessage = CHAT_MSG.sub("", privateResponse)
print(privateResponseUsername + ": " + privateResponseMessage)

if channelResponse == "PING :tmi.twitch.tv\r\n":
public.send("PONG :tmi.twitch.tv\r\n".encode("utf-8"))
else:
username = re.search(r"\w+", channelResponse).group(0) # return the entire match
message = CHAT_MSG.sub("", channelResponse)
print(username + ": " + message)
time.sleep(1 / RATE)

值得一提的是,我遵循了基本的模板样式,但它并没有涵盖在机器人中实现耳语 - 所以我不得不通过研究如何做到这一点来猜测,而且似乎是这样最推荐的方式是两种连接,一种用于公共(public),一种用于私有(private)。

最佳答案

当您构建代码时,在从 public 套接字获取某些内容之前,您无法从 private 套接字获取任何内容。如果 IRC 不偶尔发送 PING 消息,情况会更糟。

处理这个问题的方法是使用 select ,并给它你的两个套接字。一旦有可以读取的内容,select就会返回,并指示哪个套接字有可供读取的字节。

This answer有一些通用代码。您可能想要将其修改为如下所示:

while True:
# this will block until at least one socket is ready
ready_socks,_,_ = select.select([private, public], [], [])
if private in ready_socks:
privateResponse += private.recv()
if public in ready_socks:
channelResponse += public.recv()

# check privateResponse buffer, do stuff
# check channelResponse buffer, do stuff

还有一些其他事情您应该记住:

  1. 网络不必同时传送整个 IRC 消息,也不必一次传送一条消息。您可以获得“PI”、“NG :t”、“mi.twitch.tv”、“\r\n”作为单独的消息。因此,您应该在缓冲区中累积字节,然后当您至少收到一条完整消息时,对其进行处理,并将其从缓冲区中删除。
  2. UTF-8 字符可以跨越多个字节,并且可能会被网络分割。在确定可以处理整条消息之前,请勿解码 UTF-8。

关于python - 我正在用 Python 创建一个以 Twitch 为中心的 IRC 机器人,但它得到响应的速度很慢。我究竟做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37103325/

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