163 lines
4.4 KiB
Python
163 lines
4.4 KiB
Python
"""
|
|
Slixmpp: The Slick XMPP Library
|
|
Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout
|
|
This file is part of Slixmpp.
|
|
|
|
See the file LICENSE for copying permissio
|
|
"""
|
|
|
|
import datetime as dt
|
|
|
|
from slixmpp.jid import JID
|
|
from slixmpp.xmlstream import ElementBase, ET
|
|
from slixmpp.plugins import xep_0082, xep_0004
|
|
|
|
|
|
class MAM(ElementBase):
|
|
name = 'query'
|
|
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):
|
|
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)
|
|
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):
|
|
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)
|
|
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):
|
|
fields = self.__get_fields()
|
|
field = fields.get('with')
|
|
if field:
|
|
return JID(field['value'])
|
|
|
|
def set_with(self, 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.
|
|
|
|
def get_results(self):
|
|
return self._results
|
|
|
|
def set_results(self, values):
|
|
self._results = values
|
|
|
|
def del_results(self):
|
|
self._results = []
|
|
|
|
|
|
class Preferences(ElementBase):
|
|
name = 'prefs'
|
|
namespace = 'urn:xmpp:mam:2'
|
|
plugin_attrib = 'mam_prefs'
|
|
interfaces = {'default', 'always', 'never'}
|
|
sub_interfaces = {'always', 'never'}
|
|
|
|
def get_always(self):
|
|
results = set()
|
|
|
|
jids = self.xml.findall('{%s}always/{%s}jid' % (
|
|
self.namespace, self.namespace))
|
|
|
|
for jid in jids:
|
|
results.add(JID(jid.text))
|
|
|
|
return results
|
|
|
|
def set_always(self, value):
|
|
self._set_sub_text('always', '', keep=True)
|
|
always = self.xml.find('{%s}always' % self.namespace)
|
|
always.clear()
|
|
|
|
if not isinstance(value, (list, set)):
|
|
value = [value]
|
|
|
|
for jid in value:
|
|
jid_xml = ET.Element('{%s}jid' % self.namespace)
|
|
jid_xml.text = str(jid)
|
|
always.append(jid_xml)
|
|
|
|
def get_never(self):
|
|
results = set()
|
|
|
|
jids = self.xml.findall('{%s}never/{%s}jid' % (
|
|
self.namespace, self.namespace))
|
|
|
|
for jid in jids:
|
|
results.add(JID(jid.text))
|
|
|
|
return results
|
|
|
|
def set_never(self, value):
|
|
self._set_sub_text('never', '', keep=True)
|
|
never = self.xml.find('{%s}never' % self.namespace)
|
|
never.clear()
|
|
|
|
if not isinstance(value, (list, set)):
|
|
value = [value]
|
|
|
|
for jid in value:
|
|
jid_xml = ET.Element('{%s}jid' % self.namespace)
|
|
jid_xml.text = str(jid)
|
|
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:2'
|
|
plugin_attrib = 'mam_result'
|
|
interfaces = {'queryid', 'id'}
|