import dev.inmo.kslog.common.KSLog
import dev.inmo.kslog.common.LogLevel
import dev.inmo.kslog.common.defaultMessageFormatter
import dev.inmo.kslog.common.setDefaultKSLog
import dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptions
import dev.inmo.tgbotapi.extensions.api.answers.answer
import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands
import dev.inmo.tgbotapi.extensions.api.send.reply
import dev.inmo.tgbotapi.extensions.api.send.sendRichMessage
import dev.inmo.tgbotapi.extensions.api.send.sendRichMessageDraft
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitRichMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onBaseInlineQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onGuestRequestMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onRichMessage
import dev.inmo.tgbotapi.extensions.utils.baseSentMessageUpdateOrNull
import dev.inmo.tgbotapi.extensions.utils.contentMessageOrNull
import dev.inmo.tgbotapi.extensions.utils.onlyRichMessageContentMessages
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
import dev.inmo.tgbotapi.requests.edit.text.EditChatMessageRichText
import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle
import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputRichMessageContent
import dev.inmo.tgbotapi.types.InlineQueryId
import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
import dev.inmo.tgbotapi.types.rich.InputRichMessageHTML
import dev.inmo.tgbotapi.types.rich.InputRichMessageMarkdown
import dev.inmo.tgbotapi.types.toChatId
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.mapNotNull
/**
* This bot demonstrates Rich Messages support introduced in Telegram Bot API 10.1.
*
* Rich messages allow bots to send highly structured text (and to stream AI-generated replies
* with seamless rich formatting). Telegram parses the provided HTML/Markdown into a structured
* [dev.inmo.tgbotapi.types.rich.RichMessage] made of [dev.inmo.tgbotapi.types.rich.RichBlock]s.
*
* Key concepts demonstrated:
* - [dev.inmo.tgbotapi.types.rich.InputRichMessage] — describes a rich message to send. Built only via
* the [InputRichMessageHTML] / [InputRichMessageMarkdown] factories (exactly one format must be used)
* - [sendRichMessage] — sendRichMessage method
* - [sendRichMessageDraft] — sendRichMessageDraft method: stream partial rich messages by draftId
* - [EditChatMessageRichText] — editMessageText with the new `rich_message` parameter
* - [onRichMessage] — trigger for incoming [dev.inmo.tgbotapi.types.message.content.RichMessageContent]
* (the new `rich_message` field of Message)
* - [waitRichMessage] — expectation for a rich message
* - [onlyRichMessageContentMessages] — flow filter keeping only rich message content
* - [InputRichMessageContent] — usable as InputMessageContent in inline query results
*/
suspend fun main(vararg args: String) {
val botToken = args.first()
val isDebug = args.any { it == "debug" }
val isTestServer = args.any { it == "testServer" }
if (isDebug) {
setDefaultKSLog(
KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? ->
println(defaultMessageFormatter(level, tag, message, throwable))
}
)
}
val testMarkdownText = """
**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)


${'$'}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










| 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 codeSummary with **bold text**
### Details heading
- List item with _italic text_
- List item with spoiler codeSummary with **bold text**
### Details heading
- List item with _italic text_
- List item with strikethrough text, strikethrough text, strikethrough text
inline fixed-width code
marked text
subscript text
superscript text
Paragraph text
pre-formatted fixed-width code block
print('pre-formatted fixed-width code block written in the Python programming language')
Block quotation started
Block quotation continued
The last line of the block quotationThe Author





| Header 1 | Header 2 |
|---|---|
| Value 1 | Value 2 |
| Value | Value2 | Value3 | |
| Value4 | Value5 | Value6 | |
| Value7 | |||