Odeslat zprávu jako telegramový robot. Co se může pokazit?

Minulý měsíc jsem pracoval na @hltvFeatured – je to telegramový bot, který dostává oznámení o nadcházejících zápasech Counter-Strike:Global Offensive, které uvádí HLTV.org.

Po několika týdnech ve výrobě jsem dostal upozornění, že robot selže při odesílání upozornění odběratelům. Neměl jsem přístup k počítači, takže jsem byl tak nervózní. Nevěděl jsem, co se může pokazit.

Když jsem se vrátil domů, nejprve jsem otevřel IDE a začal ladit. Nebyly žádné problémy s databází, kódem aplikace nebo sítí. Telegram API však vrací chybu 400: Bad Request: can't parse entities . Začal jsem analyzovat, co je na zprávách špatně a proč to předtím neselhalo.

Telegram API umožňuje formátovat zprávy ve dvou stylech:Markdown a HTML. Vybral jsem Markdown jako méně podrobný a napsal malou funkci pro převod entity dat shody na řetězec Markdown:

function convertToMessage({ event, href, stars, title, unixTimestamp }) {
  const when = new Date(unixTimestamp).toUTCString()
  const date = formatUTCString(when).replace(/\s/g, NBSP)

  return `
[${title.replace(/\s/g, NBSP)}](${href})
Rating: ${'☆'.repeat(stars) || '–'}
_${date} @ ${event}_
`.trim()
}

Zápasy toho dne měly zajímavý název události:cs_summit 5 a hned jsem si toho všiml. Jak můžete vidět, funkce převodu změní datum a událost kurzívou :_${date} @ ${event}_ . Zpráva tedy obsahovala tři podtržítka. Nečekal jsem, že Telegram API nedokáže takto analyzovat zprávu, a tak jsem začal hledat závislost pro únikové symboly jako _ , * a [ před vložením do šablony zprávy.

Ani nevíte, jak mě překvapilo, když Telegram API odpovědělo stejnou chybou na zprávu s uniklými symboly. Tentokrát jsem to šel do googlu. Řešením byl návrh použít značky HTML a symboly escape. Aktualizoval jsem svou funkci a... funguje to!

function convertToMessage({ event, href, stars, title, unixTimestamp }) {
  const when = new Date(unixTimestamp).toUTCString()
  const date = formatUTCString(when).replace(/\s/g, NBSP)

  return `
<a href="${href}">${escapeHtml(title).replace(/\s/g, NBSP)}</a>
Rating: ${'☆'.repeat(stars) || '–'}
<i>${date} @ ${escapeHtml(event)}</i>
`.trim()
}

Nedokážu si představit případ, kdy je Markdown dobrou volbou pro označení zpráv doručených botem. A pokud můžete, podělte se prosím v komentářích :)