Merge branch 'mix-additions' into 'master'

MIX additions: handle MIX-PAM with roster and new events

See merge request poezio/slixmpp!108
This commit is contained in:
mathieui
2021-01-31 12:48:44 +01:00
4 changed files with 219 additions and 0 deletions

View File

@@ -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:
""""

View File

@@ -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)

View File

@@ -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)