From 4cf1286332ab36455af63a9bf674be86a6ee9934 Mon Sep 17 00:00:00 2001 From: mathieui Date: Fri, 7 Feb 2025 22:12:19 +0100 Subject: [PATCH] XEP-0308: add utility functions to build and correct messages without needing to go into the xml schema details. --- slixmpp/plugins/xep_0308/correction.py | 54 +++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/slixmpp/plugins/xep_0308/correction.py b/slixmpp/plugins/xep_0308/correction.py index f3947dc7..1ea2c852 100644 --- a/slixmpp/plugins/xep_0308/correction.py +++ b/slixmpp/plugins/xep_0308/correction.py @@ -1,11 +1,12 @@ - # Slixmpp: The Slick XMPP Library # Copyright (C) 2012 Nathanael C. Fritz, Lance J.T. Stout # This file is part of Slixmpp. # See the file LICENSE for copying permissio import logging +from typing import Optional from slixmpp.stanza import Message +from slixmpp.jid import JID from slixmpp.xmlstream.handler import Callback from slixmpp.xmlstream.matcher import StanzaPath from slixmpp.xmlstream import register_stanza_plugin @@ -49,3 +50,54 @@ class XEP_0308(BasePlugin): def _handle_correction(self, msg: Message): self.xmpp.event('message_correction', msg) + + def build_correction(self, id_to_replace: str, mto: JID, + mfrom: Optional[JID] = None, mtype: str = 'chat', + mbody: str = '') -> Message: + """ + Build a corrected message. + + :param id_to_replace: The id of the original message. + :param mto: Recipient of the message, must be the same as the original + message. + :param mfrom: Sender of the message, must be the same as the original + message. + :param mtype: Type of the message, must be the send as the original + message. + :param mbody: The corrected message body. + """ + msg = self.xmpp.make_message( + mto=mto, + mfrom=mfrom, + mbody=mbody, + mtype=mtype + ) + msg['replace']['id'] = id_to_replace + return msg + + def correct_message(self, msg: Message, body: str) -> Message: + """ + Send a correction to an existing message. + + :param msg: The message that must be replaced. + :param body: The body to set in the correcting message. + :returns: The message that was sent. + """ + to_replace = msg['id'] + mto = msg['to'] + mfrom = msg['from'] + mtype = msg['type'] + if not to_replace: + raise ValueError('No available ID for replacing the message') + if not mto: + raise ValueError('No available recipient JID') + + new = self.build_correction( + id_to_replace=to_replace, + mto=mto, + mfrom=mfrom, + mtype=mtype, + mbody=body, + ) + new.send() + return new