diff options
author | mathieui <mathieui@mathieui.net> | 2020-12-08 18:59:04 +0100 |
---|---|---|
committer | mathieui <mathieui@mathieui.net> | 2020-12-08 18:59:04 +0100 |
commit | d37182804102682a715df43c48a6d874835cd71a (patch) | |
tree | e8bf12aebda1f723ca7c2c072e70466760c481f0 | |
parent | 8258202681b32fb7267562a9fe3a5af03eb17f50 (diff) | |
parent | b63dc3bc8cf16177a6e50a804681958a47497550 (diff) | |
download | slixmpp-d37182804102682a715df43c48a6d874835cd71a.tar.gz slixmpp-d37182804102682a715df43c48a6d874835cd71a.tar.bz2 slixmpp-d37182804102682a715df43c48a6d874835cd71a.tar.xz slixmpp-d37182804102682a715df43c48a6d874835cd71a.zip |
Merge branch 'rai' into 'master'
XEP-0437: Room Activity Indicators
See merge request poezio/slixmpp!83
-rw-r--r-- | doap.xml | 8 | ||||
-rw-r--r-- | slixmpp/plugins/__init__.py | 1 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0437/__init__.py | 11 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0437/rai.py | 67 | ||||
-rw-r--r-- | slixmpp/plugins/xep_0437/stanza.py | 47 | ||||
-rw-r--r-- | tests/test_stanza_xep_0437.py | 28 |
6 files changed, 162 insertions, 0 deletions
@@ -865,6 +865,14 @@ </implements> <implements> <xmpp:SupportedXep> + <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0437.html"/> + <xmpp:status>complete</xmpp:status> + <xmpp:version>0.2.0</xmpp:version> + <xmpp:since>NEXT</xmpp:since> + </xmpp:SupportedXep> + </implements> + <implements> + <xmpp:SupportedXep> <xmpp:xep rdf:resource="https://xmpp.org/extensions/xep-0439.html"/> <xmpp:status>complete</xmpp:status> <xmpp:version>0.1.0</xmpp:version> diff --git a/slixmpp/plugins/__init__.py b/slixmpp/plugins/__init__.py index f37fdcfb..a0159ad1 100644 --- a/slixmpp/plugins/__init__.py +++ b/slixmpp/plugins/__init__.py @@ -109,6 +109,7 @@ __all__ = [ 'xep_0424', # Message Retraction 'xep_0425', # Message Moderation 'xep_0428', # Message Fallback + 'xep_0437', # Room Activity Indicators 'xep_0439', # Quick Response 'xep_0444', # Message Reactions ] diff --git a/slixmpp/plugins/xep_0437/__init__.py b/slixmpp/plugins/xep_0437/__init__.py new file mode 100644 index 00000000..d84d18a1 --- /dev/null +++ b/slixmpp/plugins/xep_0437/__init__.py @@ -0,0 +1,11 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2020 Mathieu Pasquet + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" +from slixmpp.plugins.base import register_plugin +from slixmpp.plugins.xep_0437.rai import XEP_0437 + +register_plugin(XEP_0437) diff --git a/slixmpp/plugins/xep_0437/rai.py b/slixmpp/plugins/xep_0437/rai.py new file mode 100644 index 00000000..c3c4d325 --- /dev/null +++ b/slixmpp/plugins/xep_0437/rai.py @@ -0,0 +1,67 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2020 Mathieu Pasquet + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" +from typing import Iterable, Optional + +from slixmpp import JID +from slixmpp.plugins import BasePlugin +from slixmpp.stanza import Presence +from slixmpp.xmlstream.matcher import StanzaPath +from slixmpp.xmlstream.handler import Callback + +from slixmpp.plugins.xep_0437 import stanza + + +class XEP_0437(BasePlugin): + name = 'xep_0437' + description = 'XEP-0437: Room Activity Indicators' + stanza = stanza + namespace = stanza.NS + + def plugin_init(self): + stanza.register_plugins() + self.xmpp.register_handler(Callback( + 'RAI Received', + StanzaPath("presence/rai"), + self._handle_rai, + )) + self.xmpp.register_handler(Callback( + 'RAI Activity Received', + StanzaPath("presence/rai/activity"), + self._handle_rai_activity, + )) + + def plugin_end(self): + self.xmpp.remove_handler('RAI received') + self.xmpp.remove_handler('RAI Activity received') + + def _handle_rai(self, presence: Presence): + self.xmpp.event('room_activity_bare', presence) + + def _handle_rai_activity(self, presence: Presence): + self.xmpp.event('room_activity', presence) + + def subscribe(self, service: JID, *, + pfrom: Optional[JID] = None): + """ + Subscribe to room activty on a MUC service. + :param JID service: MUC service + """ + pres = self.xmpp.make_presence(pto=service, pfrom=pfrom) + pres.enable('rai') + pres.send() + + def unsubscribe(self, service: JID, *, + pfrom: Optional[JID] = None): + """ + Unsubscribe from room activty on a MUC service. + :param JID service: MUC service + """ + pres = self.xmpp.make_presence( + pto=service, pfrom=pfrom, ptype='unavailable', + ) + pres.send() diff --git a/slixmpp/plugins/xep_0437/stanza.py b/slixmpp/plugins/xep_0437/stanza.py new file mode 100644 index 00000000..cd3a2c84 --- /dev/null +++ b/slixmpp/plugins/xep_0437/stanza.py @@ -0,0 +1,47 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2020 Mathieu Pasquet + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" + +from typing import Iterable +from slixmpp import JID, Presence +from slixmpp.xmlstream import ( + ElementBase, + register_stanza_plugin, +) + +NS = 'urn:xmpp:rai:0' + +class RAI(ElementBase): + name = 'rai' + plugin_attrib = 'rai' + namespace = NS + interfaces = {'activities'} + + def get_activities(self) -> Iterable[JID]: + return [JID(el.xml.text) for el in self if isinstance(el, Activity)] + + def del_activities(self): + for el in self.xml.findall('{%s}activity' % NS): + self.xml.remove(el) + + def set_activities(self, activities: Iterable[JID]): + self.del_activities() + for jid in activities: + act = Activity() + act.xml.text = str(jid) + self.append(act) + + +class Activity(ElementBase): + name = 'activity' + plugin_attrib = 'activity' + namespace = NS + + +def register_plugins(): + register_stanza_plugin(RAI, Activity, iterable=True) + register_stanza_plugin(Presence, RAI) diff --git a/tests/test_stanza_xep_0437.py b/tests/test_stanza_xep_0437.py new file mode 100644 index 00000000..b210660b --- /dev/null +++ b/tests/test_stanza_xep_0437.py @@ -0,0 +1,28 @@ +import unittest +from slixmpp import Presence, JID +from slixmpp.test import SlixTest +from slixmpp.plugins.xep_0437 import stanza + + +class TestRAI(SlixTest): + + def setUp(self): + stanza.register_plugins() + + def testResponse(self): + presence = Presence() + presence['rai']['activities'] = [ + JID('toto@titi'), + JID('coucou@coucou'), + ] + self.check(presence, """ +<presence> + <rai xmlns="urn:xmpp:rai:0"> + <activity>toto@titi</activity> + <activity>coucou@coucou</activity> + </rai> +</presence> + """, use_values=False) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestRAI) |