Pular para o conteúdo

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ênciaPor quê
1. parágrafo (\n\n)o leitor não percebe a quebra
2. linhauma linha de tabela não fica pela metade
3. espaçouma palavra não se parte
4. no meiosó 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