mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-15 18:57:08 +00:00
e63c403623
* docs: simplex-chat-python design and implementation plan * bots: Python wire types codegen * simplex-chat-python: package scaffold * simplex-chat-python: native libsimplex loader * simplex-chat-python: async FFI wrappers * simplex-chat-python: ChatApi with 49 api methods * simplex-chat-python: Bot class with decorators and dispatch * simplex-chat-python: install CLI, example bot, README * simplex-chat-python: audit fixes * bots: regenerate API docs and types Catches up the markdown, TypeScript and Python codegen outputs with two upstream schema changes: - APIConnectPlan.connectionLink became optional (from sh/python-lib audit fixes); cmdString and EBNF syntax now reflect optional parameter. - APIAddGroupRelays command and CRGroupRelaysAdded/CRGroupRelaysAddFailed responses added in #6917 (relay management). The TS and markdown outputs were regenerated when #6917 landed but the Python types module only got the new entries with this regeneration. * core: refresh SQLite query plans after relay_inactive_at migration The M20260507_relay_inactive_at migration (#6917 / #6952) shifted the query plans that 'Save query plans' verifies. Regenerated via the test that owns those snapshots; no behavioral change. * bots: keep APIConnectPlan connectionLink as required parameter The prior audit-fixes commit changed the syntax expression to `Optional ...` because the Haskell field is `connectionLink :: Maybe AConnectionLink`. That misrepresents the API contract: the `Maybe` is purely an internal signal for link-parsing failure (the handler returns `CEInvalidConnReq` on `Nothing`), not API-level optionality. Callers MUST always pass a connection link. Revert the syntax expression to `Param "connectionLink"` and add a comment so the intent is preserved next time someone audits. Regenerates COMMANDS.md, commands.ts and _commands.py to match.
53 lines
1.2 KiB
Python
53 lines
1.2 KiB
Python
"""Squaring bot — replies to every number with its square.
|
|
|
|
Run with the simplex-chat package installed:
|
|
|
|
python examples/squaring_bot.py
|
|
|
|
Sends `n * n = ...` for any text message that parses as a number; falls
|
|
back to a hint for non-number messages; responds to `/help` with usage.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
|
|
from simplex_chat import (
|
|
Bot,
|
|
BotCommand,
|
|
BotProfile,
|
|
Message,
|
|
ParsedCommand,
|
|
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.",
|
|
commands=[BotCommand(keyword="help", label="Show help")],
|
|
)
|
|
|
|
NUMBER_RE = re.compile(r"^-?\d+(\.\d+)?$")
|
|
|
|
|
|
@bot.on_message(content_type="text", text=NUMBER_RE)
|
|
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.")
|
|
|
|
|
|
@bot.on_command("help")
|
|
async def help_cmd(msg: Message, _cmd: ParsedCommand) -> None:
|
|
await msg.reply("Send a number, I'll square it.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
bot.run()
|