2012-01-05 16:31:54 +00:00
|
|
|
SleekXMPP
|
|
|
|
#########
|
|
|
|
|
|
|
|
.. sidebar:: 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.
|
|
|
|
|
|
|
|
**Latest Stable Release**
|
2012-01-18 23:31:45 +00:00
|
|
|
- `1.0 <http://github.com/fritzy/SleekXMPP/zipball/1.0>`_
|
2012-01-05 16:31:54 +00:00
|
|
|
|
|
|
|
**Develop Releases**
|
|
|
|
- `Latest Develop Version <http://github.com/fritzy/SleekXMPP/zipball/develop>`_
|
|
|
|
|
|
|
|
|
|
|
|
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>`_
|
|
|
|
|
|
|
|
|
|
|
|
SleekXMPP is an :ref:`MIT licensed <license>` 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.
|
|
|
|
|
2012-01-18 23:31:45 +00:00
|
|
|
Here's your first SleekXMPP Bot:
|
|
|
|
--------------------------------
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
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.session_start)
|
|
|
|
self.add_event_handler("message", self.message)
|
|
|
|
|
|
|
|
# If you wanted more functionality, here's how to register plugins:
|
|
|
|
# self.register_plugin('xep_0030') # Service Discovery
|
|
|
|
# self.register_plugin('xep_0199') # XMPP Ping
|
|
|
|
|
|
|
|
# Here's how to access plugins once you've registered them:
|
|
|
|
# self['xep_0030'].add_feature('echo_demo')
|
|
|
|
|
|
|
|
# If you are working with an OpenFire server, you will
|
|
|
|
# need to use a different SSL version:
|
|
|
|
# import ssl
|
|
|
|
# self.ssl_version = ssl.PROTOCOL_SSLv3
|
|
|
|
|
|
|
|
def session_start(self, event):
|
|
|
|
self.send_presence()
|
|
|
|
self.get_roster()
|
|
|
|
|
|
|
|
# Most get_*/set_* 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.connect()
|
|
|
|
xmpp.process(block=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-01-05 16:31:54 +00:00
|
|
|
Getting Started (with Examples)
|
|
|
|
-------------------------------
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 1
|
|
|
|
|
|
|
|
getting_started/echobot
|
|
|
|
getting_started/sendlogout
|
|
|
|
getting_started/component
|
|
|
|
getting_started/presence
|
|
|
|
getting_started/muc
|
|
|
|
getting_started/proxy
|
|
|
|
getting_started/scheduler
|
|
|
|
getting_started/iq
|
|
|
|
|
|
|
|
|
|
|
|
Tutorials, FAQs, and How To Guides
|
|
|
|
----------------------------------
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 1
|
|
|
|
|
|
|
|
faq
|
|
|
|
xeps
|
|
|
|
xmpp_tdg
|
|
|
|
howto/stanzas
|
|
|
|
create_plugin
|
|
|
|
features
|
|
|
|
sasl
|
|
|
|
handlersmatchers
|
|
|
|
|
|
|
|
Plugin Guides
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 1
|
|
|
|
|
|
|
|
guide_xep_0030
|
|
|
|
|
|
|
|
SleekXMPP Architecture and Design
|
|
|
|
---------------------------------
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 3
|
|
|
|
|
|
|
|
architecture
|
|
|
|
plugin_arch
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 2
|
|
|
|
|
|
|
|
event_index
|
|
|
|
api/clientxmpp
|
|
|
|
api/componentxmpp
|
|
|
|
api/basexmpp
|
|
|
|
api/exceptions
|
|
|
|
api/xmlstream/jid
|
|
|
|
api/xmlstream/stanzabase
|
|
|
|
api/xmlstream/handler
|
|
|
|
api/xmlstream/matcher
|
|
|
|
api/xmlstream/xmlstream
|
|
|
|
api/xmlstream/scheduler
|
|
|
|
api/xmlstream/tostring
|
|
|
|
api/xmlstream/filesocket
|
|
|
|
|
|
|
|
Core Stanzas
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 2
|
|
|
|
|
|
|
|
api/stanza/rootstanza
|
|
|
|
api/stanza/message
|
|
|
|
api/stanza/presence
|
|
|
|
api/stanza/iq
|
|
|
|
api/stanza/error
|
|
|
|
api/stanza/stream_error
|
|
|
|
|
|
|
|
Plugins
|
|
|
|
~~~~~~~
|
|
|
|
.. toctree::
|
|
|
|
:maxdepth: 2
|
|
|
|
|
|
|
|
|
|
|
|
Additional Info
|
|
|
|
---------------
|
|
|
|
.. toctree::
|
|
|
|
:hidden:
|
|
|
|
|
|
|
|
glossary
|
|
|
|
license
|
|
|
|
|
|
|
|
* :ref:`license`
|
|
|
|
* :ref:`glossary`
|
|
|
|
* :ref:`genindex`
|
|
|
|
* :ref:`modindex`
|
|
|
|
* :ref:`search`
|
|
|
|
|
|
|
|
Credits
|
|
|
|
-------
|
2012-01-18 23:31:45 +00:00
|
|
|
|
2012-01-05 17:28:30 +00:00
|
|
|
**Main Author:** `Nathan Fritz <http://andyet.net/team/fritzy>`_
|
2012-01-18 23:31:45 +00:00
|
|
|
`fritzy@netflint.net <xmpp:fritzy@netflint.net?message>`_,
|
|
|
|
`@fritzy <http://twitter.com/fritzy>`_
|
2012-01-05 16:31:54 +00:00
|
|
|
|
2012-01-18 23:31:45 +00:00
|
|
|
Nathan is also the author of XMPPHP and `Seesmic-AS3-XMPP
|
|
|
|
<http://code.google.com/p/seesmic-as3-xmpp/>`_, and a former member of the XMPP
|
|
|
|
Council.
|
2012-01-05 16:31:54 +00:00
|
|
|
|
2012-01-05 17:28:30 +00:00
|
|
|
**Co-Author:** `Lance Stout <http://andyet.net/team/lance>`_
|
2012-01-18 23:31:45 +00:00
|
|
|
`lancestout@gmail.com <xmpp:lancestout@gmail.com?message>`_,
|
|
|
|
`@lancestout <http://twitter.com/lancestout>`_
|
2012-01-05 16:31:54 +00:00
|
|
|
|
2012-01-05 17:28:30 +00:00
|
|
|
Both Fritzy and Lance work for `&yet <http://andyet.net>`_, which specializes in
|
2012-01-18 23:31:45 +00:00
|
|
|
realtime web and XMPP applications.
|
2012-01-05 17:28:30 +00:00
|
|
|
|
2012-01-18 23:31:45 +00:00
|
|
|
- `contact@andyet.net <mailto:contact@andyet.net>`_
|
|
|
|
- `XMPP Consulting <http://xmppconsulting.com>`_
|
|
|
|
|
2012-01-05 16:31:54 +00:00
|
|
|
**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>`_)
|
|
|
|
|