@Corn385

Почему не срабатывает машина состояний aiogram?

При вводе в чат тг слова: /изменения, должна запуститься машина состояния. Но ничего не происходит! Код разбит по модулям, ничего не напутано, код запускается без ошибок, но вот машина состояния не запускается(
from aiogram import types, Dispatcher
from create_bot import dp, bot
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from data_base import botbd
from aiogram.types import ReplyKeyboardRemove, \
    ReplyKeyboardMarkup, KeyboardButton, \
    InlineKeyboardMarkup, InlineKeyboardButton

#появляется после ввода /start
button_menu = KeyboardButton("Меню")
greet_kb = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).add(button_menu)
 
#появляется после ввода слова Меню
button_wr = KeyboardButton("/изменения")
button_stats = KeyboardButton("stats")
button_other = KeyboardButton("other")
button_info = KeyboardButton("info")
greet_menu = ReplyKeyboardMarkup(resize_keyboard=True).add(button_wr, button_stats, button_other, button_info)
 
#при вводе /start
#@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
    await message.answer("Привет, для продолжения перейдите в меню!", reply_markup=greet_kb)
 
#@dp.message_handler()
async def menu_command(message : types.Message):
    if message.text == 'меню' or message.text == 'Меню':
        await message.answer("Сделайте свой выбор!", reply_markup=greet_menu)
 
 
################################################################
 
class FSMAdmin(StatesGroup):
    winers = State()
    losers = State()
 
#тут машина состояния должна начать работать, после выбора на клавиатуре кнопки /изменения
#@dp.message_handler(commands='изменения', state=None)
async def cm_start(message : types.Message):
    await FSMAdmin.winers.set()
    await message.reply('Введите количество побед:')
 
#@dp.message_handler(state=FSMAdmin.winers)
async def load_win(message : types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['winers'] = message.text
    await FSMAdmin.next()
    await message.reply('Введите количество поражений:')
 
#@dp.message_handler(state=FSMAdmin.losers)
async def load_lose(message : types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['losers'] = message.text
 
    await botbd.sql_add_command(state)
    await state.finish()
 
 
 
 
 
def register_handlers_client(dp : Dispatcher):
    dp.register_message_handler(process_start_command, commands=['start'])
    dp.register_message_handler(menu_command)
    dp.register_message_handler(cm_start, commands='изменения', state=None) 
    dp.register_message_handler(load_win, state=FSMAdmin.winers)
    dp.register_message_handler(load_lose, state=FSMAdmin.losers)


это в основном файле, который запускается:

from aiogram.utils import executor
from create_bot import dp
from handlers import client, other
from data_base import botbd

client.register_handlers_client(dp)
executor.start_polling(dp, skip_updates=True, on_startup=on_startup)


Это в файле с dp:

from aiogram import Bot
from aiogram.dispatcher import Dispatcher
from config import TOKEN
from aiogram.contrib.fsm_storage.memory import MemoryStorage
 
storage = MemoryStorage()
 
bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=storage)
  • Вопрос задан
  • 572 просмотра
Пригласить эксперта
Ответы на вопрос 2
Amigun
@Amigun
Джун : |
Во-первых, убери у регистратора этого хендлера state=None, либо сделай его state="*".
Во-вторых, к коду можно сильно придраться...
if message.text == 'меню' or message.text == 'Меню':
- серьезно? А если я напишу мЕнЮ?
Ответ написан
Комментировать
@0NeZoX0
Я канєшно зара може скажу діч, але попробуй зроби імпорти вот так:
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram import types, Dispatcher
from create_bot import dp, bot
from data_base import botbd
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton,InlineKeyboardMarkup, InlineKeyboardButton
В мене просто раз такі проблеми були
Я так розумію код трохі взятий з Python Hub Studio

На рахунок верхнього коменту, він всеж правий, там можна використати ігнор регістру:
ignore_case=True
Кста, State=None вроді має бути
Я то використовував машину состояний з ютуб канала Redly, там вроді лекше
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы