diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fec73005..bd1422104b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,19 @@ media for present out) * `PhotoContent` now choose biggest photo size from its collection as `media` * Fix in order of media group messages which was received by webhooks +### 0.12.4 + +* Optimized preparing of media group in `UpdatesPoller` +* Add `CommonLimiter` +* Add `MessageEntity#asHtmlSource` and `String#toHtml` +* Add tools for work with html captions and texts +* `MessageContent` which using captions or text now have default parse mode `HTMLParseMode` due to issue with escaping +of `]` in links titles +* Added `Markdown` and `HTML` type aliases which actually means `MarkdownParseMode` and `HTMLParseMode` +* `ChatId` now have extension `link` which will automatically create link like `tg://user?id=` +* Created a few of methods for all supported formats of text like bold, italic, links and others +* Rewritten `MessageEntities` to use new formatting options + ## 0.11.0 * Kotlin `1.3.11` -> `1.3.21` diff --git a/README.md b/README.md index ac44d17ff3..ab2cc8d9d4 100644 --- a/README.md +++ b/README.md @@ -62,5 +62,6 @@ recommend to use some unique address for each bot which you are using Template for Nginx server config you can find in [this gist](https://gist.github.com/InsanusMokrassar/fcc6e09cebd07e46e8f0fdec234750c4#file-nginxssl-conf). -For webhook you must provide `File` with public part of certificate, `URL` where bot placed and inner `PORT` which -will be used to start receiving of updates. +For webhook you can provide `File` with public part of certificate, `URL` where bot will be available and inner `PORT` which +will be used to start receiving of updates. Actually, you can skip passing of `File` when you have something like +nginx for proxy forwarding. diff --git a/build.gradle b/build.gradle index d5c823b65a..0dc98c4797 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -project.version = "0.12.3" +project.version = "0.12.4" project.group = "com.github.insanusmokrassar" buildscript { diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/settings/limiters/CommonLimiter.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/settings/limiters/CommonLimiter.kt new file mode 100644 index 0000000000..e053a48294 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/settings/limiters/CommonLimiter.kt @@ -0,0 +1,66 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.settings.limiters + +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.Channel + +private fun now(): Long = System.currentTimeMillis() + +class CommonLimiter( + private val lockCount: Int = 10, + private val regenTime: Long = 20 * 1000L // 20 seconds for full regen of opportunity to send message +) : RequestLimiter { + private var doLimit: Boolean = false + + private val counterChannel = Channel(Channel.UNLIMITED) + private val scope = CoroutineScope(Dispatchers.Default) + private val counterJob = scope.launch { + var wasLastSecond = 0 + var lastCountTime = now() + var limitManagementJob: Job? = null + var removeLimitTime: Long = lastCountTime + for (counter in counterChannel) { + val now = now() + if (now - lastCountTime > 1000) { + lastCountTime = now + wasLastSecond = 1 + } else { + wasLastSecond++ + } + if (wasLastSecond >= lockCount) { + removeLimitTime = now + regenTime + if (limitManagementJob == null) { + limitManagementJob = launch { + doLimit = true + var internalNow = now() + while (internalNow < removeLimitTime) { + delay(removeLimitTime - internalNow) + internalNow = now() + } + doLimit = false + } + } + } + if (now > removeLimitTime) { + limitManagementJob = null + } + } + } + + private val quoterChannel = Channel(Channel.CONFLATED) + private val tickerJob = scope.launch { + while (isActive) { + quoterChannel.send(Unit) + delay(1000L) + } + } + + override suspend fun limit(block: suspend () -> T): T { + counterChannel.send(Unit) + return if (!doLimit) { + block() + } else { + quoterChannel.receive() + block() + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt index 959cc61e02..dfaa6eb2c2 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt @@ -13,6 +13,10 @@ data class ChatId( val chatId: Identifier ) : ChatIdentifier() + +val ChatId.link: String + get() = "tg://user?id=$chatId" + typealias UserId = ChatId fun Identifier.toChatId(): ChatId = ChatId(this) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt index 91c92bb650..5336c72289 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt @@ -1,9 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.boldHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.boldMarkdown + data class BoldTextMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : TextMessageEntity() { - override val formatSymbol: String = "*" +) : MessageEntity { + override val asMarkdownSource: String = sourceString.boldMarkdown() + override val asHtmlSource: String = sourceString.boldHTML() } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt index 4556f722c0..cad8a5adfd 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt @@ -1,10 +1,16 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.commandHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.commandMarkdown + data class BotCommandMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String ) : MessageEntity { + override val asMarkdownSource: String = sourceString.commandMarkdown() + override val asHtmlSource: String = sourceString.commandHTML() + val command: String by lazy { sourceString.substring(1)// skip first symbol like "/" or "!" } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt index 741a0a60d3..d5adda2106 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt @@ -1,9 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.codeHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.codeMarkdown + data class CodeTextMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : TextMessageEntity() { - override val formatSymbol: String = "`" +) : MessageEntity { + override val asMarkdownSource: String = sourceString.codeMarkdown() + override val asHtmlSource: String = sourceString.codeHTML() } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt index cdd17c79cb..4c88ce875a 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt @@ -1,11 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.emailHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.emailMarkdown + class EMailMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String ) : MessageEntity { - override val asMarkdownSource: String by lazy { - "[$sourceString](mailto://$sourceString)" - } -} \ No newline at end of file + override val asMarkdownSource: String = sourceString.emailMarkdown() + override val asHtmlSource: String = sourceString.emailHTML() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt index 1bc3c9a1ff..702a3f75a9 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt @@ -1,7 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.hashTagHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.hashTagMarkdown + data class HashTagMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : MessageEntity +) : MessageEntity { + override val asMarkdownSource: String = sourceString.hashTagMarkdown() + override val asHtmlSource: String = sourceString.hashTagHTML() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt index 32e4665b25..744dbaae9e 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt @@ -1,9 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.italicHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.italicMarkdown + data class ItalicTextMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : TextMessageEntity() { - override val formatSymbol: String = "_" +) : MessageEntity { + override val asMarkdownSource: String = sourceString.italicMarkdown() + override val asHtmlSource: String = sourceString.italicHTML() } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt index 59e2ae08db..010559e880 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt @@ -1,10 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.mentionHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.mentionMarkdown + class MentionMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String ) : MessageEntity { - override val asMarkdownSource: String - get() = sourceString -} \ No newline at end of file + override val asMarkdownSource: String = sourceString.mentionMarkdown() + override val asHtmlSource: String = sourceString.mentionHTML() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt index 96bfc85cc7..5b85448cec 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt @@ -1,12 +1,10 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity -import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown - interface MessageEntity { val offset: Int val length: Int val sourceString: String val asMarkdownSource: String - get() = sourceString.toMarkdown() + val asHtmlSource: String } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt index 6bccd2e78f..9c4433a301 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt @@ -1,7 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.phoneHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.phoneMarkdown + data class PhoneNumberMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : MessageEntity +) : MessageEntity { + override val asMarkdownSource: String = sourceString.phoneMarkdown() + override val asHtmlSource: String = sourceString.phoneHTML() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt index e9789d7ad0..37424b7b4f 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt @@ -1,9 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.preHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.preMarkdown + data class PreTextMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : TextMessageEntity() { - override val formatSymbol: String = "```" +) : MessageEntity { + override val asMarkdownSource: String = sourceString.preMarkdown() + override val asHtmlSource: String = sourceString.preHTML() } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RegularTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RegularTextMessageEntity.kt index 5c899b71e8..0c4af76680 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RegularTextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RegularTextMessageEntity.kt @@ -1,7 +1,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toHtml +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown + data class RegularTextMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : MessageEntity +) : MessageEntity { + override val asMarkdownSource: String = sourceString.toMarkdown() + override val asHtmlSource: String = sourceString.toHtml() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt index 9d149100ca..fae946f170 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt @@ -1,12 +1,14 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.linkHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.linkMarkdown + data class TextLinkMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String, val url: String ) : MessageEntity { - override val asMarkdownSource: String by lazy { - "[$sourceString]($url)" - } + override val asMarkdownSource: String = sourceString.linkMarkdown(url) + override val asHtmlSource: String = sourceString.linkHTML(url) } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt index eba3c210d2..4bbe2ea2da 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt @@ -1,6 +1,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.utils.mentionMarkdown class TextMentionMessageEntity( override val offset: Int, @@ -8,7 +9,6 @@ class TextMentionMessageEntity( override val sourceString: String, val user: User ) : MessageEntity { - override val asMarkdownSource: String by lazy { - "[$sourceString](tg://user?id=${user.id})" - } -} \ No newline at end of file + override val asMarkdownSource: String = sourceString.mentionMarkdown(user.id) + override val asHtmlSource: String = sourceString.mentionMarkdown(user.id) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt deleted file mode 100644 index 53c7142383..0000000000 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity - -abstract class TextMessageEntity : MessageEntity { - protected abstract val formatSymbol: String - - override val asMarkdownSource: String by lazy { - "$formatSymbol$sourceString$formatSymbol" - } -} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt index 6a5a182318..d4cecba36f 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt @@ -1,14 +1,15 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.linkHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.linkMarkdown + data class URLMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : MessageEntity { - val url: String - get() = sourceString +) : MessageEntity{ + val url: String = sourceString - override val asMarkdownSource: String by lazy { - "[$sourceString]($url)" - } + override val asMarkdownSource: String = sourceString.linkMarkdown(url) + override val asHtmlSource: String = sourceString.linkHTML(url) } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt index 94a1357a41..98a1d1b1b4 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt @@ -23,6 +23,9 @@ object HTMLParseMode : ParseMode() { override val parseModeName: String = "HTML" } +typealias Markdown = MarkdownParseMode +typealias HTML = HTMLParseMode + @Serializer(ParseMode::class) internal class ParseModeSerializerObject: KSerializer { override fun deserialize(decoder: Decoder): ParseMode { diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt index b84bd17791..1676614d7c 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt @@ -5,10 +5,11 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.send.SendMessage import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.* import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlTexts import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownTexts data class TextContent( @@ -22,8 +23,8 @@ data class TextContent( replyMarkup: KeyboardMarkup? ): Request = SendMessage( chatId, - toMarkdownTexts().first(), - MarkdownParseMode, + toHtmlTexts().first(), + HTMLParseMode, false, disableNotification, replyToMessageId, @@ -35,11 +36,28 @@ data class TextContent( disableNotification: Boolean, replyToMessageId: MessageIdentifier?, replyMarkup: KeyboardMarkup? - ): List> = toMarkdownTexts().map { + ): List> = createResends( + chatId, + disableNotification, + replyToMessageId, + replyMarkup, + HTMLParseMode + ) + + fun createResends( + chatId: ChatIdentifier, + disableNotification: Boolean, + replyToMessageId: MessageIdentifier?, + replyMarkup: KeyboardMarkup?, + parseMode: ParseMode = HTMLParseMode + ): List> = when (parseMode) { + is MarkdownParseMode -> toMarkdownTexts() + is HTMLParseMode -> toHtmlTexts() + }.map { SendMessage( chatId, it, - MarkdownParseMode, + parseMode, false, disableNotification, replyToMessageId, diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt index 204a371a47..bdfaa2c4c3 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt @@ -5,13 +5,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.SendAudio import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.AudioFile import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlCaptions data class AudioContent( override val media: AudioFile, @@ -27,8 +27,8 @@ data class AudioContent( chatId, media.fileId, media.thumb ?.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.duration, media.performer, media.title, diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt index 73e79fde97..49d1721691 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt @@ -5,13 +5,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.SendDocume import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.DocumentFile import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlCaptions data class DocumentContent( override val media: DocumentFile, @@ -27,8 +27,8 @@ data class DocumentContent( chatId, media.fileId, media.thumb ?.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, disableNotification, replyToMessageId, replyMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt index de31836ac8..ff79b8572d 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt @@ -7,13 +7,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMediaPho import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMemberInputMedia import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize import com.github.insanusmokrassar.TelegramBotAPI.types.files.biggest import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlCaptions data class PhotoContent( override val mediaCollection: List, @@ -30,8 +30,8 @@ data class PhotoContent( ): Request = SendPhoto( chatId, media.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, disableNotification, replyToMessageId, replyMarkup @@ -39,7 +39,7 @@ data class PhotoContent( override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = InputMediaPhoto( media.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode + toHtmlCaptions().firstOrNull(), + HTMLParseMode ) } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt index 44db88818c..fefefed0c1 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt @@ -7,12 +7,12 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMediaVid import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMemberInputMedia import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.VideoFile import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlCaptions data class VideoContent( override val media: VideoFile, @@ -28,8 +28,8 @@ data class VideoContent( chatId, media.fileId, media.thumb ?.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.duration, media.width, media.height, @@ -41,8 +41,8 @@ data class VideoContent( override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = InputMediaVideo( media.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.width, media.height, media.duration, diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt index 86f1fba9b7..ba44511753 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt @@ -5,13 +5,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.SendVoice import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.VoiceFile import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions +import com.github.insanusmokrassar.TelegramBotAPI.utils.toHtmlCaptions data class VoiceContent( override val media: VoiceFile, @@ -27,8 +27,8 @@ data class VoiceContent( chatId, media.fileId, null, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.duration, disableNotification, replyToMessageId, diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/CaptionSourcer.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Captions.kt similarity index 61% rename from src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/CaptionSourcer.kt rename to src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Captions.kt index 336496dcd2..7763f3ad6d 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/CaptionSourcer.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Captions.kt @@ -2,90 +2,14 @@ package com.github.insanusmokrassar.TelegramBotAPI.utils import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.RegularTextMessageEntity -import com.github.insanusmokrassar.TelegramBotAPI.types.captionLength +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.* import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent -import com.github.insanusmokrassar.TelegramBotAPI.types.textLength - -@Deprecated( - "Deprecated because old version have problem with long texts, but new one must return list of strings" -) -fun createMarkdownText( - text: String, - messageEntities: List -): String { - return createMarkdownText( - convertToFullMessageEntityList(text, messageEntities) - ).first() -} - -fun createMarkdownText( - entities: List, - partLength: Int = 4096 -): List { - val texts = mutableListOf() - val textBuilder = StringBuilder(partLength) - for (entity in entities) { - val string = entity.asMarkdownSource - if (textBuilder.length + string.length > partLength) { - if (textBuilder.isNotEmpty()) { - texts.add(textBuilder.toString()) - textBuilder.clear() - } - val chunked = string.chunked(partLength) - val last = chunked.last() - textBuilder.append(last) - val listToAdd = if (chunked.size > 1) { - chunked.subList(0, chunked.size - 1) - } else { - emptyList() - } - listToAdd.forEach { - texts.add(it) - } - } else { - textBuilder.append(string) - } - } - if (textBuilder.isNotEmpty()) { - texts.add(textBuilder.toString()) - textBuilder.clear() - } - return texts -} - -@Deprecated( - "Deprecated because old version have problem with long texts, but new one must return list of strings", - ReplaceWith( - "toMarkdownCaptions().firstOrNull()", - "com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions" - ) -) -fun CaptionedMediaContent.toMarkdownCaption(): String? = toMarkdownCaptions().firstOrNull() - -fun CaptionedMediaContent.toMarkdownCaptions(): List = createMarkdownText( - fullEntitiesList(), - captionLength.endInclusive + 1 -) fun CaptionedMediaContent.fullEntitiesList(): List = caption ?.let { convertToFullMessageEntityList(it, captionEntities) } ?: emptyList() -@Deprecated( - "Deprecated because old version have problem with long texts, but new one must return list of strings", - ReplaceWith( - "toMarkdownTexts().first()", - "com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownTexts" - ) -) -fun TextContent.toMarkdownText(): String = toMarkdownTexts().first() - -fun TextContent.toMarkdownTexts(): List = createMarkdownText( - fullEntitiesList(), - textLength.endInclusive + 1 -) - fun TextContent.fullEntitiesList(): List = convertToFullMessageEntityList(text, entities) fun convertToFullMessageEntityList( @@ -111,3 +35,42 @@ fun convertToFullMessageEntityList( } return result } + +fun createFormattedText( + entities: List, + partLength: Int = 4096, + mode: ParseMode = MarkdownParseMode +): List { + val texts = mutableListOf() + val textBuilder = StringBuilder(partLength) + for (entity in entities) { + val string = when (mode) { + is MarkdownParseMode -> entity.asMarkdownSource + is HTMLParseMode -> entity.asHtmlSource + } + if (textBuilder.length + string.length > partLength) { + if (textBuilder.isNotEmpty()) { + texts.add(textBuilder.toString()) + textBuilder.clear() + } + val chunked = string.chunked(partLength) + val last = chunked.last() + textBuilder.append(last) + val listToAdd = if (chunked.size > 1) { + chunked.subList(0, chunked.size - 1) + } else { + emptyList() + } + listToAdd.forEach { + texts.add(it) + } + } else { + textBuilder.append(string) + } + } + if (textBuilder.isNotEmpty()) { + texts.add(textBuilder.toString()) + textBuilder.clear() + } + return texts +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/HtmlCaptionSourcer.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/HtmlCaptionSourcer.kt new file mode 100644 index 0000000000..b75bb4b178 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/HtmlCaptionSourcer.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.captionLength +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.textLength + +fun createHtmlText( + entities: List, + partLength: Int = 4096 +): List = createFormattedText(entities, partLength, HTMLParseMode) + +fun CaptionedMediaContent.toHtmlCaptions(): List = createHtmlText( + fullEntitiesList(), + captionLength.endInclusive + 1 +) + +fun TextContent.toHtmlTexts(): List = createHtmlText( + fullEntitiesList(), + textLength.endInclusive + 1 +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MarkdownCaptionSourcer.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MarkdownCaptionSourcer.kt new file mode 100644 index 0000000000..21d1b490c7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MarkdownCaptionSourcer.kt @@ -0,0 +1,53 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.captionLength +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.textLength + +@Deprecated( + "Deprecated because old version have problem with long texts, but new one must return list of strings" +) +fun createMarkdownText( + text: String, + messageEntities: List +): String { + return createMarkdownText( + convertToFullMessageEntityList(text, messageEntities) + ).first() +} + +fun createMarkdownText( + entities: List, + partLength: Int = 4096 +): List = createFormattedText(entities, partLength, MarkdownParseMode) + +@Deprecated( + "Deprecated because old version have problem with long texts, but new one must return list of strings", + ReplaceWith( + "toMarkdownCaptions().firstOrNull()", + "com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions" + ) +) +fun CaptionedMediaContent.toMarkdownCaption(): String? = toMarkdownCaptions().firstOrNull() + +fun CaptionedMediaContent.toMarkdownCaptions(): List = createMarkdownText( + fullEntitiesList(), + captionLength.endInclusive + 1 +) + +@Deprecated( + "Deprecated because old version have problem with long texts, but new one must return list of strings", + ReplaceWith( + "toMarkdownTexts().first()", + "com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownTexts" + ) +) +fun TextContent.toMarkdownText(): String = toMarkdownTexts().first() + +fun TextContent.toMarkdownTexts(): List = createMarkdownText( + fullEntitiesList(), + textLength.endInclusive + 1 +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt new file mode 100644 index 0000000000..1eb31850c4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt @@ -0,0 +1,139 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toHtml +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown + +const val markdownBoldControl = "*" +const val markdownItalicControl = "_" +const val markdownCodeControl = "`" +const val markdownPreControl = "```" + +const val htmlBoldControl = "b" +const val htmlItalicControl = "i" +const val htmlCodeControl = "code" +const val htmlPreControl = "pre" + +private infix fun String.markdownDefault(controlSymbol: String) = "$controlSymbol$this$controlSymbol" +private infix fun String.htmlDefault(controlSymbol: String) = "<$controlSymbol>$this" + +infix fun String.linkMarkdown(link: String): String = "[$this]($link)" +infix fun String.linkHTML(link: String): String = "$this" + + +fun String.boldMarkdown(): String = markdownDefault(markdownBoldControl) +fun String.boldHTML(): String = htmlDefault(htmlBoldControl) + + +fun String.italicMarkdown(): String = markdownDefault(markdownItalicControl) +fun String.italicHTML(): String =htmlDefault(htmlItalicControl) + + +fun String.codeMarkdown(): String = markdownDefault(markdownCodeControl) +fun String.codeHTML(): String = htmlDefault(htmlCodeControl) + + +fun String.preMarkdown(): String = markdownDefault(markdownPreControl) +fun String.preHTML(): String = htmlDefault(htmlPreControl) + + +fun String.emailMarkdown(): String = linkMarkdown("mailto://$this") +fun String.emailHTML(): String = linkHTML("mailto://$this") + + +private inline infix fun String.mention(adapt: String.() -> String): String = if (startsWith("@")) { + this +} else { + "@${adapt()}" +} + + +private inline infix fun String.hashTag(adapt: String.() -> String): String = if (startsWith("#")) { + this +} else { + "#${adapt()}" +} + + +infix fun String.mentionMarkdown(userId: UserId): String = linkMarkdown(userId.link) +infix fun String.mentionHTML(userId: UserId): String = linkHTML(userId.link) + + +fun String.mentionMarkdown(): String = mention(String::toMarkdown) +fun String.mentionHTML(): String = mention(String::toHtml) + + +fun String.hashTagMarkdown(): String = hashTag(String::toMarkdown) +fun String.hashTagHTML(): String = hashTag(String::toHtml) + + +fun String.phoneMarkdown(): String = toMarkdown() +fun String.phoneHTML(): String = toHtml() + + +fun String.command(): String = if (startsWith("/")) { + this +} else { + "/$this" +} + +fun String.commandMarkdown(): String = command() +fun String.commandHTML(): String = command() + + +infix fun String.bold(parseMode: ParseMode): String = when (parseMode) { + is HTML -> boldHTML() + is Markdown -> boldMarkdown() +} + + +infix fun String.italic(parseMode: ParseMode): String = when (parseMode) { + is HTML -> italicHTML() + is Markdown -> italicMarkdown() +} + +infix fun String.hashTag(parseMode: ParseMode): String = when (parseMode) { + is HTML -> hashTagHTML() + is Markdown -> hashTagMarkdown() +} + +infix fun String.code(parseMode: ParseMode): String = when (parseMode) { + is HTML -> codeHTML() + is Markdown -> codeMarkdown() +} + +infix fun String.pre(parseMode: ParseMode): String = when (parseMode) { + is HTML -> preHTML() + is Markdown -> preMarkdown() +} + +infix fun String.email(parseMode: ParseMode): String = when (parseMode) { + is HTML -> emailHTML() + is Markdown -> emailMarkdown() +} + +infix fun Pair.link(parseMode: ParseMode): String = when (parseMode) { + is HTML -> first.linkHTML(second) + is Markdown -> first.linkMarkdown(second) +} + +infix fun String.mention(parseMode: ParseMode): String = when (parseMode) { + is HTML -> mentionHTML() + is Markdown -> mentionMarkdown() +} + +infix fun Pair.mention(parseMode: ParseMode): String = when (parseMode) { + is HTML -> first.mentionHTML(second) + is Markdown -> first.mentionMarkdown(second) +} + +infix fun String.phone(parseMode: ParseMode): String = when (parseMode) { + is HTML -> phoneHTML() + is Markdown -> phoneMarkdown() +} + +infix fun String.command(parseMode: ParseMode): String = when (parseMode) { + is HTML -> commandHTML() + is Markdown -> commandMarkdown() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/String.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/String.kt index 30584c0c7b..9c2c4d9c33 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/String.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/String.kt @@ -9,3 +9,17 @@ fun String.toMarkdown(): String { "\\_" ) } + +fun String.toHtml(): String = replace( + "<", + "<" +).replace( + ">", + ">" +).replace( + "&", + "&" +).replace( + "\"", + """ +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/UpdatesPoller.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/UpdatesPoller.kt index 3009dced12..f0dd975b2a 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/UpdatesPoller.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/UpdatesPoller.kt @@ -31,7 +31,8 @@ class UpdatesPoller( private suspend fun pushMediaGroupUpdate(update: BaseMessageUpdate? = null) { val inputMediaGroupId = (update ?.data as? MediaGroupMessage) ?.mediaGroupId if (mediaGroup.isNotEmpty() && inputMediaGroupId ?.equals(mediaGroup.mediaGroupId) != true) { - listOf(*mediaGroup.toTypedArray()).toMediaGroupUpdate() ?.let { + mediaGroup.sortBy { it.updateId } + mediaGroup.toMediaGroupUpdate() ?.let { sendToBlock(it) } ?: mediaGroup.forEach { sendToBlock(it) @@ -55,9 +56,13 @@ class UpdatesPoller( } private suspend fun handleUpdates(updates: List) { - updates.forEach { update -> + for (update in updates) { (update as? BaseMessageUpdate) ?.let { - pushMediaGroupUpdate(it) + if (it.data is MediaGroupMessage) { + pushMediaGroupUpdate(it) + } else { + null + } } ?:let { pushMediaGroupUpdate() sendToBlock(update)