3 from sleekxmpp.exceptions import IqError, IqTimeout
5 from xml.etree import cElementTree as ET
7 class OMFClient(sleekxmpp.ClientXMPP):
8 def __init__(self, jid, password):
9 sleekxmpp.ClientXMPP.__init__(self, jid, password)
11 self._registered = False
14 self.register_plugin('xep_0077') # In-band registration
15 self.register_plugin('xep_0030')
16 self.register_plugin('xep_0059')
17 self.register_plugin('xep_0060') # PubSub
19 self.add_event_handler("session_start", self.start)
20 self.add_event_handler("register", self.register)
26 def start(self, event):
29 self._server = "pubsub.%s" % self.boundjid.domain
31 def register(self, iq):
33 logging.info("%s already registered!" % self.boundjid)
38 resp['register']['username'] = self.boundjid.user
39 resp['register']['password'] = self.password
43 logging.info("Account created for %s!" % self.boundjid)
44 self._registered = True
46 logging.error("Could not register account: %s" %
47 e.iq['error']['text'])
49 logging.error("No response from server.")
53 self.plugin['xep_0077'].cancel_registration(
54 ifrom=self.boundjid.full)
55 logging.info("Account unregistered for %s!" % self.boundjid)
57 logging.error("Could not unregister account: %s" %
58 e.iq['error']['text'])
60 logging.error("No response from server.")
64 result = self['xep_0060'].get_nodes(self._server)
65 for item in result['disco_items']['items']:
66 print(' - %s' % str(item))
69 print traceback.format_exc()
70 logging.error('Could not retrieve node list.')
72 def suscriptions(self):
74 result = self['xep_0060'].get_subscriptions(self._server)
76 for node in result['node']:
77 print(' - %s' % str(node))
80 print traceback.format_exc()
81 logging.error('Could not retrieve suscriptions.')
84 def create(self, node):
85 config = self['xep_0004'].makeForm('submit')
86 config.add_field(var='pubsub#node_type', value='leaf')
87 config.add_field(var='pubsub#notify_retract', value='0')
88 config.add_field(var='pubsub#publish_model', value='open')
89 config.add_field(var='pubsub#persist_items', value='1')
90 config.add_field(var='pubsub#max_items', value='1')
91 config.add_field(var='pubsub#title', value=node)
94 self['xep_0060'].create_node(self._server, node, config = config)
96 print traceback.format_exc()
97 logging.error('Could not create node: %s' % node)
99 def delete(self, node):
101 self['xep_0060'].delete_node(self._server, node)
102 print('Deleted node: %s' % node)
104 print traceback.format_exc()
105 logging.error('Could not delete node: %s' % node)
108 def publish(self, data, node):
110 result = self['xep_0060'].publish(self._server,node,payload=data)
111 id = result['pubsub']['publish']['item']['id']
112 #print('Published at item id: %s' % id)
114 print traceback.format_exc()
115 logging.error('Could not publish to: %s' % self.boundjid)
119 result = self['xep_0060'].get_item(self._server, self.boundjid,
121 for item in result['pubsub']['items']['substanzas']:
122 print('Retrieved item %s: %s' % (item['id'], tostring(item['payload'])))
124 print traceback.format_exc()
125 logging.error('Could not retrieve item %s from node %s' % (data, self.boundjid))
127 def retract(self, data):
129 result = self['xep_0060'].retract(self._server, self.boundjid, data)
130 print('Retracted item %s from node %s' % (data, self.boundjid))
132 print traceback.format_exc()
133 logging.error('Could not retract item %s from node %s' % (data, self.boundjid))
137 result = self['xep_0060'].purge(self._server, self.boundjid)
138 print('Purged all items from node %s' % self.boundjid)
140 print traceback.format_exc()
141 logging.error('Could not purge items from node %s' % self.boundjid)
143 def subscribe(self, node):
145 result = self['xep_0060'].subscribe(self._server, node)
146 print('Subscribed %s to node %s' % (self.boundjid.bare, self.boundjid))
148 print traceback.format_exc()
149 logging.error('Could not subscribe %s to node %s' % (self.boundjid.bare, node))
151 def unsubscribe(self, node):
153 result = self['xep_0060'].unsubscribe(self._server, node)
154 print('Unsubscribed %s from node %s' % (self.boundjid.bare, node))
156 print traceback.format_exc()
157 logging.error('Could not unsubscribe %s from node %s' % (self.boundjid.bare, node))