From d9e16438239077fd132b49a9f08175dbc33a7cdd Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 23 Mar 2019 14:26:22 +0800 Subject: [PATCH 01/13] start 0.12.4 --- CHANGELOG.md | 2 ++ build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fec73005..7c1cd57147 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ 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 UpdatesPoller optimisations + ## 0.11.0 * Kotlin `1.3.11` -> `1.3.21` 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 { From 7d1871d8dcd18a2a6f1db15de12f673d9389dfe1 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 23 Mar 2019 14:31:13 +0800 Subject: [PATCH 02/13] media group optimizations --- CHANGELOG.md | 2 ++ .../TelegramBotAPI/utils/extensions/UpdatesPoller.kt | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c1cd57147..db09522152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ media for present out) ### 0.12.4 UpdatesPoller optimisations +* Optimized preparing of media group in `UpdatesPoller` + ## 0.11.0 * Kotlin `1.3.11` -> `1.3.21` 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..62914bb9f7 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) From ac5d3214b47e135c1765daf0bf7f7a8fbace50c3 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 23 Mar 2019 15:19:29 +0800 Subject: [PATCH 03/13] rewrite handleUpdates --- .../TelegramBotAPI/utils/extensions/UpdatesPoller.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 62914bb9f7..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 @@ -56,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) From 1bdcf3ae6040951f30363d8b67a9fbcc00b9896c Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 27 Mar 2019 09:13:07 +0800 Subject: [PATCH 04/13] add CommonLimiter --- CHANGELOG.md | 1 + .../bot/settings/limiters/CommonLimiter.kt | 66 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/settings/limiters/CommonLimiter.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index db09522152..c84508da03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ media for present out) ### 0.12.4 UpdatesPoller optimisations * Optimized preparing of media group in `UpdatesPoller` +* Add `CommonLimiter` ## 0.11.0 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() + } + } +} From 609a47487409f7d09b828effc6f3d77a8fea884d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 27 Mar 2019 09:35:37 +0800 Subject: [PATCH 05/13] MessageEntity#asHtmlSource --- CHANGELOG.md | 3 ++- .../types/MessageEntity/BoldTextMessageEntity.kt | 3 ++- .../types/MessageEntity/CodeTextMessageEntity.kt | 3 ++- .../types/MessageEntity/EMailMessageEntity.kt | 9 ++++----- .../types/MessageEntity/ItalicTextMessageEntity.kt | 3 ++- .../types/MessageEntity/LinkMessageEntity.kt | 14 ++++++++++++++ .../types/MessageEntity/MentionMessageEntity.kt | 5 +---- .../types/MessageEntity/MessageEntity.kt | 4 ++++ .../types/MessageEntity/PreTextMessageEntity.kt | 3 ++- .../types/MessageEntity/TextLinkMessageEntity.kt | 9 ++++----- .../MessageEntity/TextMentionMessageEntity.kt | 9 ++++----- .../types/MessageEntity/TextMessageEntity.kt | 9 +++++++-- .../types/MessageEntity/URLMessageEntity.kt | 12 +++++------- .../TelegramBotAPI/utils/extensions/String.kt | 14 ++++++++++++++ 14 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index c84508da03..5e1acf9f43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,10 +49,11 @@ 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 UpdatesPoller optimisations +### 0.12.4 * Optimized preparing of media group in `UpdatesPoller` * Add `CommonLimiter` +* Add `MessageEntity#asHtmlSource` and `String#toHtml` ## 0.11.0 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..3944bda314 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 @@ -5,5 +5,6 @@ data class BoldTextMessageEntity( override val length: Int, override val sourceString: String ) : TextMessageEntity() { - override val formatSymbol: String = "*" + override val markdownFormatSymbol: String = "*" + override val htmlFormatTagname: String = "b" } 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..19e66daeaa 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 @@ -5,5 +5,6 @@ data class CodeTextMessageEntity( override val length: Int, override val sourceString: String ) : TextMessageEntity() { - override val formatSymbol: String = "`" + override val markdownFormatSymbol: String = "`" + override val htmlFormatTagname: String = "code" } 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..90f1872575 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 @@ -4,8 +4,7 @@ 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 +) : LinkMessageEntity( + sourceString, + "mailto://$sourceString" +) 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..4c1f280b6d 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 @@ -5,5 +5,6 @@ data class ItalicTextMessageEntity( override val length: Int, override val sourceString: String ) : TextMessageEntity() { - override val formatSymbol: String = "_" + override val markdownFormatSymbol: String = "_" + override val htmlFormatTagname: String = "i" } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt new file mode 100644 index 0000000000..390029d204 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +abstract class LinkMessageEntity( + val linkTitle: String, + val link: String +) : MessageEntity { + + override val asMarkdownSource: String by lazy { + "[$linkTitle]($link)" + } + override val asHtmlSource: String by lazy { + "$linkTitle" + } +} 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..17ba95553d 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 @@ -4,7 +4,4 @@ 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 +) : MessageEntity 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..75c09f24bb 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,5 +1,6 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toHtml import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown interface MessageEntity { @@ -9,4 +10,7 @@ interface MessageEntity { val asMarkdownSource: String get() = sourceString.toMarkdown() + + val asHtmlSource: String + get() = sourceString.toHtml() } 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..17c0e3c0c0 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 @@ -5,5 +5,6 @@ data class PreTextMessageEntity( override val length: Int, override val sourceString: String ) : TextMessageEntity() { - override val formatSymbol: String = "```" + override val markdownFormatSymbol: String = "```" + override val htmlFormatTagname: String = "pre" } 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..f044bae249 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 @@ -5,8 +5,7 @@ data class TextLinkMessageEntity( override val length: Int, override val sourceString: String, val url: String -) : MessageEntity { - override val asMarkdownSource: String by lazy { - "[$sourceString]($url)" - } -} +) : LinkMessageEntity( + sourceString, + 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..f4ec51de54 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 @@ -7,8 +7,7 @@ class TextMentionMessageEntity( override val length: Int, 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 +) : LinkMessageEntity( + sourceString, + "tg://user?id=${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 index 53c7142383..d271d6e4f8 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt @@ -1,9 +1,14 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity abstract class TextMessageEntity : MessageEntity { - protected abstract val formatSymbol: String + protected abstract val markdownFormatSymbol: String + protected abstract val htmlFormatTagname: String override val asMarkdownSource: String by lazy { - "$formatSymbol$sourceString$formatSymbol" + "$markdownFormatSymbol$sourceString$markdownFormatSymbol" + } + + override val asHtmlSource: String by lazy { + "<$htmlFormatTagname>$sourceString" } } 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..2aee673219 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 @@ -4,11 +4,9 @@ data class URLMessageEntity( override val offset: Int, override val length: Int, override val sourceString: String -) : MessageEntity { - val url: String - get() = sourceString - - override val asMarkdownSource: String by lazy { - "[$sourceString]($url)" - } +) : LinkMessageEntity( + sourceString, + sourceString +) { + val url: String = link } 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( + "\"", + """ +) From 4679dc118d8977c6cbaa78451b1c5311c68adf1b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 27 Mar 2019 09:43:36 +0800 Subject: [PATCH 06/13] add tools for work with html captions and texts --- CHANGELOG.md | 1 + .../utils/{CaptionSourcer.kt => Captions.kt} | 117 ++++++------------ .../utils/HtmlCaptionSourcer.kt | 23 ++++ .../utils/MarkdownCaptionSourcer.kt | 53 ++++++++ 4 files changed, 117 insertions(+), 77 deletions(-) rename src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/{CaptionSourcer.kt => Captions.kt} (61%) create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/HtmlCaptionSourcer.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MarkdownCaptionSourcer.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e1acf9f43..2bc405cef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ media for present out) * Optimized preparing of media group in `UpdatesPoller` * Add `CommonLimiter` * Add `MessageEntity#asHtmlSource` and `String#toHtml` +* Add tools for work with html captions and texts ## 0.11.0 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 +) From e26741d88206eb1bc073570b6b54fbc1020e09a5 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 30 Mar 2019 19:37:04 +0800 Subject: [PATCH 07/13] update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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. From 997f9ce4110045e900d6fc51e490e115b766c3fb Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 30 Mar 2019 20:12:00 +0800 Subject: [PATCH 08/13] message content resend by default using HTMLParseMode --- CHANGELOG.md | 2 ++ .../types/message/content/TextContent.kt | 28 +++++++++++++++---- .../message/content/media/AudioContent.kt | 6 ++-- .../message/content/media/DocumentContent.kt | 6 ++-- .../message/content/media/PhotoContent.kt | 10 ++++--- .../message/content/media/VideoContent.kt | 10 ++++--- .../message/content/media/VoiceContent.kt | 6 ++-- 7 files changed, 49 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bc405cef3..b0e1a36261 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,8 @@ media for present out) * 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 ## 0.11.0 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..71137c1427 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,12 +5,14 @@ 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.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class AudioContent( @@ -27,8 +29,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..7316ce0d8f 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,12 +5,14 @@ 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.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class DocumentContent( @@ -27,8 +29,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..0a906181f4 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,12 +7,14 @@ 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.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class PhotoContent( @@ -30,8 +32,8 @@ data class PhotoContent( ): Request = SendPhoto( chatId, media.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, disableNotification, replyToMessageId, replyMarkup @@ -39,7 +41,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..af82fef1d9 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,11 +7,13 @@ 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.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class VideoContent( @@ -28,8 +30,8 @@ data class VideoContent( chatId, media.fileId, media.thumb ?.fileId, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.duration, media.width, media.height, @@ -41,8 +43,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..687e27a25e 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,12 +5,14 @@ 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.HTMLParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class VoiceContent( @@ -27,8 +29,8 @@ data class VoiceContent( chatId, media.fileId, null, - toMarkdownCaptions().firstOrNull(), - MarkdownParseMode, + toHtmlCaptions().firstOrNull(), + HTMLParseMode, media.duration, disableNotification, replyToMessageId, From 4ccfb93a94c48c883f55bd13e681dfba61175eee Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 31 Mar 2019 10:20:14 +0800 Subject: [PATCH 09/13] Markdown and HTML typealiases --- CHANGELOG.md | 1 + .../TelegramBotAPI/types/ParseMode/ParseMode.kt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e1a36261..d8fcda1579 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ media for present out) * 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` ## 0.11.0 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 { From 769d0360f3e0715307bd626607aebda1425a8674 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 31 Mar 2019 11:11:32 +0800 Subject: [PATCH 10/13] text formatting extensions --- CHANGELOG.md | 2 + .../TelegramBotAPI/types/ChatIdentifier.kt | 4 + .../TelegramBotAPI/utils/StringFormatting.kt | 133 ++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index d8fcda1579..4b27f49068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,8 @@ media for present out) * `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 ## 0.11.0 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/utils/StringFormatting.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt new file mode 100644 index 0000000000..8809af3459 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt @@ -0,0 +1,133 @@ +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" +} + + +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 = command() From c4a3e2cf3d422321523098697cb9c68df9d58f9a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 31 Mar 2019 11:26:41 +0800 Subject: [PATCH 11/13] MessageEntities are using string formatting extensions --- CHANGELOG.md | 1 + .../types/MessageEntity/BoldTextMessageEntity.kt | 9 ++++++--- .../types/MessageEntity/BotCommandMessageEntity.kt | 5 +++++ .../types/MessageEntity/CodeTextMessageEntity.kt | 9 ++++++--- .../types/MessageEntity/EMailMessageEntity.kt | 11 +++++++---- .../types/MessageEntity/HashTagMessageEntity.kt | 8 +++++++- .../types/MessageEntity/ItalicTextMessageEntity.kt | 9 ++++++--- .../types/MessageEntity/LinkMessageEntity.kt | 14 -------------- .../types/MessageEntity/MentionMessageEntity.kt | 8 +++++++- .../types/MessageEntity/MessageEntity.kt | 6 ------ .../MessageEntity/PhoneNumberMessageEntity.kt | 8 +++++++- .../types/MessageEntity/PreTextMessageEntity.kt | 9 ++++++--- .../MessageEntity/RegularTextMessageEntity.kt | 8 +++++++- .../types/MessageEntity/TextLinkMessageEntity.kt | 11 +++++++---- .../MessageEntity/TextMentionMessageEntity.kt | 9 +++++---- .../types/MessageEntity/TextMessageEntity.kt | 14 -------------- .../types/MessageEntity/URLMessageEntity.kt | 13 ++++++++----- .../TelegramBotAPI/utils/StringFormatting.kt | 3 +++ 18 files changed, 88 insertions(+), 67 deletions(-) delete mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt delete mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b27f49068..bd1422104b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ 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 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 3944bda314..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,10 +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 markdownFormatSymbol: String = "*" - override val htmlFormatTagname: String = "b" +) : 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..bbaee4642c 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,15 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.utils.* + 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 19e66daeaa..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,10 +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 markdownFormatSymbol: String = "`" - override val htmlFormatTagname: String = "code" +) : 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 90f1872575..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,10 +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 -) : LinkMessageEntity( - sourceString, - "mailto://$sourceString" -) +) : MessageEntity { + 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 4c1f280b6d..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,10 +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 markdownFormatSymbol: String = "_" - override val htmlFormatTagname: String = "i" +) : 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/LinkMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt deleted file mode 100644 index 390029d204..0000000000 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/LinkMessageEntity.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity - -abstract class LinkMessageEntity( - val linkTitle: String, - val link: String -) : MessageEntity { - - override val asMarkdownSource: String by lazy { - "[$linkTitle]($link)" - } - override val asHtmlSource: String by lazy { - "$linkTitle" - } -} 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 17ba95553d..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,7 +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 +) : MessageEntity { + 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 75c09f24bb..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,16 +1,10 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity -import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toHtml -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 - get() = sourceString.toHtml() } 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 17c0e3c0c0..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,10 +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 markdownFormatSymbol: String = "```" - override val htmlFormatTagname: String = "pre" +) : 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 f044bae249..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,11 +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 -) : LinkMessageEntity( - sourceString, - url -) +) : MessageEntity { + 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 f4ec51de54..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,13 +1,14 @@ 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, override val length: Int, override val sourceString: String, val user: User -) : LinkMessageEntity( - sourceString, - "tg://user?id=${user.id})" -) +) : MessageEntity { + 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 d271d6e4f8..0000000000 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity - -abstract class TextMessageEntity : MessageEntity { - protected abstract val markdownFormatSymbol: String - protected abstract val htmlFormatTagname: String - - override val asMarkdownSource: String by lazy { - "$markdownFormatSymbol$sourceString$markdownFormatSymbol" - } - - override val asHtmlSource: String by lazy { - "<$htmlFormatTagname>$sourceString" - } -} 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 2aee673219..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,12 +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 -) : LinkMessageEntity( - sourceString, - sourceString -) { - val url: String = link +) : MessageEntity{ + val url: String = sourceString + + override val asMarkdownSource: String = sourceString.linkMarkdown(url) + override val asHtmlSource: String = sourceString.linkHTML(url) } diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt index 8809af3459..0f52d0b1d0 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt @@ -78,6 +78,9 @@ fun String.command(): String = if (startsWith("/")) { "/$this" } +fun String.commandMarkdown(): String = command() +fun String.commandHTML(): String = command() + infix fun String.bold(parseMode: ParseMode): String = when (parseMode) { is HTML -> boldHTML() From d668da0e76b15ec51c16c274b4b36fd3b413d9ef Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 31 Mar 2019 11:28:28 +0800 Subject: [PATCH 12/13] hotfix for command actual calling methods --- .../TelegramBotAPI/utils/StringFormatting.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt index 0f52d0b1d0..1eb31850c4 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/StringFormatting.kt @@ -133,4 +133,7 @@ infix fun String.phone(parseMode: ParseMode): String = when (parseMode) { is Markdown -> phoneMarkdown() } -infix fun String.command(parseMode: ParseMode): String = command() +infix fun String.command(parseMode: ParseMode): String = when (parseMode) { + is HTML -> commandHTML() + is Markdown -> commandMarkdown() +} From e6e1995d8101c728cbe9bbf617a2f11e527dd953 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 31 Mar 2019 11:54:49 +0800 Subject: [PATCH 13/13] optimize imports --- .../types/MessageEntity/BotCommandMessageEntity.kt | 3 ++- .../TelegramBotAPI/types/message/content/media/AudioContent.kt | 2 -- .../types/message/content/media/DocumentContent.kt | 2 -- .../TelegramBotAPI/types/message/content/media/PhotoContent.kt | 2 -- .../TelegramBotAPI/types/message/content/media/VideoContent.kt | 2 -- .../TelegramBotAPI/types/message/content/media/VoiceContent.kt | 2 -- 6 files changed, 2 insertions(+), 11 deletions(-) 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 bbaee4642c..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,6 +1,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity -import com.github.insanusmokrassar.TelegramBotAPI.utils.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.commandHTML +import com.github.insanusmokrassar.TelegramBotAPI.utils.commandMarkdown data class BotCommandMessageEntity( override val offset: Int, 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 71137c1427..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 @@ -6,14 +6,12 @@ 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.HTMLParseMode -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class AudioContent( override val media: AudioFile, 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 7316ce0d8f..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 @@ -6,14 +6,12 @@ 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.HTMLParseMode -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class DocumentContent( override val media: DocumentFile, 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 0a906181f4..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 @@ -8,14 +8,12 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMem import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class PhotoContent( override val mediaCollection: List, 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 af82fef1d9..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 @@ -8,13 +8,11 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMem import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.HTMLParseMode -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class VideoContent( override val media: VideoFile, 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 687e27a25e..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 @@ -6,14 +6,12 @@ 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.HTMLParseMode -import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode 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.toHtmlCaptions -import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaptions data class VoiceContent( override val media: VoiceFile,