diff options
Diffstat (limited to 'slixmpp/plugins/xep_0353/jingle_message.py')
-rw-r--r-- | slixmpp/plugins/xep_0353/jingle_message.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/slixmpp/plugins/xep_0353/jingle_message.py b/slixmpp/plugins/xep_0353/jingle_message.py new file mode 100644 index 00000000..07395241 --- /dev/null +++ b/slixmpp/plugins/xep_0353/jingle_message.py @@ -0,0 +1,101 @@ +""" + slixmpp: The Slick XMPP Library + Copyright (C) 2020 Emmanuel Gil Peyrot + This file is part of slixmpp. + + See the file LICENSE for copying permission. +""" + +import logging + +from typing import Iterable, Tuple, Optional + +from slixmpp import JID, Message +from slixmpp.plugins import BasePlugin +from slixmpp.xmlstream import register_stanza_plugin +from slixmpp.xmlstream.handler import Callback +from slixmpp.xmlstream.matcher import StanzaPath +from slixmpp.plugins.xep_0353 import stanza, Propose, Retract, Accept, Proceed, Reject + +log = logging.getLogger(__name__) + +class XEP_0353(BasePlugin): + + name = 'xep_0353' + description = 'XEP-0353: Jingle Message Initiation' + stanza = stanza + + def plugin_init(self): + register_stanza_plugin(Message, Propose) + register_stanza_plugin(Message, Retract) + register_stanza_plugin(Message, Accept) + register_stanza_plugin(Message, Proceed) + register_stanza_plugin(Message, Reject) + + self.xmpp.register_handler( + Callback('Indicating Intent to Start a Session', + StanzaPath('message/jingle_propose'), + self._handle_propose)) + self.xmpp.register_handler( + Callback('Disavowing Intent to Start a Session', + StanzaPath('message/jingle_retract'), + self._handle_retract)) + self.xmpp.register_handler( + Callback('Accepting Intent to Start a Session', + StanzaPath('message/jingle_accept'), + self._handle_accept)) + self.xmpp.register_handler( + Callback('Proceed', + StanzaPath('message/jingle_proceed'), + self._handle_accept)) + self.xmpp.register_handler( + Callback('Rejecting Intent to Start a Session', + StanzaPath('message/jingle_reject'), + self._handle_reject)) + + def session_bind(self, jid): + self.xmpp.plugin['xep_0030'].add_feature(stanza.JingleMessage.namespace) + + def plugin_end(self): + self.xmpp.plugin['xep_0030'].del_feature(feature=stanza.JingleMessage.namespace) + + def _handle_propose(self, message): + self.xmpp.event('jingle_message_propose', message) + + def _handle_retract(self, message): + self.xmpp.event('jingle_message_retract', message) + + def _handle_accept(self, message): + self.xmpp.event('jingle_message_accept', message) + + def _handle_proceed(self, message): + self.xmpp.event('jingle_message_proceed', message) + + def _handle_reject(self, message): + self.xmpp.event('jingle_message_reject', message) + + def propose(self, mto: JID, sid: str, descriptions: Iterable[Tuple[str, str]], *, mfrom: Optional[JID] = None): + msg = self.xmpp.make_message(mto, mfrom=mfrom) + msg['jingle_propose']['id'] = sid + msg['jingle_propose']['descriptions'] = descriptions + msg.send() + + def retract(self, mto: JID, sid: str, *, mfrom: Optional[JID] = None): + msg = self.xmpp.make_message(mto, mfrom=mfrom) + msg['jingle_retract']['id'] = sid + msg.send() + + def accept(self, mto: JID, sid: str, *, mfrom: Optional[JID] = None): + msg = self.xmpp.make_message(mto, mfrom=mfrom) + msg['jingle_accept']['id'] = sid + msg.send() + + def proceed(self, mto: JID, sid: str, *, mfrom: Optional[JID] = None): + msg = self.xmpp.make_message(mto, mfrom=mfrom) + msg['jingle_proceed']['id'] = sid + msg.send() + + def reject(self, mto: JID, sid: str, *, mfrom: Optional[JID] = None): + msg = self.xmpp.make_message(mto, mfrom=mfrom) + msg['jingle_reject']['id'] = sid + msg.send() |