Вот есть обычный рабочий код для работы с xmpp
class JabberBot():
def __init__(self):
self.password='blablalba' # пароль для self.jid
self.jid='BLABLABLA@gmail.com' #c него посылаются
self.jid2='blablabla@gmail.com' #ему приходят
self.jid3='blablalba@gmail.com' #от него управляющие команды
jid=xmpp.protocol.JID(self.jid)
self.server = jid.getDomain()
self.user = jid.getNode()
def connect_jid(self):
self.conn = xmpp.Client(self.server, debug = [])
if (self.server=='gmail.com'):
print ('connect to google ', self.server)
conres = self.conn.connect(('talk.google.com',5223))
else:
conres = self.conn.connect()
if not conres:
print "Unable to connect to server %s!" % self.server
sys.exit(1)
if conres == 'tls':
print "We have TLS connection!"
elif conres == 'ssl':
print "We have SSL connection!"
else:
print "Warning: unable to estabilish secure connection - TLS & SSL failed!"
authres = self.conn.auth(self.user, self.password)
if not authres:
print "Unable to authorize on %s - check login/password." % self.server
sys.exit(1)
if authres <> 'sasl':
print """Warning: unable to perform SASL auth os %s.
Old authentication method used!""" % self.server
#устанавливаем статус
presence = xmpp.Presence(status = "Ready!", show ="chat", priority = '1')
self.conn.send(presence)
#return myclient
def send(self,text):
print text
mymsg=xmpp.protocol.Message(self.jid2,text, "chat")
self.conn.send(mymsg)
print mymsg
def message_handler(self, conn, message):
print "new message!"
if (re.findall(r'^('+self.jid3+r')/', str(message.getFrom()))):
command=str(message.getBody())
print "from: " + str(message.getFrom())
print "msg: " + str(message.getBody())
if (command=='exit'):
print 'exit'
try:
self.conn.disconnected()
except:
print 'errrrrr'
self.exit=1
else:
print 'msg not in trust'
def run(self):
self.connect_jid()
self.conn.RegisterHandler('message', self.message_handler)
while self.step_on(): pass
def step_on(self):
if (self.exit==1): return 0
try:
self.conn.Process(1)
print 1
except KeyboardInterrupt: return 0
return 1
bot = JabberBot()
bot.run()
if (command=='exit'):
print ‘exit’
try:
self.conn.disconnected()
except:
print ‘errrrrr’
self.exit=1
В принципе достаточно чисто self.exit и тогда всё выйдет, self.conn.disconnected() здесь так для избыточности.
Но вот как только я всё это засовываю в QtCore.QThread - делаю class JabberBot(QtCore.QThread):
Его я активирую как обычно через
self.jb = JabberBot(self)
self.jb.start()
Собсвтенно всё работает команды принимаются, сообщения отправляются. Но проблема в том что когда я посылаю exit сессия не закрывается. Т.е. в окне контактов мой jabberbot продолжает висеть. При этом видно что в “def step_on(self)” перестаёт принтится “ print 1”, да и если сделать
if self.jb.isRunning():
print ‘qqqq’
else:
print ‘zzzz’
Мне выдаёт ‘zzzz’, что говорит о завершении работа этого thread. Но при этом контакт в листе активен и ведь даже self.conn.disconnected() не помогло…
Но как только я завершаю работу программы мой бот сразу исчезает из листа.
Даже не знаю куда копать чтобы понять в чём дело…