Search code examples
pythontelegramtelegram-bottelethon

How to Add a Menu to a Telegram Bot Using Telethon Library


I have created a simple telegram bot that will take an input from a user and perform some operations and return the result to the user.

However, I want to add a menu where based on the menu option will call a specific function and return the result to the user. Each operation takes from 0 to 60 seconds and the bot is used by more than one user.

I have a few concern. First, how to make sure that the bot will store the entered value before the menu choice. Second, since the operation takes N seconds, how can I make sure that the each user will get its searched value instead of getting the result of another user? Here is my code so far:

!/usr/bin/env python3.8
api_id = 12345
api_hash = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
bot_token = 'XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
############################### Bot ############################################
from telethon.sync import TelegramClient, events,Button
from telethon import functions, types
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
def first_function(value):
    #DO SOME OPERATION
    return


def second_function(value):
    #DO SOME OPERATION
    return



bot = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token)
with bot:   
    @bot.on(events.NewMessage)
    async def handler(event):    
        value=event.message.message
        sender_id=event.message.peer_id.user_id
        username = await bot.get_entity(sender_id)
        #if menu option is 1
            # first_function(value)
        #else menu option is 2
        #second_function(value)

        await bot.send_message(username, value)        
    bot.run_until_disconnected()

Solution

  • To add a menu to your Telegram bot.
    Here is add a menu code:

    menu_keyboard = InlineKeyboardMarkup([[
            InlineKeyboardButton("Option 1", callback_data='1'),
            InlineKeyboardButton("Option 2", callback_data='2')
        ]])
    

    Make a callback:

    async def callback_query_handler(event):
        callback_query = event.data
        if callback_query == '1':
            await first_function(value)
        elif callback_query == '2':
            await second_function(value)
    

    Function send_message() write:

    await bot.send_message(username, "Please select an option from the menu:", reply_markup=menu_keyboard)
    

    Two functions add in your code:

    def first_function(value):
        #DO SOME OPERATION
        return
    
    
    def second_function(value):
        #DO SOME OPERATION
        return
    
    
    
    bot = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token)
    with bot:   
        @bot.on(events.NewMessage)
        async def handler(event):    
            value=event.message.message
            sender_id=event.message.peer_id.user_id
            username = await bot.get_entity(sender_id)
            menu_keyboard = InlineKeyboardMarkup(
                [[InlineKeyboardButton("Option 1", callback_data='1'),
                  InlineKeyboardButton("Option 2", callback_data='2')]]
            )
            await bot.send_message(username, "Please select an option from the menu:", reply_markup=menu_keyboard)
            @bot.on(events.CallbackQuery)
            async def callback_query_handler(event):
                callback_query = event.data
                if callback_query == '1':
                    await first_function(value)
                elif callback_query == '2':
                    await second_function(value)
        bot.run_until_disconnected()