es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo manejar las respuestas con Pyrogram al utilizar ForceReply?

Estoy construyendo un bot de Telegram donde intento que el usuario llene detalles sobre un evento y los almacene en un diccionario que está en una lista. Sin embargo, quiero que sea como una conversación. Deseo que se vea así:

usuario: /create

respuesta del bot: ¿Cómo le gustaría llamarlo?

respuesta del usuario: Cumpleaños de Chris

respuesta del bot: ¿Cuándo es?

respuesta del usuario: 08/11/2021

respuesta del bot: ¡Se ha guardado el evento “Cumpleaños de Chris” para el 08/11/2021!

Para lograr esto, planeo usar ForceReply, que está descrito en la documentación como: “Esto puede ser extremadamente útil si desea crear interfaces amigables y paso a paso sin tener que sacrificar el modo de privacidad”. El problema es que la documentación no parece explicar cómo manejar las respuestas.

Actualmente, mi código se ve así:

@app.on_message(filters.command(‘create’))
async def create_countdown(client, message):
global countdowns
countdown = {
‘countdown_id’: str(uuid4())[:8],
‘countdown_owner_id’: message.from_user.id,
‘countdown_onwner_username’: message.from_user.username,
}
try:
await message.reply(‘¿Cómo desea llamar al evento?’, reply_markup=ForceReply())
except FloodWait as e:
await asyncio.sleep(e.x)

Revisando el formulario, he encontrado opciones como python telegram bot ForceReply callback, que son exactamente lo que estoy buscando, pero usan bibliotecas diferentes como python-telegram-bot que les permiten usar ConversationHandler. Parece que no es parte de pyrogram.

¿Cómo creo interfaces amigables y paso a paso con pyrogram?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear interfaces paso a paso amigables para el usuario en pyrogram, puedes usar el método create_handler para definir una máquina de estados para tu bot. Este método te permite definir diferentes estados para la conversación y especificar devoluciones de llamada para manejar las respuestas en cada estado.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para usar create_handler:

    from pyrogram import filters
    from pyrogram.types import ForceReply
    from pyrogram.handlers import create_handler
    
    countdowns = []
    
    def create_countdown_handler():
        async def start_countdown(client, message):
            await message.reply('¿Cómo quieres llamar a la cuenta regresiva?', reply_markup=ForceReply())
            return 'name'
    
        async def get_name(client, message):
            countdowns.append({
                'name': message.text,
                'owner_id': message.from_user.id,
                'owner_username': message.from_user.username,
            })
            await message.reply(f'¿Cuándo es {message.text}?')
            return 'date'
    
        async def get_date(client, message):
            countdowns[-1]['date'] = message.text
            await message.reply(f"¡El evento {countdowns[-1]['name']} en {countdowns[-1]['date']} ha sido guardado!")
            return 'done'
    
        handler = create_handler(
            start=start_countdown,
            states={
                'name': get_name,
                'date': get_date,
                'done': None,
            },
            fallback=None
        )
    
        return handler
    
    
    @app.on_message(filters.command('create'))
    async def create_countdown(client, message):
        handler = create_countdown_handler()
        await handler.run(client, message)
    

    En este ejemplo, definimos una función create_countdown_handler que devuelve un objeto handler definido usando create_handler. El handler contiene tres estados: 'name', 'date' y 'done'. Cada estado tiene una devolución de llamada correspondiente que maneja la respuesta del usuario.

    Cuando el usuario envía el comando /create, creamos una nueva instancia del handler y lo iniciamos llamando a handler.run(client, message). Esto inicia la conversación y envía el primer mensaje al usuario.

    Cuando el usuario responde, se llama a la devolución de llamada correspondiente en función del estado actual. La devolución de llamada actualiza el estado y envía un nuevo mensaje al usuario para solicitar la siguiente respuesta.

    Una vez que el usuario ha proporcionado toda la información necesaria, la conversación finaliza con un mensaje final que indica que el evento se ha guardado.

    Este enfoque te permite definir interacciones conversacionales complejas que son amigables para el usuario y que pueden manejar una amplia gama de entradas.

Comments are closed.