mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-22 16:23:48 +00:00
commit
c543f11d61
12
CHANGELOG.md
12
CHANGELOG.md
@ -10,6 +10,18 @@
|
|||||||
* Add `RequestLimiter` and base realisations
|
* Add `RequestLimiter` and base realisations
|
||||||
* Now `KtorRequestsExecutor` can receive as one of parameters `RequestLimiter` (by default - `EmptyLimiter`)
|
* Now `KtorRequestsExecutor` can receive as one of parameters `RequestLimiter` (by default - `EmptyLimiter`)
|
||||||
|
|
||||||
|
### 0.9.1
|
||||||
|
|
||||||
|
* Updated built-in lengths restrictions
|
||||||
|
* Apply restrictions of text limit for sending messages
|
||||||
|
* Add `RegularTextMessageEntity` which is useful for representing regular text message entity
|
||||||
|
* Add `convertToFullMessageEntityList` which create list of entities with `RegularTextMessageEntity` on places where
|
||||||
|
must be regular text
|
||||||
|
* Change signature of `createMarkdownText`: now it will return list of strings
|
||||||
|
* Deprecate old signatures of `createMarkdownText`, `toMarkdownCaption`, `toMarkdownText`
|
||||||
|
* Add `ResendableContent#createResends` which create adapted list of resends for content
|
||||||
|
* Add `TextContent` own `createResends` realisation
|
||||||
|
|
||||||
### 0.8.5
|
### 0.8.5
|
||||||
|
|
||||||
* Add extension `String#toMarkdown`
|
* Add extension `String#toMarkdown`
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
project.version = "0.9.0"
|
project.version = "0.9.1"
|
||||||
project.group = "com.github.insanusmokrassar"
|
project.group = "com.github.insanusmokrassar"
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
|
@ -35,6 +35,11 @@ data class SendMessage(
|
|||||||
TextableSendMessageRequest<RawMessage>,
|
TextableSendMessageRequest<RawMessage>,
|
||||||
DisableWebPagePreview
|
DisableWebPagePreview
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
if (text.length !in textLength) {
|
||||||
|
throw IllegalArgumentException("Text must be in $textLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendMessage"
|
override fun method(): String = "sendMessage"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -95,6 +95,13 @@ data class SendAnimationData internal constructor(
|
|||||||
DuratedSendMessageRequest<RawMessage>,
|
DuratedSendMessageRequest<RawMessage>,
|
||||||
SizedSendMessageRequest<RawMessage>
|
SizedSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendAnimation"
|
override fun method(): String = "sendAnimation"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -95,6 +95,13 @@ data class SendAudioData internal constructor(
|
|||||||
TitledSendMessageRequest<RawMessage>,
|
TitledSendMessageRequest<RawMessage>,
|
||||||
DuratedSendMessageRequest<RawMessage>
|
DuratedSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendAudio"
|
override fun method(): String = "sendAudio"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -78,6 +78,13 @@ data class SendDocumentData internal constructor(
|
|||||||
TextableSendMessageRequest<RawMessage>,
|
TextableSendMessageRequest<RawMessage>,
|
||||||
ThumbedSendMessageRequest<RawMessage>
|
ThumbedSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendDocument"
|
override fun method(): String = "sendDocument"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -63,6 +63,14 @@ data class SendPhotoData internal constructor(
|
|||||||
ReplyingMarkupSendMessageRequest<RawMessage>,
|
ReplyingMarkupSendMessageRequest<RawMessage>,
|
||||||
TextableSendMessageRequest<RawMessage>
|
TextableSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendPhoto"
|
override fun method(): String = "sendPhoto"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,13 @@ data class SendVideoData internal constructor(
|
|||||||
DuratedSendMessageRequest<RawMessage>,
|
DuratedSendMessageRequest<RawMessage>,
|
||||||
SizedSendMessageRequest<RawMessage>
|
SizedSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendVideo"
|
override fun method(): String = "sendVideo"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -94,6 +94,13 @@ data class SendVideoNoteData internal constructor(
|
|||||||
override val height: Int?
|
override val height: Int?
|
||||||
get() = width
|
get() = width
|
||||||
|
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendVideoNote"
|
override fun method(): String = "sendVideoNote"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -84,6 +84,13 @@ data class SendVoiceData internal constructor(
|
|||||||
ThumbedSendMessageRequest<RawMessage>,
|
ThumbedSendMessageRequest<RawMessage>,
|
||||||
DuratedSendMessageRequest<RawMessage>
|
DuratedSendMessageRequest<RawMessage>
|
||||||
{
|
{
|
||||||
|
init {
|
||||||
|
text ?.let {
|
||||||
|
if (it.length !in captionLength) {
|
||||||
|
throw IllegalArgumentException("Caption must be in $captionLength range")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun method(): String = "sendVoice"
|
override fun method(): String = "sendVoice"
|
||||||
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
|
||||||
|
@ -16,17 +16,17 @@ typealias ShippingOptionIdentifier = String
|
|||||||
typealias StartParameter = String
|
typealias StartParameter = String
|
||||||
typealias InlineMessageIdentifier = String
|
typealias InlineMessageIdentifier = String
|
||||||
|
|
||||||
val callbackQueryAnswerLength = 0 .. 200
|
val callbackQueryAnswerLength = 0 until 200
|
||||||
val captionLength = 0 .. 1024
|
val captionLength = 0 until 1024
|
||||||
val textLength = 0 .. 4096
|
val textLength = 0 until 4096
|
||||||
val userProfilePhotosRequestLimit = 0 .. 100
|
val userProfilePhotosRequestLimit = 0 .. 100
|
||||||
val chatTitleLength = 1 .. 255
|
val chatTitleLength = 1 until 255
|
||||||
val chatDescriptionLength = 0 .. 255
|
val chatDescriptionLength = 0 until 256
|
||||||
val inlineResultQueryIdLingth = 1 .. 64
|
val inlineResultQueryIdLingth = 1 until 64
|
||||||
|
|
||||||
val invoiceTitleLimit = 1 .. 32
|
val invoiceTitleLimit = 1 until 32
|
||||||
val invoiceDescriptionLimit = 1 .. 255
|
val invoiceDescriptionLimit = 1 until 256
|
||||||
val invoicePayloadBytesLimit = 1 .. 128
|
val invoicePayloadBytesLimit = 1 until 128
|
||||||
|
|
||||||
const val chatIdField = "chat_id"
|
const val chatIdField = "chat_id"
|
||||||
const val messageIdField = "message_id"
|
const val messageIdField = "message_id"
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity
|
||||||
|
|
||||||
|
data class RegularTextMessageEntity(
|
||||||
|
override val offset: Int,
|
||||||
|
override val length: Int,
|
||||||
|
override val sourceString: String
|
||||||
|
) : MessageEntity
|
@ -10,6 +10,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
|
|||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownText
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownText
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownTexts
|
||||||
|
|
||||||
data class TextContent(
|
data class TextContent(
|
||||||
val text: String,
|
val text: String,
|
||||||
@ -29,4 +30,21 @@ data class TextContent(
|
|||||||
replyToMessageId,
|
replyToMessageId,
|
||||||
replyMarkup
|
replyMarkup
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override fun createResends(
|
||||||
|
chatId: ChatIdentifier,
|
||||||
|
disableNotification: Boolean,
|
||||||
|
replyToMessageId: MessageIdentifier?,
|
||||||
|
replyMarkup: KeyboardMarkup?
|
||||||
|
): List<Request<RawMessage>> = toMarkdownTexts().map {
|
||||||
|
SendMessage(
|
||||||
|
chatId,
|
||||||
|
it,
|
||||||
|
MarkdownParseMode,
|
||||||
|
false,
|
||||||
|
disableNotification,
|
||||||
|
replyToMessageId,
|
||||||
|
replyMarkup
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,4 +13,11 @@ interface ResendableContent {
|
|||||||
replyToMessageId: MessageIdentifier? = null,
|
replyToMessageId: MessageIdentifier? = null,
|
||||||
replyMarkup: KeyboardMarkup? = null
|
replyMarkup: KeyboardMarkup? = null
|
||||||
): Request<RawMessage>
|
): Request<RawMessage>
|
||||||
|
|
||||||
|
fun createResends(
|
||||||
|
chatId: ChatIdentifier,
|
||||||
|
disableNotification: Boolean = false,
|
||||||
|
replyToMessageId: MessageIdentifier? = null,
|
||||||
|
replyMarkup: KeyboardMarkup? = null
|
||||||
|
): List<Request<RawMessage>> = listOf(createResend(chatId, disableNotification, replyToMessageId, replyMarkup))
|
||||||
}
|
}
|
@ -1,39 +1,106 @@
|
|||||||
package com.github.insanusmokrassar.TelegramBotAPI.utils
|
package com.github.insanusmokrassar.TelegramBotAPI.utils
|
||||||
|
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity
|
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.message.content.TextContent
|
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.message.content.abstracts.CaptionedMediaContent
|
||||||
|
import com.github.insanusmokrassar.TelegramBotAPI.types.textLength
|
||||||
import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.toMarkdown
|
||||||
|
|
||||||
|
@Deprecated(
|
||||||
|
"Deprecated because old version have problem with long texts, but new one must return list of strings"
|
||||||
|
)
|
||||||
fun createMarkdownText(
|
fun createMarkdownText(
|
||||||
text: String,
|
text: String,
|
||||||
messageEntities: List<MessageEntity>
|
messageEntities: List<MessageEntity>
|
||||||
): String {
|
): String {
|
||||||
val builder = StringBuilder()
|
return createMarkdownText(
|
||||||
|
convertToFullMessageEntityList(text, messageEntities)
|
||||||
|
).first()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createMarkdownText(
|
||||||
|
entities: List<MessageEntity>,
|
||||||
|
partLength: Int = 4096
|
||||||
|
): List<String> {
|
||||||
|
val texts = mutableListOf<String>()
|
||||||
|
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"
|
||||||
|
)
|
||||||
|
fun CaptionedMediaContent.toMarkdownCaption(): String? = toMarkdownCaptions().firstOrNull()
|
||||||
|
|
||||||
|
fun CaptionedMediaContent.toMarkdownCaptions(): List<String> = createMarkdownText(
|
||||||
|
fullEntitiesList(),
|
||||||
|
captionLength.endInclusive + 1
|
||||||
|
)
|
||||||
|
|
||||||
|
fun CaptionedMediaContent.fullEntitiesList(): List<MessageEntity> = caption ?.let {
|
||||||
|
convertToFullMessageEntityList(it, captionEntities)
|
||||||
|
} ?: emptyList()
|
||||||
|
|
||||||
|
@Deprecated(
|
||||||
|
"Deprecated because old version have problem with long texts, but new one must return list of strings"
|
||||||
|
)
|
||||||
|
fun TextContent.toMarkdownText(): String = toMarkdownTexts().first()
|
||||||
|
|
||||||
|
fun TextContent.toMarkdownTexts(): List<String> = createMarkdownText(
|
||||||
|
fullEntitiesList(),
|
||||||
|
textLength.endInclusive + 1
|
||||||
|
)
|
||||||
|
|
||||||
|
fun TextContent.fullEntitiesList(): List<MessageEntity> = convertToFullMessageEntityList(text, entities)
|
||||||
|
|
||||||
|
fun convertToFullMessageEntityList(
|
||||||
|
text: String,
|
||||||
|
messageEntities: List<MessageEntity>
|
||||||
|
): List<MessageEntity> {
|
||||||
|
val result = mutableListOf<MessageEntity>()
|
||||||
|
|
||||||
var offset = 0
|
var offset = 0
|
||||||
for (entity in messageEntities) {
|
for (entity in messageEntities) {
|
||||||
builder.append(
|
val newEntitySize = entity.offset - offset
|
||||||
text.substring(offset until entity.offset).toMarkdown()
|
if (newEntitySize > 0) {
|
||||||
)
|
val regularEntity = RegularTextMessageEntity(offset, newEntitySize, text.substring(offset, entity.offset))
|
||||||
builder.append(
|
result.add(regularEntity)
|
||||||
entity.asMarkdownSource
|
offset += regularEntity.length
|
||||||
)
|
}
|
||||||
|
result.add(entity)
|
||||||
offset += entity.length
|
offset += entity.length
|
||||||
}
|
}
|
||||||
builder.append(
|
val newEntitySize = text.length - offset
|
||||||
text.substring(offset).toMarkdown()
|
if (newEntitySize > 0) {
|
||||||
)
|
result.add(RegularTextMessageEntity(offset, newEntitySize, text.substring(offset, text.length)))
|
||||||
return builder.toString()
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CaptionedMediaContent.toMarkdownCaption(): String? = caption ?.let {
|
|
||||||
createMarkdownText(
|
|
||||||
it,
|
|
||||||
captionEntities
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun TextContent.toMarkdownText(): String = createMarkdownText(
|
|
||||||
text,
|
|
||||||
entities
|
|
||||||
)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user