Skip to main content

Асинхронная библиотека для NovCord Bot API в стиле aiogram (import novcord)

Project description

novcord — Python-библиотека для NovCord Bot API

Асинхронная библиотека для написания ботов NovCord. API в стиле aiogram: Dispatcher/Router, декораторы-хендлеры, magic-filter F, InlineKeyboardBuilder, лёгкий FSM.

Боты хостятся тобой: запускаешь скрипт на своём ПК/сервере — бот работает, пока скрипт запущен (как у Telegram). Сервер NovCord только отдаёт Bot API.

Установка

pip install novcord-bot

Ставится как novcord-bot, а в коде импортируется как import novcord (дефис в импортах Python недопустим). Зависимость — только aiohttp.

Пока пакет не опубликован в PyPI — ставь локально из этой папки:

cd novcord-python
pip install .

Публикация в PyPI (чтобы заработал глобальный pip install novcord-bot) описана в PUBLISHING.md.

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

import asyncio
from novcord import Bot, Dispatcher, Router, F
from novcord.filters import Command
from novcord.keyboard import InlineKeyboardBuilder

dp = Dispatcher()
router = Router()
dp.include_router(router)

@router.message(Command("start"))
async def start(message):
    kb = InlineKeyboardBuilder()
    kb.button(text="Кнопка", callback_data="hi")
    kb.button(text="Сайт", url="https://novcord.online")
    await message.answer("Привет!", reply_markup=kb.as_markup())

@router.callback_query(F.data == "hi")
async def hi(query):
    await query.answer("Нажато!")
    await query.message.answer("Спасибо за нажатие 👍")

@router.message(F.text)
async def echo(message):
    await message.answer(message.text)

async def main():
    bot = Bot("ТВОЙ_ТОКЕН")   # токен из Настройки → Мои боты
    await dp.start_polling(bot)

asyncio.run(main())

Токен берётся в приложении: Настройки → Мои боты → создать бота → скопировать токен.

Локальный сервер

bot = Bot("ТОКЕН", base_url="http://localhost:3008")

Фильтры

Запись Что значит
Command("start") сообщение /start/start аргументы)
F.text у сообщения непустой текст
F.text.startswith("/") текст начинается с /
F.text.contains("foo") текст содержит foo
F.data == "a" у callback data == "a"
F.data.in_({"a", "b"}) data в наборе
MyStates.waiting текущее состояние FSM

Несколько фильтров в одном декораторе = И (все должны пройти):

@router.message(Command("admin"), F.text.contains("secret"))
async def h(message): ...

Inline-клавиатура

kb = InlineKeyboardBuilder()
kb.button(text="A", callback_data="a")
kb.button(text="B", callback_data="b")
kb.button(text="Сайт", url="https://novcord.online")
kb.adjust(2, 1)          # 2 кнопки в первом ряду, 1 во втором
markup = kb.as_markup()

FSM (пошаговые диалоги)

from novcord.fsm import State, StatesGroup

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

@router.message(Command("form"))
async def start(message, state):       # state инжектится автоматически
    await state.set_state(Form.name)
    await message.answer("Имя?")

@router.message(Form.name)
async def got_name(message, state):
    await state.update_data(name=message.text)
    await state.set_state(Form.age)
    await message.answer("Возраст?")

@router.message(Form.age)
async def got_age(message, state):
    data = await state.update_data(age=message.text)
    await state.clear()
    await message.answer(f"{data['name']}, {data['age']}")

Хендлер может принимать state (FSMContext) и/или bot — они подставляются по имени параметра.

Методы Bot

Метод Описание
get_me() инфо о боте
send_message(chat_id, text, reply_markup=, reply_to_message_id=) текст
send_photo(chat_id, photo=путь | file_url=, caption=, reply_markup=) фото
send_document(chat_id, document=путь | file_url=, caption=) файл
edit_message_text(chat_id, message_id, text, reply_markup=) редактировать
delete_message(chat_id, message_id) удалить
answer_callback_query(id, text=, show_alert=) ответ на нажатие
set_my_commands([("start","Запуск")]) список команд
get_my_commands() получить команды

Про chat_id: это id ПОЛЬЗОВАТЕЛЯ (message.from_user.id), не id диалога. Шорткаты message.answer() / callback.message.answer() подставляют его сами — вручную думать об этом не нужно.

Шорткаты

  • message.answer(text) — ответить в тот же чат
  • message.reply(text) — ответить с цитированием
  • message.answer_photo(...), message.answer_document(...)
  • message.edit_text(...), message.delete()
  • callback.answer(text) — подтвердить нажатие
  • callback.message — сообщение, под которым была кнопка

Примеры

  • examples/echo_bot.py — эхо + inline-кнопки
  • examples/fsm_bot.py — пошаговая анкета (FSM)

Ограничения v1

  • Только личные сообщения (DM). Серверные каналы — позже.
  • answer_callback_query подтверждает нажатие (всплывающий тост в UI — на будущее); отвечай на нажатия обычным message.answer / edit_text.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

novcord_bot-0.1.0.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

novcord_bot-0.1.0-py3-none-any.whl (16.3 kB view details)

Uploaded Python 3

File details

Details for the file novcord_bot-0.1.0.tar.gz.

File metadata

  • Download URL: novcord_bot-0.1.0.tar.gz
  • Upload date:
  • Size: 17.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for novcord_bot-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0c98e482b40fd94af9e66c50a66ca403e2ede4766eeaee74d17e4061d1941c45
MD5 7d87efb4e2d9446415feb28d7d0129c9
BLAKE2b-256 734055ddb6c10fefb95c7594b7b1d34d69877faf01f05218d5ebb92596ef7206

See more details on using hashes here.

File details

Details for the file novcord_bot-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: novcord_bot-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for novcord_bot-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 037fddf5f5984772b57e31800b2589a23f9e38482d60839360c288cb0a98dee5
MD5 c490788989b8be8ca2834d755ec3dfd1
BLAKE2b-256 82eeeebf915b75397247fed07a454c6f71467230e56fe18186678dad39cfaa34

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page