diff options
author | mathieui <mathieui@mathieui.net> | 2021-01-30 18:17:12 +0100 |
---|---|---|
committer | mathieui <mathieui@mathieui.net> | 2021-01-30 18:17:12 +0100 |
commit | 04a3f609e2b1fe7ae0ecaa2e1b251c7fcead33b1 (patch) | |
tree | 570373c61978e56847c27436c9ad8a9e75c3bf47 | |
parent | 119f59ecbe91f79c1fe42887d24720fc70f506d0 (diff) | |
download | slixmpp-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.py | 26 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0405/stanza.py | 18 |
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) |