Reputation: 125
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
Upvotes: 1
Views: 10312
Reputation: 125
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.
Upvotes: 1