Почему так работает как исправить?
У меня как бы некая обратная связь, но после того, как я(администратор) ответил пользователю, нужно написать ещё что-то, чтобы снова можно было задать вопрос по команде /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 шт):
В функции 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)