summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2021-01-30 18:17:12 +0100
committermathieui <mathieui@mathieui.net>2021-01-30 18:17:12 +0100
commit04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1 (patch)
tree570373c61978e56847c27436c9ad8a9e75c3bf47
parent119f59ecbe91f79c1fe42887d24720fc70f506d0 (diff)
downloadslixmpp-04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1.tar.gz
slixmpp-04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1.tar.bz2
slixmpp-04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1.tar.xz
slixmpp-04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1.zip
XEP-0405: Manage MIX Roster items
-rw-r--r--slixmpp/plugins/xep_0405/mix_pam.py26
-rw-r--r--slixmpp/plugins/xep_0405/stanza.py18
2 files changed, 44 insertions, 0 deletions
diff --git a/slixmpp/plugins/xep_0405/mix_pam.py b/slixmpp/plugins/xep_0405/mix_pam.py
index cff22b51..1158a6f9 100644
--- a/slixmpp/plugins/xep_0405/mix_pam.py
+++ b/slixmpp/plugins/xep_0405/mix_pam.py
@@ -6,13 +6,16 @@
See the file LICENSE for copying permission.
"""
from typing import (
+ List,
Optional,
Set,
+ Tuple,
)
from slixmpp import JID, Iq
from slixmpp.exceptions import IqError, IqTimeout
from slixmpp.plugins import BasePlugin
+from slixmpp.stanza.roster import RosterItem
from slixmpp.plugins.xep_0405 import stanza
from slixmpp.plugins.xep_0369 import stanza as mix_stanza
@@ -86,3 +89,26 @@ class XEP_0405(BasePlugin):
iq['client_leave']['channel'] = room
iq['client_leave'].enable('mix_leave')
return await iq.send(**iqkwargs)
+
+ async def get_mix_roster(self, *,
+ ito: Optional[JID] = None,
+ ifrom: Optional[JID] = None,
+ **iqkwargs) -> Tuple[List[RosterItem], List[RosterItem]]:
+ """
+ Get the annotated roster, with MIX channels.
+
+ :return: A tuple of (contacts, mix channels) as RosterItem elements
+ """
+ iq = self.xmpp.make_iq_get(ito=ito, ifrom=ifrom)
+ iq['roster'].enable('annotate')
+ result = await iq.send(**iqkwargs)
+ self.xmpp.event("roster_update", result)
+ contacts = []
+ mix = []
+ for item in result['roster']:
+ channel = item._get_plugin('channel', check=True)
+ if channel:
+ mix.append(item)
+ else:
+ contacts.append(item)
+ return (contacts, mix)
diff --git a/slixmpp/plugins/xep_0405/stanza.py b/slixmpp/plugins/xep_0405/stanza.py
index fe221bd6..58133d98 100644
--- a/slixmpp/plugins/xep_0405/stanza.py
+++ b/slixmpp/plugins/xep_0405/stanza.py
@@ -8,6 +8,7 @@
from slixmpp import JID
from slixmpp.stanza import Iq
+from slixmpp.stanza.roster import Roster, RosterItem
from slixmpp.xmlstream import (
ElementBase,
register_stanza_plugin,
@@ -19,6 +20,7 @@ from slixmpp.plugins.xep_0369.stanza import (
)
NS = 'urn:xmpp:mix:pam:2'
+NS_ROSTER = 'urn:xmpp:mix:roster:0'
class ClientJoin(ElementBase):
@@ -35,9 +37,25 @@ class ClientLeave(ElementBase):
interfaces = {'channel'}
+class Annotate(ElementBase):
+ namespace = NS_ROSTER
+ name = 'annotate'
+ plugin_attrib = 'annotate'
+
+
+class Channel(ElementBase):
+ namespace = NS_ROSTER
+ name = 'channel'
+ plugin_attrib = 'channel'
+ interfaces = {'participant-id'}
+
+
def register_plugins():
register_stanza_plugin(Iq, ClientJoin)
register_stanza_plugin(ClientJoin, Join)
register_stanza_plugin(Iq, ClientLeave)
register_stanza_plugin(ClientLeave, Leave)
+
+ register_stanza_plugin(Roster, Annotate)
+ register_stanza_plugin(RosterItem, Channel)