diff options
author | mathieui <mathieui@mathieui.net> | 2021-01-31 12:48:44 +0100 |
---|---|---|
committer | mathieui <mathieui@mathieui.net> | 2021-01-31 12:48:44 +0100 |
commit | 8689212602e29e28eb7cde000571fdbb7a437e2a (patch) | |
tree | 42443e8c82e608dfaedd6ddbfd5b11d17302c161 /slixmpp | |
parent | 68649d008932561f72429648a9e7f3cac15552ff (diff) | |
parent | f41fd7cce4c3cc49e6802cd16e38cd6f79f4bab0 (diff) | |
download | slixmpp-8689212602e29e28eb7cde000571fdbb7a437e2a.tar.gz slixmpp-8689212602e29e28eb7cde000571fdbb7a437e2a.tar.bz2 slixmpp-8689212602e29e28eb7cde000571fdbb7a437e2a.tar.xz slixmpp-8689212602e29e28eb7cde000571fdbb7a437e2a.zip |
Merge branch 'mix-additions' into 'master'
MIX additions: handle MIX-PAM with roster and new events
See merge request poezio/slixmpp!108
Diffstat (limited to 'slixmpp')
-rw-r--r-- | slixmpp/plugins/xep_0369/mix_core.py | 13 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0405/mix_pam.py | 26 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0405/stanza.py | 18 |
3 files changed, 57 insertions, 0 deletions
diff --git a/slixmpp/plugins/xep_0369/mix_core.py b/slixmpp/plugins/xep_0369/mix_core.py index 05b9b2fd..688d4e6a 100644 --- a/slixmpp/plugins/xep_0369/mix_core.py +++ b/slixmpp/plugins/xep_0369/mix_core.py @@ -72,9 +72,22 @@ class XEP_0369(BasePlugin): def session_bind(self, jid): self.xmpp.plugin['xep_0030'].add_feature(stanza.NS) + self.xmpp.plugin['xep_0060'].map_node_event( + 'urn:xmpp:mix:nodes:participants', + 'mix_participant_info', + ) + self.xmpp.plugin['xep_0060'].map_node_event( + 'urn:xmpp:mix:nodes:info', + 'mix_channel_info', + ) def plugin_end(self): self.xmpp.plugin['xep_0030'].del_feature(feature=stanza.NS) + node_map = self.xmpp.plugin['xep_0060'].node_event_map + if 'urn:xmpp:mix:nodes:info' in node_map: + del node_map['urn:xmpp:mix:nodes:info'] + if 'urn:xmpp:mix:nodes:participants' in node_map: + del node_map['urn:xmpp:mix:nodes:participants'] async def get_channel_info(self, channel: JID) -> InfoType: """" diff --git a/slixmpp/plugins/xep_0405/mix_pam.py b/slixmpp/plugins/xep_0405/mix_pam.py index d690ae3d..f8e5a9d9 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) |