Compare commits
No commits in common. "master" and "sleek-1.0.0-beta5" have entirely different histories.
master
...
sleek-1.0.
17
.gitignore
vendored
17
.gitignore
vendored
@ -1,17 +1,2 @@
|
|||||||
*.py[co]
|
*.pyc
|
||||||
build/
|
build/
|
||||||
dist/
|
|
||||||
MANIFEST
|
|
||||||
docs/_build/
|
|
||||||
*.swp
|
|
||||||
.tox/
|
|
||||||
.coverage
|
|
||||||
slixmpp.egg-info/
|
|
||||||
.ropeproject/
|
|
||||||
4913
|
|
||||||
*~
|
|
||||||
.baboon/
|
|
||||||
.DS_STORE
|
|
||||||
.idea/
|
|
||||||
.vscode/
|
|
||||||
venv/
|
|
@ -1,22 +0,0 @@
|
|||||||
# .readthedocs.yaml
|
|
||||||
# Read the Docs configuration file
|
|
||||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
||||||
|
|
||||||
# Required
|
|
||||||
version: 2
|
|
||||||
|
|
||||||
# Set the version of Python and other tools you might need
|
|
||||||
build:
|
|
||||||
os: ubuntu-22.04
|
|
||||||
tools:
|
|
||||||
python: "3.11"
|
|
||||||
|
|
||||||
# Build documentation in the docs/ directory with Sphinx
|
|
||||||
sphinx:
|
|
||||||
configuration: docs/conf.py
|
|
||||||
|
|
||||||
# We recommend specifying your dependencies to enable reproducible builds:
|
|
||||||
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
|
||||||
python:
|
|
||||||
install:
|
|
||||||
- requirements: docs/requirements.txt
|
|
@ -1,9 +0,0 @@
|
|||||||
when:
|
|
||||||
event: [ push, pull_request ]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
mypy:
|
|
||||||
image: python:3
|
|
||||||
commands:
|
|
||||||
- pip3 install mypy types-setuptools
|
|
||||||
- mypy slixmpp
|
|
@ -1,23 +0,0 @@
|
|||||||
when:
|
|
||||||
event: [ push, pull_request ]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
test_integration:
|
|
||||||
image: "python:3.11"
|
|
||||||
environment:
|
|
||||||
CI_ACCOUNT1:
|
|
||||||
from_secret: ci_account1
|
|
||||||
CI_ACCOUNT1_PASSWORD:
|
|
||||||
from_secret: ci_account1_password
|
|
||||||
CI_ACCOUNT2:
|
|
||||||
from_secret: ci_account2
|
|
||||||
CI_ACCOUNT2_PASSWORD:
|
|
||||||
from_secret: ci_account2_password
|
|
||||||
CI_MUC_SERVER:
|
|
||||||
from_secret: ci_muc_server
|
|
||||||
commands:
|
|
||||||
- apt-get update
|
|
||||||
- apt-get install -y python3-pip cython3 gpg idn libidn-dev
|
|
||||||
- pip3 install emoji aiohttp aiodns
|
|
||||||
- python3 setup.py build_ext --inplace
|
|
||||||
- ./run_integration_tests.py
|
|
@ -1,19 +0,0 @@
|
|||||||
when:
|
|
||||||
event: [ push, pull_request ]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
unit_tests:
|
|
||||||
image: "python:${TAG}"
|
|
||||||
commands:
|
|
||||||
- apt-get update
|
|
||||||
- apt-get install -y python3 python3-pip cython3 gpg
|
|
||||||
- pip3 install emoji aiohttp cryptography setuptools
|
|
||||||
- ./run_tests.py
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
TAG:
|
|
||||||
- "3.9"
|
|
||||||
- "3.10"
|
|
||||||
- "3.11"
|
|
||||||
- "3.12"
|
|
||||||
- "3.13"
|
|
@ -1,14 +0,0 @@
|
|||||||
Contributing to the Slixmpp project
|
|
||||||
===================================
|
|
||||||
|
|
||||||
To contribute, the preferred way is to commit your changes on some
|
|
||||||
publicly-available git repository (on a fork `on github
|
|
||||||
<https://github.com/poezio/slixmpp>`_ or on your own repository) and to
|
|
||||||
notify the developers with either:
|
|
||||||
- a ticket `on the bug tracker <https://codeberg.org/poezio/slixmpp/issues/new>`_
|
|
||||||
- a pull request on github
|
|
||||||
- a simple message on `the XMPP MUC <xmpp:slixmpp@muc.poez.io>`_
|
|
||||||
|
|
||||||
Even though Slixmpp’s github repository is just a read-only mirror, we can
|
|
||||||
still be notified of the pull requests and fetch your mirror manually to
|
|
||||||
integrate your changes.
|
|
6
INSTALL
6
INSTALL
@ -1,7 +1,5 @@
|
|||||||
Pre-requisites:
|
Pre-requisites:
|
||||||
- Python 3.7+
|
- Python 3.1 or 2.6
|
||||||
- Cython 0.22 and libidn, optionally (making JID faster by compiling the stringprep module)
|
|
||||||
- GnuPG, for testing
|
|
||||||
|
|
||||||
Install:
|
Install:
|
||||||
> python3 setup.py install
|
> python3 setup.py install
|
||||||
@ -11,4 +9,4 @@ Root install:
|
|||||||
|
|
||||||
To test:
|
To test:
|
||||||
> cd examples
|
> cd examples
|
||||||
> python3 echo_client.py -d -j [USER@example.com] -p [PASSWORD]
|
> python echo_client.py -v -j [USER@example.com] -p [PASSWORD]
|
||||||
|
122
LICENSE
122
LICENSE
@ -17,125 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Licenses of Bundled Third Party Code
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
dateutil - Extensions to the standard python 2.3+ datetime module.
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Copyright (c) 2003-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>
|
|
||||||
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
* Neither the name of the copyright holder nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
||||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
|
|
||||||
fixed_datetime
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Copyright (c) 2008, Red Innovation Ltd., Finland
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
* Neither the name of Red Innovation nor the names of its contributors
|
|
||||||
may be used to endorse or promote products derived from this software
|
|
||||||
without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY RED INNOVATION ``AS IS'' AND ANY
|
|
||||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL RED INNOVATION BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUELTA – A PURE-PYTHON SASL CLIENT LIBRARY
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
This software is subject to "The MIT License"
|
|
||||||
|
|
||||||
Copyright 2004-2013 David Alan Cridland
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
|
|
||||||
python-gnupg: A Python wrapper for the GNU Privacy Guard
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
Copyright (c) 2008-2012 by Vinay Sajip.
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
* The name(s) of the copyright holder(s) may not be used to endorse or
|
|
||||||
promote products derived from this software without specific prior
|
|
||||||
written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) "AS IS" AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
||||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
include README.rst
|
|
||||||
include LICENSE
|
|
||||||
include run_tests.py
|
|
||||||
include slixmpp/stringprep.pyx
|
|
||||||
recursive-include docs Makefile *.bat *.py *.rst *.css *.ttf *.png
|
|
||||||
recursive-include examples *.py
|
|
||||||
recursive-include tests *.py
|
|
47
README
Normal file
47
README
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
SleekXMPP is an XMPP library written for Python 3.1+ (with 2.6 compatibility).
|
||||||
|
Hosted at http://wiki.github.com/fritzy/SleekXMPP/
|
||||||
|
|
||||||
|
Featured in examples in XMPP: The Definitive Guide by Kevin Smith, Remko Tronçon, and Peter Saint-Andre
|
||||||
|
If you're coming here from The Definitive Guide, please read http://wiki.github.com/fritzy/SleekXMPP/xmpp-the-definitive-guide
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
We try to keep requirements to a minimum, but we suggest that you install http://dnspython.org although it isn't strictly required.
|
||||||
|
If you do not install this library, you may need to specify the server/port for services that use SRV records (like GTalk).
|
||||||
|
"sudo pip install dnspython" on a *nix system with pip installed.
|
||||||
|
|
||||||
|
SleekXMPP has several design goals/philosophies:
|
||||||
|
- Low number of dependencies.
|
||||||
|
- Every XEP as a plugin.
|
||||||
|
- Rewarding to work with.
|
||||||
|
|
||||||
|
The goals for 1.0 include (and we're getting close):
|
||||||
|
- Nearly Full test coverage of stanzas.
|
||||||
|
- Wide range of functional tests.
|
||||||
|
- Stanza objects for all interaction with the stream
|
||||||
|
- Documentation on using and extending SleekXMPP.
|
||||||
|
- Complete documentation on all implemented stanza objects
|
||||||
|
- Documentation on all examples used in XMPP: The Definitive Guide
|
||||||
|
|
||||||
|
1.1 will include:
|
||||||
|
- More functional and unit tests
|
||||||
|
- PEP-8 compliance
|
||||||
|
- XEP-225 support
|
||||||
|
|
||||||
|
Since 0.2, here's the Changelog:
|
||||||
|
- MANY bugfixes
|
||||||
|
- Re-implementation of handlers/threading to greatly simplify and remove bugs (no more spawning threads in handlers)
|
||||||
|
- Stanza objects for jabber:client and all implemented XEPs
|
||||||
|
- Raising XMPPError for jabber:client and extended errors in handlers
|
||||||
|
- Robust error handling and better insurance of iq responses
|
||||||
|
- Stanza objects have made life a lot easier!
|
||||||
|
- Massive audit/cleanup.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
----------------
|
||||||
|
Main Author: Nathan Fritz fritz@netflint.net
|
||||||
|
Contributors: Kevin Smith & Lance Stout
|
||||||
|
Patches: Remko Tronçon
|
||||||
|
|
||||||
|
Feel free to add fritzy@netflint.net to your roster for direct support and comments.
|
||||||
|
Join sleekxmpp-discussion@googlegroups.com / http://groups.google.com/group/sleekxmpp-discussion for email discussion.
|
||||||
|
Join sleek@conference.jabber.org for groupchat discussion.
|
155
README.rst
155
README.rst
@ -1,155 +0,0 @@
|
|||||||
Slixmpp
|
|
||||||
#########
|
|
||||||
|
|
||||||
Slixmpp is an MIT licensed XMPP library for Python 3.7+. It is a fork of
|
|
||||||
SleekXMPP.
|
|
||||||
|
|
||||||
Slixmpp's goals is to only rewrite the core of the library (the low level
|
|
||||||
socket handling, the timers, the events dispatching) in order to remove all
|
|
||||||
threads.
|
|
||||||
|
|
||||||
Building
|
|
||||||
--------
|
|
||||||
|
|
||||||
Slixmpp can make use of cython to improve performance on critical modules.
|
|
||||||
To do that, **cython3** is necessary along with **libidn** headers.
|
|
||||||
Otherwise, no compilation is needed. Building is done by running setup.py::
|
|
||||||
|
|
||||||
python3 setup.py build_ext --inplace
|
|
||||||
|
|
||||||
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 Slixmpp::
|
|
||||||
|
|
||||||
python run_tests.py
|
|
||||||
|
|
||||||
Integration tests require the following environment variables to be set:::
|
|
||||||
|
|
||||||
$CI_ACCOUNT1
|
|
||||||
$CI_ACCOUNT1_PASSWORD
|
|
||||||
$CI_ACCOUNT2
|
|
||||||
$CI_ACCOUNT2_PASSWORD
|
|
||||||
$CI_MUC_SERVER
|
|
||||||
|
|
||||||
where the account variables are JIDs of valid, existing accounts, and
|
|
||||||
the passwords are the account passwords. The MUC server must allow room
|
|
||||||
creation from those JIDs.
|
|
||||||
|
|
||||||
To run the integration test suite for Slixmpp::
|
|
||||||
|
|
||||||
python run_integration_tests.py
|
|
||||||
|
|
||||||
The Slixmpp Boilerplate
|
|
||||||
-------------------------
|
|
||||||
Projects using Slixmpp tend to follow a basic pattern for setting up client/component
|
|
||||||
connections and configuration. Here is the gist of the boilerplate needed for a Slixmpp
|
|
||||||
based project. See the documentation or examples directory for more detailed archetypes for
|
|
||||||
Slixmpp projects::
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from slixmpp import ClientXMPP
|
|
||||||
from slixmpp.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(forever=True)
|
|
||||||
|
|
||||||
|
|
||||||
Slixmpp Credits
|
|
||||||
---------------
|
|
||||||
|
|
||||||
**Maintainers:**
|
|
||||||
- Florent Le Coz (`louiz@louiz.org <xmpp:louiz@louiz.org?message>`_),
|
|
||||||
- Mathieu Pasquet (`mathieui@mathieui.net <xmpp:mathieui@mathieui.net?message>`_),
|
|
||||||
|
|
||||||
**Contributors:**
|
|
||||||
- Emmanuel Gil Peyrot (`Link mauve <xmpp:linkmauve@linkmauve.fr?message>`_)
|
|
||||||
- Sam Whited (`Sam Whited <mailto:sam@samwhited.com>`_)
|
|
||||||
- Dan Sully (`Dan Sully <mailto:daniel@electricalrain.com>`_)
|
|
||||||
- Gasper Zejn (`Gasper Zejn <mailto:zejn@kiberpipa.org>`_)
|
|
||||||
- Krzysztof Kotlenga (`Krzysztof Kotlenga <mailto:pocek@users.sf.net>`_)
|
|
||||||
- Tsukasa Hiiragi (`Tsukasa Hiiragi <mailto:bakalolka@gmail.com>`_)
|
|
||||||
- Maxime Buquet (`pep <xmpp:pep@bouah.net?message>`_)
|
|
||||||
|
|
||||||
Credits (SleekXMPP)
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
**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 former 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>`_)
|
|
171
conn_tests/test_pubsubjobs.py
Normal file
171
conn_tests/test_pubsubjobs.py
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
import logging
|
||||||
|
import sleekxmpp
|
||||||
|
from optparse import OptionParser
|
||||||
|
from xml.etree import cElementTree as ET
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import sleekxmpp.plugins.xep_0004
|
||||||
|
from sleekxmpp.xmlstream.matcher.stanzapath import StanzaPath
|
||||||
|
from sleekxmpp.xmlstream.handler.waiter import Waiter
|
||||||
|
try:
|
||||||
|
import configparser
|
||||||
|
except ImportError:
|
||||||
|
import ConfigParser as configparser
|
||||||
|
try:
|
||||||
|
import queue
|
||||||
|
except ImportError:
|
||||||
|
import Queue as queue
|
||||||
|
|
||||||
|
class TestClient(sleekxmpp.ClientXMPP):
|
||||||
|
def __init__(self, jid, password):
|
||||||
|
sleekxmpp.ClientXMPP.__init__(self, jid, password)
|
||||||
|
self.add_event_handler("session_start", self.start)
|
||||||
|
#self.add_event_handler("message", self.message)
|
||||||
|
self.waitforstart = queue.Queue()
|
||||||
|
|
||||||
|
def start(self, event):
|
||||||
|
self.getRoster()
|
||||||
|
self.sendPresence()
|
||||||
|
self.waitforstart.put(True)
|
||||||
|
|
||||||
|
|
||||||
|
class TestPubsubServer(unittest.TestCase):
|
||||||
|
statev = {}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
unittest.TestCase.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test001getdefaultconfig(self):
|
||||||
|
"""Get the default node config"""
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode3')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode4')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode5')
|
||||||
|
result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost)
|
||||||
|
self.statev['defaultconfig'] = result
|
||||||
|
self.failUnless(isinstance(result, sleekxmpp.plugins.xep_0004.Form))
|
||||||
|
|
||||||
|
def test002createdefaultnode(self):
|
||||||
|
"""Create a node without config"""
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode1'))
|
||||||
|
|
||||||
|
def test003deletenode(self):
|
||||||
|
"""Delete recently created node"""
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode1'))
|
||||||
|
|
||||||
|
def test004createnode(self):
|
||||||
|
"""Create a node with a config"""
|
||||||
|
self.statev['defaultconfig'].field['pubsub#access_model'].setValue('open')
|
||||||
|
self.statev['defaultconfig'].field['pubsub#notify_retract'].setValue(True)
|
||||||
|
self.statev['defaultconfig'].field['pubsub#persist_items'].setValue(True)
|
||||||
|
self.statev['defaultconfig'].field['pubsub#presence_based_delivery'].setValue(True)
|
||||||
|
p = self.xmpp2.Presence()
|
||||||
|
p['to'] = self.pshost
|
||||||
|
p.send()
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode2', self.statev['defaultconfig'], ntype='job'))
|
||||||
|
|
||||||
|
def test005reconfigure(self):
|
||||||
|
"""Retrieving node config and reconfiguring"""
|
||||||
|
nconfig = self.xmpp1['xep_0060'].getNodeConfig(self.pshost, 'testnode2')
|
||||||
|
self.failUnless(nconfig, "No configuration returned")
|
||||||
|
#print("\n%s ==\n %s" % (nconfig.getValues(), self.statev['defaultconfig'].getValues()))
|
||||||
|
self.failUnless(nconfig.getValues() == self.statev['defaultconfig'].getValues(), "Configuration does not match")
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].setNodeConfig(self.pshost, 'testnode2', nconfig))
|
||||||
|
|
||||||
|
def test006subscribetonode(self):
|
||||||
|
"""Subscribe to node from account 2"""
|
||||||
|
self.failUnless(self.xmpp2['xep_0060'].subscribe(self.pshost, "testnode2"))
|
||||||
|
|
||||||
|
def test007publishitem(self):
|
||||||
|
"""Publishing item"""
|
||||||
|
item = ET.Element('{http://netflint.net/protocol/test}test')
|
||||||
|
w = Waiter('wait publish', StanzaPath('message/pubsub_event/items'))
|
||||||
|
self.xmpp2.registerHandler(w)
|
||||||
|
#result = self.xmpp1['xep_0060'].setItem(self.pshost, "testnode2", (('test1', item),))
|
||||||
|
result = self.xmpp1['jobs'].createJob(self.pshost, "testnode2", 'test1', item)
|
||||||
|
msg = w.wait(5) # got to get a result in 5 seconds
|
||||||
|
self.failUnless(msg != False, "Account #2 did not get message event")
|
||||||
|
#result = self.xmpp1['xep_0060'].setItem(self.pshost, "testnode2", (('test2', item),))
|
||||||
|
result = self.xmpp1['jobs'].createJob(self.pshost, "testnode2", 'test2', item)
|
||||||
|
w = Waiter('wait publish2', StanzaPath('message/pubsub_event/items'))
|
||||||
|
self.xmpp2.registerHandler(w)
|
||||||
|
self.xmpp2['jobs'].claimJob(self.pshost, 'testnode2', 'test1')
|
||||||
|
msg = w.wait(5) # got to get a result in 5 seconds
|
||||||
|
self.xmpp2['jobs'].claimJob(self.pshost, 'testnode2', 'test2')
|
||||||
|
self.xmpp2['jobs'].finishJob(self.pshost, 'testnode2', 'test1')
|
||||||
|
self.xmpp2['jobs'].finishJob(self.pshost, 'testnode2', 'test2')
|
||||||
|
print result
|
||||||
|
#need to add check for update
|
||||||
|
|
||||||
|
def test900cleanup(self):
|
||||||
|
"Cleaning up"
|
||||||
|
#self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2'), "Could not delete test node.")
|
||||||
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
#parse command line arguements
|
||||||
|
optp = OptionParser()
|
||||||
|
optp.add_option('-q','--quiet', help='set logging to ERROR', action='store_const', dest='loglevel', const=logging.ERROR, default=logging.INFO)
|
||||||
|
optp.add_option('-d','--debug', help='set logging to DEBUG', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
|
||||||
|
optp.add_option('-v','--verbose', help='set logging to COMM', action='store_const', dest='loglevel', const=5, default=logging.INFO)
|
||||||
|
optp.add_option("-c","--config", dest="configfile", default="config.xml", help="set config file to use")
|
||||||
|
optp.add_option("-n","--nodenum", dest="nodenum", default="1", help="set node number to use")
|
||||||
|
optp.add_option("-p","--pubsub", dest="pubsub", default="1", help="set pubsub host to use")
|
||||||
|
opts,args = optp.parse_args()
|
||||||
|
|
||||||
|
logging.basicConfig(level=opts.loglevel, format='%(levelname)-8s %(message)s')
|
||||||
|
|
||||||
|
#load xml config
|
||||||
|
logging.info("Loading config file: %s" % opts.configfile)
|
||||||
|
config = configparser.RawConfigParser()
|
||||||
|
config.read(opts.configfile)
|
||||||
|
|
||||||
|
#init
|
||||||
|
logging.info("Account 1 is %s" % config.get('account1', 'jid'))
|
||||||
|
xmpp1 = TestClient(config.get('account1','jid'), config.get('account1','pass'))
|
||||||
|
logging.info("Account 2 is %s" % config.get('account2', 'jid'))
|
||||||
|
xmpp2 = TestClient(config.get('account2','jid'), config.get('account2','pass'))
|
||||||
|
|
||||||
|
xmpp1.registerPlugin('xep_0004')
|
||||||
|
xmpp1.registerPlugin('xep_0030')
|
||||||
|
xmpp1.registerPlugin('xep_0060')
|
||||||
|
xmpp1.registerPlugin('xep_0199')
|
||||||
|
xmpp1.registerPlugin('jobs')
|
||||||
|
xmpp2.registerPlugin('xep_0004')
|
||||||
|
xmpp2.registerPlugin('xep_0030')
|
||||||
|
xmpp2.registerPlugin('xep_0060')
|
||||||
|
xmpp2.registerPlugin('xep_0199')
|
||||||
|
xmpp2.registerPlugin('jobs')
|
||||||
|
|
||||||
|
if not config.get('account1', 'server'):
|
||||||
|
# we don't know the server, but the lib can probably figure it out
|
||||||
|
xmpp1.connect()
|
||||||
|
else:
|
||||||
|
xmpp1.connect((config.get('account1', 'server'), 5222))
|
||||||
|
xmpp1.process(threaded=True)
|
||||||
|
|
||||||
|
#init
|
||||||
|
if not config.get('account2', 'server'):
|
||||||
|
# we don't know the server, but the lib can probably figure it out
|
||||||
|
xmpp2.connect()
|
||||||
|
else:
|
||||||
|
xmpp2.connect((config.get('account2', 'server'), 5222))
|
||||||
|
xmpp2.process(threaded=True)
|
||||||
|
|
||||||
|
TestPubsubServer.xmpp1 = xmpp1
|
||||||
|
TestPubsubServer.xmpp2 = xmpp2
|
||||||
|
TestPubsubServer.pshost = config.get('settings', 'pubsub')
|
||||||
|
xmpp1.waitforstart.get(True)
|
||||||
|
xmpp2.waitforstart.get(True)
|
||||||
|
testsuite = unittest.TestLoader().loadTestsFromTestCase(TestPubsubServer)
|
||||||
|
|
||||||
|
alltests_suite = unittest.TestSuite([testsuite])
|
||||||
|
result = unittest.TextTestRunner(verbosity=2).run(alltests_suite)
|
||||||
|
xmpp1.disconnect()
|
||||||
|
xmpp2.disconnect()
|
233
conn_tests/test_pubsubserver.py
Normal file
233
conn_tests/test_pubsubserver.py
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
import logging
|
||||||
|
import sleekxmpp
|
||||||
|
from optparse import OptionParser
|
||||||
|
from xml.etree import cElementTree as ET
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import sleekxmpp.plugins.xep_0004
|
||||||
|
from sleekxmpp.xmlstream.matcher.stanzapath import StanzaPath
|
||||||
|
from sleekxmpp.xmlstream.handler.waiter import Waiter
|
||||||
|
try:
|
||||||
|
import configparser
|
||||||
|
except ImportError:
|
||||||
|
import ConfigParser as configparser
|
||||||
|
try:
|
||||||
|
import queue
|
||||||
|
except ImportError:
|
||||||
|
import Queue as queue
|
||||||
|
|
||||||
|
class TestClient(sleekxmpp.ClientXMPP):
|
||||||
|
def __init__(self, jid, password):
|
||||||
|
sleekxmpp.ClientXMPP.__init__(self, jid, password)
|
||||||
|
self.add_event_handler("session_start", self.start)
|
||||||
|
#self.add_event_handler("message", self.message)
|
||||||
|
self.waitforstart = queue.Queue()
|
||||||
|
|
||||||
|
def start(self, event):
|
||||||
|
self.getRoster()
|
||||||
|
self.sendPresence()
|
||||||
|
self.waitforstart.put(True)
|
||||||
|
|
||||||
|
|
||||||
|
class TestPubsubServer(unittest.TestCase):
|
||||||
|
statev = {}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
unittest.TestCase.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test001getdefaultconfig(self):
|
||||||
|
"""Get the default node config"""
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode3')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode4')
|
||||||
|
self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode5')
|
||||||
|
result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost)
|
||||||
|
self.statev['defaultconfig'] = result
|
||||||
|
self.failUnless(isinstance(result, sleekxmpp.plugins.xep_0004.Form))
|
||||||
|
|
||||||
|
def test002createdefaultnode(self):
|
||||||
|
"""Create a node without config"""
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode1'))
|
||||||
|
|
||||||
|
def test003deletenode(self):
|
||||||
|
"""Delete recently created node"""
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode1'))
|
||||||
|
|
||||||
|
def test004createnode(self):
|
||||||
|
"""Create a node with a config"""
|
||||||
|
self.statev['defaultconfig'].field['pubsub#access_model'].setValue('open')
|
||||||
|
self.statev['defaultconfig'].field['pubsub#notify_retract'].setValue(True)
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode2', self.statev['defaultconfig']))
|
||||||
|
|
||||||
|
def test005reconfigure(self):
|
||||||
|
"""Retrieving node config and reconfiguring"""
|
||||||
|
nconfig = self.xmpp1['xep_0060'].getNodeConfig(self.pshost, 'testnode2')
|
||||||
|
self.failUnless(nconfig, "No configuration returned")
|
||||||
|
#print("\n%s ==\n %s" % (nconfig.getValues(), self.statev['defaultconfig'].getValues()))
|
||||||
|
self.failUnless(nconfig.getValues() == self.statev['defaultconfig'].getValues(), "Configuration does not match")
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].setNodeConfig(self.pshost, 'testnode2', nconfig))
|
||||||
|
|
||||||
|
def test006subscribetonode(self):
|
||||||
|
"""Subscribe to node from account 2"""
|
||||||
|
self.failUnless(self.xmpp2['xep_0060'].subscribe(self.pshost, "testnode2"))
|
||||||
|
|
||||||
|
def test007publishitem(self):
|
||||||
|
"""Publishing item"""
|
||||||
|
item = ET.Element('{http://netflint.net/protocol/test}test')
|
||||||
|
w = Waiter('wait publish', StanzaPath('message/pubsub_event/items'))
|
||||||
|
self.xmpp2.registerHandler(w)
|
||||||
|
result = self.xmpp1['xep_0060'].setItem(self.pshost, "testnode2", (('test1', item),))
|
||||||
|
msg = w.wait(5) # got to get a result in 5 seconds
|
||||||
|
self.failUnless(msg != False, "Account #2 did not get message event")
|
||||||
|
self.failUnless(result)
|
||||||
|
#need to add check for update
|
||||||
|
|
||||||
|
def test008updateitem(self):
|
||||||
|
"""Updating item"""
|
||||||
|
item = ET.Element('{http://netflint.net/protocol/test}test', {'someattr': 'hi there'})
|
||||||
|
w = Waiter('wait publish', StanzaPath('message/pubsub_event/items'))
|
||||||
|
self.xmpp2.registerHandler(w)
|
||||||
|
result = self.xmpp1['xep_0060'].setItem(self.pshost, "testnode2", (('test1', item),))
|
||||||
|
msg = w.wait(5) # got to get a result in 5 seconds
|
||||||
|
self.failUnless(msg != False, "Account #2 did not get message event")
|
||||||
|
self.failUnless(result)
|
||||||
|
#need to add check for update
|
||||||
|
|
||||||
|
def test009deleteitem(self):
|
||||||
|
"""Deleting item"""
|
||||||
|
w = Waiter('wait retract', StanzaPath('message/pubsub_event/items@node=testnode2'))
|
||||||
|
self.xmpp2.registerHandler(w)
|
||||||
|
result = self.xmpp1['xep_0060'].deleteItem(self.pshost, "testnode2", "test1")
|
||||||
|
self.failUnless(result, "Got error when deleting item.")
|
||||||
|
msg = w.wait(1)
|
||||||
|
self.failUnless(msg != False, "Did not get retract notice.")
|
||||||
|
|
||||||
|
def test010unsubscribenode(self):
|
||||||
|
"Unsubscribing Account #2"
|
||||||
|
self.failUnless(self.xmpp2['xep_0060'].unsubscribe(self.pshost, "testnode2"), "Got error response when unsubscribing.")
|
||||||
|
|
||||||
|
def test011createcollectionnode(self):
|
||||||
|
"Create a collection node w/ Account #2"
|
||||||
|
self.failUnless(self.xmpp2['xep_0060'].create_node(self.pshost, "testnode3", self.statev['defaultconfig'], True), "Could not create collection node")
|
||||||
|
|
||||||
|
def test012subscribecollection(self):
|
||||||
|
"Subscribe Account #1 to collection"
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].subscribe(self.pshost, "testnode3"))
|
||||||
|
|
||||||
|
def test013assignnodetocollection(self):
|
||||||
|
"Assign node to collection"
|
||||||
|
self.failUnless(self.xmpp2['xep_0060'].addNodeToCollection(self.pshost, 'testnode2', 'testnode3'))
|
||||||
|
|
||||||
|
def test014publishcollection(self):
|
||||||
|
"""Publishing item to collection child"""
|
||||||
|
item = ET.Element('{http://netflint.net/protocol/test}test')
|
||||||
|
w = Waiter('wait publish2', StanzaPath('message/pubsub_event/items@node=testnode2'))
|
||||||
|
self.xmpp1.registerHandler(w)
|
||||||
|
result = self.xmpp2['xep_0060'].setItem(self.pshost, "testnode2", (('test2', item),))
|
||||||
|
msg = w.wait(5) # got to get a result in 5 seconds
|
||||||
|
self.failUnless(msg != False, "Account #1 did not get message event: perhaps node was advertised incorrectly?")
|
||||||
|
self.failUnless(result)
|
||||||
|
|
||||||
|
# def test016speedtest(self):
|
||||||
|
# "Uncached speed test"
|
||||||
|
# import time
|
||||||
|
# start = time.time()
|
||||||
|
# for y in range(0, 50000, 1000):
|
||||||
|
# start2 = time.time()
|
||||||
|
# for x in range(y, y+1000):
|
||||||
|
# self.failUnless(self.xmpp1['xep_0060'].subscribe(self.pshost, "testnode4", subscribee="testuser%s@whatever" % x))
|
||||||
|
# print time.time() - start2
|
||||||
|
# seconds = time.time() - start
|
||||||
|
# print "--", seconds
|
||||||
|
# print "---------"
|
||||||
|
# time.sleep(15)
|
||||||
|
# self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode4'), "Could not delete non-cached test node")
|
||||||
|
|
||||||
|
# def test015speedtest(self):
|
||||||
|
# "cached speed test"
|
||||||
|
# result = self.xmpp1['xep_0060'].getNodeConfig(self.pshost)
|
||||||
|
# self.statev['defaultconfig'] = result
|
||||||
|
# self.statev['defaultconfig'].field['pubsub#node_type'].setValue("leaf")
|
||||||
|
# self.statev['defaultconfig'].field['sleek#saveonchange'].setValue(True)
|
||||||
|
# self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode4', self.statev['defaultconfig']))
|
||||||
|
# self.statev['defaultconfig'].field['sleek#saveonchange'].setValue(False)
|
||||||
|
# self.failUnless(self.xmpp1['xep_0060'].create_node(self.pshost, 'testnode5', self.statev['defaultconfig']))
|
||||||
|
# start = time.time()
|
||||||
|
# for y in range(0, 50000, 1000):
|
||||||
|
# start2 = time.time()
|
||||||
|
# for x in range(y, y+1000):
|
||||||
|
# self.failUnless(self.xmpp1['xep_0060'].subscribe(self.pshost, "testnode5", subscribee="testuser%s@whatever" % x))
|
||||||
|
# print time.time() - start2
|
||||||
|
# seconds = time.time() - start
|
||||||
|
# print "--", seconds
|
||||||
|
|
||||||
|
def test900cleanup(self):
|
||||||
|
"Cleaning up"
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode2'), "Could not delete test node.")
|
||||||
|
self.failUnless(self.xmpp1['xep_0060'].deleteNode(self.pshost, 'testnode3'), "Could not delete collection node")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
#parse command line arguements
|
||||||
|
optp = OptionParser()
|
||||||
|
optp.add_option('-q','--quiet', help='set logging to ERROR', action='store_const', dest='loglevel', const=logging.ERROR, default=logging.INFO)
|
||||||
|
optp.add_option('-d','--debug', help='set logging to DEBUG', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
|
||||||
|
optp.add_option('-v','--verbose', help='set logging to COMM', action='store_const', dest='loglevel', const=5, default=logging.INFO)
|
||||||
|
optp.add_option("-c","--config", dest="configfile", default="config.xml", help="set config file to use")
|
||||||
|
optp.add_option("-n","--nodenum", dest="nodenum", default="1", help="set node number to use")
|
||||||
|
optp.add_option("-p","--pubsub", dest="pubsub", default="1", help="set pubsub host to use")
|
||||||
|
opts,args = optp.parse_args()
|
||||||
|
|
||||||
|
logging.basicConfig(level=opts.loglevel, format='%(levelname)-8s %(message)s')
|
||||||
|
|
||||||
|
#load xml config
|
||||||
|
logging.info("Loading config file: %s" % opts.configfile)
|
||||||
|
config = configparser.RawConfigParser()
|
||||||
|
config.read(opts.configfile)
|
||||||
|
|
||||||
|
#init
|
||||||
|
logging.info("Account 1 is %s" % config.get('account1', 'jid'))
|
||||||
|
xmpp1 = TestClient(config.get('account1','jid'), config.get('account1','pass'))
|
||||||
|
logging.info("Account 2 is %s" % config.get('account2', 'jid'))
|
||||||
|
xmpp2 = TestClient(config.get('account2','jid'), config.get('account2','pass'))
|
||||||
|
|
||||||
|
xmpp1.registerPlugin('xep_0004')
|
||||||
|
xmpp1.registerPlugin('xep_0030')
|
||||||
|
xmpp1.registerPlugin('xep_0060')
|
||||||
|
xmpp1.registerPlugin('xep_0199')
|
||||||
|
xmpp2.registerPlugin('xep_0004')
|
||||||
|
xmpp2.registerPlugin('xep_0030')
|
||||||
|
xmpp2.registerPlugin('xep_0060')
|
||||||
|
xmpp2.registerPlugin('xep_0199')
|
||||||
|
|
||||||
|
if not config.get('account1', 'server'):
|
||||||
|
# we don't know the server, but the lib can probably figure it out
|
||||||
|
xmpp1.connect()
|
||||||
|
else:
|
||||||
|
xmpp1.connect((config.get('account1', 'server'), 5222))
|
||||||
|
xmpp1.process(threaded=True)
|
||||||
|
|
||||||
|
#init
|
||||||
|
if not config.get('account2', 'server'):
|
||||||
|
# we don't know the server, but the lib can probably figure it out
|
||||||
|
xmpp2.connect()
|
||||||
|
else:
|
||||||
|
xmpp2.connect((config.get('account2', 'server'), 5222))
|
||||||
|
xmpp2.process(threaded=True)
|
||||||
|
|
||||||
|
TestPubsubServer.xmpp1 = xmpp1
|
||||||
|
TestPubsubServer.xmpp2 = xmpp2
|
||||||
|
TestPubsubServer.pshost = config.get('settings', 'pubsub')
|
||||||
|
xmpp1.waitforstart.get(True)
|
||||||
|
xmpp2.waitforstart.get(True)
|
||||||
|
testsuite = unittest.TestLoader().loadTestsFromTestCase(TestPubsubServer)
|
||||||
|
|
||||||
|
alltests_suite = unittest.TestSuite([testsuite])
|
||||||
|
result = unittest.TextTestRunner(verbosity=2).run(alltests_suite)
|
||||||
|
xmpp1.disconnect()
|
||||||
|
xmpp2.disconnect()
|
13
conn_tests/testconfig.ini
Normal file
13
conn_tests/testconfig.ini
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[settings]
|
||||||
|
enabled=true
|
||||||
|
pubsub=pubsub.recon
|
||||||
|
|
||||||
|
[account1]
|
||||||
|
jid=fritzy@recon
|
||||||
|
pass=testing123
|
||||||
|
server=
|
||||||
|
|
||||||
|
[account2]
|
||||||
|
jid=fritzy2@recon
|
||||||
|
pass=testing123
|
||||||
|
server=
|
350
conn_tests/testpubsub.py
Executable file
350
conn_tests/testpubsub.py
Executable file
@ -0,0 +1,350 @@
|
|||||||
|
"""
|
||||||
|
SleekXMPP: The Sleek XMPP Library
|
||||||
|
Copyright (C) 2010 Nathanael C. Fritz
|
||||||
|
This file is part of SleekXMPP.
|
||||||
|
|
||||||
|
See the file LICENSE for copying permission.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
import sleekxmpp
|
||||||
|
from optparse import OptionParser
|
||||||
|
from xml.etree import cElementTree as ET
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
import Queue
|
||||||
|
import thread
|
||||||
|
|
||||||
|
|
||||||
|
class testps(sleekxmpp.ClientXMPP):
|
||||||
|
def __init__(self, jid, password, ssl=False, plugin_config = {}, plugin_whitelist=[], nodenum=0, pshost=None):
|
||||||
|
sleekxmpp.ClientXMPP.__init__(self, jid, password, ssl, plugin_config, plugin_whitelist)
|
||||||
|
self.registerPlugin('xep_0004')
|
||||||
|
self.registerPlugin('xep_0030')
|
||||||
|
self.registerPlugin('xep_0060')
|
||||||
|
self.registerPlugin('xep_0092')
|
||||||
|
self.add_handler("<message xmlns='jabber:client'><event xmlns='http://jabber.org/protocol/pubsub#event' /></message>", self.pubsubEventHandler, name='Pubsub Event', threaded=True)
|
||||||
|
self.add_event_handler("session_start", self.start, threaded=True)
|
||||||
|
self.add_handler("<iq type='error' />", self.handleError, name='Iq Error')
|
||||||
|
self.events = Queue.Queue()
|
||||||
|
self.default_config = None
|
||||||
|
self.ps = self.plugin['xep_0060']
|
||||||
|
self.node = "pstestnode_%s"
|
||||||
|
self.pshost = pshost
|
||||||
|
if pshost is None:
|
||||||
|
self.pshost = self.boundjid.host
|
||||||
|
self.nodenum = int(nodenum)
|
||||||
|
self.leafnode = self.nodenum + 1
|
||||||
|
self.collectnode = self.nodenum + 2
|
||||||
|
self.lasterror = ''
|
||||||
|
self.sprintchars = 0
|
||||||
|
self.defaultconfig = None
|
||||||
|
self.tests = ['test_defaultConfig', 'test_createDefaultNode', 'test_getNodes', 'test_deleteNode', 'test_createWithConfig', 'test_reconfigureNode', 'test_subscribeToNode', 'test_addItem', 'test_updateItem', 'test_deleteItem', 'test_unsubscribeNode', 'test_createCollection', 'test_subscribeCollection', 'test_addNodeCollection', 'test_deleteNodeCollection', 'test_addCollectionNode', 'test_deleteCollectionNode', 'test_unsubscribeNodeCollection', 'test_deleteCollection']
|
||||||
|
self.passed = 0
|
||||||
|
self.width = 120
|
||||||
|
|
||||||
|
def start(self, event):
|
||||||
|
#TODO: make this configurable
|
||||||
|
self.getRoster()
|
||||||
|
self.sendPresence(ppriority=20)
|
||||||
|
thread.start_new(self.test_all, tuple())
|
||||||
|
|
||||||
|
def sprint(self, msg, end=False, color=False):
|
||||||
|
length = len(msg)
|
||||||
|
if color:
|
||||||
|
if color == "red":
|
||||||
|
color = "1;31"
|
||||||
|
elif color == "green":
|
||||||
|
color = "0;32"
|
||||||
|
msg = "%s%s%s" % ("\033[%sm" % color, msg, "\033[0m")
|
||||||
|
if not end:
|
||||||
|
sys.stdout.write(msg)
|
||||||
|
self.sprintchars += length
|
||||||
|
else:
|
||||||
|
self.sprint("%s%s" % ("." * (self.width - self.sprintchars - length), msg))
|
||||||
|
print('')
|
||||||
|
self.sprintchars = 0
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
def pubsubEventHandler(self, xml):
|
||||||
|
for item in xml.findall('{http://jabber.org/protocol/pubsub#event}event/{http://jabber.org/protocol/pubsub#event}items/{http://jabber.org/protocol/pubsub#event}item'):
|
||||||
|
self.events.put(item.get('id', '__unknown__'))
|
||||||
|
for item in xml.findall('{http://jabber.org/protocol/pubsub#event}event/{http://jabber.org/protocol/pubsub#event}items/{http://jabber.org/protocol/pubsub#event}retract'):
|
||||||
|
self.events.put(item.get('id', '__unknown__'))
|
||||||
|
for item in xml.findall('{http://jabber.org/protocol/pubsub#event}event/{http://jabber.org/protocol/pubsub#event}collection/{http://jabber.org/protocol/pubsub#event}disassociate'):
|
||||||
|
self.events.put(item.get('node', '__unknown__'))
|
||||||
|
for item in xml.findall('{http://jabber.org/protocol/pubsub#event}event/{http://jabber.org/protocol/pubsub#event}collection/{http://jabber.org/protocol/pubsub#event}associate'):
|
||||||
|
self.events.put(item.get('node', '__unknown__'))
|
||||||
|
|
||||||
|
def handleError(self, xml):
|
||||||
|
error = xml.find('{jabber:client}error')
|
||||||
|
self.lasterror = error.getchildren()[0].tag.split('}')[-1]
|
||||||
|
|
||||||
|
def test_all(self):
|
||||||
|
print("Running Publish-Subscribe Tests")
|
||||||
|
version = self.plugin['xep_0092'].getVersion(self.pshost)
|
||||||
|
if version:
|
||||||
|
print("%s %s on %s" % (version.get('name', 'Unknown Server'), version.get('version', 'v?'), version.get('os', 'Unknown OS')))
|
||||||
|
print("=" * self.width)
|
||||||
|
for test in self.tests:
|
||||||
|
testfunc = getattr(self, test)
|
||||||
|
self.sprint("%s" % testfunc.__doc__)
|
||||||
|
if testfunc():
|
||||||
|
self.sprint("Passed", True, "green")
|
||||||
|
self.passed += 1
|
||||||
|
else:
|
||||||
|
if not self.lasterror:
|
||||||
|
self.lasterror = 'No response'
|
||||||
|
self.sprint("Failed (%s)" % self.lasterror, True, "red")
|
||||||
|
self.lasterror = ''
|
||||||
|
print("=" * self.width)
|
||||||
|
self.sprint("Cleaning up...")
|
||||||
|
#self.ps.deleteNode(self.pshost, self.node % self.nodenum)
|
||||||
|
self.ps.deleteNode(self.pshost, self.node % self.leafnode)
|
||||||
|
#self.ps.deleteNode(self.pshost, self.node % self.collectnode)
|
||||||
|
self.sprint("Done", True, "green")
|
||||||
|
self.disconnect()
|
||||||
|
self.sprint("%s" % self.passed, False, "green")
|
||||||
|
self.sprint("/%s Passed -- " % len(self.tests))
|
||||||
|
if len(self.tests) - self.passed:
|
||||||
|
self.sprint("%s" % (len(self.tests) - self.passed), False, "red")
|
||||||
|
else:
|
||||||
|
self.sprint("%s" % (len(self.tests) - self.passed), False, "green")
|
||||||
|
self.sprint(" Failed Tests")
|
||||||
|
print
|
||||||
|
#print "%s/%s Passed -- %s Failed Tests" % (self.passed, len(self.tests), len(self.tests) - self.passed)
|
||||||
|
|
||||||
|
def test_defaultConfig(self):
|
||||||
|
"Retreiving default configuration"
|
||||||
|
result = self.ps.getNodeConfig(self.pshost)
|
||||||
|
if result is False or result is None:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.defaultconfig = result
|
||||||
|
try:
|
||||||
|
self.defaultconfig.field['pubsub#access_model'].setValue('open')
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
self.defaultconfig.field['pubsub#notify_retract'].setValue(True)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return True
|
||||||
|
|
||||||
|
def test_createDefaultNode(self):
|
||||||
|
"Creating default node"
|
||||||
|
return self.ps.create_node(self.pshost, self.node % self.nodenum)
|
||||||
|
|
||||||
|
def test_getNodes(self):
|
||||||
|
"Getting list of nodes"
|
||||||
|
self.ps.getNodes(self.pshost)
|
||||||
|
self.ps.getItems(self.pshost, 'blog')
|
||||||
|
return True
|
||||||
|
|
||||||
|
def test_deleteNode(self):
|
||||||
|
"Deleting node"
|
||||||
|
return self.ps.deleteNode(self.pshost, self.node % self.nodenum)
|
||||||
|
|
||||||
|
def test_createWithConfig(self):
|
||||||
|
"Creating node with config"
|
||||||
|
if self.defaultconfig is None:
|
||||||
|
self.lasterror = "No Avail Config"
|
||||||
|
return False
|
||||||
|
return self.ps.create_node(self.pshost, self.node % self.leafnode, self.defaultconfig)
|
||||||
|
|
||||||
|
def test_reconfigureNode(self):
|
||||||
|
"Retrieving node config and reconfiguring"
|
||||||
|
nconfig = self.ps.getNodeConfig(self.pshost, self.node % self.leafnode)
|
||||||
|
if nconfig == False:
|
||||||
|
return False
|
||||||
|
return self.ps.setNodeConfig(self.pshost, self.node % self.leafnode, nconfig)
|
||||||
|
|
||||||
|
def test_subscribeToNode(self):
|
||||||
|
"Subscribing to node"
|
||||||
|
return self.ps.subscribe(self.pshost, self.node % self.leafnode)
|
||||||
|
|
||||||
|
def test_addItem(self):
|
||||||
|
"Adding item, waiting for notification"
|
||||||
|
item = ET.Element('test')
|
||||||
|
result = self.ps.setItem(self.pshost, self.node % self.leafnode, (('test_node1', item),))
|
||||||
|
if result == False:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
return False
|
||||||
|
if event == 'test_node1':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_updateItem(self):
|
||||||
|
"Updating item, waiting for notification"
|
||||||
|
item = ET.Element('test')
|
||||||
|
item.attrib['crap'] = 'yup, right here'
|
||||||
|
result = self.ps.setItem(self.pshost, self.node % self.leafnode, (('test_node1', item),))
|
||||||
|
if result == False:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
return False
|
||||||
|
if event == 'test_node1':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_deleteItem(self):
|
||||||
|
"Deleting item, waiting for notification"
|
||||||
|
result = self.ps.deleteItem(self.pshost, self.node % self.leafnode, 'test_node1')
|
||||||
|
if result == False:
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
self.lasterror = "No Notification"
|
||||||
|
return False
|
||||||
|
if event == 'test_node1':
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_unsubscribeNode(self):
|
||||||
|
"Unsubscribing from node"
|
||||||
|
return self.ps.unsubscribe(self.pshost, self.node % self.leafnode)
|
||||||
|
|
||||||
|
def test_createCollection(self):
|
||||||
|
"Creating collection node"
|
||||||
|
return self.ps.create_node(self.pshost, self.node % self.collectnode, self.defaultconfig, True)
|
||||||
|
|
||||||
|
def test_subscribeCollection(self):
|
||||||
|
"Subscribing to collection node"
|
||||||
|
return self.ps.subscribe(self.pshost, self.node % self.collectnode)
|
||||||
|
|
||||||
|
def test_addNodeCollection(self):
|
||||||
|
"Assigning node to collection, waiting for notification"
|
||||||
|
config = self.ps.getNodeConfig(self.pshost, self.node % self.leafnode)
|
||||||
|
if not config or config is None:
|
||||||
|
self.lasterror = "Config Error"
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
config.field['pubsub#collection'].setValue(self.node % self.collectnode)
|
||||||
|
except KeyError:
|
||||||
|
self.sprint("...Missing Field...", False, "red")
|
||||||
|
config.addField('pubsub#collection', value=self.node % self.collectnode)
|
||||||
|
if not self.ps.setNodeConfig(self.pshost, self.node % self.leafnode, config):
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
self.lasterror = "No Notification"
|
||||||
|
return False
|
||||||
|
if event == self.node % self.leafnode:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_deleteNodeCollection(self):
|
||||||
|
"Removing node assignment to collection, waiting for notification"
|
||||||
|
config = self.ps.getNodeConfig(self.pshost, self.node % self.leafnode)
|
||||||
|
if not config or config is None:
|
||||||
|
self.lasterror = "Config Error"
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
config.field['pubsub#collection'].delValue(self.node % self.collectnode)
|
||||||
|
except KeyError:
|
||||||
|
self.sprint("...Missing Field...", False, "red")
|
||||||
|
config.addField('pubsub#collection', value='')
|
||||||
|
if not self.ps.setNodeConfig(self.pshost, self.node % self.leafnode, config):
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
self.lasterror = "No Notification"
|
||||||
|
return False
|
||||||
|
if event == self.node % self.leafnode:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_addCollectionNode(self):
|
||||||
|
"Assigning node from collection, waiting for notification"
|
||||||
|
config = self.ps.getNodeConfig(self.pshost, self.node % self.collectnode)
|
||||||
|
if not config or config is None:
|
||||||
|
self.lasterror = "Config Error"
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
config.field['pubsub#children'].setValue(self.node % self.leafnode)
|
||||||
|
except KeyError:
|
||||||
|
self.sprint("...Missing Field...", False, "red")
|
||||||
|
config.addField('pubsub#children', value=self.node % self.leafnode)
|
||||||
|
if not self.ps.setNodeConfig(self.pshost, self.node % self.collectnode, config):
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
self.lasterror = "No Notification"
|
||||||
|
return False
|
||||||
|
if event == self.node % self.leafnode:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_deleteCollectionNode(self):
|
||||||
|
"Removing node from collection, waiting for notification"
|
||||||
|
config = self.ps.getNodeConfig(self.pshost, self.node % self.collectnode)
|
||||||
|
if not config or config is None:
|
||||||
|
self.lasterror = "Config Error"
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
config.field['pubsub#children'].delValue(self.node % self.leafnode)
|
||||||
|
except KeyError:
|
||||||
|
self.sprint("...Missing Field...", False, "red")
|
||||||
|
config.addField('pubsub#children', value='')
|
||||||
|
if not self.ps.setNodeConfig(self.pshost, self.node % self.collectnode, config):
|
||||||
|
return False
|
||||||
|
try:
|
||||||
|
event = self.events.get(True, 10)
|
||||||
|
except Queue.Empty:
|
||||||
|
self.lasterror = "No Notification"
|
||||||
|
return False
|
||||||
|
if event == self.node % self.leafnode:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def test_unsubscribeNodeCollection(self):
|
||||||
|
"Unsubscribing from collection"
|
||||||
|
return self.ps.unsubscribe(self.pshost, self.node % self.collectnode)
|
||||||
|
|
||||||
|
def test_deleteCollection(self):
|
||||||
|
"Deleting collection"
|
||||||
|
return self.ps.deleteNode(self.pshost, self.node % self.collectnode)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
#parse command line arguements
|
||||||
|
optp = OptionParser()
|
||||||
|
optp.add_option('-q','--quiet', help='set logging to ERROR', action='store_const', dest='loglevel', const=logging.ERROR, default=logging.INFO)
|
||||||
|
optp.add_option('-d','--debug', help='set logging to DEBUG', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
|
||||||
|
optp.add_option('-v','--verbose', help='set logging to COMM', action='store_const', dest='loglevel', const=5, default=logging.INFO)
|
||||||
|
optp.add_option("-c","--config", dest="configfile", default="config.xml", help="set config file to use")
|
||||||
|
optp.add_option("-n","--nodenum", dest="nodenum", default="1", help="set node number to use")
|
||||||
|
optp.add_option("-p","--pubsub", dest="pubsub", default="1", help="set pubsub host to use")
|
||||||
|
opts,args = optp.parse_args()
|
||||||
|
|
||||||
|
logging.basicConfig(level=opts.loglevel, format='%(levelname)-8s %(message)s')
|
||||||
|
|
||||||
|
#load xml config
|
||||||
|
logging.info("Loading config file: %s" % opts.configfile)
|
||||||
|
config = ET.parse(os.path.expanduser(opts.configfile)).find('auth')
|
||||||
|
|
||||||
|
#init
|
||||||
|
logging.info("Logging in as %s" % config.attrib['jid'])
|
||||||
|
|
||||||
|
|
||||||
|
plugin_config = {}
|
||||||
|
plugin_config['xep_0092'] = {'name': 'SleekXMPP Example', 'version': '0.1-dev'}
|
||||||
|
plugin_config['xep_0199'] = {'keepalive': True, 'timeout': 30, 'frequency': 300}
|
||||||
|
|
||||||
|
con = testps(config.attrib['jid'], config.attrib['pass'], plugin_config=plugin_config, plugin_whitelist=[], nodenum=opts.nodenum, pshost=opts.pubsub)
|
||||||
|
if not config.get('server', None):
|
||||||
|
# we don't know the server, but the lib can probably figure it out
|
||||||
|
con.connect()
|
||||||
|
else:
|
||||||
|
con.connect((config.attrib['server'], 5222))
|
||||||
|
con.process(threaded=False)
|
||||||
|
print("")
|
1
docs/.gitignore
vendored
1
docs/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
_build/*
|
|
130
docs/Makefile
130
docs/Makefile
@ -1,130 +0,0 @@
|
|||||||
# Makefile for Sphinx documentation
|
|
||||||
#
|
|
||||||
|
|
||||||
# You can set these variables from the command line.
|
|
||||||
SPHINXOPTS =
|
|
||||||
SPHINXBUILD = sphinx-build
|
|
||||||
PAPER =
|
|
||||||
BUILDDIR = _build
|
|
||||||
|
|
||||||
# Internal variables.
|
|
||||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
|
||||||
PAPEROPT_letter = -D latex_paper_size=letter
|
|
||||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
|
||||||
|
|
||||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
|
|
||||||
|
|
||||||
help:
|
|
||||||
@echo "Please use \`make <target>' where <target> is one of"
|
|
||||||
@echo " html to make standalone HTML files"
|
|
||||||
@echo " dirhtml to make HTML files named index.html in directories"
|
|
||||||
@echo " singlehtml to make a single large HTML file"
|
|
||||||
@echo " pickle to make pickle files"
|
|
||||||
@echo " json to make JSON files"
|
|
||||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
|
||||||
@echo " qthelp to make HTML files and a qthelp project"
|
|
||||||
@echo " devhelp to make HTML files and a Devhelp project"
|
|
||||||
@echo " epub to make an epub"
|
|
||||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
|
||||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
|
||||||
@echo " text to make text files"
|
|
||||||
@echo " man to make manual pages"
|
|
||||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
|
||||||
@echo " linkcheck to check all external links for integrity"
|
|
||||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-rm -rf $(BUILDDIR)/*
|
|
||||||
|
|
||||||
html:
|
|
||||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
|
||||||
|
|
||||||
dirhtml:
|
|
||||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
|
||||||
|
|
||||||
singlehtml:
|
|
||||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
|
||||||
|
|
||||||
pickle:
|
|
||||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the pickle files."
|
|
||||||
|
|
||||||
json:
|
|
||||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can process the JSON files."
|
|
||||||
|
|
||||||
htmlhelp:
|
|
||||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
|
||||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
|
||||||
|
|
||||||
qthelp:
|
|
||||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
|
||||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
|
||||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Slixmpp.qhcp"
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Slixmpp.qhc"
|
|
||||||
|
|
||||||
devhelp:
|
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
|
||||||
@echo
|
|
||||||
@echo "Build finished."
|
|
||||||
@echo "To view the help file:"
|
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Slixmpp"
|
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Slixmpp"
|
|
||||||
@echo "# devhelp"
|
|
||||||
|
|
||||||
epub:
|
|
||||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
|
||||||
|
|
||||||
latex:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo
|
|
||||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
|
||||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
|
||||||
"(use \`make latexpdf' here to do that automatically)."
|
|
||||||
|
|
||||||
latexpdf:
|
|
||||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
|
||||||
@echo "Running LaTeX files through pdflatex..."
|
|
||||||
make -C $(BUILDDIR)/latex all-pdf
|
|
||||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
|
||||||
|
|
||||||
text:
|
|
||||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
|
||||||
|
|
||||||
man:
|
|
||||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
|
||||||
@echo
|
|
||||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
|
||||||
|
|
||||||
changes:
|
|
||||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
|
||||||
@echo
|
|
||||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
|
||||||
|
|
||||||
linkcheck:
|
|
||||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
|
||||||
@echo
|
|
||||||
@echo "Link check complete; look for any errors in the above output " \
|
|
||||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
|
||||||
|
|
||||||
doctest:
|
|
||||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
|
||||||
@echo "Testing of doctests in the sources finished, look at the " \
|
|
||||||
"results in $(BUILDDIR)/doctest/output.txt."
|
|
BIN
docs/_static/images/arch_layers.png
vendored
BIN
docs/_static/images/arch_layers.png
vendored
Binary file not shown.
Before Width: | Height: | Size: 27 KiB |
BIN
docs/_static/images/from_&yet.png
vendored
BIN
docs/_static/images/from_&yet.png
vendored
Binary file not shown.
Before Width: | Height: | Size: 2.7 KiB |
@ -1,88 +0,0 @@
|
|||||||
.. _internal-api:
|
|
||||||
|
|
||||||
Internal "API"
|
|
||||||
==============
|
|
||||||
|
|
||||||
Slixmpp has a generic API registry that can be used by its plugins to allow
|
|
||||||
access control, redefinition of behaviour, without having to inherit from the
|
|
||||||
plugin or do more dark magic.
|
|
||||||
|
|
||||||
The idea is that each api call can be replaced, most of them use a form
|
|
||||||
of in-memory storage that can be, for example, replaced with database
|
|
||||||
or file-based storaged.
|
|
||||||
|
|
||||||
|
|
||||||
Each plugin is assigned an API proxy bound to itself, but only a few make use
|
|
||||||
of it.
|
|
||||||
|
|
||||||
See also :ref:`api-simple-tuto`.
|
|
||||||
|
|
||||||
Description of a generic API call
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def get_toto(jid, node, ifrom, args):
|
|
||||||
return 'toto'
|
|
||||||
|
|
||||||
self.xmpp.plugin['xep_XXXX'].api.register(handler, 'get_toto')
|
|
||||||
|
|
||||||
Each API call will receive 4 parameters (which can be ``None`` if data
|
|
||||||
is not relevant to the operation), which are ``jid`` (``Optional[JID]``),
|
|
||||||
``node`` (``Optional[str]``), ``ifrom`` (``Optional[JID]``), and ``args``
|
|
||||||
(``Any``).
|
|
||||||
|
|
||||||
- ``jid``, if relevant, represents the JID targeted by that operation
|
|
||||||
- ``node``, if relevant is an arbitrary string, but was thought for, e.g.,
|
|
||||||
a pubsub or disco node.
|
|
||||||
- ``ifrom``, if relevant, is the JID the event is coming from.
|
|
||||||
- ``args`` is the event-specific data passed on by the plugin, often a dict
|
|
||||||
of arguments (can be None as well).
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
Since 1.8.0, API calls can be coroutines.
|
|
||||||
|
|
||||||
|
|
||||||
Handler hierarchy
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The ``self.api.register()`` signature is as follows:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def register(handler, op, jid=None, node=None, default=False):
|
|
||||||
pass
|
|
||||||
|
|
||||||
As you can see, :meth:`~.APIRegistry.register` takes an additional ctype
|
|
||||||
parameter, but the :class:`~.APIWrapper` takes care of that for us (in most
|
|
||||||
cases, it is the name of the XEP plugin, such as ``'xep_0XXX'``).
|
|
||||||
|
|
||||||
When you register a handler, you register it for an ``op``, for **operation**.
|
|
||||||
For example, ``get_vcard``.
|
|
||||||
|
|
||||||
``handler`` and ``op`` are the only two required parameters (and in many cases,
|
|
||||||
all you will ever need). You can, however, go further and register handlers
|
|
||||||
for specific values of the ``jid`` and ``node`` parameters of the calls.
|
|
||||||
|
|
||||||
The priority of the execution of handlers is as follows:
|
|
||||||
|
|
||||||
- Check if a handler for both values of ``node`` and ``jid`` has been defined
|
|
||||||
- If not found, check if a handler for this value of ``jid`` has been defined
|
|
||||||
- If not found, check if a handler for this value of ``node`` has been defined
|
|
||||||
- If still not found, get the global handler (no parameter registered)
|
|
||||||
|
|
||||||
|
|
||||||
Raw documentation
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
This documentation is provided for reference, but :meth:`~.APIRegistry.register`
|
|
||||||
should be all you need.
|
|
||||||
|
|
||||||
|
|
||||||
.. module:: slixmpp.api
|
|
||||||
|
|
||||||
.. autoclass:: APIRegistry
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: APIWrapper
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
========
|
|
||||||
BaseXMPP
|
|
||||||
========
|
|
||||||
|
|
||||||
.. module:: slixmpp.basexmpp
|
|
||||||
|
|
||||||
.. autoclass:: BaseXMPP
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
==========
|
|
||||||
ClientXMPP
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. module:: slixmpp.clientxmpp
|
|
||||||
|
|
||||||
.. autoclass:: ClientXMPP
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
=============
|
|
||||||
ComponentXMPP
|
|
||||||
=============
|
|
||||||
|
|
||||||
.. module:: slixmpp.componentxmpp
|
|
||||||
|
|
||||||
.. autoclass:: ComponentXMPP
|
|
||||||
:members:
|
|
@ -1,14 +0,0 @@
|
|||||||
Exceptions
|
|
||||||
==========
|
|
||||||
|
|
||||||
.. module:: slixmpp.exceptions
|
|
||||||
|
|
||||||
|
|
||||||
.. autoexception:: XMPPError
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoexception:: IqError
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoexception:: IqTimeout
|
|
||||||
:members:
|
|
@ -1,17 +0,0 @@
|
|||||||
API Reference
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 3
|
|
||||||
|
|
||||||
clientxmpp
|
|
||||||
componentxmpp
|
|
||||||
basexmpp
|
|
||||||
exceptions
|
|
||||||
xmlstream/jid
|
|
||||||
xmlstream/stanzabase
|
|
||||||
xmlstream/handler
|
|
||||||
xmlstream/matcher
|
|
||||||
xmlstream/xmlstream
|
|
||||||
xmlstream/tostring
|
|
||||||
api
|
|
@ -1,111 +0,0 @@
|
|||||||
Plugin index
|
|
||||||
============
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
xep_0004
|
|
||||||
xep_0009
|
|
||||||
xep_0012
|
|
||||||
xep_0013
|
|
||||||
xep_0020
|
|
||||||
xep_0027
|
|
||||||
xep_0030
|
|
||||||
xep_0033
|
|
||||||
xep_0045
|
|
||||||
xep_0047
|
|
||||||
xep_0049
|
|
||||||
xep_0050
|
|
||||||
xep_0054
|
|
||||||
xep_0055
|
|
||||||
xep_0059
|
|
||||||
xep_0060
|
|
||||||
xep_0065
|
|
||||||
xep_0066
|
|
||||||
xep_0070
|
|
||||||
xep_0071
|
|
||||||
xep_0077
|
|
||||||
xep_0079
|
|
||||||
xep_0080
|
|
||||||
xep_0082
|
|
||||||
xep_0084
|
|
||||||
xep_0085
|
|
||||||
xep_0086
|
|
||||||
xep_0092
|
|
||||||
xep_0100
|
|
||||||
xep_0106
|
|
||||||
xep_0107
|
|
||||||
xep_0108
|
|
||||||
xep_0115
|
|
||||||
xep_0118
|
|
||||||
xep_0122
|
|
||||||
xep_0128
|
|
||||||
xep_0131
|
|
||||||
xep_0133
|
|
||||||
xep_0152
|
|
||||||
xep_0153
|
|
||||||
xep_0163
|
|
||||||
xep_0172
|
|
||||||
xep_0184
|
|
||||||
xep_0186
|
|
||||||
xep_0191
|
|
||||||
xep_0196
|
|
||||||
xep_0198
|
|
||||||
xep_0199
|
|
||||||
xep_0202
|
|
||||||
xep_0203
|
|
||||||
xep_0221
|
|
||||||
xep_0222
|
|
||||||
xep_0223
|
|
||||||
xep_0224
|
|
||||||
xep_0231
|
|
||||||
xep_0235
|
|
||||||
xep_0249
|
|
||||||
xep_0256
|
|
||||||
xep_0257
|
|
||||||
xep_0258
|
|
||||||
xep_0264
|
|
||||||
xep_0279
|
|
||||||
xep_0280
|
|
||||||
xep_0292
|
|
||||||
xep_0297
|
|
||||||
xep_0300
|
|
||||||
xep_0308
|
|
||||||
xep_0313
|
|
||||||
xep_0317
|
|
||||||
xep_0319
|
|
||||||
xep_0332
|
|
||||||
xep_0333
|
|
||||||
xep_0334
|
|
||||||
xep_0335
|
|
||||||
xep_0352
|
|
||||||
xep_0353
|
|
||||||
xep_0356
|
|
||||||
xep_0359
|
|
||||||
xep_0363
|
|
||||||
xep_0369
|
|
||||||
xep_0372
|
|
||||||
xep_0377
|
|
||||||
xep_0380
|
|
||||||
xep_0382
|
|
||||||
xep_0385
|
|
||||||
xep_0394
|
|
||||||
xep_0402
|
|
||||||
xep_0403
|
|
||||||
xep_0404
|
|
||||||
xep_0405
|
|
||||||
xep_0421
|
|
||||||
xep_0422
|
|
||||||
xep_0424
|
|
||||||
xep_0425
|
|
||||||
xep_0428
|
|
||||||
xep_0437
|
|
||||||
xep_0439
|
|
||||||
xep_0441
|
|
||||||
xep_0444
|
|
||||||
xep_0446
|
|
||||||
xep_0447
|
|
||||||
xep_0461
|
|
||||||
xep_0469
|
|
||||||
xep_0490
|
|
||||||
xep_0492
|
|
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
XEP-0004: Data Forms
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0004
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0004
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0004.stanza.field
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0004.stanza.form
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0009: Jabber-RPC
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0009
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0009
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0009.stanza.RPC
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
|||||||
|
|
||||||
XEP-0012: Last Activity
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0012
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0012
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
.. _api-0012:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This plugin uses an in-memory storage by default to keep track of the
|
|
||||||
received and sent last activities.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
get_last_activity
|
|
||||||
- **jid**: :class:`~.JID` of whom to retrieve the last activity
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: who the request is from (None = local)
|
|
||||||
- **args**: ``None`` or an :class:`~.Iq` that is requesting the
|
|
||||||
- **returns**
|
|
||||||
information.
|
|
||||||
|
|
||||||
Get the last activity of a JID from the storage.
|
|
||||||
|
|
||||||
set_last_activity
|
|
||||||
- **jid**: :class:`~.JID` of whom to set the last activity
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: A dict containing ``'seconds'`` and ``'status'``
|
|
||||||
``{'seconds': Optional[int], 'status': Optional[str]}``
|
|
||||||
|
|
||||||
Set the last activity of a JID in the storage.
|
|
||||||
|
|
||||||
del_last_activity
|
|
||||||
- **jid**: :class:`~.JID` to delete from the storage
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Remove the last activity of a JID from the storage.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0012.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0013: Flexible Offline Message Retrieval
|
|
||||||
============================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0013
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0013
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0013.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0020: Feature Negotiation
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0020
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0020
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0020.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
|||||||
|
|
||||||
XEP-0027: Current Jabber OpenPGP Usage
|
|
||||||
======================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0027
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0027
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
.. _api-0027:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The default API here is managing a JID→Keyid dict in-memory.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
get_keyid
|
|
||||||
- **jid**: :class:`~.JID` to get.
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: ``Optional[str]``, the keyid or None
|
|
||||||
|
|
||||||
Get the KeyiD for a JID, None if it is not found.
|
|
||||||
|
|
||||||
set_keyid
|
|
||||||
- **jid**: :class:`~.JID` to set the id for.
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: ``str``, keyid to set
|
|
||||||
|
|
||||||
Set the KeyiD for a JID.
|
|
||||||
|
|
||||||
del_keyid
|
|
||||||
- **jid**: :class:`~.JID` to delete from the mapping.
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Delete the KeyiD for a JID.
|
|
||||||
|
|
||||||
get_keyids
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: ``Dict[JID, str]`` the full internal mapping
|
|
||||||
|
|
||||||
Get all currently stored KeyIDs.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0027.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
|
|
||||||
XEP-0030: Service Discovery
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0030
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0030
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
.. _api-0030:
|
|
||||||
|
|
||||||
Internal API Methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
All ``api`` operations supported by the 0030 plugin are implemented as part of
|
|
||||||
the :class:`~.StaticDisco` class which implement an in-memory cache for disco
|
|
||||||
info and items.
|
|
||||||
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0030.static
|
|
||||||
:members:
|
|
||||||
:member-order: bysource
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0030.stanza.info
|
|
||||||
:members:
|
|
||||||
:member-order: bysource
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0030.stanza.items
|
|
||||||
:members:
|
|
||||||
:member-order: bysource
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0033: Extended Stanza Addressing
|
|
||||||
====================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0033
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0033
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0033.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
|
|
||||||
XEP-0045: Multi-User Chat
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0045
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0045
|
|
||||||
:member-order: bysource
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0045.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
|||||||
|
|
||||||
XEP-0047: In-band Bytestreams
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0047
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0047
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. autoclass:: IBBytestream
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. _api-0047:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The API here is used to manage streams and authorize. The default handlers
|
|
||||||
work with the config parameters.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
authorized_sid (0047 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: :class:`~.Iq` of the stream request.
|
|
||||||
- **returns**: ``True`` if the stream should be accepted,
|
|
||||||
``False`` otherwise.
|
|
||||||
|
|
||||||
Check if the stream should be accepted. Uses
|
|
||||||
the information setup by :term:`preauthorize_sid (0047 version)`
|
|
||||||
by default.
|
|
||||||
|
|
||||||
authorized (0047 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: :class:`~.Iq` of the stream request.
|
|
||||||
- **returns**: ``True`` if the stream should be accepted,
|
|
||||||
``False`` otherwise.
|
|
||||||
|
|
||||||
A fallback handler (run after :term:`authorized_sid (0047 version)`)
|
|
||||||
to check if a stream should be accepted. Uses the ``auto_accept``
|
|
||||||
parameter by default.
|
|
||||||
|
|
||||||
preauthorize_sid (0047 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream will be from.
|
|
||||||
- **args**: Unused.
|
|
||||||
|
|
||||||
Register a stream id to be accepted automatically (called from
|
|
||||||
other plugins such as XEP-0095).
|
|
||||||
|
|
||||||
get_stream
|
|
||||||
- **jid**: :class:`~.JID` of local receiver.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: :class:`~.IBBytestream`
|
|
||||||
|
|
||||||
Return a currently opened stream between two JIDs.
|
|
||||||
|
|
||||||
set_stream
|
|
||||||
- **jid**: :class:`~.JID` of local receiver.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Register an opened stream between two JIDs.
|
|
||||||
|
|
||||||
del_stream
|
|
||||||
- **jid**: :class:`~.JID` of local receiver.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Delete a stream between two JIDs.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0047.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0049: Private XML Storage
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0049
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0049
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0049.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0050: Ad-Hoc Commands
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0050
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0050
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0050.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
|
|
||||||
XEP-0054: vcard-temp
|
|
||||||
====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0054
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0054
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0054:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This plugin maintains by default an in-memory cache of the received
|
|
||||||
VCards.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
set_vcard
|
|
||||||
- **jid**: :class:`~.JID` of whom to set the vcard
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: :class:`~.VCardTemp` object to store for this JID.
|
|
||||||
|
|
||||||
Set a VCard for a JID.
|
|
||||||
|
|
||||||
get_vcard
|
|
||||||
- **jid**: :class:`~.JID` of whom to set the vcard
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: :class:`~.JID` the request is coming from
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: :class:`~.VCardTemp` object for this JID or None.
|
|
||||||
|
|
||||||
Get a stored VCard for a JID.
|
|
||||||
|
|
||||||
del_vcard
|
|
||||||
- **jid**: :class:`~.JID` of whom to set the vcard
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Delete a stored VCard for a JID.
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0054.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0055: Jabber search
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0055
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0055
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0055.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
XEP-0059: Result Set Management
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0059
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0059
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. autoclass:: ResultIterator
|
|
||||||
:members:
|
|
||||||
:member-order: bysource
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0059.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
|||||||
|
|
||||||
XEP-0060: Publish-Subscribe
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0060
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0060
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0060.stanza.base
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0060.stanza.pubsub
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0060.stanza.pubsub_errors
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0060.stanza.pubsub_owner
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0060.stanza.pubsub_event
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
@ -1,60 +0,0 @@
|
|||||||
|
|
||||||
XEP-0065: SOCKS5 Bytestreams
|
|
||||||
============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0065
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0065
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0065:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The internal API is used here to authorize or pre-authorize streams.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
authorized_sid (0065 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: :class:`~.Iq` of the stream request.
|
|
||||||
- **returns**: ``True`` if the stream should be accepted,
|
|
||||||
``False`` otherwise.
|
|
||||||
|
|
||||||
Check if the stream should be accepted. Uses
|
|
||||||
the information setup by :term:`preauthorize_sid (0065 version)`
|
|
||||||
by default.
|
|
||||||
|
|
||||||
authorized (0065 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream is from.
|
|
||||||
- **args**: :class:`~.Iq` of the stream request.
|
|
||||||
- **returns**: ``True`` if the stream should be accepted,
|
|
||||||
``False`` otherwise.
|
|
||||||
|
|
||||||
A fallback handler (run after :term:`authorized_sid (0065 version)`)
|
|
||||||
to check if a stream should be accepted. Uses the ``auto_accept``
|
|
||||||
parameter by default.
|
|
||||||
|
|
||||||
preauthorize_sid (0065 version)
|
|
||||||
- **jid**: :class:`~.JID` receiving the stream initiation.
|
|
||||||
- **node**: stream id
|
|
||||||
- **ifrom**: who the stream will be from.
|
|
||||||
- **args**: Unused.
|
|
||||||
|
|
||||||
Register a stream id to be accepted automatically (called from
|
|
||||||
other plugins such as XEP-0095).
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0065.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0066: Out of Band Data
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0066
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0066
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0066.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0070: Verifying HTTP Requests via XMPP
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0070
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0070
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0070.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0071: XHTML-IM
|
|
||||||
==================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0071
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0071
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0071.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
|
|
||||||
XEP-0077: In-Band Registration
|
|
||||||
==============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0077
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0077
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
Internal APi methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The API here is made to allow components to manage registered users.
|
|
||||||
The default handlers make use of the plugin options and store users
|
|
||||||
in memory.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
user_get
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: who the request is coming from
|
|
||||||
- **args**: :class:`~.Iq` registration request.
|
|
||||||
- **returns**: ``dict`` containing user data or None.
|
|
||||||
|
|
||||||
Get user data for a user.
|
|
||||||
|
|
||||||
user_validate
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: who the request is coming from
|
|
||||||
- **args**: :class:`~.Iq` registration request, 'register' payload.
|
|
||||||
- **raises**: ValueError if some fields are invalid
|
|
||||||
|
|
||||||
Validate form fields and save user data.
|
|
||||||
|
|
||||||
user_remove
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: who the request is coming from
|
|
||||||
- **args**: :class:`~.Iq` registration removal request.
|
|
||||||
- **raises**: KeyError if the user is not found.
|
|
||||||
|
|
||||||
Remove a user from the store.
|
|
||||||
|
|
||||||
make_registration_form
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: who the request is coming from
|
|
||||||
- **args**: :class:`~.Iq` registration request.
|
|
||||||
- **raises**: KeyError if the user is not found.
|
|
||||||
|
|
||||||
Return an :class:`~.Iq` reply for the request, with a form and
|
|
||||||
options set. By default, use ``form_fields`` and ``form_instructions``
|
|
||||||
plugin config options.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0077.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0079: Advanced Message Processing
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0079
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0079
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0079.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0080: User Location
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0080
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0080
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0080.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0082: XMPP Date and Time Profiles
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0082
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0082
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0084: User Avatar
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0084
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0084
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0084.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0085: Chat State Notifications
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0085
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0085
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0085.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0086: Error Condition Mappings
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0086
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0086
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0086.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0092: Software Version
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0092
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0092
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0092.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0100: Gateway interaction
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0100
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0100
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0106: JID Escaping
|
|
||||||
======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0106
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0106
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0107: User Mood
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0107
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0107
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0107.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0108: User Activity
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0108
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0108
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0108.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
|||||||
|
|
||||||
XEP-0115: Entity Capabilities
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0115
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0115
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0115:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This internal API extends the Disco internal API, and also manages an
|
|
||||||
in-memory cache of verstring→disco info, and fulljid→verstring.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
cache_caps
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: a ``dict`` containing the verstring and
|
|
||||||
:class:`~.DiscoInfo` payload (
|
|
||||||
``{'verstring': Optional[str], 'info': Optional[DiscoInfo]}``)
|
|
||||||
|
|
||||||
Cache a verification string with its payload.
|
|
||||||
|
|
||||||
get_caps
|
|
||||||
- **jid**: JID to retrieve the verstring for (unused with the default
|
|
||||||
handler)
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: a ``dict`` containing the verstring
|
|
||||||
``{'verstring': str}``
|
|
||||||
- **returns**: The :class:`~.DiscoInfo` payload for that verstring.
|
|
||||||
|
|
||||||
Get a disco payload from a verstring.
|
|
||||||
|
|
||||||
assign_verstring
|
|
||||||
- **jid**: :class:`~.JID` (full) to assign the verstring to
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: a ``dict`` containing the verstring
|
|
||||||
``{'verstring': str}``
|
|
||||||
|
|
||||||
Cache JID→verstring information.
|
|
||||||
|
|
||||||
get_verstring
|
|
||||||
- **jid**: :class:`~.JID` to use for fetching the verstring
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: ``str``, the verstring
|
|
||||||
|
|
||||||
Retrieve a verstring for a JID.
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0115.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0118: User Tune
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0118
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0118
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0118.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0122: Data Forms Validation
|
|
||||||
===============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0122
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0122
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0122.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
|
|
||||||
XEP-0128: Service Discovery Extensions
|
|
||||||
======================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0128
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0128
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0128:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
add_extended_info
|
|
||||||
- **jid**: JID to set the extended info for
|
|
||||||
- **node**: note to set the info at
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: A :class:`~.Form` or list of forms to add to the disco
|
|
||||||
extended info for this JID/node.
|
|
||||||
|
|
||||||
Add extended info for a JID/node.
|
|
||||||
|
|
||||||
set_extended_info
|
|
||||||
- **jid**: JID to set the extended info for
|
|
||||||
- **node**: note to set the info at
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: A :class:`~.Form` or list of forms to set as the disco
|
|
||||||
extended info for this JID/node.
|
|
||||||
|
|
||||||
Set extended info for a JID/node.
|
|
||||||
|
|
||||||
del_extended_info
|
|
||||||
- **jid**: JID to delete the extended info from
|
|
||||||
- **node**: note to delete the info from
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
|
|
||||||
Delete extended info for a JID/node.
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0131: Stanza Headers and Internet Metadata
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0131
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0131
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0131.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0133: Service Administration
|
|
||||||
================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0133
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0133
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0152: Reachability Addresses
|
|
||||||
================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0152
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0152
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0152.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
|
|
||||||
XEP-0153: vCard-Based Avatars
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0153
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0153
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0153:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The internal API is used here to maintain an in-memory JID→avatar hash
|
|
||||||
cache.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
set_hash
|
|
||||||
- **jid**: :class:`~.JID` of whom to retrieve the last activity
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: ``str``, avatar hash
|
|
||||||
|
|
||||||
Set the avatar hash for a JID.
|
|
||||||
|
|
||||||
reset_hash
|
|
||||||
- **jid**: :class:`~.JID` of whom to retrieve the last activity
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: :class:`~.JID` of the entity requesting the reset.
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**
|
|
||||||
information.
|
|
||||||
|
|
||||||
Reset the avatar hash for a JID. This downloads the vcard and computes
|
|
||||||
the hash.
|
|
||||||
|
|
||||||
get_hash
|
|
||||||
- **jid**: :class:`~.JID` of whom to retrieve the last activity
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: unused
|
|
||||||
- **returns**: ``Optional[str]``, the avatar hash
|
|
||||||
|
|
||||||
Get the avatar hash for a JID.
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0153.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0163: Personal Eventing Protocol (PEP)
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0163
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0163
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0172: User Nickname
|
|
||||||
=======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0172
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0172
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0172.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0184: Message Delivery Receipts
|
|
||||||
===================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0184
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0184
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0184.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0186: Invisible Command
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0186
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0186
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0186.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0191: Blocking Command
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0191
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0191
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0191.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0196: User Gaming
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0196
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0196
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0196.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0198: Stream Management
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0198
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0198
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0198.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0199: XMPP Ping
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0199
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0199
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0199.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0202: Entity Time
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0202
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0202
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0202.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0203: Delayed Delivery
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0203
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0203
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0203.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0221: Data Forms Media Element
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0221
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0221
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0221.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0222: Persistent Storage of Public Data via PubSub
|
|
||||||
======================================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0222
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0222
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0223: Persistent Storage of Private Data via PubSub
|
|
||||||
=======================================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0223
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0223
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0224: Attention
|
|
||||||
===================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0224
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0224
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0224.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
|
|
||||||
XEP-0231: Bits of Binary
|
|
||||||
========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0231
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0231
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
.. _api-0231:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The default API handlers for this plugin manage an in-memory cache of
|
|
||||||
bits of binary by content-id.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
set_bob
|
|
||||||
- **jid**: :class:`~.JID` sending the bob
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: :class:`~JID` receiving the bob
|
|
||||||
- **args**: :class:`~.BitsOfBinary` element.
|
|
||||||
|
|
||||||
Set a BoB in the cache.
|
|
||||||
|
|
||||||
get_bob
|
|
||||||
- **jid**: :class:`~.JID` receiving the bob
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: :class:`~JID` sending the bob
|
|
||||||
- **args**: ``str`` content-id of the bob
|
|
||||||
- **returns**: :class:`~.BitsOfBinary` element.
|
|
||||||
|
|
||||||
Get a BoB from the cache.
|
|
||||||
|
|
||||||
del_bob
|
|
||||||
- **jid**: unused
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: :class:`~JID` sending the bob
|
|
||||||
- **args**: ``str`` content-id of the bob
|
|
||||||
|
|
||||||
Delete a BoB from the cache.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0231.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0235: OAuth Over XMPP
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0235
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0235
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0235.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0249: Direct MUC Invitations
|
|
||||||
================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0249
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0249
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0249.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
XEP-0256: Last Activity in Presence
|
|
||||||
===================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0256
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0256
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0257: Client Certificate Management for SASL EXTERNAL
|
|
||||||
=========================================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0257
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0257
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0257.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0258: Security Labels in XMPP
|
|
||||||
=================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0258
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0258
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0258.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0264: Jingle Content Thumbnails
|
|
||||||
===================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0264
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0264
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0264.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0279: Server IP Check
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0279
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0279
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0279.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0280: Message Carbons
|
|
||||||
=========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0280
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0280
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0280.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
XEP-0292: vCard4 Over XMPP
|
|
||||||
==========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0292
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0292
|
|
||||||
:members:
|
|
||||||
:exclude-members: plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0292.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0297: Stanza Forwarding
|
|
||||||
===========================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0297
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0297
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0297.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0300: Use of Cryptographic Hash Functions in XMPP
|
|
||||||
=====================================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0300
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0300
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0300.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0308: Last Message Correction
|
|
||||||
=================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0308
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0308
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0308.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
|||||||
|
|
||||||
XEP-0313: Message Archive Management
|
|
||||||
====================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0313
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0313
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0313.stanza
|
|
||||||
:members:
|
|
||||||
:member-order: bysource
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0317: Hats
|
|
||||||
==============
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0317
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0317
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0317.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
|||||||
|
|
||||||
XEP-0319: Last User Interaction in Presence
|
|
||||||
===========================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0319
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0319
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
.. _api-0319:
|
|
||||||
|
|
||||||
Internal API methods
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The default API manages an in-memory cache of idle periods.
|
|
||||||
|
|
||||||
.. glossary::
|
|
||||||
|
|
||||||
set_idle
|
|
||||||
- **jid**: :class:`~.JID` who has been idling
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: :class:`datetime`, timestamp of the idle start
|
|
||||||
|
|
||||||
Set the idle start for a JID.
|
|
||||||
|
|
||||||
get_idle
|
|
||||||
- **jid**: :class:`~.JID` to get the idle time of
|
|
||||||
- **node**: unused
|
|
||||||
- **ifrom**: unused
|
|
||||||
- **args**: : unused
|
|
||||||
- **returns**: :class:`datetime`
|
|
||||||
|
|
||||||
Get the idle start timestamp for a JID.
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0319.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
XEP-0332: HTTP over XMPP transport
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0332
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0332
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0332.stanza.data
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0332.stanza.request
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0332.stanza.response
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0333: Chat Markers
|
|
||||||
======================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0333
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0333
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0333.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
|
|
||||||
XEP-0334: Message Processing Hints
|
|
||||||
==================================
|
|
||||||
|
|
||||||
.. module:: slixmpp.plugins.xep_0334
|
|
||||||
|
|
||||||
.. autoclass:: XEP_0334
|
|
||||||
:members:
|
|
||||||
:exclude-members: session_bind, plugin_init, plugin_end
|
|
||||||
|
|
||||||
|
|
||||||
Stanza elements
|
|
||||||
---------------
|
|
||||||
|
|
||||||
.. automodule:: slixmpp.plugins.xep_0334.stanza
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user