Update the MAM plugin for asyncio & new namespace
And add an example
This commit is contained in:
@@ -36,35 +36,58 @@ class XEP_0313(BasePlugin):
|
||||
register_stanza_plugin(Iq, stanza.MAM)
|
||||
register_stanza_plugin(Iq, stanza.Preferences)
|
||||
register_stanza_plugin(Message, stanza.Result)
|
||||
register_stanza_plugin(Message, stanza.Archived, iterable=True)
|
||||
register_stanza_plugin(Iq, stanza.Fin)
|
||||
register_stanza_plugin(stanza.Result, self.xmpp['xep_0297'].stanza.Forwarded)
|
||||
register_stanza_plugin(stanza.MAM, self.xmpp['xep_0059'].stanza.Set)
|
||||
register_stanza_plugin(stanza.Fin, self.xmpp['xep_0059'].stanza.Set)
|
||||
|
||||
def retrieve(self, jid=None, start=None, end=None, with_jid=None, ifrom=None,
|
||||
timeout=None, callback=None, iterator=False):
|
||||
timeout=None, callback=None, iterator=False, rsm=None):
|
||||
iq = self.xmpp.Iq()
|
||||
query_id = iq['id']
|
||||
|
||||
iq['to'] = jid
|
||||
iq['from'] = ifrom
|
||||
iq['type'] = 'get'
|
||||
iq['type'] = 'set'
|
||||
iq['mam']['queryid'] = query_id
|
||||
iq['mam']['start'] = start
|
||||
iq['mam']['end'] = end
|
||||
iq['mam']['with'] = with_jid
|
||||
if rsm:
|
||||
for key, value in rsm.items():
|
||||
iq['mam']['rsm'][key] = str(value)
|
||||
|
||||
cb_data = {}
|
||||
def pre_cb(query):
|
||||
query['mam']['queryid'] = query['id']
|
||||
collector = Collector(
|
||||
'MAM_Results_%s' % query_id,
|
||||
StanzaPath('message/mam_result@queryid=%s' % query['id']))
|
||||
self.xmpp.register_handler(collector)
|
||||
cb_data['collector'] = collector
|
||||
|
||||
def post_cb(result):
|
||||
results = cb_data['collector'].stop()
|
||||
if result['type'] == 'result':
|
||||
result['mam']['results'] = results
|
||||
|
||||
if iterator:
|
||||
return self.xmpp['xep_0059'].iterate(iq, 'mam', 'results',
|
||||
recv_interface='mam_fin',
|
||||
pre_cb=pre_cb, post_cb=post_cb)
|
||||
|
||||
collector = Collector(
|
||||
'MAM_Results_%s' % query_id,
|
||||
StanzaPath('message/mam_result@queryid=%s' % query_id))
|
||||
self.xmpp.register_handler(collector)
|
||||
|
||||
if iterator:
|
||||
return self.xmpp['xep_0059'].iterate(iq, 'mam', 'results')
|
||||
def wrapped_cb(iq):
|
||||
results = collector.stop()
|
||||
if iq['type'] == 'result':
|
||||
iq['mam']['results'] = results
|
||||
callback(iq)
|
||||
if callback:
|
||||
callback(iq)
|
||||
|
||||
return iq.send(timeout=timeout, callback=wrapped_cb)
|
||||
|
||||
def set_preferences(self, jid=None, default=None, always=None, never=None,
|
||||
|
||||
@@ -10,44 +10,76 @@ import datetime as dt
|
||||
|
||||
from slixmpp.jid import JID
|
||||
from slixmpp.xmlstream import ElementBase, ET
|
||||
from slixmpp.plugins import xep_0082
|
||||
from slixmpp.plugins import xep_0082, xep_0004
|
||||
|
||||
|
||||
class MAM(ElementBase):
|
||||
name = 'query'
|
||||
namespace = 'urn:xmpp:mam:tmp'
|
||||
namespace = 'urn:xmpp:mam:2'
|
||||
plugin_attrib = 'mam'
|
||||
interfaces = {'queryid', 'start', 'end', 'with', 'results'}
|
||||
sub_interfaces = {'start', 'end', 'with'}
|
||||
|
||||
def setup(self, xml=None):
|
||||
ElementBase.setup(self, xml)
|
||||
self._form = xep_0004.stanza.Form()
|
||||
self._form['type'] = 'submit'
|
||||
field = self._form.add_field(var='FORM_TYPE', ftype='hidden',
|
||||
value='urn:xmpp:mam:2')
|
||||
self.append(self._form)
|
||||
self._results = []
|
||||
|
||||
def __get_fields(self):
|
||||
return self._form.get_fields()
|
||||
|
||||
def get_start(self):
|
||||
timestamp = self._get_sub_text('start')
|
||||
return xep_0082.parse(timestamp)
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('start')
|
||||
if field:
|
||||
return xep_0082.parse(field['value'])
|
||||
|
||||
def set_start(self, value):
|
||||
if isinstance(value, dt.datetime):
|
||||
value = xep_0082.format_datetime(value)
|
||||
self._set_sub_text('start', value)
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('start')
|
||||
if field:
|
||||
field['value'] = value
|
||||
else:
|
||||
field = self._form.add_field(var='start')
|
||||
field['value'] = value
|
||||
|
||||
def get_end(self):
|
||||
timestamp = self._get_sub_text('end')
|
||||
return xep_0082.parse(timestamp)
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('end')
|
||||
if field:
|
||||
return xep_0082.parse(field['value'])
|
||||
|
||||
def set_end(self, value):
|
||||
if isinstance(value, dt.datetime):
|
||||
value = xep_0082.format_datetime(value)
|
||||
self._set_sub_text('end', value)
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('end')
|
||||
if field:
|
||||
field['value'] = value
|
||||
else:
|
||||
field = self._form.add_field(var='end')
|
||||
field['value'] = value
|
||||
|
||||
def get_with(self):
|
||||
return JID(self._get_sub_text('with'))
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('with')
|
||||
if field:
|
||||
return JID(field['value'])
|
||||
|
||||
def set_with(self, value):
|
||||
self._set_sub_text('with', str(value))
|
||||
|
||||
fields = self.__get_fields()
|
||||
field = fields.get('with')
|
||||
if field:
|
||||
field['with'] = str(value)
|
||||
else:
|
||||
field = self._form.add_field(var='with')
|
||||
field['value'] = str(value)
|
||||
# The results interface is meant only as an easy
|
||||
# way to access the set of collected message responses
|
||||
# from the query.
|
||||
@@ -64,7 +96,7 @@ class MAM(ElementBase):
|
||||
|
||||
class Preferences(ElementBase):
|
||||
name = 'prefs'
|
||||
namespace = 'urn:xmpp:mam:tmp'
|
||||
namespace = 'urn:xmpp:mam:2'
|
||||
plugin_attrib = 'mam_prefs'
|
||||
interfaces = {'default', 'always', 'never'}
|
||||
sub_interfaces = {'always', 'never'}
|
||||
@@ -118,22 +150,13 @@ class Preferences(ElementBase):
|
||||
never.append(jid_xml)
|
||||
|
||||
|
||||
class Fin(ElementBase):
|
||||
name = 'fin'
|
||||
namespace = 'urn:xmpp:mam:2'
|
||||
plugin_attrib = 'mam_fin'
|
||||
|
||||
class Result(ElementBase):
|
||||
name = 'result'
|
||||
namespace = 'urn:xmpp:mam:tmp'
|
||||
namespace = 'urn:xmpp:mam:2'
|
||||
plugin_attrib = 'mam_result'
|
||||
interfaces = {'queryid', 'id'}
|
||||
|
||||
|
||||
class Archived(ElementBase):
|
||||
name = 'archived'
|
||||
namespace = 'urn:xmpp:mam:tmp'
|
||||
plugin_attrib = 'mam_archived'
|
||||
plugin_multi_attrib = 'mam_archives'
|
||||
interfaces = {'by', 'id'}
|
||||
|
||||
def get_by(self):
|
||||
return JID(self._get_attr('by'))
|
||||
|
||||
def set_by(self, value):
|
||||
return self._set_attr('by', str(value))
|
||||
|
||||
Reference in New Issue
Block a user