Итак... У меня есть простой чат-клиент:
class ChatClient(sleekxmpp.ClientXMPP):
def __init__(self, jid, password, server):
sleekxmpp.ClientXMPP.__init__(self, jid, password, ssl=True)
self.add_event_handler("session_start", self.start)
self.register_plugin('xep_0030')
self.register_plugin('xep_0004')
self.register_plugin('xep_0060')
self.register_plugin('xep_0199')
self.ssl_version = ssl.PROTOCOL_SSLv3
self.connected = self.connect()
if self.connected:
self.process(threaded=True)
def start(self, event):
self.send_presence(priority = "-9001")
self.get_roster(blocking = True, timeout = 3)
def message(self, targets, msg):
for target in targets:
self.send_message(target, msg)
и у меня есть функция «проверить», чтобы убедиться, что вы вводите свое имя пользователя/пароль:
def authenticate(username, password, server):
xmppuser = username + '@' + server
passTester = ChatClient(xmppuser, password)
passTester.disconnect(wait = True)
authenticated = passTester.authenticated
return authenticated
Теперь проблема возникает, когда у меня есть клиент чата как многопоточный, я сталкиваюсь с ситуацией, когда пытаюсь проверить ChatClient.authenticated до того, как сервер сможет фактически подключиться. Как видите, я попытался «подождать» отключения, но в очереди на отправку ничего нет, поэтому он сразу отключается.
Альтернатива, которую я пробовал, такова:
def authenticate(username, password, server):
xmppuser = username + '@' + server
passTester = ChatClient(xmppuser, password)
passTester.message('bogusName', 'ladfhkjdglkhjdfg')
passTester.disconnect(wait = True)
authenticated = passTester.authenticated
return authenticated
Теперь, когда я отправил фиктивное сообщение, вызову отключения нужно подождать. когда я ввожу правильное имя пользователя/пароль с этим кодом, отключение ожидает отправки сообщения (что включает в себя ожидание реального соединения), ничего не отправляет, а для ChatClient.authenticated установлено значение True!
К сожалению, когда я ввожу неправильное имя пользователя/пароль, сообщение никогда не отправляется, а разъединение (wait=True) никогда не отключается, поскольку сообщение никогда не отправляется.
Есть ли у кого-нибудь более правильный способ «аутентификации»?