Source code for slixmpp.plugins.xep_0441.stanza
# Slixmpp: The Slick XMPP Library
# Copyright (C) 2021 Mathieu Pasquet
# This file is part of Slixmpp.
# See the file LICENSE for copying permissio
from collections import abc
import logging
from typing import (
Iterable,
)
from slixmpp.jid import JID
from slixmpp.xmlstream import ElementBase, ET
log = logging.getLogger(__name__)
[docs]
class Preferences(ElementBase):
"""MAM Preferences payload.
.. code-block:: xml
<iq type='set' id='juliet3'>
<prefs xmlns='urn:xmpp:mam:2' default='roster'>
<always>
<jid>romeo@montague.lit</jid>
</always>
<never>
<jid>montague@montague.lit</jid>
</never>
</prefs>
</iq>
"""
name = 'prefs'
namespace = 'urn:xmpp:mam:2'
plugin_attrib = 'mam_prefs'
#: Available interfaces:
#:
#: - ``default``: Default MAM policy (must be one of 'roster', 'always',
#: 'never'
#: - ``always`` (``list[JID]``): list of JIDs to always store
#: conversations with.
#: - ``never`` (``list[JID]``): list of JIDs to never store
#: conversations with.
interfaces = {'default', 'always', 'never'}
sub_interfaces = {'always', 'never'}
[docs]
def get_always(self) -> set[JID]:
"""
Get a usable set of JIDs the server always stores conversations for.
"""
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
[docs]
def set_always(self, value: Iterable[JID]):
"""
Set the MAM policy to always archive for the specified JIDs.
:param value: List of JIDs.
"""
if not isinstance(value, abc.Iterable):
if isinstance(value, JID):
log.warning("Wrong type provided to set_always(): %s", value)
value = [value]
else:
raise ValueError(f'Wrong type for "value" ({value}).')
elif isinstance(value, str):
raise ValueError('Wrong type for "value" (str).')
self._set_sub_text('always', '', keep=True)
always = self.xml.find('{%s}always' % self.namespace)
if always is None:
raise ValueError("<always/> was not found, it should not happen")
always.clear()
for jid in value:
jid_xml = ET.Element('{%s}jid' % self.namespace)
jid_xml.text = str(jid)
always.append(jid_xml)
[docs]
def get_never(self) -> set[JID]:
"""
Get a usable set of JIDs the server never stores conversations for.
"""
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
[docs]
def set_never(self, value: Iterable[JID]):
"""
Set the MAM policy to never archive for the specified JIDs.
:param value: List of JIDs.
"""
if not isinstance(value, abc.Iterable):
if isinstance(value, JID):
log.warning("Wrong type provided to set_never(): %s", value)
value = [value]
else:
raise ValueError(f'Wrong type for "value" ({value}).')
elif isinstance(value, str):
raise ValueError('Wrong type for "value" (str).')
self._set_sub_text('never', '', keep=True)
never = self.xml.find('{%s}never' % self.namespace)
never.clear()
for jid in value:
jid_xml = ET.Element('{%s}jid' % self.namespace)
jid_xml.text = str(jid)
never.append(jid_xml)