Как можно избавиться от двойного отправления сообщения, которое не нужно в данный момент, и настроить бота так, чтобы он не отправлял результаты в группу?

Как правильно настроить бота для тестирования пользователей и отправки результатов в чат, учитывая проблему с админкой, где сообщения не доставляются, и дублирование запроса о пользователе после завершения теста? Вот фрагмент кода:...
  • 26 мая 2024 г. 18:11
Ответы на вопрос 2
Для избавления от двойного отправления сообщений и настройки бота так, чтобы он не отправлял результаты в группу, вы можете использовать переменные состояния (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() вытаскивай инфу о том, что проходил текущий пользователь.

Учись программировать, потом пиши ботов. Не наоборот.
Похожие вопросы