Metadata-Version: 2.4
Name: reasonspace-bot
Version: 0.1.0
Summary: Официальный Python SDK для платформы ботов Reason Space (decorator-framework + REST-клиент + HMAC-verify webhook receiver).
Project-URL: Homepage, https://reasonspace.ru
Project-URL: Documentation, https://docs.reasonspace.ru
Project-URL: Source, https://gitlab.data.sandboxer.ru/products/reason-space/reasonspace-bot-sdk
Author-email: Reason Space <dev@reasonspace.ru>
License: MIT
Keywords: bot,chat,reasonspace,sdk
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Communications :: Chat
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: httpx>=0.27
Requires-Dist: starlette>=0.37
Provides-Extra: dev
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: uvicorn>=0.30; extra == 'dev'
Provides-Extra: server
Requires-Dist: uvicorn>=0.30; extra == 'server'
Description-Content-Type: text/markdown

# reasonspace-bot

Официальный Python SDK для платформы ботов **Reason Space**: decorator-framework
для приёма webhook-событий + async REST-клиент + проверка HMAC-подписи.

```bash
pip install reasonspace-bot
```

## Minimal bot

```python
from reasonspace_bot import Bot, MessageCreatedEvent

bot = Bot()  # читает BOT_TOKEN + WEBHOOK_SECRET из env

@bot.on("message.created")
async def on_message(event: MessageCreatedEvent) -> None:
    if event.author_is_bot:
        return
    if event.plain_command == "/ping":
        await bot.send_message(event.channel_id, "🏓 pong", space_id=event.space_id)

if __name__ == "__main__":
    bot.run(port=8765)
```

## Env

| Var | Назначение |
|---|---|
| `BOT_TOKEN` | `bot_<48hex>` — токен бота (обязателен) |
| `WEBHOOK_SECRET` | секрет вебхука; пусто = dev-mode без verify (**обязателен в prod**) |
| `REASONSPACE_API` | базовый URL API (по умолчанию `https://api.reasonspace.ru`) |

## Что внутри

- `Bot` — `@bot.on("<event.type>")`, встроенный ASGI-app `bot.app` (`/webhook` + `/`,
  авто HMAC-verify, дедуп по `X-Reasonspace-Delivery`, упавший хендлер не валит доставку).
- `BotClient` — `send_message`, `list_messages`, `add_reaction`, `delete_message`,
  `list_members`, `list_roles`, `kick_member`, `mute_member`, `voice_join`,
  `voice_overview`. Уважает `Retry-After`.
- Типизированные события: `MessageCreatedEvent`, `MemberJoinedEvent`,
  `VoiceJoinedEvent`, … Неизвестный type → generic `BotEvent` (старый код не падает).
- `verify_signature(secret, body, header)` — если делаете свой receiver.

## Prod

```bash
gunicorn bot:bot.app --workers 4 --worker-class uvicorn.workers.UvicornWorker
```

Документация: <https://docs.reasonspace.ru>
