Source code for slixmpp.plugins.xep_0447.sfs

import logging
from datetime import datetime
from pathlib import Path
from typing import Iterable, Literal

from slixmpp.plugins import BasePlugin
from slixmpp.stanza import Message
from slixmpp.xmlstream import register_stanza_plugin

from . import stanza

log = logging.getLogger(__name__)


[docs] class XEP_0447(BasePlugin): """ XEP-0447: Stateless File Sharing Only support outgoing SFS, incoming is not handled at all. """ name = "xep_0447" description = "XEP-0447: Stateless File Sharing" dependencies = {"xep_0300", "xep_0446"} stanza = stanza def plugin_init(self): register_stanza_plugin(Message, stanza.StatelessFileSharing) register_stanza_plugin(stanza.StatelessFileSharing, stanza.Sources) register_stanza_plugin( stanza.StatelessFileSharing, self.xmpp["xep_0446"].stanza.File ) register_stanza_plugin(stanza.Sources, stanza.UrlData, iterable=True)
[docs] def get_sfs( self, path: Path, uris: Iterable[str] | None = None, media_type: str | None = None, desc: str | None = None, disposition: Literal["inline", "attachment"] | None = None ) -> stanza.StatelessFileSharing: """ Produce an SFS element from a file present locally. :param path: Path of the file. :param uris: Iterable on uris to that file. :param media_type: Media type of the file. :param desc: Description of the file. :param disposition: The content-disposition of the file. :returns: The SFS element. """ sfs = stanza.StatelessFileSharing() if disposition: sfs["disposition"] = disposition if uris is not None: for uri in uris: ref = stanza.UrlData() ref["target"] = uri sfs["sources"].append(ref) if media_type: sfs["file"]["media-type"] = media_type if desc: sfs["file"]["desc"] = desc sfs["file"]["name"] = path.name stat = path.stat() sfs["file"]["size"] = stat.st_size sfs["file"]["date"] = datetime.fromtimestamp(stat.st_mtime) h = self.xmpp.plugin["xep_0300"].compute_hash(path) h["value"] = h["value"].decode() sfs["file"].append(h) return sfs