Контекст:
Я использую PyTelegramBotAPi или Python Telegram Bot
У меня есть код I я запускаю, когда пользователь начинает разговор.
Когда пользователь начинает разговор, мне нужно отправить ему первое изображение и вопрос, видел ли он что-то на рисунке, функция должна ждать ввода пользователя и верните, видел ли он это или нет.
После этого мне нужно будет продолжать посылать картинку в al oop, ждать ответа и запускать алгоритм деления пополам на нем.
Что я пробовал до сих пор:
Я пытался использовать разметку ответа, которая ждет ответа, или встроенную клавиатуру с обработчиками, но я застрял, потому что мой код выполняется без ожидания ввода пользователя. .
Код:
@bot.message_handler(func=lambda msg: msg in ['Yes', 'No'])
@bot.message_handler(commands=['start', 'help'])
def main(message):
"""
This is my main function
"""
chat_id = message.chat.id
try:
reply_answer = message.reply_to_message.text
except AttributeError:
reply_answer = '0'
# TODO : should wait for the answer asynchnonossly
def tester(n, reply_answer):
"""
Displays the current candidate to the user and asks them to
check if they see wildfire damages.
"""
print('call......')
bisector.index = n
bot.send_photo(
chat_id=chat_id,
photo=bisector.image.save_image(),
caption=f"Did you see it Yes or No {bisector.date}",
reply_markup=types.ForceReply(selective=True))
# I SHOUL WAIT FOR THE INPUT HERE AND RETURN THE USER INPUT
return eval(reply_answer)
culprit = bisect(bisector.count, lambda x: x, partial(tester, reply_answer=reply_answer) )
bisector.index = culprit
bot.send_message(chat_id, f"Found! First apparition = {bisector.date}")
bot.polling(none_stop=True)
Алгоритм, который я запускаю для пользовательского ввода, выглядит примерно так:
def bisect(n, mapper, tester):
"""
Runs a bisection.
- `n` is the number of elements to be bisected
- `mapper` is a callable that will transform an integer from "0" to "n"
into a value that can be tested
- `tester` returns true if the value is within the "right" range
"""
if n < 1:
raise ValueError('Cannot bissect an empty array')
left = 0
right = n - 1
while left + 1 < right:
mid = int((left + right) / 2)
val = mapper(mid)
tester_values = tester(val) # Here is where I am using the ouput from Telegram bot
if tester_values:
right = mid
else:
left = mid
return mapper(right)
Надеюсь Я четко объяснил проблему, не стесняйтесь спрашивать любые разъяснения. Если вы знаете что-то, что может направить меня в правильном направлении для решения этой проблемы, дайте мне знать.
Я пробовал подобный вопрос, но не получаю ответы.