Как получит три ответа по отдельности в pyTelgramBotApi?
Ищу способ, как трижды спросить у пользователя дату Вот код:
def change_check_times(message, user):
start_times = copy.deepcopy(_globals.CHECK_TIMES)
times = []
def inner(message):
nonlocal times, start_times
try:
if message.text in _globals.CHECK_TIMES:
_trash = time.strptime(message.text, '%H:%M')
else:
raise ValueError
except ValueError: # if time not in CHECK_TIMES or time is not valid
bot.send_message(message.chat.id, _("Вводите только доступные даты", user.language))
return bot.register_next_step_handler(message, inner)
else:
start_times.remove(message.text)
times.append(message.text)
start = _globals.UNSUBSCIRBED_USER_CHECK_TIMES if not user.is_pro else _globals.SUBSCIRBED_USER_CHECK_TIMES
for i in range(start, 0, -1):
print(i)
date_word = "дат" if i > 4 else "даты" if 1 < i <= 4 else "дату"
bot.send_message(message.chat.id, _(f"Введите ещё {i} {date_word}", user.language), reply_markup=kbs(start_times))
bot.register_next_step_handler(message, inner)
db.change_user(user.user_id, check_times=','.join(times))
bot.send_message(message.chat.id, _("Ваши времена проверки такие: " + ", ".join(times), user.language))
return start_bot
def kbs(buttons, one_time_keyboard=True):
kb = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=one_time_keyboard, row_width=len(buttons)//2)
kb.add(*[types.KeyboardButton(i) for i in buttons])
return kb
_(smth) - перевод текста
user - класс пользователя
Я хочу спросить первый раз, подождать ответа, второй раз, подождать ответа, и тд
Ответы (2 шт):
Автор решения: Violet
→ Ссылка
def start(message):
msg = bot.send_message(message.chat.id, 'Введите первое значение')
bot.register_next_step_handler(msg, start_2)
def start_2(message):
msg = bot.send_message(message.chat.id, 'Введите второе значение')
bot.register_next_step_handler(msg, start_3, message.text)
def start_3(message, value):
print(message.text, value)
Автор решения: Андрей
→ Ссылка
Решил вопрос сам, решение получилось более простым в использовании, более универсальным Вот решение:
def change_check_times(message, user):
available_times = copy.deepcopy(_globals.CHECK_TIMES)
chosen_times = []
start = _globals.UNSUBSCIRBED_USER_CHECK_TIMES if not user.is_pro else _globals.SUBSCIRBED_USER_CHECK_TIMES
def inner(message, iteration_num):
nonlocal chosen_times, available_times
try:
if message.text in _globals.CHECK_TIMES:
time.strptime(message.text, '%H:%M')
iteration_num -= 1
available_times.remove(message.text)
chosen_times.append(message.text)
else:
raise ValueError
if iteration_num == 0:
db.change_user(user.user_id, check_times=','.join(chosen_times))
bot.send_message(message.chat.id, _("Ваши времена проверки такие: " + ", ".join(chosen_times), user.language))
return start_bot(message)
except ValueError: # if time not in CHECK_TIMES or time is not valid
bot.send_message(message.chat.id, _("Вводите только доступные даты", user.language))
return bot.register_next_step_handler(message, inner, iteration_num)
else:
date_word = "дат" if iteration_num > 4 else "даты" if 1 < iteration_num <= 4 else "дату"
bot.send_message(
message.chat.id,
_(
f"Введите ещё {iteration_num} {date_word}",
user.language),
reply_markup=kbs(available_times)
)
bot.register_next_step_handler(message, inner, iteration_num)
bot.send_message(
message.chat.id,
_(
f'Выберите {start} {"дат" if start > 4 else "даты" if 1 < start <= 4 else "дату"}',
user.language
),
reply_markup=kbs(available_times))
bot.register_next_step_handler(message, inner, start)