Pular para o conteúdo

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çãoSai 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 &amp;lt; — o escape do escape.