Задать вопрос
@Elufis

Почему не передается переменная из одного обработчика в другой?

import asyncio
from aiogram import F, Router
from aiogram import Dispatcher, Bot
from aiogram.filters.command import Command
from aiogram import types
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from aiogram.types import FSInputFile, URLInputFile, BufferedInputFile
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.fsm.state import StatesGroup, State
from aiogram.fsm.context import FSMContext
from aiogram.utils.formatting import Text, Bold
from bot import Bot


router = Router()
dp = Dispatcher()
class Reg(StatesGroup):
    name = State()
    number = State()
    strigka = State()
    time = State()
    yes = State()
    user_id = State()
    register = State()
    ok = State()


@router.callback_query(F.data == 'next')
async def one(callback: types.CallbackQuery, state: FSMContext):
    await state.set_state(Reg.name)
    await callback.message.answer('Как мне тебя называть?')
@router.message(Reg.name)
async def reg_name(message: types.Message, state: FSMContext):
    await state.update_data(name=message.text)
    await state.set_state(Reg.number)
    await message.answer('Напишите Ваш номер телефона')
@router.message(Reg.number)
async def reg_number(message:types.Message, state: FSMContext):
    await state.update_data(number=message.text)
    await state.set_state(Reg.strigka)
    await message.answer('Напишите стрижку')
@router.message(Reg.strigka)
async def reg_strigka(message:types.Message, state: FSMContext):

    await state.update_data(strigka=message.text)
    await state.set_state(Reg.time)
    await message.answer("Напишите удобное время")


@router.message(Reg.time)
async def reg_time(message:types.Message, state: FSMContext):

    await state.update_data(time=message.text)
    await state.update_data(user_id=message.from_user.id)
    data = await state.get_data()

    print(data["user_id"],1)

    builder = InlineKeyboardBuilder()
    builder.add(types.InlineKeyboardButton(
        text='Да',
        callback_data='yes'
    ))
    builder.add(types.InlineKeyboardButton(
        text='Нет',
        callback_data='not'
    ))
    await message.answer(f'{data["name"]}\n{data["number"]}\n{data["strigka"]}\n{data["time"]}', reply_markup=builder.as_markup())
    await state.set_state(Reg.yes)



@router.callback_query(Reg.yes, F.data == 'yes')
async def send_message(callback: types.CallbackQuery, state: FSMContext, bot: Bot):
    data = await state.get_data()

    print(data["user_id"],2)

    builder = InlineKeyboardBuilder()
    builder.add(types.InlineKeyboardButton(
        text='Принять',
        callback_data='register'))

    builder.add(types.InlineKeyboardButton(
        text='Отклонить',
        callback_data='Note_register'))

    await bot.send_message(
        chat_id=мой id,
        text=f'Это приходит Никите:\n{data["name"]}\n{data["number"]}\n{data["strigka"]}\n{data["time"]}\n{data["user_id"]}',
        reply_markup=builder.as_markup())
    user_id = data["user_id"]
    print(user_id,3)
    #await state.set_state(Reg.register)
    await callback.answer()  # Не забудь обработать callback




    @router.callback_query(F.data == 'register')
    async def register_client(callback: types.CallbackQuery):
        # Извлечение user_id
        #await state.update_data(user_id=callback.from_user.id)

          # Проверка значения user_id

        print(user_id,4)
        if user_id is not None:
            await bot.send_message(chat_id=user_id, text='Вас записали!')
            await callback.answer()
            await callback.message.answer(f'Ваш chat_id: {user_id}')

        else:
            await callback.message.answer('Ошибка: user_id не найден.')
        await state.clear()

Вот работа бота:
1.бот записывает введеные данные клиента
2.Отправлять их менеджеру(см. def send_message), и кнопки подтверждения записи
3.После того как менеджер нажал кнопку "Принять", клиенту отправляется сообщение "Вас записали" (см. def register_client)

Проблема в том, что когда клиент 1 записался, то клиент 2 уже не может записаться, так как бот сохранил user_id первого клиента
Я пробовал state.clear в конце кода как отдельным обработчиком, так и в конце def register_client
Сейчас попробовал вариант с записью в переменную user_id
Вот что выдает Run:
1.Когда я пользуюсь:
1.1 мой id 1
1.2 мой id 2
1.3 мой id 3
1.4 мой id 4
2. Когда пользуеться клиент:
2.1 его id 1
2.2 его id 2
2.3 его id 3
2.4 мой id 4
Я не понимаю почему после одного сохранения данные не перекидываются в последний обработчик
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
Перед обработчиком "register" стоит лишний Tab.
А так вообще если рассматривать это в качестве реального бота, то использовать fsm сомнительная идея, т.к если два клиента подадут заявку до того, как один из них будет принят, то данные отправятся второму клиенту. Если рассматривать это как реальную задачу, то лучше использовать базы данных
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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