Mensagens longas
O limite de 4096 é em UTF-16, e não em caracteres: Tg.dividir corta onde o Telegram aceita.
Uma mensagem do Telegram tem no máximo 4096 unidades; uma legenda de foto, 1024. Passar disso não corta a mensagem: o Telegram a recusa inteira com message is too long, e o relatório que o bot ia mandar simplesmente não chega.
E a conta é em unidades UTF-16, não em caracteres. Um emoji — quase todos estão fora do plano básico — vale dois. Uma mensagem de 4000 caracteres com 200 emojis passa de 4096 e é recusada, embora len diga 4000.
dataforge
adopt Arcane.Telegram as Tg
app := Tg.app("123456:TESTE-exemplo")
relatorio := ("linha do relatório com 📦\n" * 300)
mark @app.comando("relatorio")
action enviar_relatorio(ctx):
cycle parte in Tg.dividir(relatorio):
ctx.responder(parte)
t := Tg.testar(app)
t.comando("relatorio")
assert t.quantas("sendMessage") bigger 1
assert "".join(t.respostas()).replace("\n", "") is relatorio.replace("\n", "")Onde ele corta#
| Preferência | Por quê |
|---|---|
1. parágrafo (\n\n) | o leitor não percebe a quebra |
| 2. linha | uma linha de tabela não fica pela metade |
| 3. espaço | uma palavra não se parte |
| 4. no meio | só quando uma "palavra" passa do limite sozinha |
E um escape do MarkdownV2 nunca é separado da barra: um pedaço terminando em \\ e o seguinte começando em . são duas mensagens recusadas por marcação inválida.
dataforge
adopt Arcane.Telegram as Tg
legenda := Tg.dividir("Legenda muito longa " * 80, 1024)
assert len(legenda) bigger 1
cycle p in legenda:
assert len(p) smaller_eq 1024