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:
@@ -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:
|
||||
""""
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user