Почему так работает как исправить?

У меня как бы некая обратная связь, но после того, как я(администратор) ответил пользователю, нужно написать ещё что-то, чтобы снова можно было задать вопрос по команде /forward, но мне такое не нужно. Нужно, чтобы после моего ответа, можно было снова прописать команду /forward и снова задать вопрос. Вот код:

import telebot

TOKEN = '' 
ADMIN_CHAT_ID = 799888927 

bot = telebot.TeleBot(TOKEN)

# Временное хранилище для сообщений и id пользователей
admin_message = []
user_id = []


def delete_user_data():
    global admin_message, user_id
    admin_message.clear()
    user_id.clear()


@bot.message_handler(commands=['forward'])
def echo(message):
    bot.send_message(message.chat.id, 'Напиши сообщение, которое хочешь отправить')
    bot.register_next_step_handler(message, save_user_message)


def save_user_message(message):
    user_id.append(message.chat.id)
    bot.forward_message(chat_id=ADMIN_CHAT_ID, from_chat_id=message.chat.id, message_id=message.id)
    bot.send_message(ADMIN_CHAT_ID, f'Напишите ответ для пользователя')
    bot.register_next_step_handler(message, save_author_answer)
    print(user_id)


@bot.message_handler(func=lambda message: message.chat.id == ADMIN_CHAT_ID)
def save_author_answer(message):
    admin_message.append(message.text)
    for ids in user_id:
        bot.send_message(chat_id=ids, text=f'Ответ администратора: \n{admin_message[0]}')
        bot.send_message(chat_id=ids, text=f'Для дальнейших вопросов напишите /forward')
    print(admin_message)
    delete_user_data()


bot.polling(none_stop=True)

Ответы (1 шт):

Автор решения: Amgarak

В функции save_user_message обратите внимание на

bot.register_next_step_handler(message, save_author_answer)

Вы переключаете следующий шаг юзера на handler администратора.

Фильтр save_author_answer сообщение юзера не пропустит, но оно в любом случае туда будет отправлено. Отсюда и нежелательное поведение.

Регистрация следующего шага для юзера на функцию save_author_answer не нужна.


Важно учитывать, что ваш код ответит ВСЕМ пользователям СРАЗУ, а не конкретному пользователю на его конкретный вопрос.

Для решения этой проблемы, предлагаю переделать примерно так:

import telebot

TOKEN = 'TOKEN'   
ADMIN_CHAT_ID = 799888927

bot = telebot.TeleBot(TOKEN)
user_messages = {}  

@bot.message_handler(commands=['start'])
def start(message):
    user_id = message.chat.id
    if user_id == ADMIN_CHAT_ID:
        bot.send_message(user_id, 'Напишите /next для получения следующего сообщения.')
    else:
        bot.send_message(chat_id=user_id, text=f'Для дальнейших вопросов напишите /forward')
            
@bot.message_handler(commands=['forward'])
def echo(message):
    bot.send_message(message.chat.id, 'Напиши сообщение, которое хочешь отправить:')
    bot.register_next_step_handler(message, save_user_message)

def save_user_message(message):
    user_id = message.chat.id
    if user_id not in user_messages:
        user_messages[user_id] = []
    user_messages[user_id].append(message.message_id)
    bot.send_message(chat_id=user_id, text=f'Ожидайте ответа или задайте ещё один вопрос /forward')
    print(user_messages)

@bot.message_handler(commands=['next'])
def send_next_message_to_admin(message):
    if message.chat.id == ADMIN_CHAT_ID:
        if user_messages:
            next_user_id = next(iter(user_messages))  
            next_message_id = user_messages[next_user_id][0]  
            next_message = bot.forward_message(chat_id=ADMIN_CHAT_ID, from_chat_id=next_user_id, message_id=next_message_id)
            bot.send_message(ADMIN_CHAT_ID, 'Ответьте на это сообщение:')
            bot.register_next_step_handler(message, lambda msg: send_author_answer(msg, next_user_id, next_message.text))
        else:
            bot.send_message(ADMIN_CHAT_ID, 'Нет новых сообщений для ответа.')

def send_author_answer(message, user_id, user_message_text):
    bot.send_message(chat_id=user_id, text=f'Ваш вопрос: \n{user_message_text}\n\nОтвет администратора: \n{message.text}')
    bot.send_message(chat_id=user_id, text=f'Для дальнейших вопросов напишите /forward')
    
    user_messages[user_id].pop(0)  
    if not user_messages[user_id]:  
        del user_messages[user_id]  

    print(f'Ответ админа: {message.text}')
    bot.send_message(ADMIN_CHAT_ID, 'Напишите /next для получения следующего сообщения.')

bot.polling(none_stop=True)
→ Ссылка