.. _differences:

Differences from SleekXMPP
==========================

**Python 3.7+ only**
    slixmpp will work on python 3.7 and above. It may work with previous
    versions but we provide no guarantees.

**Stanza copies**
    The same stanza object is given through all the handlers; a handler that
    edits the stanza object should make its own copy.

**Replies**
    Because stanzas are not copied anymore,
    :meth:`Stanza.reply() <.StanzaBase.reply>` calls
    (for :class:`IQs <.Iq>`, :class:`Messages <.Message>`, etc)
    now return a new object instead of editing the stanza object
    in-place.

**Block and threaded arguments**
    All the functions that had a ``threaded=`` or ``block=`` argument
    do not have it anymore. Also, :meth:`.Iq.send` **does not block
    anymore**.

**Coroutine facilities**
    **See** :ref:`using_asyncio`

    If an event handler is a coroutine, it will be called asynchronously
    in the event loop instead of inside the event caller.

    A CoroutineCallback class has been added to create coroutine stream
    handlers, which will be also handled in the event loop.

    The :class:`~.slixmpp.stanza.Iq` object’s :meth:`~.slixmpp.stanza.Iq.send`
    method now **always** return a :class:`~.asyncio.Future` which result will be set
    to the IQ reply when it is received, or to ``None`` if the IQ is not of
    type ``get`` or ``set``.

    Many plugins (WIP) calls which retrieve information also return the same
    future.

**Architectural differences**
    slixmpp does not have an event queue anymore, and instead processes
    handlers directly after receiving the XML stanza.

.. note::
    If you find something that doesn’t work but should, please report it.