Metadata-Version: 2.4
Name: onemix-bot
Version: 2.0.3
Summary: Async Python SDK for building bots on the ONEMIX messenger platform (aiogram-style)
Home-page: https://github.com/onemix/bot-sdk-python
Author: ONEMIX Team
Author-email: support@itpaxlive.ru
Keywords: onemix bot messenger api sdk async aiogram
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.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Communications :: Chat
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.24.0
Provides-Extra: legacy
Requires-Dist: requests>=2.25.0; extra == "legacy"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# ONEMIX Bot SDK

Асинхронная Python-библиотека для создания ботов в мессенджере **ONEMIX**.
API намеренно повторяет [aiogram 3.x](https://docs.aiogram.dev/) — если вы
писали ботов для Telegram, здесь всё знакомо.

## Установка

```bash
pip install onemix-bot
```

## Получение токена

Откройте чат с **BotFather** в ONEMIX, отправьте `/newbot`, задайте имя и
username — получите токен. Токен также доступен по команде `/token`.

## Быстрый старт

```python
import asyncio
from onemix_bot import Bot, Dispatcher
from onemix_bot.filters import Command, CommandStart, F
from onemix_bot.types import Message, InlineKeyboardBuilder

bot = Bot(token="ВАШ_ТОКЕН", api_url="https://api.onemix.me")
dp = Dispatcher()


@dp.message(CommandStart())
async def start(message: Message):
    kb = InlineKeyboardBuilder()
    kb.button(text="📖 Помощь", callback_data="help")
    kb.button(text="🌐 Сайт", url="https://onemix.me")
    kb.adjust(2)
    await message.answer(
        f"Привет, {message.from_user.full_name}! Я бот на ONEMIX.",
        reply_markup=kb.as_markup(),
    )


@dp.message(Command("help"))
async def help_handler(message: Message):
    await message.answer("Команды: /start, /help")


@dp.message(F.text)
async def echo(message: Message):
    await message.answer(f"Вы написали: {message.text}")


if __name__ == "__main__":
    dp.run_polling(bot)
```

## Фильтры

```python
from onemix_bot.filters import Command, CommandStart, Text, F

@dp.message(CommandStart())            # /start
@dp.message(Command("help", "info"))   # /help или /info
@dp.message(Text("привет"))            # точное совпадение текста
@dp.message(F.text)                    # любое текстовое сообщение
@dp.message(F.text.startswith("/"))    # текст, начинающийся с /
@dp.message(F.text.contains("ошибка")) # содержит подстроку
@dp.message(F.text.regexp(r"\d{4}"))   # совпадение по регулярке
```

Фильтры комбинируются через `&` и `|`:

```python
@dp.message(F.text.startswith("куп") & F.text.contains("билет"))
async def buy(message: Message):
    ...
```

## Инлайн-клавиатуры

```python
from onemix_bot.types import InlineKeyboardMarkup, InlineKeyboardButton, InlineKeyboardBuilder

# через билдер
kb = InlineKeyboardBuilder()
kb.button(text="Да", callback_data="yes")
kb.button(text="Нет", callback_data="no")
kb.adjust(2)                       # 2 кнопки в ряд
await message.answer("Подтвердить?", reply_markup=kb.as_markup())

# вручную
markup = InlineKeyboardMarkup(inline_keyboard=[
    [InlineKeyboardButton(text="Открыть сайт", url="https://onemix.me")],
])
```

## Конечный автомат (FSM)

```python
from onemix_bot.filters import Command
from onemix_bot.fsm import State, StatesGroup, FSMContext, StateFilter
from onemix_bot.types import Message


class Form(StatesGroup):
    name = State()
    age = State()


@dp.message(Command("form"))
async def form_start(message: Message, state: FSMContext):
    await state.set_state(Form.name)
    await message.answer("Как тебя зовут?")


@dp.message(StateFilter(Form.name))
async def form_name(message: Message, state: FSMContext):
    await state.update_data(name=message.text)
    await state.set_state(Form.age)
    await message.answer("Сколько тебе лет?")


@dp.message(StateFilter(Form.age))
async def form_age(message: Message, state: FSMContext):
    data = await state.update_data(age=message.text)
    await state.clear()
    await message.answer(f"Готово! Имя: {data['name']}, возраст: {data['age']}")
```

## Роутеры

Раскладывайте хэндлеры по модулям, как в aiogram:

```python
# handlers/payments.py
from onemix_bot import Router
from onemix_bot.filters import Command

router = Router()

@router.message(Command("pay"))
async def pay(message):
    await message.answer("Оплата...")

# main.py
from onemix_bot import Dispatcher
from handlers import payments

dp = Dispatcher()
dp.include_router(payments.router)
```

## Команды бота (автоподсказки `/`)

```python
@dp.startup
async def on_start(bot: Bot):
    await bot.set_commands([
        {"command": "start", "description": "Запустить бота"},
        {"command": "help", "description": "Помощь"},
    ])
```

После этого команды показываются автоподсказками при вводе `/` в чате с ботом.

## API-методы

```python
me = await bot.get_me()
await bot.send_message(chat_id, "текст", reply_markup=..., parse_mode="markdown")
updates = await bot.get_updates()
await bot.set_commands([...])
```

## Простой синхронный клиент (legacy)

Для несложных ботов доступен синхронный класс без async:

```python
from onemix_bot.legacy import OnemixBot

bot = OnemixBot(token="ВАШ_ТОКЕН", api_url="https://api.onemix.me")

@bot.command("start")
def on_start(msg):
    bot.reply(msg, "Привет!")

bot.run()
```

## Лицензия

MIT
