Как сделать ожидание сообщения от пользователя? TeleBot
Я хочу адаптировать текстовую игру под бота в телеграме. Вся суть в том, что после вывода правил, человек дожен вводить числа, а бот должен их считывать и записывать в переменную. Код в принципе работает, но есть один минус - он за пару минут сожрёт всю ОЗУ. Пытался добавлять "sleeр", ни к чему хорошему не привело.
Вот весь код:
import random
import re
import telebot
bot_token = "*****************************"
bot = telebot.TeleBot(bot_token)
NUM_DIGITS = 3
MAX_GUESSES = 10
a = 0
guess = ''
@bot.message_handler(commands=['bagels'])
def main(message):
global a, guess
bot.send_message(message.chat.id,""""Бaйглз" Дедуктивная игра.
Я загадываю любое {}-значимое число. Попробуй угадать его. Всего у тебя 10 попыток.
Вот некоторые расшифровки:
Когда я говорю: Это значит:
"Пико" Одна правильная цифра, но не на своем месте.
"Ферми" Одна правильная цифра и на своем месте.
"Бaйглз" Ни единой правильной цифры
Например, если секретная цифра 248, а ваш ответ 843, то компьютер скажет Ферми Пико.""".format(NUM_DIGITS))
secretNum = getSecretNum()
bot.send_message(message.chat.id, 'У вас есть {} попыток, что-бы угадать число.'.format(MAX_GUESSES))
numGuesses = 1
while numGuesses <= MAX_GUESSES:
guess = ''
while len(guess) != NUM_DIGITS or not guess.isdecimal():
bot.send_message(message.chat.id, 'Попытка #{}: '.format(numGuesses))
a = 0
while a != 1: # В этом цикле вся проблема
@bot.message_handler(commands=re.compile(r"^[0-9]").search(message.text))
def text(message):
global a, guess
guess = message.text
if len(guess) == 3:
a = 1
clues = getClues(guess, secretNum)
bot.send_message(message.chat.id, text=clues)
numGuesses += 1
if guess == secretNum:
break
if numGuesses > MAX_GUESSES:
bot.send_message(message.chat.id,
'У вас закончились попытки. Вы проиграли.\nЗагаданное число - {}.'.format(secretNum))
break
def getSecretNum():
numbers = list('0123456789')
random.shuffle(numbers)
secretNum = ''
for i in range(NUM_DIGITS):
secretNum += str(numbers[i])
return secretNum
def getClues(guess, secretNum):
if guess == secretNum:
return 'Вы угадали!'
clues = []
for i in range(len(guess)):
if guess[i] == secretNum[i]:
clues.append('Ферми')
elif guess[i] in secretNum:
clues.append('Пико')
if len(clues) == 0:
return 'Байглз'
else:
clues.sort()
return ' '.join(clues)
bot.polling(none_stop=True)
Ответы (1 шт):
Автор решения: A૨τ૯ʍ
→ Ссылка
Я переписал игру немного, вот как решил:
import random
import telebot
import logging
bot_token = "*****************************************"
bot = telebot.TeleBot(bot_token)
telebot.logger.setLevel(logging.INFO)
NUM_DIGITS = 3
guess = dict()
def init_storage(user_id):
guess[user_id] = dict(attempt=None, secretNum=None)
def set_data_storage(user_id, key, value):
guess[user_id][key] = value
def get_data_storage(user_id):
return guess[user_id]
@bot.message_handler(func=lambda message: message.text.lower() in ["байглз", "bagels"])
def main(message):
init_storage(message.chat.id)
bot.send_message(message.chat.id, """"Бaйглз" Дедуктивная игра.
Я загадываю любое {}-значимое число. Попробуй угадать его. Всего у тебя 10 попыток.
Вот некоторые расшифровки:
Когда я говорю: Это значит:
"Пико" Одна правильная цифра, но не на своем месте.
"Ферми" Одна правильная цифра и на своем месте.
"Бaйглз" Ни единой правильной цифры
Например, если секретная цифра 248, а ваш ответ 843, то компьютер скажет Ферми Пико.""".format(NUM_DIGITS))
secretNum = getSecretNum()
attempt = 10
set_data_storage(message.chat.id, "attempt", attempt)
set_data_storage(message.chat.id, "secretNum", secretNum)
print(get_data_storage(message.chat.id))
bot.send_message(message.chat.id, 'У вас есть 10 попыток, что-бы угадать число.')
bot.register_next_step_handler(message, clue)
def getSecretNum():
numbers = list('0123456789')
random.shuffle(numbers)
secretNum = ''
for i in range(NUM_DIGITS):
secretNum += str(numbers[i])
return secretNum
def clue(message):
guess = message.text
if not guess.isdigit():
msg = bot.reply_to(message, 'Вы ввели НЕ цифровое значение. Пожалуйста, введите 3-ех значное число')
bot.register_next_step_handler(msg, clue)
return
attempt = get_data_storage(message.chat.id)["attempt"]
secretNum = get_data_storage(message.chat.id)["secretNum"]
if guess == secretNum:
bot.reply_to(message, "Вы угадали!")
init_storage(message.chat.id)
return
elif attempt > 1:
attempt -= 1
clues = []
for i in range(3):
if guess[i] == secretNum[i]:
clues.append('Ферми')
elif guess[i] in secretNum:
clues.append('Пико')
if len(clues) == 0:
clues.append('Байглз')
else:
clues.sort()
clues = " ".join(clues)
set_data_storage(message.chat.id, "attempt", attempt)
bot.send_message(message.chat.id, f'{clues}\nОсталось попыток: {attempt}')
bot.register_next_step_handler(message, clue)
else:
bot.reply_to(message,
'У вас закончились попытки. Вы проиграли.\nЗагаданное число - {}.'.format(secretNum))
print("Бот запущен ?")
bot.polling(non_stop=True)