{"id":24020659,"url":"https://github.com/dinothor/pyjabber","last_synced_at":"2025-07-01T03:37:04.240Z","repository":{"id":271520564,"uuid":"788912552","full_name":"DinoThor/PyJabber","owner":"DinoThor","description":"A Python XMPP server","archived":false,"fork":false,"pushed_at":"2025-06-13T11:45:34.000Z","size":2159,"stargazers_count":6,"open_issues_count":4,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-13T12:44:44.117Z","etag":null,"topics":["async","ejabberd","openfire","prosody","python3","xmpp","xmpp-server"],"latest_commit_sha":null,"homepage":"https://pyjabber.readthedocs.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DinoThor.png","metadata":{"files":{"readme":"README.rst","changelog":"HISTORY.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.rst","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-04-19T10:33:29.000Z","updated_at":"2025-05-26T08:49:30.000Z","dependencies_parsed_at":"2025-01-08T09:32:56.456Z","dependency_job_id":"c159ff7f-c94c-4e36-ac7a-f387bc478d44","html_url":"https://github.com/DinoThor/PyJabber","commit_stats":null,"previous_names":["dinothor/pyjabber"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/DinoThor/PyJabber","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DinoThor%2FPyJabber","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DinoThor%2FPyJabber/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DinoThor%2FPyJabber/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DinoThor%2FPyJabber/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DinoThor","download_url":"https://codeload.github.com/DinoThor/PyJabber/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DinoThor%2FPyJabber/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262889942,"owners_count":23380335,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","ejabberd","openfire","prosody","python3","xmpp","xmpp-server"],"created_at":"2025-01-08T12:18:19.982Z","updated_at":"2025-07-01T03:37:04.214Z","avatar_url":"https://github.com/DinoThor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"========\nPyJabber\n========\n\n.. image:: https://img.shields.io/pypi/v/pyjabber.svg\n        :target: https://pypi.org/project/pyjabber/\n\n.. image:: https://img.shields.io/badge/python-3.8%20to%203.12-orange?logo=python\u0026logoColor=green\n        :alt: Python 3.8 to 3.12\n\n.. image:: https://img.shields.io/github/actions/workflow/status/dinothor/pyjabber/python-app.yml\n        :target: https://github.com/DinoThor/PyJabber/actions\n        :alt: Build Status\n\n.. image:: https://coveralls.io/repos/github/DinoThor/PyJabber/badge.svg?branch=master\n        :target: https://coveralls.io/github/DinoThor/PyJabber?branch=master\n        :alt: Coverage Status\n\n.. image:: https://tokei.rs/b1/github/dinothor/pyjabber\n        :alt: Code lines counter\n\n.. image:: https://readthedocs.org/projects/pyjabber/badge/?version=latest\n        :target: https://pyjabber.readthedocs.io/en/latest/?version=latest\n        :alt: Documentation Status\n\n.. image:: https://img.shields.io/pypi/dm/pyjabber\n        :target: https://www.pepy.tech/projects/pyjabber\n        :alt: Monthly downloads\n\n.. image:: https://img.shields.io/pepy/dt/pyjabber\n        :target: https://www.pepy.tech/projects/pyjabber\n        :alt: Total downloads\n\n\n\n|\n| PyJabber is a server for Jabber/XMPP entirely written in Python, with minimal reliance on external libraries.\n| It strives to provide a simple, lightweight, and comprehensible codebase, featuring a modular structure that\n        facilitates extension through the implementation of necessary XEPs for specific use cases.\n| While initially designed to fulfill the requirements of the multi-agent system `SPADE \u003chttps://github.com/javipalanca/spade\u003e`_, it can be easily customized to suit any other purpose.\n|\n\n* Free software: MIT license\n* Documentation: https://pyjabber.readthedocs.io.\n\n------------\nInstallation\n------------\n.. code-block::\n\n        pip install pyjabber\n\n-----------\nQuick start\n-----------\n\nPython program\n--------------\n\nThe process of starting the server returns a coroutine, leaving it to the user to set up the required environment. The simplest approach is to use the ``asyncio.run`` function.\n\n.. code-block:: python\n\n    from pyjabber import Server\n\n    my_server = Server()\n    asyncio.run(my_server.start())\n\nThis allows PyJabber to be treated as a regular task and integrated seamlessly into an asynchronous application.\n\n.. code-block:: python\n\n    import asyncio\n    from pyjabber.server import Server\n\n    async def counter():\n      while True:\n        await asyncio.sleep(1)\n        print(f\"Hello World\")\n\n    async def launch():\n      my_server = Server()\n      await asyncio.gather(my_server.start(), counter())\n\n    asyncio.run(launch())\n\nCLI\n---\nThe CLI launcher provides access to all the configuration options available in the programmatic version (when launched from a Python script).\n\n\n.. code-block:: python\n\n\n        $ pyjabber --help\n\n\n.. code-block::\n\n\n       Usage: python -m pyjabber [OPTIONS]\n\n        Options:\n          --host TEXT                Host name  [default: localhost]\n          --client_port INTEGER      Server-to-client port  [default: 5222]\n          --server_port INTEGER      Server-to-server port  [default: 5269]\n          --server_out_port INTEGER  Server-to-server port (Out coming connection)\n                                     [default: 5269]\n          --family [ipv4|ipv6]       (ipv4 / ipv6)  [default: ipv4]\n          --timeout INTEGER          Timeout for connection  [default: 60]\n          --database_path TEXT       Path for database file  [default: */pyjabber.db]\n          --database_purge           Restore database file to default state (empty)\n          --database_in_memory       Database in memory. The data will be erased after\n                                     server shutdown\n          --message_persistence      Keep the unsent messages in memory waiting for\n                                     the receiver client to connect\n          -v, --verbose              Show verbose debug level: -v INFO -vv DEBUG, -vvv\n                                     level TRACE,\n          --log_path TEXT            Path to log dumpfile\n          -D, --debug                Enables debug mode in Asyncio\n          --help                     Show this message and exit.\n\n\nAnd to launch a default profile\n\n.. code-block::\n\n\n        $ pyjabber\n\n\n.. code-block::\n\n        2024-12-18 09:03:22.880 - INFO: Starting server...\n        2024-12-18 09:03:22.881 - INFO: Client domain =\u003e localhost\n        2024-12-18 09:03:22.881 - INFO: Server is listening clients on [('127.0.0.1', 5222), ('158.42.155.44', 5222)]\n        2024-12-18 09:03:22.881 - INFO: Serving admin webpage on http://localhost:9090\n        2024-12-18 09:03:22.881 - INFO: Server is listening servers on [('0.0.0.0', 5269)]\n        2024-12-18 09:03:22.881 - INFO: Server started...\n\nFeatures\n--------\n\n.. list-table::\n   :widths: 25 25 50\n   :header-rows: 1\n\n   * -\n     - Status\n     - Description\n   * - TLS\n     - Implemented\n     - v1.3. Localhost certificate included\n   * - SASL\n     - Implemented\n     - PLAIN, EXTERNAL (s2s)\n   * - Roster\n     - Implemented\n     - CRUD avaliable\n   * - Presence\n     - Implemented (local bound)\n     - Subscribe, Unsubscribed, Initial presence and Unavailable\n\nPlugins\n-------\n.. list-table::\n   :widths: 25 25 50\n   :header-rows: 1\n\n   * -\n     - Status\n     - Description\n   * - `XEP-0004 \u003chttps://xmpp.org/extensions/xep-0004.html\u003e`_\n     - IMPLEMENTED\n     - Dataforms\n   * - `XEP-0030 \u003chttps://xmpp.org/extensions/xep-0030.html\u003e`_\n     - IMPLEMENTED\n     - Service Discovery\n   * - `XEP-0060 \u003chttps://xmpp.org/extensions/xep-0077.html\u003e`_\n     - IMPLEMENTED\n     - Pubsub\n   * - `XEP-0077 \u003chttps://xmpp.org/extensions/xep-0077.html\u003e`_\n     - IMPLEMENTED\n     - In Band Registration\n   * - `XEP-0199 \u003chttps://xmpp.org/extensions/xep-0199.html\u003e`_\n     - IMPLEMENTED\n     - Ping\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinothor%2Fpyjabber","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdinothor%2Fpyjabber","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdinothor%2Fpyjabber/lists"}