Please tell me how you can call the bot’s response to any message in the feedback bot. By example:
User: /start
Bot: Welcome message (Hello)
User: any message
Bot: Feedback message (Expect an answer)
I tried to do it through the echo function, but most likely I made a mistake somewhere.
I am attaching the code:
main.py:
from telegram.ext import Updater from handlers import setup_dispatcher from settings import TELEGRAM_TOKEN # Setup bot handlers updater = Updater(TELEGRAM_TOKEN) dp = updater.dispatcher dp = setup_dispatcher(dp) updater.start_polling() updater.idle()
settings.py:
import os from dotenv import load_dotenv, find_dotenv # Loading .env variables load_dotenv(find_dotenv()) TELEGRAM_TOKEN = "HERE TELEGRAM TOKEN" TELEGRAM_SUPPORT_CHAT_ID = "HERE CHAT ID" TELEGRAM_SUPPORT_CHAT_ID = int(TELEGRAM_SUPPORT_CHAT_ID) WELCOME_MESSAGE = os.getenv("WELCOME_MESSAGE", "Hi ๐") FEEDBACK_MESSAGE = os.getenv("FEEDBACK_MESSAGE", "Expect an answer๐") REPLY_TO_THIS_MESSAGE = os.getenv("REPLY_TO_THIS_MESSAGE", "REPLY_TO_THIS") WRONG_REPLY = os.getenv("WRONG_REPLY", "WRONG_REPLY")
handlers.py:
import os from telegram import Update from telegram.ext import CommandHandler, MessageHandler, Filters, CallbackContext from settings import WELCOME_MESSAGE, TELEGRAM_SUPPORT_CHAT_ID, REPLY_TO_THIS_MESSAGE, WRONG_REPLY def start(update, context): update.message.reply_text(WELCOME_MESSAGE) # response to /start user_info = update.message.from_user.to_dict() context.bot.send_message( chat_id=TELEGRAM_SUPPORT_CHAT_ID, text=f""" ๐ Connected {user_info}. """, ) def echo(update: Update, context: CallbackContext): update.message.reply_text(FEEDBACK_MESSAGE) # there should be a response to any message "Expect an answer" def forward_to_chat(update, context): forwarded = update.message.forward(chat_id=TELEGRAM_SUPPORT_CHAT_ID) if not forwarded.forward_from: context.bot.send_message( chat_id=TELEGRAM_SUPPORT_CHAT_ID, reply_to_message_id=forwarded.message_id, text=f'{update.message.from_user.id}n{REPLY_TO_THIS_MESSAGE}' ) def forward_to_user(update, context): user_id = None if update.message.reply_to_message.forward_from: user_id = update.message.reply_to_message.forward_from.id elif REPLY_TO_THIS_MESSAGE in update.message.reply_to_message.text: try: user_id = int(update.message.reply_to_message.text.split('n')[0]) except ValueError: user_id = None if user_id: context.bot.copy_message( message_id=update.message.message_id, chat_id=user_id, from_chat_id=update.message.chat_id ) else: context.bot.send_message( chat_id=TELEGRAM_SUPPORT_CHAT_ID, text=WRONG_REPLY ) def setup_dispatcher(dp): dp.add_handler(CommandHandler('start', start)) dp.add_handler(MessageHandler(Filters.chat_type.private, forward_to_chat)) dp.add_handler(MessageHandler(Filters.chat(TELEGRAM_SUPPORT_CHAT_ID) & Filters.reply, forward_to_user)) return dp
I will be very grateful for your help
Advertisement
Answer
Thanks to Aditya Yadav for the advice :)
Additionally, I researched the documentation, regarding the dialog handler part of the library I use. The following solution was found: Rewrite the def echo and def forward_to_chat functions, combining them.
def echo_forward_handler(update, context): text = 'Expect an answer' context.bot.send_message(chat_id=update.effective_chat.id, text=text) forwarded = update.message.forward(chat_id=TELEGRAM_SUPPORT_CHAT_ID) if not forwarded.forward_from: context.bot.send_message( chat_id=TELEGRAM_SUPPORT_CHAT_ID, reply_to_message_id=forwarded.message_id, text=f'{update.message.from_user.id}n{REPLY_TO_THIS_MESSAGE}' )
The necessary dispatcher was also formed at the end:
def setup_dispatcher(dp): dp.add_handler(MessageHandler(Filters.text & (~Filters.command) & Filters.chat_type.private, echo_forward_handler)) return dp
Thus, the task that was set in the condition was solved.