В кардинале для этого есть state машина, которая каждой кнопке дает стейт. Т.е. юзер жмет кнопку отправить ключ, на этой кнопке весит state = “sending_key”, то автоматически к следующему сообщению будет применен этот state. Но это долго муторно и не удобно.
В библиотеке для telegram бота, существует прекрасный способ декорировать любую функцию под ваши нужды:
from telebot.types import InlineKeyboardMarkup as K, InlineKeyboardButton as Bimport tg_bot.CBT as CBTdef init_cardinal(cardinal: Cardinal): bot = cardinal.telegram.bot # 1. Регистрация команд в меню /help Telegram-бота cardinal.add_telegram_commands(UUID, [ ("mycmd", "Описание команды плагина", True) ]) # 2. Обработчик текстовой команды @bot.message_handler(commands=["mycmd"]) def cmd_mycmd(m): kb = K() # ВАЖНО: всегда добавляйте префикс UUID в callback_data, чтобы не пересекаться с другими плагинами! kb.add(B("🟢 Нажми меня", callback_data=f"{UUID}:my_action")) bot.send_message(m.chat.id, "Привет! Это меню моего плагина.", reply_markup=kb) # 3. Обработчик callback-кнопок плагина @bot.callback_query_handler(func=lambda c: c.data.startswith(f"{UUID}:")) def handle_callbacks(c): if c.data == f"{UUID}:my_action": bot.answer_callback_query(c.id, "Кнопка нажата!") bot.send_message(c.message.chat.id, "Действие выполнено ✅") # 4. Обработчик кнопки «Настройки» в общем списке плагинов бота @bot.callback_query_handler(func=lambda c: c.data.startswith(f"{CBT.PLUGIN_SETTINGS}:{UUID}") or c.data == f"{UUID}:0") def open_plugin_settings(c): bot.send_message(c.message.chat.id, "Главное меню плагина:")
Полная информация о заказе
(Весь объект заказа со всеми полями ниже)order = cardinal.account.get_order(order_id="ABC12345")print(order.price) # Цена (float)print(order.buyer_username) # Ник покупателя (str)print(order.status) # OrderStatus.PAID / CLOSED / REFUNDEDprint(order.chat_id) # ID чата с покупателем
Возврат средств покупателю
try: cardinal.account.refund(order_id="ABC12345") cardinal.send_message(chat_id, "✅ Средства успешно возвращены.")except Exception as e: logger.error(f"Не удалось сделать возврат: {e}")
Управление лотами
# 1. Получаем текущие поля лотаlot_fields = cardinal.account.get_lot_fields(lot_id=12345678)# 2. Меняем нужные свойстваlot_fields.active = False # True = включить, False = выключить лотlot_fields.price = 199.0 # Новая цена лота# 3. Сохраняем изменения на FunPaycardinal.account.save_lot(lot_fields)
Получение списка лотов в категории
# Получить все свои активные/неактивные лоты конкретной подкатегории (например, Telegram Stars):lots = cardinal.account.get_my_subcategory_lots(subcategory_id=2418)for lot in lots: print(lot.id, lot.title, lot.price, lot.active)