Как передать значение из словаря FSM в хендлер инлаин кнопки
Я отравляю число в состояние и записываю его в словарь другой пользователь получает текст с инлаин кнопкой и по ее нажатию получаем мое число. Я уже не знаю что делать когда открываю словарь в хенлере кнопки - он пустой Можете накалякать мне кусок кода ,а то я уже все перепробовал.
class FsmHand(StatesGroup):
Inp = State()
dp.message_handler(commands=['send'])
async def start(message: types.Message):
if (message.from_user.id == 1111111):
await message.answer("ID")
await FsmHand.Inp.set()
async def inp(message: types.Message,state: FSMContext):
async with state.proxy() as data:
data["Inp"] = message.text
dp.callback_query_handler(text="yes")
async def test_call(callback_query: types.CallbackQuery,state: FSMContext):
async with state.proxy() as data:
print(data) #ДАТА ПУСТАЯ
Ответы (1 шт):
Автор решения: RitinaADM
→ Ссылка
Вопрос поставлен не корректно но я попробую дать на него ответ. Как я понял не из описания а из представленного кода что вам нужно чтобы state_data попал в callback_query_handler
Рассмотрю пример составления сообщения для некого юзера код написан в теории мб где ошибки по синтаксису но вроде все гуд state='*' Пускает в хэндер любой стейт!
class State_1(StatesGroup):
input_user = State() # Ввод юзера
input_message = State() # Ввод сообщения
@dp.message_handler(commands=['send_message_for_user'])
async def send_message_for(message: types.Message):
reply_markup = types.InlineKeyboardMarkup() # Создаем клавиатуру
reply_markup.add(types.InlineKeyboardButton(text=f'Отменить', callback_data=f'cancel_state')) # Добавляем кнопку
await message.answer("Укажите chat id получателя", reply_markup=reply_markup) # Отправляем сообщение
await State_1.input_user.set()
@dp.message_handler(state=State_1.input_user)
async def send_message_for_input_user(message: types.Message, state: FSMContext):
try:
await state.set_data({'chat_id': int(message.text)})
reply_markup = types.InlineKeyboardMarkup() # Создаем клавиатуру
reply_markup.add(types.InlineKeyboardButton(text=f'Отменить', callback_data=f'cancel_state')) # Добавляем кнопку
await message.answer(f'Введите сообщение для: {message.text}', reply_markup=reply_markup)
await State_1.input_message.set()
except: await message.delete() # Пользователь отправил не число удаляем его ошибку и ждем повтора
@dp.message_handler(state=State_1.input_message)
async def send_message_for_input_message(message: types.Message, state: FSMContext):
try:
await state.update_data({'message': message.text})
reply_markup = types.InlineKeyboardMarkup() # Создаем клавиатуру
reply_markup.add(types.InlineKeyboardButton(text=f'Отменить', callback_data=f'cancel_state'),
types.InlineKeyboardButton(text=f'Отправить', callback_data=f'send_message_for')) # Добавляем кнопку
await message.answer(f'{message.text}', reply_markup=reply_markup)
except:
await message.delete() # Пользователь отправил не число удаляем его ошибку и ждем повтора
@dp.callback_query_handler(state=State_1)
async def test_call(callback_query: types.CallbackQuery, state: FSMContext):
state_data = await state.get_data()
if callback_query.data == 'cancel_state':
await state.reset_state()
await callback_query.answer(f'Отмена')
elif callback_query.data == 'send_message_for':
await bot.send_message(state_data['chat_id'], state_data['message'])
await callback_query.message.answer(f'Сообщение успешно отправлено')