mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-27 22:18:36 +00:00
The 12 new /name commands and 8 responses were in none of the docs lists, and APINameAddress/CRNameAddress outlived their constructors. Added alongside APINameRegister, which set the precedent. Also regenerates TYPES.md and the TS/Python types, stale since CENameRegistrationFailed gained nameRegRetryAfter. APINameSetLink now signs through signSnrcIntent, so "the only bridge to the wallet" is enforced rather than documented. tokenId is dropped and setTextTypeString unexported, both without callers. nameKeyOf no longer reads the bound account: the path is literal, so the binding never affected which key came back. The mock's idempotent is one transaction, and a buy with no link stores no link rather than an empty one. ownedNames stays device-wide, now with the reason on it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
SimpleX Chat Python library
Python 3.11+ client for SimpleX Chat bots. Equivalent to the Node.js library.
Install
pip install simplex-chat
The native libsimplex is downloaded lazily on first use. To pre-fetch:
python -m simplex_chat install # sqlite (default)
python -m simplex_chat install --backend postgres # linux-x86_64 only
Quick start
import re
from simplex_chat import Bot, BotProfile, Message, SqliteDb, TextMessage
bot = Bot(
profile=BotProfile(display_name="Squaring bot"),
db=SqliteDb(file_prefix="./squaring_bot"),
welcome="Send me a number, I'll square it.",
)
@bot.on_message(content_type="text", text=re.compile(r"^-?\d+(\.\d+)?$"))
async def square(msg: TextMessage) -> None:
n = float(msg.text or "0")
await msg.reply(f"{n} * {n} = {n * n}")
@bot.on_message(content_type="text")
async def fallback(msg: Message) -> None:
await msg.reply("Send me a number, like 7 or 3.14.")
if __name__ == "__main__":
bot.run()
bot.run() blocks. The connection address is logged on startup — paste it into a SimpleX client to talk to the bot. Ctrl+C to stop.
Three decorators: @bot.on_message(...), @bot.on_command(name), @bot.on_event(tag). Message handlers are first-match-wins in registration order, so register specific filters first and catch-alls last.
See examples/squaring_bot.py for the full example.
Development
uv venv && source .venv/bin/activate
uv pip install -e '.[dev]'
ruff check && pyright && pytest tests/
Wire types under src/simplex_chat/types/_*.py are generated. Regenerate with cabal test simplex-chat-test --test-options='--match Python'.
Release
Manual for now. Bump _version.py:__version__, build a wheel, upload to PyPI:
uv build --wheel
uv publish --token "$PYPI_TOKEN"