【发布时间】:2014-12-16 21:42:06
【问题描述】:
我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器以创建机器人。我已经听取了this thread 的建议,但我仍然需要帮助。
这是我正在使用的The TeamSpeak API。
在编辑之前,这是我的脚本中实际发生的事情的摘要(1 个连接):
- 它连接。
- 它检查频道 ID(以及它自己的客户端 ID)
- 它加入频道并开始阅读所有内容
- 如果有人说出特定命令,它会执行该命令然后断开连接。
我怎样才能让它不会断开连接?如何使脚本保持“等待”状态,以便在执行命令后继续读取?
我正在使用 Python 3.4.1。
我尝试学习线程,但要么我很笨,要么它不像我想象的那样工作。还有一个“bug”,一旦等待事件,如果我没有用命令触发任何东西,它会在 60 秒后断开连接。
#Librerias
import ts3
import threading
import datetime
from random import choice, sample
# Data needed #
USER = "thisisafakename"
PASS = "something"
HOST = "111.111.111.111"
PORT = 10011
SID = 1
class BotPrincipal:
def __init__(self, manejador=False):
self.ts3conn = ts3.query.TS3Connection(HOST, PORT)
self.ts3conn.login(client_login_name=USER, client_login_password=PASS)
self.ts3conn.use(sid=SID)
channelToJoin = Bot.GettingChannelID("TestingBot")
try: #Login with a client that is ok
self.ts3conn.clientupdate(client_nickname="The Reader Bot")
self.MyData = self.GettingMyData()
self.MoveUserToChannel(ChannelToJoin, Bot.MyData["client_id"])
self.suscribirEvento("textchannel", ChannelToJoin)
self.ts3conn.on_event = self.manejadorDeEventos
self.ts3conn.recv_in_thread()
except ts3.query.TS3QueryError: #Name already exists, 2nd client connect with this info
self.ts3conn.clientupdate(client_nickname="The Writer Bot")
self.MyData = self.GettingMyData()
self.MoveUserToChannel(ChannelToJoin, Bot.MyData["client_id"])
def __del__(self):
self.ts3conn.close()
def GettingMyData(self):
respuesta = self.ts3conn.whoami()
return respuesta.parsed[0]
def GettingChannelID(self, nombre):
respuesta = self.ts3conn.channelfind(pattern=ts3.escape.TS3Escape.unescape(nombre))
return respuesta.parsed[0]["cid"]
def MoveUserToChannel(self, idCanal, idUsuario, passCanal=None):
self.ts3conn.clientmove(cid=idCanal, clid=idUsuario, cpw=passCanal)
def suscribirEvento(self, tipoEvento, idCanal):
self.ts3conn.servernotifyregister(event=tipoEvento, id_=idCanal)
def SendTextToChannel(self, idCanal, mensajito="Error"):
self.ts3conn.sendtextmessage(targetmode=2, target=idCanal, msg=mensajito) #This works
print("test") #PROBLEM HERE This doesn't work. Why? the line above did work
def manejadorDeEventos(sender, event):
message = event.parsed[0]['msg']
if "test" in message: #This works
Bot.SendTextToChannel(ChannelToJoin, "This is a test") #This works
if __name__ == "__main__":
Bot = BotPrincipal()
threadprincipal = threading.Thread(target=Bot.__init__)
threadprincipal.start()
在使用 2 个机器人之前,我测试了在 SendTextToChannel 连接时启动它,它运行良好,允许我在将文本发送到频道后做任何我想做的事情。只有在 manejadorDeEventos 触发时才会发生使整个 python 代码停止的错误
编辑 1 - 试验线程。
我用线程把它搞砸了,得到了两个客户端同时连接的结果。不知何故,我认为其中一个正在阅读事件,另一个正在回答。该脚本不再自行关闭,这是一个胜利,但克隆连接看起来不太好。
编辑 2 - 更新代码和问题的实际状态。
我设法使双重连接工作或多或少“正常”,但如果房间内 60 秒内没有任何反应,它会断开连接。尝试使用 Threading.timer 但我无法使其工作。整个问题代码已经更新。
我想要一个答案,它可以帮助我从频道阅读和回答它,而无需为此连接第二个机器人(就像它实际上正在做的那样......)如果答案我会加分还可以帮助我理解一种简单的方法,即每 50 秒向服务器查询一次,这样它就不会断开连接。
【问题讨论】:
-
@Parker:这是更新的代码,有一个新问题,而不是重复。但是,对于 OP:值得尝试找出使这一点更清晰的方法,因为很多人都会立即做出反应。我不确定该怎么做,尤其是当英语不是您的第一语言时……也许常见问题解答有一些指导?
-
为了将来参考 OP,在本地 git 存储库中编写这样的代码确实是值得的,或者至少在对源代码进行重大修改之前备份源文件。我在项目中犯过非常类似的错误,例如这个错误,它们都随着备份/源管理而消失。
标签: python multithreading python-3.x