import type { User } from "./manage.ts"; import type { CopyTextButton, DisabledButton, LoginUrl, SwitchInlineQueryChosenChat, WebAppInfo, } from "./markup.ts"; import type { Animation, Audio, Document, Location, PhotoSize, Video, Voice, } from "./message.ts"; import type { InputMediaAnimation, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, InputMediaVoiceNote, } from "./methods.ts"; /** Describes a rich message to be sent. Exactly one of the fields html, markdown, or blocks must be used. * * Rich messages support advanced structured formatting options like headings, lists, tables, media, block quotations, collapsible blocks, footnotes, and formulas. Telegram clients will render them accordingly. You can specify rich message content using Markdown-style or HTML-style formatting, or explicit blocks. * * Plain URLs, e-mail addresses, username mentions, hashtags, cashtags, bot commands, phone numbers, and bank card numbers are detected automatically. To disable automatic entity detection, pass True in the skip_entity_detection field. Note that Telegram clients will display an alert to the user before opening an inline link ('Open this link?' together with the full URL). * * When Markdown-style or HTML-style formatting is used, you can use links in the form tg://photo?id=..., tg://video?id=..., tg://document?id=..., and tg://audio?id=... instead of an HTTP URL to reuse previously uploaded files or upload a new file. * * #### Rich Message Limits * * Rich messages are subject to the following limits: * * - Up to 32768 UTF-8 characters in the rich message text, including custom emoji alternative text and formula source. * - Up to 500 blocks, including nested blocks, list items, ordered list items, table rows, quotation blocks, and details blocks. * - Up to 16 levels of nested formatting and blocks. * - Up to 50 media attachments in total. * - Up to 20 columns in a table. * * #### Rich Markdown style * * To use this mode, pass rich message content in the markdown field. Use the following syntax in your message: * * ````markdown * **bold text** * __bold text__ * *italic text* * _italic text_ * ~~strikethrough text~~ * `inline fixed-width code` * ==marked text== * ||spoiler|| * * [inline URL](https://t.me/) * [inline e-mail](mailto:user@example.com) * [inline phone number](tel:+123456789) * [inline mention of a user](tg://user?id=123456789) * ![👍](tg://emoji?id=5368324170671202286) * ![22:45 tomorrow](tg://time?unix=1647531900&format=wDT) * $x^2 + y^2$ * \#hashtag $USD +12345678901, card: 4242 4242 4242 4242, https://t.me t.me a@t.me /command @username * all the text above was on the same line * * # Heading 1 * ## Heading 2 * ### Heading 3 * #### Heading 4 * ##### Heading 5 * ###### Heading 6 * * Paragraph text * * ```python * print('pre-formatted fixed-width code block written in the Python programming language') * ``` * * --- * * - unordered list item * * unordered list item * + unordered list item * * 1. ordered list item * 2. ordered list item * * - [ ] task list item * - [x] completed task list item * * >Block quotation started * > * >Block quotation continued on the next line * >Block quotation continued on the same line * > * >The last line of the block quotation * * ![](https://telegram.org/example/photo.jpg) * ![](https://telegram.org/example/video.mp4) * ![](https://telegram.org/example/audio.mp3) * ![](https://telegram.org/example/audio.ogg) * ![](https://telegram.org/example/animation.gif) * ![](https://telegram.org/example/document.zip) * * ![](https://telegram.org/example/photo.jpg "Photo caption") * ![](https://telegram.org/example/video.mp4 "Video caption") * ![](https://telegram.org/example/audio.mp3 "Audio caption") * ![](https://telegram.org/example/audio.ogg "Voice note caption") * ![](https://telegram.org/example/animation.gif "Animation caption") * ![](https://telegram.org/example/document.zip "Document caption") * * | Header 1 | Header 2 | * |:---------|:--------:| * | left | center | * * Text with a reference[^id1] and another one[^id2]. * * [^id1]: Definition of the first footnote. * [^id2]: Definition of the second footnote. * * $$E = mc^2$$ * * ```math * E = mc^2 * ``` * * ## Example Nested Syntax Report for _Q1_ * Intro with underlined text, ==marked text==, and $x^2 + y^2$. * **Bold _italic underlined italic bold italic_ bold** * In inline tags, nested **markdown** is parsed * >Quote with **bold text, ~~strikethrough, and spoiler~~**, plus [a link](https://t.me/). * * - List item with `code`, superscript, subscript, and a footnote[^note] * - Another item with **bold spoiler code** * - Another item with ~~strikethrough and inserted text~~ * * | Metric | Value | * |:-------|------:| * | Speed | **42** ms | * | Status | ready | * * [^note]: Footnote with _italic text_ and HTML underline. * * --- * * # Details blocks can contain Markdown content: * *
Summary with **bold text** * * ### Details heading * - List item with _italic text_ * - List item with spoiler * *
* * # Collages and slideshows can contain Markdown media blocks: * * * * ![](https://telegram.org/example/photo.jpg) * ![](https://telegram.org/example/video.mp4) * * * * * * ![](https://telegram.org/example/photo.jpg) * ![](https://telegram.org/example/video.mp4) * * * ```` * * For formatting features that don't have Markdown syntax, use HTML tags: * * ```html * underlined text, underlined text * subscript text * superscript text * * *
TitleContent
* *
CaptionThe Author
* *

Inline buttons: * url * user * callback with the date 22:45 tomorrow and the custom emoji 👍 * Mini App (private chats only) * login (requires domain set up via @BotFather) * inline * inline 2 * inline 3 * Copy * Disabled *

* * url * user * callback * * * Mini App (private chats only) * * * login (requires domain set up via @BotFather) * * * inline * inline 2 * inline 3 * * * Copy * Disabled * * ``` * * Please note: * * - Rich Markdown is compatible with GitHub Flavored Markdown where possible and can contain arbitrary HTML. Supported rich message HTML tags are parsed as described in Rich HTML style. * - Media can be specified only as a separate block. * - Media blocks support only HTTP and HTTPS URLs. * - Media type is determined by the MIME type and the URL of the media. * - In media syntax, the optional title after the URL is used as the caption; for example, displays “Photo caption” under the media. * - Table cells can contain only inline formatting. * - Formula source is treated as raw LaTeX. * - See date-time entity formatting for more details about supported date-time formats. * * #### Rich HTML style * * To use this mode, pass rich message content in the html field. The following tags are currently supported: * * ```html * * bold text, bold text * italic text, italic text * underlined text, underlined text * strikethrough text, strikethrough text, strikethrough text * inline fixed-width code * marked text * subscript text * superscript text * spoiler * * Reference * inline URL * inline e-mail * inline phone number * inline mention of a user * in-document link * * * Referenced text * 👍 * 👍 * 22:45 tomorrow * x^2 + y^2 * * #hashtag $USD +12345678901, card: 4242 4242 4242 4242, https://t.me t.me a@t.me /command @username * * all the text above was on the same line * *

Heading 1

*

Heading 2

*

Heading 3

*

Heading 4

*
Heading 5
*
Heading 6
* * * *

Paragraph text

*
pre-formatted fixed-width code block
*
  print('pre-formatted fixed-width code block written in the Python programming language')
* *
* *
  1. ordered list item
*
  1. ordered list item
*
  1. ordered list item with explicit number
* * *
Block quotation started
Block quotation continued
The last line of the block quotationThe Author
*
Expandable block quotation started
Expandable block quotation continued
Expandable block quotation continued
Expandable block quotation continued
The last line of the expandable block quotationThe Author
* * * * * * * * * *
Photo captionPhoto credit
*
Video caption
*
Audio caption
*
Voice note caption
*
Animation caption
*
Document caption
* * *
Map caption
* * * * * * *
Header 1Header 2
Value 1Value 2
* * * *
Table caption
ValueValue2Value3
Value4Value5Value6
Value7
* *
TitleContent
*
TitleContent
* E = mc^2 *

Inline buttons: * url * user * callback with the date 22:45 tomorrow and the custom emoji 👍 * Mini App (private chats only) * login (requires domain set up via @BotFather) * inline * inline 2 * inline 3 * Copy * Disabled *

* * url * user * callback * * * Mini App (private chats only) * * * login (requires domain set up via @BotFather) * * * inline * inline 2 * inline 3 * * * Copy * Disabled * * ``` * * Please note: * * - Only the tags mentioned above are currently supported. * - All numerical HTML entities are supported. * - The API currently supports only the following named HTML entities: <, >, &, ", ',  , …, —, –, ‘, ’, “ and ”. * - Use nested pre and code tags to define the programming language for a pre-formatted block. * - Programming language can't be specified for standalone code tags. * - Links mailto:..., tel:..., and tg://user?id=... are rendered as e-mail links, phone links, and inline mentions respectively. Other supported links are rendered as regular inline links. * - Images, videos, and audio files can be specified only as separate media blocks. * - Media blocks support only HTTP and HTTPS URLs. * - An empty \ on its own creates an anchor that can be linked to with \.... * - In \
, you can use \ tags to specify caption credit. * - Use \... to define referenced text that can be linked to with \.... * - The body of a \
tag can contain rich message content. If the open attribute is specified, the block is expanded by default. * - Formula source is treated as raw LaTeX. * - See date-time entity formatting for more details about supported date-time formats. */ export interface InputRichMessage { /** Content of the rich message to send described as a list of blocks */ blocks?: InputRichBlock[]; /** Content of the rich message to send described using HTML formatting. See rich message formatting options for more details. Use media field to specify the media used in the message. */ html?: string; /** Content of the rich message to send described using Markdown formatting. See rich message formatting options for more details. Use media field to specify the media used in the message. */ markdown?: string; /** List of media that are specified in the markdown or html fields using tg://photo?id=, tg://video?id=, tg://document?id=, and tg://audio?id= links */ media?: InputRichMessageMedia[]; /** Pass True if the rich message must be shown right-to-left */ is_rtl?: boolean; /** Pass True to skip automatic detection of entities (e.g., URLs, email addresses, username mentions, hashtags, cashtags, bot commands, or phone numbers) in the text */ skip_entity_detection?: boolean; } /** Describes a media element embedded in an outgoing rich message. */ export interface InputRichMessageMedia { /** Unique identifier of the media used in a tg://photo?id=, tg://video?id=, tg://document?id=, or tg://audio?id= link. 1-64 characters, only A-Z, a-z, 0-9, _ and - are allowed. */ id: string; /** The media to be sent. Everything except the media itself and its properties is ignored. */ media: | InputMediaAnimation | InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo | InputMediaVoiceNote; } /** This object represents a rich formatted text. Currently, it can be either a String for plain text, an Array of RichText, or any of the following types: - RichTextBold - RichTextItalic - RichTextUnderline - RichTextStrikethrough - RichTextSpoiler - RichTextDateTime - RichTextTextMention - RichTextSubscript - RichTextSuperscript - RichTextMarked - RichTextCode - RichTextCustomEmoji - RichTextMathematicalExpression - RichTextUrl - RichTextEmailAddress - RichTextPhoneNumber - RichTextBankCardNumber - RichTextMention - RichTextHashtag - RichTextCashtag - RichTextBotCommand - RichTextButton - RichTextAnchor - RichTextAnchorLink - RichTextReference - RichTextReferenceLink */ export type RichText = | string | RichText[] | RichTextBold | RichTextItalic | RichTextUnderline | RichTextStrikethrough | RichTextSpoiler | RichTextDateTime | RichTextTextMention | RichTextSubscript | RichTextSuperscript | RichTextMarked | RichTextCode | RichTextCustomEmoji | RichTextMathematicalExpression | RichTextUrl | RichTextEmailAddress | RichTextPhoneNumber | RichTextBankCardNumber | RichTextMention | RichTextHashtag | RichTextCashtag | RichTextBotCommand | RichTextButton | RichTextAnchor | RichTextAnchorLink | RichTextReference | RichTextReferenceLink; /** A bold text. */ export interface RichTextBold { /** Type of the rich text, always “bold” */ type: "bold"; /** The text */ text: RichText; } /** An italicized text. */ export interface RichTextItalic { /** Type of the rich text, always “italic” */ type: "italic"; /** The text */ text: RichText; } /** An underlined text. */ export interface RichTextUnderline { /** Type of the rich text, always “underline” */ type: "underline"; /** The text */ text: RichText; } /** A strikethrough text. */ export interface RichTextStrikethrough { /** Type of the rich text, always “strikethrough” */ type: "strikethrough"; /** The text */ text: RichText; } /** A text covered by a spoiler. */ export interface RichTextSpoiler { /** Type of the rich text, always “spoiler” */ type: "spoiler"; /** The text */ text: RichText; } /** Formatted date and time. */ export interface RichTextDateTime { /** Type of the rich text, always “date_time” */ type: "date_time"; /** The text */ text: RichText; /** The Unix time associated with the entity */ unix_time: number; /** The string that defines the formatting of the date and time. See date-time entity formatting for more details. */ date_time_format: "r" | `${"w" | ""}${"d" | "D" | ""}${"t" | "T" | ""}`; } /** A mention of a Telegram user by their identifier. */ export interface RichTextTextMention { /** Type of the rich text, always “text_mention” */ type: "text_mention"; /** The text */ text: RichText; /** The mentioned user */ user: User; } /** A subscript text. */ export interface RichTextSubscript { /** Type of the rich text, always “subscript” */ type: "subscript"; /** The text */ text: RichText; } /** A superscript text. */ export interface RichTextSuperscript { /** Type of the rich text, always “superscript” */ type: "superscript"; /** The text */ text: RichText; } /** A marked text. */ export interface RichTextMarked { /** Type of the rich text, always “marked” */ type: "marked"; /** The text */ text: RichText; } /** A monowidth text. */ export interface RichTextCode { /** Type of the rich text, always “code” */ type: "code"; /** The text */ text: RichText; } /** A custom emoji. */ export interface RichTextCustomEmoji { /** Type of the rich text, always “custom_emoji” */ type: "custom_emoji"; /** Unique identifier of the custom emoji. Use getCustomEmojiStickers to get full information about the sticker. */ custom_emoji_id: string; /** Alternative emoji for the custom emoji */ alternative_text: string; } /** A mathematical expression. */ export interface RichTextMathematicalExpression { /** Type of the rich text, always “mathematical_expression” */ type: "mathematical_expression"; /** The expression in LaTeX format */ expression: string; } /** A text with a link. */ export interface RichTextUrl { /** Type of the rich text, always “url” */ type: "url"; /** The text */ text: RichText; /** URL of the link */ url: string; } /** A text with an email address. */ export interface RichTextEmailAddress { /** Type of the rich text, always “email_address” */ type: "email_address"; /** The text */ text: RichText; /** The email address */ email_address: string; } /** A text with a phone number. */ export interface RichTextPhoneNumber { /** Type of the rich text, always “phone_number” */ type: "phone_number"; /** The text */ text: RichText; /** The phone number */ phone_number: string; } /** A text with a bank card number. */ export interface RichTextBankCardNumber { /** Type of the rich text, always “bank_card_number” */ type: "bank_card_number"; /** The text */ text: RichText; /** The bank card number */ bank_card_number: string; } /** A mention by a username. */ export interface RichTextMention { /** Type of the rich text, always “mention” */ type: "mention"; /** The text */ text: RichText; /** The mentioned user */ username: string; } /** A hashtag. */ export interface RichTextHashtag { /** Type of the rich text, always “hashtag” */ type: "hashtag"; /** The text */ text: RichText; /** The hashtag */ hashtag: string; } /** A cashtag. */ export interface RichTextCashtag { /** Type of the rich text, always “cashtag” */ type: "cashtag"; /** The text */ text: RichText; /** The cashtag */ cashtag: string; } /** A bot command. */ export interface RichTextBotCommand { /** Type of the rich text, always “bot_command” */ type: "bot_command"; /** The text */ text: RichText; /** The bot command */ bot_command: string; } /** An anchor. */ export interface RichTextAnchor { /** Type of the rich text, always “anchor” */ type: "anchor"; /** The name of the anchor */ name: string; } /** A link to an anchor. */ export interface RichTextAnchorLink { /** Type of the rich text, always “anchor_link” */ type: "anchor_link"; /** The link text */ text: RichText; /** The name of the anchor. If the name is empty, then the link brings back to the top of the message. */ anchor_name: string; } /** A reference. */ export interface RichTextReference { /** Type of the rich text, always “reference” */ type: "reference"; /** Text of the reference */ text: RichText; /** The name of the reference */ name: string; } /** A link to a reference. */ export interface RichTextReferenceLink { /** Type of the rich text, always “reference_link” */ type: "reference_link"; /** The link text */ text: RichText; /** The name of the reference */ reference_name: string; } /** Caption of a rich formatted block. */ export interface RichBlockCaption { /** Block caption */ text: RichText; /** Block credit which corresponds to the HTML tag \ */ credit?: RichText; } /** Cell in a table. */ export interface RichBlockTableCell { /** Text in the cell. If omitted, then the cell is invisible. */ text?: RichText; /** True, if the cell is a header cell */ is_header?: true; /** The number of columns the cell spans if it is bigger than 1 */ colspan?: number; /** The number of rows the cell spans if it is bigger than 1 */ rowspan?: number; /** Horizontal cell content alignment. Currently, must be one of “left”, “center”, or “right”. */ align: "left" | "center" | "right"; /** Vertical cell content alignment. Currently, must be one of “top”, “middle”, or “bottom”. */ valign: "top" | "middle" | "bottom"; } /** An item of a list. */ export interface RichBlockListItem { /** Label of the item */ label: string; /** The content of the item */ blocks: RichBlock[]; /** True, if the item has a checkbox */ has_checkbox?: true; /** True, if the item has a checked checkbox */ is_checked?: true; /** For ordered lists, the numeric value of the item label */ value?: number; /** For ordered lists, the type of the item label; must be one of “a” for lowercase letters, “A” for uppercase letters, “i” for lowercase Roman numerals, “I” for uppercase Roman numerals, or “1” for decimal numbers */ type?: "a" | "A" | "i" | "I" | "1"; } /** This object represents a block in a rich formatted message. Currently, it can be any of the following types: - RichBlockParagraph - RichBlockSectionHeading - RichBlockPreformatted - RichBlockFooter - RichBlockDivider - RichBlockMathematicalExpression - RichBlockAnchor - RichBlockList - RichBlockBlockQuotation - RichBlockExpandableBlockQuotation - RichBlockPullQuotation - RichBlockCollage - RichBlockSlideshow - RichBlockTable - RichBlockDetails - RichBlockMap - RichBlockAnimation - RichBlockAudio - RichBlockDocument - RichBlockPhoto - RichBlockVideo - RichBlockVoiceNote - RichBlockButtons - RichBlockThinking */ export type RichBlock = | RichBlockParagraph | RichBlockSectionHeading | RichBlockPreformatted | RichBlockFooter | RichBlockDivider | RichBlockMathematicalExpression | RichBlockAnchor | RichBlockList | RichBlockBlockQuotation | RichBlockExpandableBlockQuotation | RichBlockPullQuotation | RichBlockCollage | RichBlockSlideshow | RichBlockTable | RichBlockDetails | RichBlockMap | RichBlockAnimation | RichBlockAudio | RichBlockDocument | RichBlockPhoto | RichBlockVideo | RichBlockVoiceNote | RichBlockButtons | RichBlockThinking; /** A text paragraph, corresponding to the HTML tag \

. */ export interface RichBlockParagraph { /** Type of the block, always “paragraph” */ type: "paragraph"; /** Text of the block */ text: RichText; } /** A section heading, corresponding to the HTML tags \

, \

, \

, \

, \

, or \
. */ export interface RichBlockSectionHeading { /** Type of the block, always “heading” */ type: "heading"; /** Text of the block */ text: RichText; /** Relative size of the text font; 1-6, 1 is the largest, 6 is the smallest */ size: 1 | 2 | 3 | 4 | 5 | 6; } /** A preformatted text block, corresponding to the nested HTML tags \
 and \. */
export interface RichBlockPreformatted {
  /** Type of the block, always “pre” */
  type: "pre";
  /** Text of the block */
  text: RichText;
  /** The programming language of the text */
  language?: string;
}

/** A footer, corresponding to the HTML tag \