Comandos e roteamento
As sete formas de casar um update, o middleware e o tratador de erro.
Comando#
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#
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#
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#
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#
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.