Как правильно настроить бота для тестирования пользователей и отправки результатов в чат, учитывая проблему с админкой, где сообщения не доставляются, и дублирование запроса о пользователе после завершения теста? Вот фрагмент кода:...
Для избавления от двойного отправления сообщений и настройки бота так, чтобы он не отправлял результаты в группу, вы можете использовать переменные состояния (state) для отслеживания текущего состояния бота и условных операторов для контроля логики отправки сообщений. Например, вы можете добавить переменную состояния "testing" и установить ее значение в "True", когда пользователь начинает тестирование. Затем, при запросе результатов теста, проверять значение этой переменной и отправлять результаты только если она установлена в "True". После завершения тестирования, установите значение "testing" в "False". Что касается проблемы с админкой и дублированием запросов о пользователе после завершения теста, вы можете добавить проверку наличия пользователя в базе данных перед началом теста. Если пользователь уже есть в базе данных, вы можете предложить ему пройти тест еще раз или отправить результаты предыдущего теста. Примерно так может выглядеть корректировка фрагмента кода: ```python state = {} @bot.message_handler(commands=['start']) def start_test(message): if message.chat.id not in state: state[message.chat.id] = {} if not state[message.chat.id].get('user_exists', False): # Проверяем, есть ли пользователь в базе данных if not user_already_exists(message.from_user.id): add_user_to_database(message.from_user.id, message.from_user.username) state[message.chat.id]['user_exists'] = True ## начало теста @bot.message_handler(commands=['results']) def get_results(message): if message.chat.id in state and state[message.chat.id].get('testing', False): # Отправляем результаты теста bot.send_message(message.chat.id, "Результаты теста...") else: bot.send_message(message.chat.id, "Пройдите тест перед запросом результатов.") def add_user_to_database(user_id, username): # Добавить пользователя в базу данных def user_already_exists(user_id): # Проверить, есть ли пользователь в базе данных ``` Надеюсь, эти рекомендации помогут вам настроить бота так, чтобы он корректно обрабатывал запросы пользователей и не отправлял ненужные сообщения.
return (test_g, test_k)
bot.send_message(айди группы, f'@{message.from_user.username} / {message.from_user.id} отправил тест на проверку\nЕго варианты были\nhttps://forms.gle/{test(message)[0]}\nhttps://forms.gle/{test(message)[1]}')
Полнейшая чушь.
Во-первых, запомни, что обработчики событий (всё, что декорировано message_handler() или подобным) не следует вызывать самостоятельно. Вот просто не следует. Их вызывает бот по мере надобности. Как следствие, возвращать из них тоже ничего не следует - бот это проигнорирует, а ты эти значения не получишь.
Во-вторых, выучи концепцию побочных эффектов при вызове функции и держи её в голове. Ты на ровном месте делаешь два вызова test(), которая имеет побочные эффекты в виде отправки сообщения, а потом удивляешься, что два раза отправляются сообщения! Причем именно что на ровном месте. Вот тебе что, грозят болтающееся отрезать за сохранение результата test() в ещё одну локальную переменную перед использованием этого результа? Конечно, это непринципиально, потому что test() вызывать нельзя (см. пункт 1), но всё равно показательно.
А что касается передачи инфы о действиях пользователя - заведи хранилище вида "id пользователя - пара ссылок". Подойдёт даже словарь, если тебе не нужно, чтобы инфа переживала перезапуск бота. И вот оттуда уже в well() вытаскивай инфу о том, что проходил текущий пользователь.
Учись программировать, потом пиши ботов. Не наоборот.