Форум сайта python.su
Всем привет. Вопрос тривиальный абсолютно, но на который я не нахожу ответ в гугле.
Задача заключается в следующем: при вводе пользователем количества букв в слове необходимо записывать ответ в переменную, которая будет сохранять значение неограниченное количество сообщений в будущем(пока сам не перезапишу или не очищу). Пробовал банально записать в переменную, но при последующем получении сообщения переменная обнуляется. На просторах интернета все советуют использовать register_next_step_handler, но мне то необходимо не на одно вхождение значение запоминать, а до конца определенного периода вне зависимости от отправки сообщений пользователем. Еще видел, что можно привязаться к айди пользователя и в какое-то временное хранилище связанное по ключу записать и потом с помощью этого ключа вытаскивать значение. Но описано было абсолютно не понятно. Подскажите пожалуйста, куда копать. Питоном занялся совсем недавно, не бейте пж))
import telebot from telebot import types import random from StackWords import * RealTimeWord = '' SelectedNumber = 0 # Создаем экземпляр бота bot = telebot.TeleBot('') #def SaveNumber(Number): # global SelectedNumber = Number def SendRules(m): bot.send_message(m.chat.id, 'Правила игры:, parse_mode='html') # Функция, обрабатывающая команду /start @bot.message_handler(commands=["start"]) def start(m, res=False): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton("Начать игру") button2 = types.KeyboardButton("Правила") markup.add(button1, button2) bot.send_message(m.chat.id, 'Привет, это бот для игры в слова.\n', parse_mode='html', reply_markup=markup) # Получение сообщений от юзера @bot.message_handler(content_types=["text"]) def handle_text(message): if(message.text == "Начать игру"): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton("4 буквы") button2 = types.KeyboardButton("5 букв") button3 = types.KeyboardButton("6 букв") button4 = types.KeyboardButton("На главную") markup.add(button1, button2, button3, button4) bot.send_message(message.chat.id, 'Выберите количество букв в слове', reply_markup=markup) elif (message.text == "Правила"): SendRules(message) elif (message.text == "4 буквы"): #FourLettersTask(message, random.choice(FourLetters)) markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton("На главную") markup.add(button1) SelectedNumber = 4 bot.send_message(message.chat.id, '????\nБуквы присутствуют:\nТестирование: ' + random.choice(FourLetters), reply_markup=markup) elif (message.text == "5 букв"): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton("На главную") markup.add(button1) bot.send_message(message.chat.id, '?????\nБуквы присутствуют:\nТестирование: ' + random.choice(FiveLetters), reply_markup=markup) elif (message.text == "6 букв"): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton("На главную") markup.add(button1) bot.send_message(message.chat.id, '??????\nБуквы присутствуют:\nТестирование: ' + random.choice(SixLetters), reply_markup=markup) elif (message.text == "На главную"): start(message) else: if (len(message.text) == SelectedNumber): bot.send_message(message.chat.id, 'Правильно') else: bot.send_message(message.chat.id, 'Количество букв в вашем слове некорректное') # Запускаем бота bot.polling(none_stop=True, interval=0)
Отредактировано hlypik (Ноя. 9, 2022 21:31:05)
Офлайн
Ну и еще нашел, что прикручивают sql сервер и там данные хранят, но это же жопа какая-то, мне же просто циферки запомнить, какая БД)))
Офлайн
Любая переменная хранится только в цикле жизни твоего скрипта - если ты его остановил перезапустил и так далее
все значения обнулились.
Следовательно постоянные значения которые нужно запоминать нужно хранить снаружи и обращаться к ним из твоего скрипта
База данных это просто удобно паралельно гибко и так далее - ведь пользователей будет много и для каждого своя уникальная переменная
Либо можно хранить в файле что в итоге окажеться менее удобно особенно при паралельном чтении и записи
Так же у тебя пропущены SelectedNumber в блоках для 5 и 6 букв
Офлайн
Спасибо за ответ, тогда буду копать базы данных. Про SelectedNumber спасибо. Я еще просто не дошел до этих вариантов, с 4-мя бы буквами завести, а там пойдёт)
Офлайн