Metadata-Version: 2.5
Name: safesubs
Version: 1.0.1
Summary: Клиент SafeMembers: проверка обязательных подписок в Telegram-ботах (с готовым middleware для aiogram 3)
Project-URL: Homepage, https://github.com/PGSAVE/safemembers
Project-URL: Repository, https://github.com/PGSAVE/safemembers
Author-email: PGSAVE <i@sxve.it>
License: MIT
Requires-Python: >=3.10
Requires-Dist: aiohttp>=3.9
Provides-Extra: aiogram
Requires-Dist: aiogram<4,>=3.0; extra == 'aiogram'
Description-Content-Type: text/markdown

# safesubs

Клиент сервиса [SafeMembers](https://github.com/PGSAVE/safemembers)   проверка обязательных
подписок (свои каналы + SubGram + Flyer) в Telegram-ботах.

```
pip install safesubs
```

## aiogram 3   одна строка

```python
from safesubs import SafeSubs
from safesubs.aiogram import setup

subs = SafeSubs("sm_ваш_ключ", api_url="https://subs.example.com")

setup(dp, subs)
```

Middleware сам показывает пользователю кнопки "Подписаться" и "✅ Проверить", обрабатывает
нажатие "Проверить" и пропускает подписанных дальше. Тексты настраиваются параметрами:

```python
setup(
    dp,
    subs,
    text="Для продолжения подпишитесь на каналы:",
    check_button="✅ Проверить",
    not_yet_text="Вы подписались не на всё",
    ok_text="Спасибо! Продолжайте",
    only_private=True,  # в группах не проверять
    skip=lambda event: False,  # свои исключения (например, команда /help)
)
```

Точечная проверка в отдельных хендлерах   фильтр:

```python
from safesubs.aiogram import SubscriptionFilter


@dp.message(Command("download"), SubscriptionFilter(subs))
async def download(message): ...
```

## Любой фреймворк

```python
result = await subs.check(user_id, language_code="ru")
if result.status:
    ...  # подписан на всё
else:
    for link in result.links:
        print(link.text, link.url)  # нарисуйте кнопки + кнопку "Проверить", по ней снова вызовите check()
```

Положительные ответы кэшируются локально на `cache_ttl` минут (значение приходит от сервера).
При недоступности сервера клиент по умолчанию **пропускает** пользователя (`fail_open=True`).

REST-API без библиотеки: `POST {api_url}/v1/check`, заголовок `Authorization: Bearer <key>`,
тело `{"user_id": 123}` → `{"status": true|false, "cache_ttl": 1440, "links": [...]}`.
