From 04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1 Mon Sep 17 00:00:00 2001 From: mathieui Date: Sat, 30 Jan 2021 18:17:12 +0100 Subject: [PATCH] XEP-0405: Manage MIX Roster items --- slixmpp/plugins/xep_0405/mix_pam.py | 26 ++++++++++++++++++++++++++ slixmpp/plugins/xep_0405/stanza.py | 18 ++++++++++++++++++ 2 files changed, 44 insertions(+) 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)