Fix the pubsub_client example.

This commit is contained in:
Emmanuel Gil Peyrot 2015-08-08 15:45:54 +01:00 committed by Florent Le Coz
parent 1b4187fa56
commit a721084f6e

View File

@ -5,20 +5,16 @@ import logging
from getpass import getpass from getpass import getpass
from argparse import ArgumentParser from argparse import ArgumentParser
import asyncio
import slixmpp import slixmpp
from slixmpp.exceptions import XMPPError
from slixmpp.xmlstream import ET, tostring from slixmpp.xmlstream import ET, tostring
from slixmpp.xmlstream.asyncio import asyncio
def make_callback():
future = asyncio.Future()
def callback(result):
future.set_result(result)
return future, callback
class PubsubClient(slixmpp.ClientXMPP): class PubsubClient(slixmpp.ClientXMPP):
def __init__(self, jid, password, server, def __init__(self, jid, password, server,
node=None, action='list', data=''): node=None, action='nodes', data=''):
super(PubsubClient, self).__init__(jid, password) super(PubsubClient, self).__init__(jid, password)
self.register_plugin('xep_0030') self.register_plugin('xep_0030')
@ -36,87 +32,83 @@ class PubsubClient(slixmpp.ClientXMPP):
self.add_event_handler('session_start', self.start) self.add_event_handler('session_start', self.start)
@asyncio.coroutine
def start(self, event): def start(self, event):
self.get_roster() self.get_roster()
self.send_presence() self.send_presence()
try: try:
getattr(self, self.action)() yield from getattr(self, self.action)()
except: except:
logging.error('Could not execute: %s' % self.action) logging.error('Could not execute: %s', self.action)
self.disconnect() self.disconnect()
def nodes(self): def nodes(self):
future, callback = make_callback()
try: try:
self['xep_0060'].get_nodes(self.pubsub_server, self.node, callback=callback) result = yield from self['xep_0060'].get_nodes(self.pubsub_server, self.node)
result = yield from future
for item in result['disco_items']['items']: for item in result['disco_items']['items']:
print(' - %s' % str(item)) logging.info(' - %s', str(item))
except: except XMPPError as error:
logging.error('Could not retrieve node list.') logging.error('Could not retrieve node list: %s', error.format())
def create(self): def create(self):
try: try:
self['xep_0060'].create_node(self.pubsub_server, self.node) yield from self['xep_0060'].create_node(self.pubsub_server, self.node)
except: logging.info('Created node %s', self.node)
logging.error('Could not create node: %s' % self.node) except XMPPError as error:
logging.error('Could not create node %s: %s', self.node, error.format())
def delete(self): def delete(self):
try: try:
self['xep_0060'].delete_node(self.pubsub_server, self.node) yield from self['xep_0060'].delete_node(self.pubsub_server, self.node)
print('Deleted node: %s' % self.node) logging.info('Deleted node %s', self.node)
except: except XMPPError as error:
logging.error('Could not delete node: %s' % self.node) logging.error('Could not delete node %s: %s', self.node, error.format())
def publish(self): def publish(self):
payload = ET.fromstring("<test xmlns='test'>%s</test>" % self.data) payload = ET.fromstring("<test xmlns='test'>%s</test>" % self.data)
future, callback = make_callback()
try: try:
self['xep_0060'].publish(self.pubsub_server, self.node, payload=payload, callback=callback) result = yield from self['xep_0060'].publish(self.pubsub_server, self.node, payload=payload)
result = yield from future logging.info('Published at item id: %s', result['pubsub']['publish']['item']['id'])
id = result['pubsub']['publish']['item']['id'] except XMPPError as error:
print('Published at item id: %s' % id) logging.error('Could not publish to %s: %s', self.node, error.format())
except:
logging.error('Could not publish to: %s' % self.node)
def get(self): def get(self):
future, callback = make_callback()
try: try:
self['xep_0060'].get_item(self.pubsub_server, self.node, self.data, callback=callback) result = yield from self['xep_0060'].get_item(self.pubsub_server, self.node, self.data)
result = yield from future
for item in result['pubsub']['items']['substanzas']: for item in result['pubsub']['items']['substanzas']:
print('Retrieved item %s: %s' % (item['id'], tostring(item['payload']))) logging.info('Retrieved item %s: %s', item['id'], tostring(item['payload']))
except: except XMPPError as error:
logging.error('Could not retrieve item %s from node %s' % (self.data, self.node)) logging.error('Could not retrieve item %s from node %s: %s', self.data, self.node, error.format())
def retract(self): def retract(self):
try: try:
self['xep_0060'].retract(self.pubsub_server, self.node, self.data) yield from self['xep_0060'].retract(self.pubsub_server, self.node, self.data)
print('Retracted item %s from node %s' % (self.data, self.node)) logging.info('Retracted item %s from node %s', self.data, self.node)
except: except XMPPError as error:
logging.error('Could not retract item %s from node %s' % (self.data, self.node)) logging.error('Could not retract item %s from node %s: %s', self.data, self.node, error.format())
def purge(self): def purge(self):
try: try:
self['xep_0060'].purge(self.pubsub_server, self.node) yield from self['xep_0060'].purge(self.pubsub_server, self.node)
print('Purged all items from node %s' % self.node) logging.info('Purged all items from node %s', self.node)
except: except XMPPError as error:
logging.error('Could not purge items from node %s' % self.node) logging.error('Could not purge items from node %s: %s', self.node, error.format())
def subscribe(self): def subscribe(self):
try: try:
self['xep_0060'].subscribe(self.pubsub_server, self.node) iq = yield from self['xep_0060'].subscribe(self.pubsub_server, self.node)
print('Subscribed %s to node %s' % (self.boundjid.bare, self.node)) subscription = iq['pubsub']['subscription']
except: logging.info('Subscribed %s to node %s', subscription['jid'], subscription['node'])
logging.error('Could not subscribe %s to node %s' % (self.boundjid.bare, self.node)) except XMPPError as error:
logging.error('Could not subscribe %s to node %s: %s', self.boundjid.bare, self.node, error.format())
def unsubscribe(self): def unsubscribe(self):
try: try:
self['xep_0060'].unsubscribe(self.pubsub_server, self.node) yield from self['xep_0060'].unsubscribe(self.pubsub_server, self.node)
print('Unsubscribed %s from node %s' % (self.boundjid.bare, self.node)) logging.info('Unsubscribed %s from node %s', self.boundjid.bare, self.node)
except: except XMPPError as error:
logging.error('Could not unsubscribe %s from node %s' % (self.boundjid.bare, self.node)) logging.error('Could not unsubscribe %s from node %s: %s', self.boundjid.bare, self.node, error.format())
@ -133,12 +125,12 @@ if __name__ == '__main__':
action="store_const", action="store_const",
dest="loglevel", dest="loglevel",
const=logging.ERROR, const=logging.ERROR,
default=logging.ERROR) default=logging.INFO)
parser.add_argument("-d","--debug", help="set logging to DEBUG", parser.add_argument("-d","--debug", help="set logging to DEBUG",
action="store_const", action="store_const",
dest="loglevel", dest="loglevel",
const=logging.DEBUG, const=logging.DEBUG,
default=logging.ERROR) default=logging.INFO)
# JID and password options. # JID and password options.
parser.add_argument("-j", "--jid", dest="jid", parser.add_argument("-j", "--jid", dest="jid",
@ -147,7 +139,7 @@ if __name__ == '__main__':
help="password to use") help="password to use")
parser.add_argument("server") parser.add_argument("server")
parser.add_argument("action", choice=["nodes", "create", "delete", "purge", "subscribe", "unsubscribe", "publish", "retract", "get"]) parser.add_argument("action", choices=["nodes", "create", "delete", "purge", "subscribe", "unsubscribe", "publish", "retract", "get"])
parser.add_argument("node", nargs='?') parser.add_argument("node", nargs='?')
parser.add_argument("data", nargs='?') parser.add_argument("data", nargs='?')