Teclados e formatação
Botões embutidos, o teclado do celular, e o escape de MarkdownV2 que salva a mensagem inteira.
Botões embutidos#
dataforge
ctx.responder("Confirma?", teclado := Tg.botoes([
[Tg.botao("Sim", dados := "ok"), Tg.botao("Nao", dados := "cancelar")],
[Tg.botao("Ver no site", url := "https://exemplo.dev")]
]))O dados volta em ctx.dados quando alguém clica. dados e url no mesmo botão é um erro do Telegram — e ele recusa o teclado inteiro sem dizer qual botão é o culpado, então é melhor descobrir na chamada.
O teclado do celular#
dataforge
ctx.responder("Escolha:", teclado := Tg.teclado([
["Consultar saldo", "Extrato"],
["Falar com alguem"]
], dica := "toque numa opcao"))
// e para tirar:
ctx.responder("Pronto.", teclado := Tg.remover_teclado())O escape que salva a mensagem#
O MarkdownV2 do Telegram exige escapar dezoito caracteres, e a lista inclui o ponto e o hífen — ou seja, um preço e uma data. Um caractere sem escape faz o Telegram recusar a mensagem inteira com 400, e o texto que quebra costuma ser justamente o que veio do usuário: funciona em teste e falha em produção, com o nome de alguém.
dataforge
// errado: o '.' e o '-' derrubam a mensagem
ctx.responder("Total: R$ 1.099,90 - hoje", marcacao := "MarkdownV2")
// certo:
ctx.responder(Tg.escapar("Total: R$ 1.099,90 - hoje"),
marcacao := "MarkdownV2")| Função | Sai como |
|---|---|
Tg.escapar(t) | o texto com os dezoito reservados escapados |
Tg.negrito(t) | *texto* — já escapado por dentro |
Tg.italico(t) · Tg.riscado(t) · Tg.spoiler(t) | as outras ênfases |
Tg.codigo(t) | código em linha; só a crase é escapada |
Tg.bloco(t, lang) | bloco de código com linguagem |
Tg.link(t, url) · Tg.mencao(t, id) | link, e menção a uma pessoa |
Tg.escapar_html(t) | para a marcação HTML, que exige só três trocas |
O escapar_html troca o & primeiro: na ordem contrária, < viraria &lt; — o escape do escape.