From b50bfb2f34a3ace3a70b1647f54ad6a0e761acf7 Mon Sep 17 00:00:00 2001 From: mathieui Date: Sat, 13 Jul 2019 19:32:37 +0200 Subject: [PATCH] Initial commit for reactions protoxep --- slixmpp/plugins/__init__.py | 1 + .../plugins/protoxep_reactions/__init__.py | 11 ++++ .../plugins/protoxep_reactions/reactions.py | 54 +++++++++++++++++++ slixmpp/plugins/protoxep_reactions/stanza.py | 31 +++++++++++ 4 files changed, 97 insertions(+) create mode 100644 slixmpp/plugins/protoxep_reactions/__init__.py create mode 100644 slixmpp/plugins/protoxep_reactions/reactions.py create mode 100644 slixmpp/plugins/protoxep_reactions/stanza.py diff --git a/slixmpp/plugins/__init__.py b/slixmpp/plugins/__init__.py index d28cf281..f8ebe778 100644 --- a/slixmpp/plugins/__init__.py +++ b/slixmpp/plugins/__init__.py @@ -85,4 +85,5 @@ __all__ = [ 'xep_0323', # IoT Systems Sensor Data 'xep_0325', # IoT Systems Control 'xep_0332', # HTTP Over XMPP Transport + 'protoxep_reactions', # https://dino.im/xeps/reactions.html ] diff --git a/slixmpp/plugins/protoxep_reactions/__init__.py b/slixmpp/plugins/protoxep_reactions/__init__.py new file mode 100644 index 00000000..e107bd16 --- /dev/null +++ b/slixmpp/plugins/protoxep_reactions/__init__.py @@ -0,0 +1,11 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2019 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.protoxep_reactions.reactions import XEP_Reactions + +register_plugin(XEP_Reactions) diff --git a/slixmpp/plugins/protoxep_reactions/reactions.py b/slixmpp/plugins/protoxep_reactions/reactions.py new file mode 100644 index 00000000..e7af8fcb --- /dev/null +++ b/slixmpp/plugins/protoxep_reactions/reactions.py @@ -0,0 +1,54 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2019 Mathieu Pasquet + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" +from typing import Iterable + +from slixmpp.plugins import BasePlugin +from slixmpp.stanza import Message +from slixmpp.xmlstream import register_stanza_plugin +from slixmpp.xmlstream.matcher import MatchXMLMask +from slixmpp.xmlstream.handler import Callback + +from slixmpp.plugins.protoxep_reactions import stanza + + +class XEP_Reactions(BasePlugin): + name = 'protoxep_reactions' + description = 'XEP-XXXX: Message Reactions' + dependencies = {'xep_0030'} + stanza = stanza + + def plugin_init(self): + self.xmpp.register_handler( + Callback( + 'Reaction received', + MatchXMLMask(''), + self._handle_reactions, + ) + ) + self.xmpp['xep_0030'].add_feature('urn:xmpp:reactions:0') + register_stanza_plugin(Message, stanza.Reactions) + + def plugin_end(self): + self.xmpp.remove_handler('Reaction received') + self.xmpp['xep_0030'].remove_feature('urn:xmpp:reactions:0') + + def _handle_reactions(self, message: Message): + self.xmpp.event('reactions', message) + + @staticmethod + def set_reactions(message: Message, to_id: str, reactions: Iterable[str]): + """ + Add reactions to a Message object. + """ + reactions_stanza = stanza.Reactions() + reactions_stanza['to'] = to_id + for reaction in reactions: + reaction_stanza = stanza.Reaction() + reaction_stanza['value'] = reaction + reactions_stanza.append(reaction_stanza) + message.append(reactions_stanza) diff --git a/slixmpp/plugins/protoxep_reactions/stanza.py b/slixmpp/plugins/protoxep_reactions/stanza.py new file mode 100644 index 00000000..45414a37 --- /dev/null +++ b/slixmpp/plugins/protoxep_reactions/stanza.py @@ -0,0 +1,31 @@ +""" + Slixmpp: The Slick XMPP Library + Copyright (C) 2019 Mathieu Pasquet + This file is part of Slixmpp. + + See the file LICENSE for copying permission. +""" + +from slixmpp.xmlstream import ElementBase, register_stanza_plugin + + +class Reactions(ElementBase): + name = 'reactions' + plugin_attrib = 'reactions' + namespace = 'urn:xmpp:reactions:0' + interfaces = {'to'} + + +class Reaction(ElementBase): + name = 'reaction' + namespace = 'urn:xmpp:reactions:0' + interfaces = {'value'} + + def get_value(self) -> str: + return self.xml.text + + def set_value(self, value: str): + self.xml.text = value + + +register_stanza_plugin(Reactions, Reaction, iterable=True)