Как сделать так, чтобы бот запоминал имя?

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import os, json, string
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.dispatcher.filters import Text

TOKEN = “”
storage = MemoryStorage()
bot = Bot(token=TOKEN)
dp = Dispatcher(bot, storage=storage)

async def on_startup(_):
  print('Бот вышел в онлайн')


#---------------------############ BUTTON ############ ---------------------#

btn_load_name = KeyboardButton('/Name')
btn_check_name = KeyboardButton('/Узнать_имя')

kb_load_name = ReplyKeyboardMarkup(resize_keyboard=True)
kb_check_name = ReplyKeyboardMarkup(resize_keyboard=True)

kb_load_name.row(btn_load_name)
kb_check_name.row(btn_check_name)


#---------------------############ CLIENT ############ ---------------------#

@dp.message_handler(commands=['start', 'help'])
async def start(message: types.Message):
  await bot.send_message(message.from_user.id, f'Здравствуйте, {message.from_user.first_name} {message.from_user.last_name}', reply_markup=kb_load_name)
  await mesage.delete()

# @dp.message_handler(commands=['help'])
# async def help(message: types.Message):
#   await bot.send_message(mesage.from_user.id, 'За помощью обращайтесь по номеру телефоену')

@dp.message_handler(commands=['Узнать_имя'])
async def check_name(message: types.Message):
  await message.reply(str(data['name']))


#---------------------############ ADMIN ############ ---------------------#

class FSMadmin(StatesGroup):
  name = State()

@dp.message_handler(commands=['name'], state=None)
async def cm_start(message: types.Message):
  await FSMadmin.name.set()
  await bot.send_message(message.from_user.id,  f'{message.from_user.first_name} {message.from_user.last_name}, введите имя')

@dp.message_handler(state=FSMadmin.name)
async def load_name_bot(message: types.Message, state: FSMContext):
  async with state.proxy() as data:
    data['name'] = message.text
  await bot.send_message(message.from_user.id, 'Имя занесено',reply_markup=kb_check_name)
  await state.finish()
  




#---------------------############ OTHER ############ ---------------------#

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


При запуске команды /name всё работает корректно.Записываю имя, всё срабатывает,выдаёт: «Имя занесено»,как и указано в коде. Но при команде /Узнать имя, бот выдаёт «Имя занесено». Проверял словарь data, туда записывается значение «Имя занесено». Что не так?
  • Вопрос задан
  • 485 просмотров
Решения вопроса 1
Buchachalo
@Buchachalo
async with state.proxy() as data: вот такой конструкцией четно говоря для хранения данных не пользовался. Пойдите по пути который описан в стандартных мануалах.

Для записи и хранения данных
await state.update_data(name=message.text)

Для извлечения
state_data = await state.get_data()
name = state_data.get('name')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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