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 :)