No description
Find a file
Lance Stout f92f96325a Make Iq exceptions more discoverable and simpler to use.
IqError and IqTimeout now extend XMPPError, so if you don't care
about the difference, you can use:

    try:
        self.do_something_with_iqs()
    except XMPPError:
        # Error? Timeout? I don't care!
        pass

If you do need to distinguish between timeouts and error replies,
you can still continue to use:

    try:
        self.do_somethin_with_iqs()
    except IqError as err:
        pass
    except IqTimeout:
        pass

If you don't catch any Iq errors and you're processing a stanza
then an error response will be sent, just like normal if you raise
XMPPError or any other exception, except that the error messages
will be generic to prevent leaking too much information.
2011-08-19 01:04:20 -07:00
conn_tests My hunch is that these should also be updated. 2011-01-23 02:08:29 +08:00
docs Add guide for sending a message and then disconnecting. 2011-08-17 21:21:37 -07:00
examples Update examples to work with Python3 (raw_input vs input) 2011-08-18 01:06:59 -07:00
sleekxmpp Make Iq exceptions more discoverable and simpler to use. 2011-08-19 01:04:20 -07:00
tests Add tests for setting a form's type to 'submit' or 'cancel'. 2011-08-13 01:28:18 -07:00
.gitignore Update .gitignore 2011-08-12 17:22:27 -07:00
ez_setup.py
INSTALL Updated the client and component examples. 2010-09-01 18:18:30 -04:00
LICENSE More documentation! 2011-08-13 20:58:53 -07:00
README.rst Update the README 2011-08-18 16:32:06 -07:00
setup.py Update README (renamed to README.rst so Github will render it) 2011-08-18 01:04:59 -07:00
testall.py capture SIGHUP and SIGTERM (windows) and disconnect; also testall no longer loads string26 with python3 2010-10-20 17:30:12 -07:00

SleekXMPP
#########

SleekXMPP is an MIT licensed XMPP library for Python 2.6/3.1+,
and is featured in examples in
`XMPP: The Definitive Guide <http://oreilly.com/catalog/9780596521271>`_ 
by Kevin Smith, Remko Tronçon, and Peter Saint-Andre. If you've arrived
here from reading the Definitive Guide, please see the notes on updating
the examples to the latest version of SleekXMPP.

SleekXMPP's design goals and philosphy are:

**Low number of dependencies**
    Installing and using SleekXMPP should be as simple as possible, without
    having to deal with long dependency chains.

    As part of reducing the number of dependencies, some third party
    modules are included with SleekXMPP in the ``thirdparty`` directory.
    Imports from this module first try to import an existing installed
    version before loading the packaged version, when possible.

**Every XEP as a plugin**
    Following Python's "batteries included" approach, the goal is to
    provide support for all currently active XEPs (final and draft). Since
    adding XEP support is done through easy to create plugins, the hope is
    to also provide a solid base for implementing and creating experimental
    XEPs.

**Rewarding to work with**
    As much as possible, SleekXMPP should allow things to "just work" using
    sensible defaults and appropriate abstractions. XML can be ugly to work
    with, but it doesn't have to be that way.


Get the Code
------------
.. code-block:: sh

    pip install sleekxmpp

The latest source code for SleekXMPP may be found on `Github
<http://github.com/fritzy/SleekXMPP>`_. Releases can be found in the
``master`` branch, while the latest development version is in the
``develop`` branch.

**Stable Releases**
    - `1.0 Beta6.1 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta6.1>`_  
    - `1.0 Beta5 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta5>`_
    - `1.0 Beta4 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta4>`_
    - `1.0 Beta3 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta3>`_
    - `1.0 Beta2 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta2>`_
    - `1.0 Beta1 <http://github.com/fritzy/SleekXMPP/zipball/1.0-Beta1>`_

**Develop Releases**
    - `Latest Develop Version <http://github.com/fritzy/SleekXMPP/zipball/develop>`_


Discussion
----------
A mailing list and XMPP chat room are available for discussing and getting
help with SleekXMPP.

**Mailing List**
    `SleekXMPP Discussion on Google Groups <http://groups.google.com/group/sleekxmpp-discussion>`_

**Chat**
    `sleek@conference.jabber.org <xmpp:sleek@conference.jabber.org?join>`_

Documentation and Testing
-------------------------

Documentation can be found both inline in the code, and as a Sphinx project in ``/docs``.
To generate the Sphinx documentation, follow the commands below. The HTML output will
be in ``docs/_build/html``::

    cd docs
    make html
    open _build/html/index.html

To run the test suite for SleekXMPP::

    python testall.py


The SleekXMPP Boilerplate
-------------------------

Projects using SleekXMPP tend to follow a basic pattern for setting up client/component
connections and configuration. Here is the gist of the boilerplate needed for a SleekXMPP
based project. See the documetation or examples directory for more detailed archetypes for
SleekXMPP projects::

    import logging

    from sleekxmpp import ClientXMPP
    from sleekxmpp.exceptions import IqError, IqTimeout


    class EchoBot(ClientXMPP):

        def __init__(self, jid, password):
            ClientXMPP.__init__(self, jid, password)

            self.add_event_handler("session_start", self.start)
            self.add_event_handler("message", self.message)

        def start(self, event):
            self.send_presence()

            # Most get_* methods from plugins use Iq stanzas, which
            # can generate IqError and IqTimeout exceptions
            try:
                self.get_roster()
            except IqError as err:
                logging.error('There was an error getting the roster')
                logging.error(err.iq['error']['condition'])
                self.disconnect()
            except IqTimeout:
                logging.error('Server is taking too long to respond')
                self.disconnect()

        def message(self, msg):
            if msg['type'] in ('chat', 'normal'):
                msg.reply("Thanks for sending\n%(body)s" % msg).send()


    if __name__ == '__main__':
        # Ideally use optparse or argparse to get JID, 
        # password, and log level.

        logging.basicConfig(level=logging.DEBUG,
                            format='%(levelname)-8s %(message)s')

        xmpp = EchoBot('somejid@example.com', 'use_getpass')
        xmpp.register_plugin('xep_0030') # Service Discovery
        xmpp.register_plugin('xep_0199') # XMPP Ping

        # If you are working with an OpenFire server, you will need
        # to useuterborg Larsson version:
        # xmppissl_version = ssl.PROTOCOL_SSLv3

        if xmpp.connect():
            xmpp.process(block=True)
        else:
            print("Unable to connect.")


Credits
-------
**Main Author:** Nathan Fritz
    `fritzy@netflint.net <xmpp:fritzy@netflint.net?message>`_, 
    `@fritzy <http://twitter.com/fritzy>`_

    Nathan is also the author of XMPPHP and `Seesmic-AS3-XMPP
    <http://code.google.com/p/seesmic-as3-xmpp/>`_, and a member of the XMPP
    Council.

**Co-Author:** Lance Stout
    `lancestout@gmail.com <xmpp:lancestout@gmail.com?message>`_, 
    `@lancestout <http://twitter.com/lancestout>`_

**Contributors:**
    - Brian Beggs (`macdiesel <http://github.com/macdiesel>`_)
    - Dann Martens (`dannmartens <http://github.com/dannmartens>`_)
    - Florent Le Coz (`louiz <http://github.com/louiz>`_)
    - Kevin Smith (`Kev <http://github.com/Kev>`_, http://kismith.co.uk)
    - Remko Tronçon (`remko <http://github.com/remko>`_, http://el-tramo.be)
    - Te-jé Rogers (`te-je <http://github.com/te-je>`_)
    - Thom Nichols (`tomstrummer <http://github.com/tomstrummer>`_)