Не вызываются зарегистрированные хэндлеры(

Рейтинг: 0Ответов: 1Опубликовано: 03.03.2023

Бизнес телеграм бот, в приведенном коде, когда пишешь в тг загрузить, он ничего не делает, хотя по логике должен передавать кажое смс последовательно. Что делать? Я новичок, поэтому лучше посмотрите на код пж)

from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher.filters import Text
from aiogram import types, Dispatcher
from create_bot import dp, bot
from data_base import sqlite_db
from keyboards import admin_kb
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton


ID = None


class FSMadmin(StatesGroup):
    photo = State()
    name = State()
    description = State()
    price = State()


# Получаем ID текущего модератора
# @dp.message_handler(commands=['moderator'], is_chat_admin=True)
async def make_changes_command(message: types.Message):
    global ID
    ID = message.from_user.id
    await bot.send_message(message.from_user.id, "Что надо???", reply_markup=admin_kb.button_case_admin)
    await message.delete()


# Начало диалога загрузки нового пункта меню
# @dp.message_handler(commands= 'Загрузить', state=None)
async def cm_start(message: types.Message):
    if message.from_user.id == ID:
        await FSMadmin.photo.set()
        await message.reply("Загрузи фото")

# Выход из состояния
# @dp.message_handler(state="*", commands="отмена")
# @dp.message_handler(Text(equals="отмена", ignare_case=True),state="*")
async def cancel_handler(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        current_state = await  state.get_state()
        if current_state is None:
            return
        await state.finish()
        await message.reply('OK')

# Ловим 1ый ответ и пишем в словарь
# @dp.message_handler(content_types=['photo'], state=FSMadmin.photo)
async def load_photo(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['photo'] = message.photo[0].file_id
        await FSMadmin.next()
        await message.reply("Теперь введи название")


# Ловим второй ответ
# @dp.message_handler(state=FSMadmin.name)
async def load_name(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['name'] = message.text
        await FSMadmin.next()
        await message.reply("Введи описание")


# Ловим третий ответ
# @dp.message_handler(state=FSMadmin.description)
async def load_description(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['description'] = message.text
        await FSMadmin.next()
        await message.reply("Теперь укажи цену")


# Ловим последний ответ и используем полученные данные
# @dp.message_handler(state=FSMadmin.price)
async def load_price(message: types.Message, state: FSMContext):
    if message.from_user.id == ID:
        async with state.proxy() as data:
            data['price'] = float(message.text)
        # async with state.proxy() as data:
        #     await message.reply(str(data))
        await sqlite_db.sql_add_command(state)
        await state.finish()

@dp.callback_query_handler(lambda x: x.data and x.data.startswith('del '))
async def del_callback_run(callback_query: types.CallbackQuery):
    await sqlite_db.sql_delete_command(callback_query.data.replace('del ', ''))
    await callback_query.answer(text=f'{callback_query.data.replace("del ", "")} удалена', show_alert=True)

@dp.message_handler(commands="Удалить")
async def delete_item(message:types.Message):
    if message.from_user.id ==ID:
        read = await sqlite_db.sql_read2()
        for ret in read:
            await bot.send_photo(message.from_user.id, ret[0], f'{ret[1]}\nОписание: {ret[2]}\nЦена {ret[-1]}')
            await bot.send_message(message.from_user.id, text='^^^', reply_markup=InlineKeyboardMarkup().
                                   add(InlineKeyboardButton(f"Удалить {ret[1]}", callback_data=f'del {ret[1]}')))


# Регистрируем хендлеры
def register_handlers_admin(dp: Dispatcher):
    dp.register_message_handler(cm_start, commands=["Загрузить"], state=None)
    dp.register_message_handler(cancel_handler, state="*", commands="отмена")
    dp.register_message_handler(cancel_handler, Text(equals="отмена",  ignore_case=True), state="*")
    dp.register_message_handler(load_photo, content_types=['photo'], state=FSMadmin.photo)
    dp.register_message_handler(load_name, state=FSMadmin.name)
    dp.register_message_handler(load_description, state=FSMadmin.description)
    dp.register_message_handler(load_price, state=FSMadmin.price)
    dp.register_message_handler(make_changes_command, commands=['moderator'], is_chat_admin=True)

И там ещё кучу таких же хендлеров пишу, но они не вызываются. Бот написан блочно, это часть админская.

Ответы

▲ 0

В коде отсутствуют обработчики состояний для FSMadmin.name, FSMadmin.description и FSMadmin.price. Поэтому бот не может продолжить диалог и не реагирует на ввод пользователя Попробуй внедрить это

# Обработчик состояния FSMadmin.photo
@dp.message_handler(state=FSMadmin.photo, content_types=types.ContentTypes.PHOTO)
async def process_photo(message: types.Message, state: FSMContext):
    await message.reply("Отличное фото! Теперь введите название")
    await FSMadmin.name.set()
    await state.update_data(photo=message.photo[-1].file_id)

# Обработчик состояния FSMadmin.name
@dp.message_handler(state=FSMadmin.name)
async def process_name(message: types.Message, state: FSMContext):
    await message.reply("Введите описание")
    await FSMadmin.description.set()
    await state.update_data(name=message.text)

# Обработчик состояния FSMadmin.description
@dp.message_handler(state=FSMadmin.description)
async def process_description(message: types.Message, state: FSMContext):
    await message.reply("Введите цену")
    await FSMadmin.price.set()
    await state.update_data(description=message.text)

# Обработчик состояния FSMadmin.price
@dp.message_handler(state=FSMadmin.price)
async def process_price(message: types.Message, state: FSMContext):
    data = await state.get_data()
    await message.reply("Все готово! Новый пункт меню:")
    await message.reply_photo(data['photo'])
    await message.reply(f"Название: {data['name']}\nОписание: {data['description']}\nЦена: {message.text}")
    await state.finish()