Найти - Пользователи
Полная версия: [PyQt] и XMPP (xmpppy) Thread не рвёт сессию
Начало » GUI » [PyQt] и XMPP (xmpppy) Thread не рвёт сессию
1
necrozyablo
Вот решил прикрутить к своему GUI возможность посылать логи по xmpp ну и принимать удалённо команды.

Вот есть обычный рабочий код для работы с 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()
Собственно этот код нормально работает если послать команду ‘exit’ то будет выполнятся
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() не помогло…
Но как только я завершаю работу программы мой бот сразу исчезает из листа.
Даже не знаю куда копать чтобы понять в чём дело…
Krieger
По-видимому сервер еще считает вас активным, вы не передаете ему станзу о том что отключились.

presence = xmpp.Presence(typ = 'unavailable')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB