Mercurial > libervia-backend
changeset 4115:0da563780ffc
plugin XEP-0167, XEP-0353: handle ringing:
- add a `jingle_preflight_info` method in the Jingle Application model to handle this kind
of information
- XEP-0353 is calling `jingle_preflight_info` when a `ringing` message is received
- XEP-0167 use this information to send a `ringing` info to frontends
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 16 Aug 2023 18:33:28 +0200 |
parents | 79ec7d7beef3 |
children | 23fa52acf72c |
files | libervia/backend/plugins/plugin_xep_0166/models.py libervia/backend/plugins/plugin_xep_0167/__init__.py libervia/backend/plugins/plugin_xep_0234.py libervia/backend/plugins/plugin_xep_0353.py |
diffstat | 4 files changed, 57 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libervia/backend/plugins/plugin_xep_0166/models.py Wed Aug 16 18:28:32 2023 +0200 +++ b/libervia/backend/plugins/plugin_xep_0166/models.py Wed Aug 16 18:33:28 2023 +0200 @@ -44,6 +44,20 @@ pass @abc.abstractmethod + async def jingle_preflight_info( + self, + client: SatXMPPEntity, + session: dict, + info_type: str, + info_data: dict|None = None + ) -> None: + """Called when we have new information during preflight + + Notably used by XEP-0353 to signal ringing + """ + pass + + @abc.abstractmethod async def jingle_preflight_cancel( self, client: SatXMPPEntity,
--- a/libervia/backend/plugins/plugin_xep_0167/__init__.py Wed Aug 16 18:28:32 2023 +0200 +++ b/libervia/backend/plugins/plugin_xep_0167/__init__.py Wed Aug 16 18:33:28 2023 +0200 @@ -387,6 +387,24 @@ if not accepted: raise exceptions.CancelError("User declined the incoming call.") + async def jingle_preflight_info( + self, + client: SatXMPPEntity, + session: dict, + info_type: str, + info_data: dict|None = None + ) -> None: + if info_type == "ringing": + if not session.get("ringing", False): + self.host.bridge.call_info( + session["id"], "ringing", "", client.profile + ) + # we indicate that the ringing has started, to avoid sending several times + # the signal + session["ringing"] = True + else: + log.warning(f"Unknown preflight info type: {info_type!r}") + async def jingle_preflight_cancel( self, client: SatXMPPEntity,
--- a/libervia/backend/plugins/plugin_xep_0234.py Wed Aug 16 18:28:32 2023 +0200 +++ b/libervia/backend/plugins/plugin_xep_0234.py Wed Aug 16 18:33:28 2023 +0200 @@ -464,6 +464,15 @@ session["file_accepted"] = True return accepted + async def jingle_preflight_info( + self, + client: SatXMPPEntity, + session: dict, + info_type: str, + info_data: dict|None = None + ) -> None: + pass + async def jingle_preflight_cancel( self, client: SatXMPPEntity,
--- a/libervia/backend/plugins/plugin_xep_0353.py Wed Aug 16 18:28:32 2023 +0200 +++ b/libervia/backend/plugins/plugin_xep_0353.py Wed Aug 16 18:33:28 2023 +0200 @@ -29,7 +29,6 @@ from libervia.backend.core.core_types import SatXMPPEntity from libervia.backend.core.i18n import D_, _ from libervia.backend.core.log import getLogger -from libervia.backend.tools import xml_tools log = getLogger(__name__) @@ -215,6 +214,8 @@ return self._handle_accept(client, message_elt, elt) elif elt.name == "reject": return self._handle_reject(client, message_elt, elt) + elif elt.name == "ringing": + return await self._handle_ringing(client, message_elt, elt) else: log.warning(f"invalid element: {elt.toXml}") return True @@ -367,6 +368,20 @@ response_d.errback(RejectException(reason, text)) return False + async def _handle_ringing(self, client, message_elt, ringing_elt): + session_id = ringing_elt["id"] + try: + session = self._j.get_session(client, session_id) + except exceptions.NotFound: + log.warning(f"Session {session_id!r} unknown, ignoring ringing.") + return False + for __, content_data in session["contents"].items(): + await content_data["application"].handler.jingle_preflight_info( + client, session, "ringing", None + ) + + return False + @implementer(iwokkel.IDisco) class Handler(xmlstream.XMPPHandler):