Pular para o conteúdo

Comandos e roteamento

As sete formas de casar um update, o middleware e o tratador de erro.

Comando#

dataforge
mark @app.comando("start", ajuda := "Comeca a conversa")
action comecar(ctx):
    ctx.responder("Ola!")

mark @app.comando(["ajuda", "help"])
action ajudar(ctx):
    ctx.responder("Mande /cadastro.")

Ele casa com /nome, com /nome argumento e com `/nome@meubot` — a última forma é a que o Telegram usa em grupo, e um bot que não a trata parece mudo lá dentro, funcionando em privado.

O ajuda alimenta app.publicar_comandos(), que manda o menu ao Telegram. Sem o menu, a lista que aparece ao digitar / vem vazia, e um bot sem menu parece quebrado.

Texto, botão e mídia#

dataforge
mark @app.texto("^preco de (.+)$")
action preco(ctx):
    ctx.responder("Consultando…")

mark @app.botao("^comprar:(\\d+)$")
action comprar(ctx):
    ctx.avisar("Adicionado!")
    ctx.editar("Pedido atualizado.")

mark @app.midia("foto")
action recebeu_foto(ctx):
    ctx.responder("Foto recebida.")

O texto recebe uma expressão regular, ou nada para casar qualquer texto — e ele nunca casa uma mensagem que começa com /: um tratador de texto que engolisse comandos faria todo comando novo parar de funcionar.

As espécies de mídia: foto, documento, voz, video, audio, adesivo, local, contato, animacao e enquete. Uma espécie que não existe é recusada na hora, listando as que existem.

Entrou, saiu, consulta inline#

dataforge
mark @app.entrou()
action boas_vindas(ctx):
    ctx.responder("Bem-vindo ao grupo!")

mark @app.inline()
action buscar(ctx):
    ctx.bot.responder_inline(ctx.consulta["id"], resultados_de(ctx.texto))

Middleware#

dataforge
mark @app.antes_de_cada()
action so_assinantes(ctx):
    given not assinante(ctx.id_do_usuario()):
        ctx.responder("Isto e so para assinantes.")
        yield no        // 'no' interrompe: nenhum tratador roda

mark @app.depois_de_cada()
action registrar(ctx):
    Log.info($"{ctx.tipo} de {ctx.chat}")

Devolver no no antes_de_cada interrompe o update — é como se faz uma barreira sem espalhar um given por todos os tratadores.

Quando algo quebra#

dataforge
mark @app.ao_falhar()
action deu_errado(ctx, erro):
    out $"[bot] {erro}"
    ctx.responder("Alguma coisa quebrou aqui. Ja anotei.")

Um erro num tratador não derruba o bot: ele é anotado, o tratador de erro roda, e o próximo update é atendido. Um bot que morre porque alguém mandou um emoji inesperado é um bot que fica fora do ar de madrugada.

Um tratador de erro que também falha não entra em laço: a linha para ali, e o bot segue vivo.