1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-12-28 17:09:23 +00:00

Compare commits

...

25 Commits

Author SHA1 Message Date
df6d70b20d update dependencies 2024-02-10 17:31:20 +06:00
0b12df14db start 10.0.1 2024-02-06 22:49:15 +06:00
1590e1eef2 Merge pull request #818 from InsanusMokrassar/10.0.0
10.0.0 hotfix: add support of 'sender' chat type
2024-01-12 14:21:55 +06:00
6896bc0772 add support of 'sender' chat type 2024-01-12 14:21:06 +06:00
ce1abb0ae2 Merge pull request #814 from InsanusMokrassar/10.0.0
10.0.0
2024-01-12 12:45:49 +06:00
ac63d52b14 add notes about telegram bots api 7.0 support 2024-01-12 02:44:30 +06:00
e902f85b36 fixes in build 2024-01-12 02:21:22 +06:00
225fedde3a several more fixes 2024-01-12 02:14:46 +06:00
66e31e5d0c fixes in AccessibleMessage -> Message in several old parts 2024-01-12 01:53:40 +06:00
852065ad38 get back LinksFormatting for Message 2024-01-12 01:44:56 +06:00
d88fc2c9c0 rename replyInChat -> replyInChatId; replace AccessibleMessage by Message in Reply parts 2024-01-12 01:18:33 +06:00
4d92588390 update changelog 2024-01-12 01:11:57 +06:00
89524290c5 improve users shared DSLs 2024-01-10 23:05:54 +06:00
86c86dfb8a fixes in LinkPreviewOptions 2024-01-10 16:46:36 +06:00
bdae774c62 add EncodeDefault for required fields in LinkPreviewOptions 2024-01-10 14:59:41 +06:00
d70c7fdbdf fixes related to UsersShared 2024-01-09 18:21:20 +06:00
f14885a541 fix in LinkPreviewOptions.Surrogate 2024-01-09 18:05:03 +06:00
0013e91f6e fix of build and add annotation to all fields with one 2024-01-09 17:52:13 +06:00
aa315f6fec rename LinkPreviewOptions.Medium to LinkPreviewOptions.Default 2024-01-09 17:34:07 +06:00
9425380002 imrovements in copy/delete/forward messages 2024-01-09 17:03:47 +06:00
0f5bce592b replace username to full 2024-01-09 11:45:12 +06:00
294f80032c rename ScheduledGiveaway -> Giveaway 2024-01-09 11:43:04 +06:00
a4064a15ec add trigger for ChatMessageReactionsCountUpdated 2024-01-09 11:33:26 +06:00
76a2cfd1a0 Merge pull request #817 from mefilt/master
Fixed incorrect link at readme
2024-01-08 16:34:38 +06:00
Mefilt
edca5494d4 Fixed incorrect link at readme 2024-01-08 18:29:59 +08:00
64 changed files with 1223 additions and 789 deletions

View File

@@ -1,11 +1,32 @@
# TelegramBotAPI changelog # TelegramBotAPI changelog
## 10.0.1
* `Version`:
* `Ktor`: `2.3.7` -> `2.3.8`
* `MicroUtils`: `0.20.26` -> `0.20.32`
* `Korlibs`: `5.3.0` -> `5.3.1`
* `KSLog`: `1.3.1` -> `1.3.2`
## 10.0.0 ## 10.0.0
**Add support of [Telegram Bots API 7.0](https://core.telegram.org/bots/api-changelog#december-29-2023)**
**IN THIS UPDATE KLOCK DEPENDENCY CHANGED TO `com.soywiz.korge:korlibs-time` UP TO 5.3.0 VERSION** **IN THIS UPDATE KLOCK DEPENDENCY CHANGED TO `com.soywiz.korge:korlibs-time` UP TO 5.3.0 VERSION**
**IN THIS UPDATE KRYPTO DEPENDENCY CHANGED TO `com.soywiz.korge:korlibs-crypto` UP TO 5.3.0 VERSION** **IN THIS UPDATE KRYPTO DEPENDENCY CHANGED TO `com.soywiz.korge:korlibs-crypto` UP TO 5.3.0 VERSION**
* `Version`:
* `MicroUtils`: `0.20.23` -> `0.20.26`
* `Korlibs`: `4.0.10` -> `5.3.0`
* `Core`:
* `Message` now inherited by two variants: `AccessibleMessage` and `InaccessibleMessage`
* `Common`:
* In most places `disableWebPagePreview` has been replaced by new `LinkPreviewOptions`
* In most places arguments `replyToMessageId` and `allowSendingWithoutReply` has been replaced with
`ReplyParameters`
* In `reply` extension two parameters have been added: `replyInChatId` and `replyInThreadId`
## 9.4.3 ## 9.4.3
**IetfLanguageCode has been renamed to IetfLang in MicroUtils** **IetfLanguageCode has been renamed to IetfLang in MicroUtils**

View File

@@ -1,4 +1,4 @@
# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-6.9-blue)](https://core.telegram.org/bots/api-changelog#september-22-2023) # TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-7.0-blue)](https://core.telegram.org/bots/api-changelog#december-29-2023)
| Docs | [![KDocs](https://img.shields.io/static/v1?label=Dokka&message=KDocs&color=blue&logo=kotlin)](https://tgbotapi.inmo.dev/index.html) [![Mini tutorial](https://img.shields.io/static/v1?label=Mk&message=Docs&color=blue&logo=mkdocs)](https://docs.inmo.dev/tgbotapi/index.html) | | Docs | [![KDocs](https://img.shields.io/static/v1?label=Dokka&message=KDocs&color=blue&logo=kotlin)](https://tgbotapi.inmo.dev/index.html) [![Mini tutorial](https://img.shields.io/static/v1?label=Mk&message=Docs&color=blue&logo=mkdocs)](https://docs.inmo.dev/tgbotapi/index.html) |
|:----------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| |:----------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|
@@ -118,5 +118,5 @@ suspend fun main() {
### More examples ### More examples
You may find examples in [this project](https://github.com/InsanusMokrassar/TelegramBotAPI-examples). Besides, you are You may find examples in [this project](https://github.com/InsanusMokrassar/TelegramBotAPI-examples). Besides, you are
always welcome in our [bookstack](https://bookstack.inmo.dev/books/telegrambotapi) and always welcome in our [docs](https://docs.inmo.dev/tgbotapi/index.html) and
[chat](https://t.me/InMoTelegramBotAPIChat). [chat](https://t.me/InMoTelegramBotAPIChat).

View File

@@ -54,13 +54,13 @@ if (new File(projectDir, "secret.gradle").exists()) {
githubRelease { githubRelease {
token "${project.property('GITHUB_RELEASE_TOKEN')}" token "${project.property('GITHUB_RELEASE_TOKEN')}"
owner "InsanusMokrassar" owner = "InsanusMokrassar"
repo "TelegramBotAPI" repo = "TelegramBotAPI"
tagName "v$library_version" tagName = "v$library_version"
releaseName "$library_version" releaseName = "$library_version"
targetCommitish "$library_version" targetCommitish = "$library_version"
body getCurrentVersionChangelog() body = getCurrentVersionChangelog()
} }
} }

View File

@@ -6,4 +6,4 @@ kotlin.incremental=true
kotlin.incremental.js=true kotlin.incremental.js=true
library_group=dev.inmo library_group=dev.inmo
library_version=10.0.0 library_version=10.0.1

View File

@@ -6,19 +6,19 @@ kotlin-coroutines = "1.7.3"
javax-activation = "1.1.1" javax-activation = "1.1.1"
korlibs = "5.3.0" korlibs = "5.3.1"
uuid = "0.8.2" uuid = "0.8.2"
ktor = "2.3.7" ktor = "2.3.8"
ksp = "1.9.22-1.0.16" ksp = "1.9.22-1.0.17"
kotlin-poet = "1.15.3" kotlin-poet = "1.16.0"
microutils = "0.20.25" microutils = "0.20.32"
kslog = "1.3.1" kslog = "1.3.2"
versions = "0.50.0" versions = "0.51.0"
github-release-plugin = "2.4.1" github-release-plugin = "2.5.2"
dokka = "1.9.10" dokka = "1.9.10"
[libraries] [libraries]

View File

@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip

View File

@@ -16,6 +16,9 @@ kotlin {
api project(":tgbotapi.core") api project(":tgbotapi.core")
} }
} }
configureEach {
languageSettings.optIn("kotlinx.serialization.ExperimentalSerializationApi")
}
} }
} }

View File

@@ -4,6 +4,8 @@ import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.DeleteMessages import dev.inmo.tgbotapi.requests.DeleteMessages
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import kotlin.jvm.JvmName
suspend fun TelegramBot.deleteMessages( suspend fun TelegramBot.deleteMessages(
chatId: ChatIdentifier, chatId: ChatIdentifier,
@@ -35,14 +37,19 @@ suspend fun TelegramBot.deleteMessages(
) )
suspend fun TelegramBot.deleteMessages( suspend fun TelegramBot.deleteMessages(
messages: List<AccessibleMessage> messagesMetas: List<Message.MetaInfo>
) = messages.groupBy { it.chat }.map { (chat, messages) -> ) = messagesMetas.groupBy { it.chatId }.map { (chatId, messages) ->
deleteMessages( deleteMessages(
chatId = chat.id, chatId = chatId,
messageIds = messages.map { it.messageId } messageIds = messages.map { it.messageId }
) )
}.all { it } }.all { it }
@JvmName("deleteMessagesWithMessages")
suspend fun TelegramBot.deleteMessages(
messages: List<AccessibleMessage>
) = deleteMessages(messages.map { it.metaInfo })
suspend fun TelegramBot.delete( suspend fun TelegramBot.delete(
chatId: ChatIdentifier, chatId: ChatIdentifier,
messageIds: List<MessageId> messageIds: List<MessageId>
@@ -60,6 +67,12 @@ suspend fun TelegramBot.delete(
vararg messageIds: MessageId vararg messageIds: MessageId
) = deleteMessages(chatId = chatId, messageIds = (listOf(firstMessageId, secondMessageId) + messageIds.toList())) ) = deleteMessages(chatId = chatId, messageIds = (listOf(firstMessageId, secondMessageId) + messageIds.toList()))
suspend fun TelegramBot.delete(
messagesMetas: List<Message.MetaInfo>
) = deleteMessages(messagesMetas)
@JvmName("deleteWithMessages")
suspend fun TelegramBot.delete( suspend fun TelegramBot.delete(
messages: List<AccessibleMessage> messages: List<AccessibleMessage>
) = deleteMessages(messages) ) = deleteMessages(messages)

View File

@@ -1,9 +1,12 @@
package dev.inmo.tgbotapi.extensions.api package dev.inmo.tgbotapi.extensions.api
import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.api.send.copyMessages
import dev.inmo.tgbotapi.requests.ForwardMessages import dev.inmo.tgbotapi.requests.ForwardMessages
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import kotlin.jvm.JvmName
suspend fun TelegramBot.forwardMessages( suspend fun TelegramBot.forwardMessages(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
@@ -66,15 +69,15 @@ suspend fun TelegramBot.forwardMessages(
suspend fun TelegramBot.forwardMessages( suspend fun TelegramBot.forwardMessages(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
messages: List<AccessibleMessage>, messagesMetas: List<Message.MetaInfo>,
threadId: MessageThreadId? = toChatId.threadId, threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false, disableNotification: Boolean = false,
protectContent: Boolean = false, protectContent: Boolean = false,
removeCaption: Boolean = false removeCaption: Boolean = false
) = messages.groupBy { it.chat }.flatMap { (chat, messages) -> ) = messagesMetas.groupBy { it.chatId }.flatMap { (chatId, messages) ->
forwardMessages( forwardMessages(
toChatId = toChatId, toChatId = toChatId,
fromChatId = chat.id, fromChatId = chatId,
messageIds = messages.map { it.messageId }, messageIds = messages.map { it.messageId },
threadId = threadId, threadId = threadId,
disableNotification = disableNotification, disableNotification = disableNotification,
@@ -83,6 +86,23 @@ suspend fun TelegramBot.forwardMessages(
) )
} }
@JvmName("forwardMessagesWithMessages")
suspend fun TelegramBot.forwardMessages(
toChatId: ChatIdentifier,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = forwardMessages(
toChatId = toChatId,
messagesMetas = messages.map { it.metaInfo },
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
suspend fun TelegramBot.forward( suspend fun TelegramBot.forward(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
fromChatId: ChatIdentifier, fromChatId: ChatIdentifier,
@@ -139,6 +159,23 @@ suspend fun TelegramBot.forward(
removeCaption = removeCaption removeCaption = removeCaption
) )
suspend fun TelegramBot.forward(
toChatId: ChatIdentifier,
messagesMetas: List<Message.MetaInfo>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = forwardMessages(
toChatId = toChatId,
messagesMetas = messagesMetas,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
@JvmName("forwardWithMessages")
suspend fun TelegramBot.forward( suspend fun TelegramBot.forward(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
messages: List<AccessibleMessage>, messages: List<AccessibleMessage>,

View File

@@ -4,6 +4,8 @@ import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.send.CopyMessages import dev.inmo.tgbotapi.requests.send.CopyMessages
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import kotlin.jvm.JvmName
suspend fun TelegramBot.copyMessages( suspend fun TelegramBot.copyMessages(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
@@ -66,15 +68,15 @@ suspend fun TelegramBot.copyMessages(
suspend fun TelegramBot.copyMessages( suspend fun TelegramBot.copyMessages(
toChatId: ChatIdentifier, toChatId: ChatIdentifier,
messages: List<AccessibleMessage>, messagesMetas: List<Message.MetaInfo>,
threadId: MessageThreadId? = toChatId.threadId, threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false, disableNotification: Boolean = false,
protectContent: Boolean = false, protectContent: Boolean = false,
removeCaption: Boolean = false removeCaption: Boolean = false
) = messages.groupBy { it.chat }.flatMap { (chat, messages) -> ) = messagesMetas.groupBy { it.chatId }.flatMap { (chatId, messages) ->
copyMessages( copyMessages(
toChatId = toChatId, toChatId = toChatId,
fromChatId = chat.id, fromChatId = chatId,
messageIds = messages.map { it.messageId }, messageIds = messages.map { it.messageId },
threadId = threadId, threadId = threadId,
disableNotification = disableNotification, disableNotification = disableNotification,
@@ -82,3 +84,109 @@ suspend fun TelegramBot.copyMessages(
removeCaption = removeCaption removeCaption = removeCaption
) )
} }
@JvmName("copyMessagesWithMessages")
suspend fun TelegramBot.copyMessages(
toChatId: ChatIdentifier,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
messagesMetas = messages.map { it.metaInfo },
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
suspend fun TelegramBot.copy(
toChatId: ChatIdentifier,
fromChatId: ChatIdentifier,
messageIds: List<MessageId>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
fromChatId = fromChatId,
messageIds = messageIds,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
suspend fun TelegramBot.copy(
toChatId: ChatIdentifier,
fromChatId: ChatIdentifier,
messageIds: Array<MessageId>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
fromChatId = fromChatId,
messageIds = messageIds,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
suspend fun TelegramBot.copy(
toChatId: ChatIdentifier,
fromChatId: ChatIdentifier,
firstMessageId: MessageId,
vararg messageIds: MessageId,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
fromChatId = fromChatId,
firstMessageId = firstMessageId,
messageIds = messageIds,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
suspend fun TelegramBot.copy(
toChatId: ChatIdentifier,
messagesMetas: List<Message.MetaInfo>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
messagesMetas = messagesMetas,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)
@JvmName("copyWithMessages")
suspend fun TelegramBot.copy(
toChatId: ChatIdentifier,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
removeCaption: Boolean = false
) = copyMessages(
toChatId = toChatId,
messages = messages,
threadId = threadId,
disableNotification = disableNotification,
protectContent = protectContent,
removeCaption = removeCaption
)

View File

@@ -139,10 +139,10 @@ suspend fun BehaviourContext.waitMediaContent(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitContent(initRequest, errorFactory).mapContent<MediaContent>() ) = waitContent(initRequest, errorFactory).mapContent<MediaContent>()
suspend fun BehaviourContext.waitScheduledGiveawayContent( suspend fun BehaviourContext.waitGiveawayContent(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitContent(initRequest, errorFactory).mapContent<ScheduledGiveawayContent>() ) = waitContent(initRequest, errorFactory).mapContent<GiveawayContent>()
suspend fun BehaviourContext.waitGiveawayPublicResultsContent( suspend fun BehaviourContext.waitGiveawayPublicResultsContent(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,

View File

@@ -2,9 +2,7 @@
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
import dev.inmo.tgbotapi.extensions.utils.withContent
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
@@ -13,7 +11,6 @@ import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate
import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.RiskFeature
import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.mapNotNull
typealias CommonMessageToCommonMessageMapper<T> = suspend CommonMessage<T>.() -> CommonMessage<T>? typealias CommonMessageToCommonMessageMapper<T> = suspend CommonMessage<T>.() -> CommonMessage<T>?
@@ -153,10 +150,10 @@ suspend fun BehaviourContext.waitMediaContentMessage(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitContentMessage(initRequest, errorFactory).mapWithContent<MediaContent>() ) = waitContentMessage(initRequest, errorFactory).mapWithContent<MediaContent>()
suspend fun BehaviourContext.waitScheduledGiveawayContentMessage( suspend fun BehaviourContext.waitGiveawayContentMessage(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitContentMessage(initRequest, errorFactory).mapWithContent<ScheduledGiveawayContent>() ) = waitContentMessage(initRequest, errorFactory).mapWithContent<GiveawayContent>()
suspend fun BehaviourContext.waitGiveawayPublicResultsContentMessage( suspend fun BehaviourContext.waitGiveawayPublicResultsContentMessage(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,

View File

@@ -131,10 +131,10 @@ suspend fun BehaviourContext.waitEditedInvoice(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContent<InvoiceContent>(initRequest, false, errorFactory) ) = waitEditedContent<InvoiceContent>(initRequest, false, errorFactory)
suspend fun BehaviourContext.waitEditedScheduledGiveawayContent( suspend fun BehaviourContext.waitEditedGiveawayContent(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContent<ScheduledGiveawayContent>(initRequest, false, errorFactory) ) = waitEditedContent<GiveawayContent>(initRequest, false, errorFactory)
suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContent( suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContent(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,

View File

@@ -3,7 +3,6 @@
package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
import dev.inmo.tgbotapi.extensions.utils.baseEditMessageUpdateOrNull
import dev.inmo.tgbotapi.extensions.utils.commonMessageOrNull import dev.inmo.tgbotapi.extensions.utils.commonMessageOrNull
import dev.inmo.tgbotapi.extensions.utils.withContent import dev.inmo.tgbotapi.extensions.utils.withContent
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
@@ -137,10 +136,10 @@ suspend fun BehaviourContext.waitEditedInvoiceMessage(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContentMessage<InvoiceContent>(initRequest, errorFactory) ) = waitEditedContentMessage<InvoiceContent>(initRequest, errorFactory)
suspend fun BehaviourContext.waitEditedScheduledGiveawayContentMessage( suspend fun BehaviourContext.waitEditedGiveawayContentMessage(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContentMessage<ScheduledGiveawayContent>(initRequest, errorFactory) ) = waitEditedContentMessage<GiveawayContent>(initRequest, errorFactory)
suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContentMessage( suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContentMessage(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,

View File

@@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.types.request.UsersShared
import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.RiskFeature
import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
typealias EventMessageToEventMapper<T> = suspend ChatEventMessage<T>.() -> T? typealias EventMessageToEventMapper<T> = suspend ChatEventMessage<T>.() -> T?
@@ -199,11 +200,16 @@ suspend fun BehaviourContext.waitChatSharedRequest(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEvents<ChatSharedRequest>(initRequest, errorFactory) ) = waitEvents<ChatSharedRequest>(initRequest, errorFactory)
suspend fun BehaviourContext.waitUserShared( suspend fun BehaviourContext.waitUsersShared(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEvents<UsersShared>(initRequest, errorFactory) ) = waitEvents<UsersShared>(initRequest, errorFactory)
suspend fun BehaviourContext.waitUserShared(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitUsersShared(initRequest, errorFactory).filter { it.userIds.size == 1 }
suspend fun BehaviourContext.waitChatShared( suspend fun BehaviourContext.waitChatShared(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }

View File

@@ -23,6 +23,7 @@ import dev.inmo.tgbotapi.types.request.UsersShared
import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.RiskFeature
import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filter
@RiskFeature(lowLevelRiskFeatureMessage) @RiskFeature(lowLevelRiskFeatureMessage)
suspend inline fun <reified O : ChatEvent> BehaviourContext.waitEventsMessages( suspend inline fun <reified O : ChatEvent> BehaviourContext.waitEventsMessages(
@@ -193,11 +194,16 @@ suspend fun BehaviourContext.waitChatSharedRequestEventsMessages(
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEventsMessages<ChatSharedRequest>(initRequest, errorFactory) ) = waitEventsMessages<ChatSharedRequest>(initRequest, errorFactory)
suspend fun BehaviourContext.waitUserSharedEventsMessages( suspend fun BehaviourContext.waitUsersSharedEventsMessages(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }
) = waitEventsMessages<UsersShared>(initRequest, errorFactory) ) = waitEventsMessages<UsersShared>(initRequest, errorFactory)
suspend fun BehaviourContext.waitUserSharedEventsMessages(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitUsersSharedEventsMessages(initRequest, errorFactory).filter { it.chatEvent.userIds.size == 1 }
suspend fun BehaviourContext.waitChatSharedEventsMessages( suspend fun BehaviourContext.waitChatSharedEventsMessages(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null } errorFactory: NullableRequestBuilder<*> = { null }

View File

@@ -0,0 +1,38 @@
@file:Suppress("unused")
package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatIdChatMessageReactionUpdatedMarkerFactory
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatIdChatMessageReactionsCountUpdatedMarkerFactory
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByIdPollMarkerFactory
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
import dev.inmo.tgbotapi.extensions.utils.chatMessageReactionUpdatedUpdateOrNull
import dev.inmo.tgbotapi.extensions.utils.chatMessageReactionsCountUpdatedUpdateOrNull
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionUpdated
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionsCountUpdated
import dev.inmo.tgbotapi.types.polls.*
import dev.inmo.tgbotapi.types.update.abstracts.Update
/**
* @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call
* @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example,
* this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage].
* Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own.
* Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times]
* to combinate several filters
* @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously
* in one "stream". Output of [markerFactory] will be used as a key for "stream"
* @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that
* data
*/
suspend fun <BC : BehaviourContext> BC.onChatMessageReactionsCountUpdated(
initialFilter: SimpleFilter<ChatMessageReactionsCountUpdated>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, ChatMessageReactionsCountUpdated, Update>? = null,
markerFactory: MarkerFactory<ChatMessageReactionsCountUpdated, Any> = ByChatIdChatMessageReactionsCountUpdatedMarkerFactory,
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, ChatMessageReactionsCountUpdated>
) = on(markerFactory, initialFilter, subcontextUpdatesFilter, scenarioReceiver) {
(it.chatMessageReactionsCountUpdatedUpdateOrNull() ?.data) ?.let(::listOfNotNull)
}

View File

@@ -716,8 +716,8 @@ suspend fun <BC : BehaviourContext> BC.onMediaContent(
* @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that
* data * data
*/ */
suspend fun <BC : BehaviourContext> BC.onScheduledGiveawayContent( suspend fun <BC : BehaviourContext> BC.onGiveawayContent(
initialFilter: CommonMessageFilter<ScheduledGiveawayContent>? = null, initialFilter: CommonMessageFilter<GiveawayContent>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, ScheduledGiveawayContentMessage, Update>? = MessageFilterByChat, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, ScheduledGiveawayContentMessage, Update>? = MessageFilterByChat,
markerFactory: MarkerFactory<in ScheduledGiveawayContentMessage, Any> = ByChatMessageMarkerFactory, markerFactory: MarkerFactory<in ScheduledGiveawayContentMessage, Any> = ByChatMessageMarkerFactory,
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, ScheduledGiveawayContentMessage> scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, ScheduledGiveawayContentMessage>

View File

@@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByCha
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatMessageMarkerFactory
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times
import dev.inmo.tgbotapi.extensions.utils.baseSentMessageUpdateOrNull import dev.inmo.tgbotapi.extensions.utils.baseSentMessageUpdateOrNull
import dev.inmo.tgbotapi.extensions.utils.chatEventMessageOrNull import dev.inmo.tgbotapi.extensions.utils.chatEventMessageOrNull
import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.*
@@ -775,7 +776,7 @@ suspend fun <BC : BehaviourContext> BC.onChatSharedRequest(
* @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that
* data * data
*/ */
suspend fun <BC : BehaviourContext> BC.onUserShared( suspend fun <BC : BehaviourContext> BC.onUsersShared(
initialFilter: SimpleFilter<PrivateEventMessage<UsersShared>>? = null, initialFilter: SimpleFilter<PrivateEventMessage<UsersShared>>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, PrivateEventMessage<UsersShared>, Update>? = MessageFilterByChat, subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, PrivateEventMessage<UsersShared>, Update>? = MessageFilterByChat,
markerFactory: MarkerFactory<in ChatEventMessage<UsersShared>, Any> = ByChatMessageMarkerFactory, markerFactory: MarkerFactory<in ChatEventMessage<UsersShared>, Any> = ByChatMessageMarkerFactory,
@@ -783,6 +784,26 @@ suspend fun <BC : BehaviourContext> BC.onUserShared(
) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver) ) = onEventWithCustomChatEventMessage(initialFilter, subcontextUpdatesFilter, markerFactory, scenarioReceiver)
/**
* @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call
* @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example,
* this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage].
* Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own.
* Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times]
* to combinate several filters
* @param markerFactory Will be used to identify different "stream". [scenarioReceiver] will be called synchronously
* in one "stream". Output of [markerFactory] will be used as a key for "stream"
* @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that
* data
*/
suspend fun <BC : BehaviourContext> BC.onUserShared(
initialFilter: SimpleFilter<PrivateEventMessage<UsersShared>>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, PrivateEventMessage<UsersShared>, Update>? = MessageFilterByChat,
markerFactory: MarkerFactory<in ChatEventMessage<UsersShared>, Any> = ByChatMessageMarkerFactory,
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, PrivateEventMessage<UsersShared>>
) = onUsersShared(initialFilter * { it.chatEvent.userIds.size == 1 }, subcontextUpdatesFilter, markerFactory, scenarioReceiver)
/** /**
* @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call

View File

@@ -0,0 +1,8 @@
package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionUpdated
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionsCountUpdated
object ByChatIdChatMessageReactionsCountUpdatedMarkerFactory : MarkerFactory<ChatMessageReactionsCountUpdated, Any> {
override suspend fun invoke(data: ChatMessageReactionsCountUpdated) = data.chat.id
}

View File

@@ -9,6 +9,7 @@ import dev.inmo.tgbotapi.bot.exceptions.newRequestException
import dev.inmo.tgbotapi.requests.GetUpdatesRequest import dev.inmo.tgbotapi.requests.GetUpdatesRequest
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.Response import dev.inmo.tgbotapi.types.Response
import dev.inmo.tgbotapi.types.message.textsources.pre
import dev.inmo.tgbotapi.utils.DefaultKTgBotAPIKSLog import dev.inmo.tgbotapi.utils.DefaultKTgBotAPIKSLog
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
@@ -16,6 +17,7 @@ import io.ktor.client.plugins.timeout
import io.ktor.client.request.* import io.ktor.client.request.*
import io.ktor.client.statement.bodyAsText import io.ktor.client.statement.bodyAsText
import io.ktor.http.ContentType import io.ktor.http.ContentType
import io.ktor.http.content.*
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.collections.set import kotlin.collections.set
@@ -33,7 +35,14 @@ abstract class AbstractRequestCallFactory(
jsonFormatter: Json jsonFormatter: Json
): T? { ): T? {
val preparedBody = prepareCallBody(client, urlsKeeper, request) ?: return null val preparedBody = prepareCallBody(client, urlsKeeper, request) ?: return null
logger.v { "Prepared body for $request: $preparedBody" } logger.v {
val bodyValue = if (preparedBody is TextContent) {
preparedBody.text
} else {
preparedBody.toString()
}
"Prepared body for $request: $bodyValue"
}
client.post { client.post {
url( url(

View File

@@ -98,6 +98,7 @@ data class MultipartFile (
private val inputSource: () -> Input private val inputSource: () -> Input
) : InputFile() { ) : InputFile() {
@Required @Required
@EncodeDefault
override val fileId: String = "${uuid4()}.${filename.fileExtension}" override val fileId: String = "${uuid4()}.${filename.fileExtension}"
val input: Input val input: Input
get() = inputSource() get() = inputSource()

View File

@@ -112,6 +112,7 @@ data class CreateChatInviteLinkWithJoinRequest(
override val expirationUnixTimeStamp: TelegramDate? = null, override val expirationUnixTimeStamp: TelegramDate? = null,
) : CreateChatInviteLink<ChatInviteLinkWithJoinRequest>, WithJoinRequestChatInviteLinkRequest { ) : CreateChatInviteLink<ChatInviteLinkWithJoinRequest>, WithJoinRequestChatInviteLinkRequest {
@Required @Required
@EncodeDefault
@SerialName(createsJoinRequestField) @SerialName(createsJoinRequestField)
private val createsJoinRequest: Boolean = true private val createsJoinRequest: Boolean = true

View File

@@ -126,6 +126,7 @@ data class EditChatInviteLinkWithJoinRequest(
) : EditChatInviteLink<ChatInviteLinkWithJoinRequest>, ) : EditChatInviteLink<ChatInviteLinkWithJoinRequest>,
WithJoinRequestChatInviteLinkRequest { WithJoinRequestChatInviteLinkRequest {
@Required @Required
@EncodeDefault
@SerialName(createsJoinRequestField) @SerialName(createsJoinRequestField)
private val createsJoinRequest: Boolean = true private val createsJoinRequest: Boolean = true

View File

@@ -99,7 +99,7 @@ value class Username(
get() = withoutAt get() = withoutAt
init { init {
if (!username.startsWith("@")) { if (!full.startsWith("@")) {
throw IllegalArgumentException("Username must starts with `@`") throw IllegalArgumentException("Username must starts with `@`")
} }
} }
@@ -132,7 +132,7 @@ object ChatIdentifierSerializer : KSerializer<ChatIdentifier> {
override fun serialize(encoder: Encoder, value: ChatIdentifier) { override fun serialize(encoder: Encoder, value: ChatIdentifier) {
when (value) { when (value) {
is IdChatIdentifier -> encoder.encodeLong(value.chatId) is IdChatIdentifier -> encoder.encodeLong(value.chatId)
is Username -> encoder.encodeString(value.username) is Username -> encoder.encodeString(value.full)
} }
} }
} }
@@ -170,7 +170,7 @@ object FullChatIdentifierSerializer : KSerializer<ChatIdentifier> {
when (value) { when (value) {
is ChatId -> encoder.encodeLong(value.chatId) is ChatId -> encoder.encodeLong(value.chatId)
is ChatIdWithThreadId -> encoder.encodeString("${value.chatId}/${value.threadId}") is ChatIdWithThreadId -> encoder.encodeString("${value.chatId}/${value.threadId}")
is Username -> encoder.encodeString(value.username) is Username -> encoder.encodeString(value.full)
} }
} }
} }

View File

@@ -1,9 +1,6 @@
package dev.inmo.tgbotapi.types package dev.inmo.tgbotapi.types
import kotlinx.serialization.KSerializer import kotlinx.serialization.*
import kotlinx.serialization.Required
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@@ -16,9 +13,10 @@ sealed interface LinkPreviewOptions {
val preferLargeMedia: Boolean val preferLargeMedia: Boolean
val showAboveText: Boolean val showAboveText: Boolean
@Serializable @Serializable(LinkPreviewOptions.Companion::class)
data object Disabled : LinkPreviewOptions { data object Disabled : LinkPreviewOptions {
@Required @Required
@EncodeDefault
@SerialName(isDisabledField) @SerialName(isDisabledField)
override val isDisabled: Boolean = true override val isDisabled: Boolean = true
override val url: String? override val url: String?
@@ -31,7 +29,7 @@ sealed interface LinkPreviewOptions {
get() = false get() = false
} }
@Serializable @Serializable(LinkPreviewOptions.Companion::class)
data class Large( data class Large(
@SerialName(urlField) @SerialName(urlField)
override val url: String?, override val url: String?,
@@ -39,16 +37,18 @@ sealed interface LinkPreviewOptions {
override val showAboveText: Boolean override val showAboveText: Boolean
) : LinkPreviewOptions { ) : LinkPreviewOptions {
@Required @Required
@EncodeDefault
@SerialName(isDisabledField) @SerialName(isDisabledField)
override val isDisabled: Boolean = false override val isDisabled: Boolean = false
@Required @Required
@EncodeDefault
@SerialName(preferLargeMediaField) @SerialName(preferLargeMediaField)
override val preferLargeMedia: Boolean = true override val preferLargeMedia: Boolean = true
override val preferSmallMedia: Boolean override val preferSmallMedia: Boolean
get() = false get() = false
} }
@Serializable @Serializable(LinkPreviewOptions.Companion::class)
data class Small( data class Small(
@SerialName(urlField) @SerialName(urlField)
override val url: String?, override val url: String?,
@@ -56,23 +56,26 @@ sealed interface LinkPreviewOptions {
override val showAboveText: Boolean override val showAboveText: Boolean
) : LinkPreviewOptions { ) : LinkPreviewOptions {
@Required @Required
@EncodeDefault
@SerialName(isDisabledField) @SerialName(isDisabledField)
override val isDisabled: Boolean = false override val isDisabled: Boolean = false
@Required @Required
@EncodeDefault
@SerialName(preferSmallMediaField) @SerialName(preferSmallMediaField)
override val preferSmallMedia: Boolean = true override val preferSmallMedia: Boolean = true
override val preferLargeMedia: Boolean override val preferLargeMedia: Boolean
get() = false get() = false
} }
@Serializable @Serializable(LinkPreviewOptions.Companion::class)
data class Medium( data class Default(
@SerialName(urlField) @SerialName(urlField)
override val url: String?, override val url: String?,
@SerialName(showAboveTextField) @SerialName(showAboveTextField)
override val showAboveText: Boolean override val showAboveText: Boolean
) : LinkPreviewOptions { ) : LinkPreviewOptions {
@Required @Required
@EncodeDefault
@SerialName(isDisabledField) @SerialName(isDisabledField)
override val isDisabled: Boolean = false override val isDisabled: Boolean = false
override val preferSmallMedia: Boolean override val preferSmallMedia: Boolean
@@ -84,7 +87,7 @@ sealed interface LinkPreviewOptions {
@Serializable @Serializable
private data class Surrogate( private data class Surrogate(
@SerialName(isDisabledField) @SerialName(isDisabledField)
val isDisabled: Boolean = true, val isDisabled: Boolean = false,
@SerialName(urlField) @SerialName(urlField)
val url: String? = null, val url: String? = null,
@SerialName(preferSmallMediaField) @SerialName(preferSmallMediaField)
@@ -93,9 +96,7 @@ sealed interface LinkPreviewOptions {
val preferLargeMedia: Boolean = false, val preferLargeMedia: Boolean = false,
@SerialName(showAboveTextField) @SerialName(showAboveTextField)
val showAboveText: Boolean = false, val showAboveText: Boolean = false,
) { )
}
companion object : KSerializer<LinkPreviewOptions> { companion object : KSerializer<LinkPreviewOptions> {
override val descriptor: SerialDescriptor override val descriptor: SerialDescriptor
@@ -108,18 +109,21 @@ sealed interface LinkPreviewOptions {
surrogate.isDisabled -> Disabled surrogate.isDisabled -> Disabled
surrogate.preferLargeMedia -> Large(surrogate.url, surrogate.showAboveText) surrogate.preferLargeMedia -> Large(surrogate.url, surrogate.showAboveText)
surrogate.preferSmallMedia -> Small(surrogate.url, surrogate.showAboveText) surrogate.preferSmallMedia -> Small(surrogate.url, surrogate.showAboveText)
else -> Medium(surrogate.url, surrogate.showAboveText) else -> Default(surrogate.url, surrogate.showAboveText)
} }
} }
override fun serialize(encoder: Encoder, value: LinkPreviewOptions) { override fun serialize(encoder: Encoder, value: LinkPreviewOptions) {
when (value) { Surrogate.serializer().serialize(
is Disabled -> Disabled.serializer().serialize(encoder, value) encoder,
is Large -> Large.serializer().serialize(encoder, value) Surrogate(
is Medium -> Medium.serializer().serialize(encoder, value) isDisabled = value.isDisabled,
is Small -> Small.serializer().serialize(encoder, value) url = value.url,
} preferSmallMedia = value.preferSmallMedia,
preferLargeMedia = value.preferLargeMedia,
showAboveText = value.showAboveText
)
)
} }
} }
} }

View File

@@ -9,13 +9,15 @@ import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
@Serializable(MenuButtonSerializer::class) @Serializable(MenuButtonSerializer::class)
@OptIn(ExperimentalSerializationApi::class)
sealed interface MenuButton { sealed interface MenuButton {
@Required @EncodeDefault
val type: String val type: String
@Serializable @Serializable
object Commands : MenuButton { object Commands : MenuButton {
@Required @Required
@EncodeDefault
override val type: String override val type: String
get() = "commands" get() = "commands"
} }
@@ -27,6 +29,7 @@ sealed interface MenuButton {
val webApp: WebAppInfo val webApp: WebAppInfo
) : MenuButton { ) : MenuButton {
@Required @Required
@EncodeDefault
override val type: String override val type: String
get() = Companion.type get() = Companion.type
@@ -39,6 +42,7 @@ sealed interface MenuButton {
@Serializable @Serializable
object Default : MenuButton { object Default : MenuButton {
@Required @Required
@EncodeDefault
override val type: String override val type: String
get() = "default" get() = "default"
} }

View File

@@ -6,7 +6,7 @@ import dev.inmo.tgbotapi.types.dice.Dice
import dev.inmo.tgbotapi.types.files.* import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.games.RawGame import dev.inmo.tgbotapi.types.games.RawGame
import dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults import dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
import dev.inmo.tgbotapi.types.giveaway.ScheduledGiveaway import dev.inmo.tgbotapi.types.giveaway.Giveaway
import dev.inmo.tgbotapi.types.location.Location import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.message.MessageOrigin import dev.inmo.tgbotapi.types.message.MessageOrigin
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
@@ -28,7 +28,7 @@ sealed interface ReplyInfo {
val messageMeta: Message.MetaInfo? val messageMeta: Message.MetaInfo?
data class Internal( data class Internal(
val message: AccessibleMessage val message: Message
): ReplyInfo { ): ReplyInfo {
override val messageMeta: Message.MetaInfo override val messageMeta: Message.MetaInfo
get() = message.metaInfo get() = message.metaInfo
@@ -96,7 +96,7 @@ sealed interface ReplyInfo {
private val poll: Poll? = null, private val poll: Poll? = null,
private val invoice: Invoice? = null, private val invoice: Invoice? = null,
private val dice: Dice? = null, private val dice: Dice? = null,
private val giveaway: ScheduledGiveaway? = null, private val giveaway: Giveaway? = null,
private val giveaway_winners: GiveawayPublicResults? = null, private val giveaway_winners: GiveawayPublicResults? = null,
) { ) {
val asExternalReplyInfo: External val asExternalReplyInfo: External

View File

@@ -4,10 +4,7 @@ import dev.inmo.tgbotapi.abstracts.WithMessageId
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.PreviewUser import dev.inmo.tgbotapi.types.chat.PreviewUser
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.KSerializer import kotlinx.serialization.*
import kotlinx.serialization.Required
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@@ -31,6 +28,7 @@ sealed interface ChatBoostSource {
override val user: PreviewUser override val user: PreviewUser
) : ByUser { ) : ByUser {
@Required @Required
@EncodeDefault
@SerialName(sourceField) @SerialName(sourceField)
override val sourceName: String = sourceCode override val sourceName: String = sourceCode
@@ -45,6 +43,7 @@ sealed interface ChatBoostSource {
override val user: PreviewUser override val user: PreviewUser
) : ByUser { ) : ByUser {
@Required @Required
@EncodeDefault
@SerialName(sourceField) @SerialName(sourceField)
override val sourceName: String = sourceCode override val sourceName: String = sourceCode
@@ -67,9 +66,11 @@ sealed interface ChatBoostSource {
override val user: PreviewUser override val user: PreviewUser
) : Giveaway, ByUser { ) : Giveaway, ByUser {
@Required @Required
@EncodeDefault
@SerialName(sourceField) @SerialName(sourceField)
override val sourceName: String = Giveaway.sourceCode override val sourceName: String = Giveaway.sourceCode
@Required @Required
@EncodeDefault
@SerialName(isUnclaimedField) @SerialName(isUnclaimedField)
override val unclaimed: Boolean = false override val unclaimed: Boolean = false
} }
@@ -80,9 +81,11 @@ sealed interface ChatBoostSource {
override val messageId: MessageId override val messageId: MessageId
) : Giveaway { ) : Giveaway {
@Required @Required
@EncodeDefault
@SerialName(sourceField) @SerialName(sourceField)
override val sourceName: String = Giveaway.sourceCode override val sourceName: String = Giveaway.sourceCode
@Required @Required
@EncodeDefault
@SerialName(isUnclaimedField) @SerialName(isUnclaimedField)
override val unclaimed: Boolean = true override val unclaimed: Boolean = true
@SerialName(userField) @SerialName(userField)
@@ -104,6 +107,7 @@ sealed interface ChatBoostSource {
@Serializable @Serializable
private data class Surrogate( private data class Surrogate(
@Required @Required
@EncodeDefault
@SerialName(sourceField) @SerialName(sourceField)
val sourceName: String, val sourceName: String,
@SerialName(userField) @SerialName(userField)

View File

@@ -65,6 +65,7 @@ data class RequestLocationKeyboardButton(
) : KeyboardButton { ) : KeyboardButton {
@SerialName(requestLocationField) @SerialName(requestLocationField)
@Required @Required
@EncodeDefault
val requestLocation: Boolean = true val requestLocation: Boolean = true
} }

View File

@@ -17,12 +17,15 @@ import kotlinx.serialization.encoding.Encoder
sealed interface KeyboardButtonRequestUsers { sealed interface KeyboardButtonRequestUsers {
val requestId: RequestId val requestId: RequestId
val isBot: Boolean? val isBot: Boolean?
val isPremium: Boolean?
val maxCount: Int val maxCount: Int
@Serializable @Serializable
data class Any( data class Any(
@SerialName(requestIdField) @SerialName(requestIdField)
override val requestId: RequestId, override val requestId: RequestId,
@SerialName(userIsPremiumField)
override val isPremium: Boolean? = null,
@SerialName(maxQuantityField) @SerialName(maxQuantityField)
override val maxCount: Int = keyboardButtonRequestUserLimit.first override val maxCount: Int = keyboardButtonRequestUserLimit.first
) : KeyboardButtonRequestUsers { ) : KeyboardButtonRequestUsers {
@@ -36,7 +39,7 @@ sealed interface KeyboardButtonRequestUsers {
@SerialName(requestIdField) @SerialName(requestIdField)
override val requestId: RequestId, override val requestId: RequestId,
@SerialName(userIsPremiumField) @SerialName(userIsPremiumField)
val isPremium: Boolean? = null, override val isPremium: Boolean? = null,
@SerialName(maxQuantityField) @SerialName(maxQuantityField)
override val maxCount: Int = keyboardButtonRequestUserLimit.first override val maxCount: Int = keyboardButtonRequestUserLimit.first
) : KeyboardButtonRequestUsers { ) : KeyboardButtonRequestUsers {
@@ -55,6 +58,8 @@ sealed interface KeyboardButtonRequestUsers {
@SerialName(userIsBotField) @SerialName(userIsBotField)
@EncodeDefault @EncodeDefault
override val isBot: Boolean = true override val isBot: Boolean = true
override val isPremium: Boolean?
get() = null
} }
@Serializer(KeyboardButtonRequestUsers::class) @Serializer(KeyboardButtonRequestUsers::class)
@@ -80,7 +85,7 @@ sealed interface KeyboardButtonRequestUsers {
return when (surrogate.userIsBot) { return when (surrogate.userIsBot) {
true -> Bot(surrogate.requestId, surrogate.maxCount) true -> Bot(surrogate.requestId, surrogate.maxCount)
false -> Common(surrogate.requestId, surrogate.userIsPremium, surrogate.maxCount) false -> Common(surrogate.requestId, surrogate.userIsPremium, surrogate.maxCount)
null -> Any(surrogate.requestId, surrogate.maxCount) null -> Any(surrogate.requestId, surrogate.userIsPremium, surrogate.maxCount)
} }
} }

View File

@@ -11,6 +11,7 @@ data class ReplyForce(
) : KeyboardMarkup { ) : KeyboardMarkup {
@SerialName(forceReplyField) @SerialName(forceReplyField)
@Required @Required
@EncodeDefault
val forceReply: Boolean = true val forceReply: Boolean = true
companion object { companion object {

View File

@@ -8,5 +8,6 @@ data class ReplyKeyboardRemove(
) : KeyboardMarkup { ) : KeyboardMarkup {
@SerialName("remove_keyboard") @SerialName("remove_keyboard")
@Required @Required
@EncodeDefault
val removeKeyboard: Boolean = true val removeKeyboard: Boolean = true
} }

View File

@@ -2,8 +2,10 @@ package dev.inmo.tgbotapi.types.buttons.reply
import dev.inmo.tgbotapi.types.buttons.* import dev.inmo.tgbotapi.types.buttons.*
import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights
import dev.inmo.tgbotapi.types.keyboardButtonRequestUserLimit
import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.request.RequestId
import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.types.webapps.WebAppInfo
import kotlin.math.max
/** /**
@@ -55,7 +57,7 @@ inline fun webAppReplyButton(
/** /**
* Creates [RequestUserKeyboardButton] * Creates [RequestUserKeyboardButton]
*/ */
inline fun requestUserReplyButton( inline fun requestUsersReplyButton(
text: String, text: String,
requestUser: KeyboardButtonRequestUsers requestUser: KeyboardButtonRequestUsers
) = RequestUserKeyboardButton( ) = RequestUserKeyboardButton(
@@ -63,15 +65,51 @@ inline fun requestUserReplyButton(
requestUser requestUser
) )
/**
* Creates [RequestUserKeyboardButton]
*/
@Deprecated("Renamed", ReplaceWith("requestUsersReplyButton(text, requestUser)", "dev.inmo.tgbotapi.types.buttons.reply.requestUsersReplyButton"))
inline fun requestUserReplyButton(
text: String,
requestUser: KeyboardButtonRequestUsers
) = requestUsersReplyButton(text, requestUser)
/** /**
* Creates [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot] * Creates [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot]
*/ */
inline fun requestBotsReplyButton(
text: String,
requestId: RequestId,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersReplyButton(
text,
KeyboardButtonRequestUsers.Bot(requestId, maxCount)
)
/**
* Creates [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot]
*/
@Deprecated("Renamed", ReplaceWith("requestBotsReplyButton(text, requestId)", "dev.inmo.tgbotapi.types.buttons.reply.requestBotsReplyButton"))
inline fun requestBotReplyButton( inline fun requestBotReplyButton(
text: String, text: String,
requestId: RequestId requestId: RequestId,
) = requestUserReplyButton( ) = requestBotsReplyButton(
text, text,
KeyboardButtonRequestUsers.Bot(requestId) requestId,
)
/**
* Creates [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Common]
*/
inline fun requestUsersReplyButton(
text: String,
requestId: RequestId,
premiumUser: Boolean? = null,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersReplyButton(
text,
KeyboardButtonRequestUsers.Common(requestId, premiumUser, maxCount)
) )
/** /**
@@ -80,10 +118,26 @@ inline fun requestBotReplyButton(
inline fun requestUserReplyButton( inline fun requestUserReplyButton(
text: String, text: String,
requestId: RequestId, requestId: RequestId,
premiumUser: Boolean? = null premiumUser: Boolean? = null,
) = requestUserReplyButton( maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersReplyButton(
text, text,
KeyboardButtonRequestUsers.Common(requestId, premiumUser) requestId,
premiumUser,
maxCount
)
/**
* Creates [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Any]
*/
inline fun requestUsersOrBotsReplyButton(
text: String,
requestId: RequestId,
premiumUser: Boolean? = null,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersReplyButton(
text,
KeyboardButtonRequestUsers.Any(requestId, premiumUser, maxCount)
) )
/** /**

View File

@@ -17,23 +17,41 @@ private val formatter
sealed class ChatType { sealed class ChatType {
abstract val stringified: String abstract val stringified: String
@Serializable(ChatTypeSerializer::class) @Serializable(ChatTypeSerializer::class)
object PrivateChatType : ChatType() { override val stringified = "private" } object Sender : ChatType() { override val stringified = "sender" }
@Serializable(ChatTypeSerializer::class) @Serializable(ChatTypeSerializer::class)
object GroupChatType : ChatType() { override val stringified = "group" } object Private : ChatType() { override val stringified = "private" }
@Serializable(ChatTypeSerializer::class) @Serializable(ChatTypeSerializer::class)
object SupergroupChatType : ChatType() { override val stringified = "supergroup" } object Group : ChatType() { override val stringified = "group" }
@Serializable(ChatTypeSerializer::class) @Serializable(ChatTypeSerializer::class)
object ChannelChatType : ChatType() { override val stringified = "channel" } object Supergroup : ChatType() { override val stringified = "supergroup" }
@Serializable(ChatTypeSerializer::class) @Serializable(ChatTypeSerializer::class)
class UnknownChatType(override val stringified: String) : ChatType() object Channel : ChatType() { override val stringified = "channel" }
@Serializable(ChatTypeSerializer::class)
class Unknown(override val stringified: String) : ChatType()
companion object {
@Deprecated("Renamed", ReplaceWith("Private", "dev.inmo.tgbotapi.types.chat.ChatType.Private"))
val PrivateChatType = Private
@Deprecated("Renamed", ReplaceWith("Group", "dev.inmo.tgbotapi.types.chat.ChatType.Group"))
val GroupChatType = Group
@Deprecated("Renamed", ReplaceWith("Supergroup", "dev.inmo.tgbotapi.types.chat.ChatType.Supergroup"))
val SupergroupChatType = Supergroup
@Deprecated("Renamed", ReplaceWith("Channel", "dev.inmo.tgbotapi.types.chat.ChatType.Channel"))
val ChannelChatType = Channel
@Deprecated("Renamed", ReplaceWith("Unknown", "dev.inmo.tgbotapi.types.chat.ChatType.Unknown"))
val UnknownChatType = Unknown
@Deprecated("Renamed", ReplaceWith("Unknown(stringified)", "dev.inmo.tgbotapi.types.chat.ChatType.Unknown"))
fun UnknownChatType(stringified: String) = Unknown(stringified)
}
} }
val String.asChatType val String.asChatType
get() = when (this) { get() = when (this) {
ChatType.PrivateChatType.stringified -> ChatType.PrivateChatType ChatType.Sender.stringified -> ChatType.Sender
ChatType.GroupChatType.stringified -> ChatType.GroupChatType ChatType.Private.stringified -> ChatType.Private
ChatType.SupergroupChatType.stringified -> ChatType.SupergroupChatType ChatType.Group.stringified -> ChatType.Group
ChatType.ChannelChatType.stringified -> ChatType.ChannelChatType ChatType.Supergroup.stringified -> ChatType.Supergroup
else -> ChatType.UnknownChatType(this) ChatType.Channel.stringified -> ChatType.Channel
else -> ChatType.Unknown(this)
} }
@RiskFeature @RiskFeature
@@ -63,15 +81,16 @@ object ChatSerializer : KSerializer<Chat> {
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
when (type) { when (type) {
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson) ChatType.Sender -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson) ChatType.Private -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> if (isForum) { ChatType.Group -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.Supergroup -> if (isForum) {
formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
} else { } else {
formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson)
} }
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson) ChatType.Channel -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownChatType( is ChatType.Unknown -> UnknownChatType(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(), formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
decodedJson.toString(), decodedJson.toString(),
decodedJson decodedJson
@@ -101,15 +120,16 @@ object PreviewChatSerializer : KSerializer<PreviewChat> {
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
return when (type) { return when (type) {
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson) ChatType.Sender -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson) ChatType.Private -> formatter.decodeFromJsonElement(PrivateChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> if (isForum) { ChatType.Group -> formatter.decodeFromJsonElement(GroupChatImpl.serializer(), decodedJson)
ChatType.Supergroup -> if (isForum) {
formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(ForumChatImpl.serializer(), decodedJson)
} else { } else {
formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(SupergroupChatImpl.serializer(), decodedJson)
} }
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson) ChatType.Channel -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownChatType( is ChatType.Unknown -> UnknownChatType(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(), formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
decodedJson.toString(), decodedJson.toString(),
decodedJson decodedJson
@@ -143,16 +163,16 @@ sealed class ExtendedChatSerializer : KSerializer<ExtendedChat> {
val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true val isForum = decodedJson[isForumField] ?.jsonPrimitive ?.booleanOrNull == true
return when (type) { return when (type) {
// else -> throw IllegalArgumentException("Unknown type of chat") ChatType.Sender -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
ChatType.PrivateChatType -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson) ChatType.Private -> formatter.decodeFromJsonElement(ExtendedPrivateChatImpl.serializer(), decodedJson)
ChatType.GroupChatType -> formatter.decodeFromJsonElement(ExtendedGroupChatImpl.serializer(), decodedJson) ChatType.Group -> formatter.decodeFromJsonElement(ExtendedGroupChatImpl.serializer(), decodedJson)
ChatType.SupergroupChatType -> if (isForum) { ChatType.Supergroup -> if (isForum) {
formatter.decodeFromJsonElement(ExtendedForumChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(ExtendedForumChatImpl.serializer(), decodedJson)
} else { } else {
formatter.decodeFromJsonElement(ExtendedSupergroupChatImpl.serializer(), decodedJson) formatter.decodeFromJsonElement(ExtendedSupergroupChatImpl.serializer(), decodedJson)
} }
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson) ChatType.Channel -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson)
is ChatType.UnknownChatType -> UnknownExtendedChat( is ChatType.Unknown -> UnknownExtendedChat(
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(), formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
decodedJson.toString(), decodedJson.toString(),
decodedJson decodedJson

View File

@@ -45,5 +45,6 @@ data class AdministratorChatMemberImpl(
) : AdministratorChatMember { ) : AdministratorChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Administrator override val status: ChatMember.Status = ChatMember.Status.Administrator
} }

View File

@@ -13,5 +13,6 @@ data class KickedChatMember(
) : BannedChatMember { ) : BannedChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Kicked override val status: ChatMember.Status = ChatMember.Status.Kicked
} }

View File

@@ -11,5 +11,6 @@ data class LeftChatMemberImpl(
) : LeftChatMember { ) : LeftChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Left override val status: ChatMember.Status = ChatMember.Status.Left
} }

View File

@@ -11,5 +11,6 @@ data class MemberChatMemberImpl(
) : MemberChatMember { ) : MemberChatMember {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Member override val status: ChatMember.Status = ChatMember.Status.Member
} }

View File

@@ -45,5 +45,6 @@ data class OwnerChatMember(
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Creator override val status: ChatMember.Status = ChatMember.Status.Creator
} }

View File

@@ -44,5 +44,6 @@ data class RestrictedChatMember(
) : BannedChatMember, SpecialRightsChatMember, ChatPermissions { ) : BannedChatMember, SpecialRightsChatMember, ChatPermissions {
@SerialName(statusField) @SerialName(statusField)
@Required @Required
@EncodeDefault
override val status: ChatMember.Status = ChatMember.Status.Restricted override val status: ChatMember.Status = ChatMember.Status.Restricted
} }

View File

@@ -71,24 +71,28 @@ data class UnknownBotCommandScope internal constructor(
@Serializable @Serializable
object BotCommandScopeDefault : BotCommandScope { object BotCommandScopeDefault : BotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = "default" override val type: String = "default"
} }
@Serializable @Serializable
object BotCommandScopeAllPrivateChats : BotCommandScope { object BotCommandScopeAllPrivateChats : BotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = "all_private_chats" override val type: String = "all_private_chats"
} }
@Serializable @Serializable
object BotCommandScopeAllGroupChats : BotCommandScope { object BotCommandScopeAllGroupChats : BotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = "all_group_chats" override val type: String = "all_group_chats"
} }
@Serializable @Serializable
object BotCommandScopeAllChatAdministrators : BotCommandScope { object BotCommandScopeAllChatAdministrators : BotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = "all_chat_administrators" override val type: String = "all_chat_administrators"
} }
@@ -102,6 +106,7 @@ data class BotCommandScopeChatAdministrators(
override val chatId: ChatIdentifier override val chatId: ChatIdentifier
) : ChatBotCommandScope { ) : ChatBotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = BotCommandScopeChatAdministrators.type override val type: String = BotCommandScopeChatAdministrators.type
companion object { companion object {
const val type = "chat_administrators" const val type = "chat_administrators"
@@ -113,6 +118,7 @@ data class BotCommandScopeChat(
override val chatId: ChatIdentifier override val chatId: ChatIdentifier
) : ChatBotCommandScope { ) : ChatBotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = BotCommandScopeChat.type override val type: String = BotCommandScopeChat.type
companion object { companion object {
const val type = "chat" const val type = "chat"
@@ -125,6 +131,7 @@ data class BotCommandScopeChatMember(
val userId: UserId val userId: UserId
) : ChatBotCommandScope { ) : ChatBotCommandScope {
@Required @Required
@EncodeDefault
override val type: String = BotCommandScopeChatMember.type override val type: String = BotCommandScopeChatMember.type
companion object { companion object {
const val type = "chat_member" const val type = "chat_member"

View File

@@ -1,19 +1,13 @@
package dev.inmo.tgbotapi.types.giveaway package dev.inmo.tgbotapi.types.giveaway
import dev.inmo.micro_utils.language_codes.IetfLang import dev.inmo.micro_utils.language_codes.IetfLang
import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.PreviewChat import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.giveaway.GiveawayInfo
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChatEvent
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PublicChatEvent
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class ScheduledGiveaway( data class Giveaway(
@SerialName(chatsField) @SerialName(chatsField)
val chats: List<PreviewChat>, val chats: List<PreviewChat>,
@SerialName(winnersSelectionDateField) @SerialName(winnersSelectionDateField)

View File

@@ -4,10 +4,7 @@ import dev.inmo.tgbotapi.abstracts.WithPreviewChatAndMessageId
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.PreviewChat import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.PreviewUser import dev.inmo.tgbotapi.types.chat.PreviewUser
import kotlinx.serialization.KSerializer import kotlinx.serialization.*
import kotlinx.serialization.Required
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@@ -32,6 +29,7 @@ sealed interface GiveawayPublicResults: GiveawayInfo, GiveawayResults, WithPrevi
) : GiveawayPublicResults { ) : GiveawayPublicResults {
@SerialName(wasRefundedField) @SerialName(wasRefundedField)
@Required @Required
@EncodeDefault
override val refunded: Boolean = true override val refunded: Boolean = true
@SerialName(winnersCountField) @SerialName(winnersCountField)
override val count: Int = 0 override val count: Int = 0
@@ -78,6 +76,7 @@ sealed interface GiveawayPublicResults: GiveawayInfo, GiveawayResults, WithPrevi
) : GiveawayPublicResults { ) : GiveawayPublicResults {
@SerialName(wasRefundedField) @SerialName(wasRefundedField)
@Required @Required
@EncodeDefault
override val refunded: Boolean = false override val refunded: Boolean = false
} }

View File

@@ -2,10 +2,7 @@ package dev.inmo.tgbotapi.types.message
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.* import dev.inmo.tgbotapi.types.chat.*
import kotlinx.serialization.KSerializer import kotlinx.serialization.*
import kotlinx.serialization.Required
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.encoding.Encoder
@@ -27,6 +24,7 @@ sealed interface MessageOrigin {
) : MessageOrigin { ) : MessageOrigin {
@SerialName(typeField) @SerialName(typeField)
@Required @Required
@EncodeDefault
override val type: String = Companion.type override val type: String = Companion.type
companion object { companion object {
@@ -43,6 +41,7 @@ sealed interface MessageOrigin {
) : MessageOrigin { ) : MessageOrigin {
@SerialName(typeField) @SerialName(typeField)
@Required @Required
@EncodeDefault
override val type: String = Companion.type override val type: String = Companion.type
companion object { companion object {
@@ -66,6 +65,7 @@ sealed interface MessageOrigin {
) : Public { ) : Public {
@SerialName(typeField) @SerialName(typeField)
@Required @Required
@EncodeDefault
override val type: String = Companion.type override val type: String = Companion.type
companion object { companion object {
@@ -86,6 +86,7 @@ sealed interface MessageOrigin {
) : Public { ) : Public {
@SerialName(typeField) @SerialName(typeField)
@Required @Required
@EncodeDefault
override val type: String = Companion.type override val type: String = Companion.type
companion object { companion object {
@@ -105,6 +106,7 @@ sealed interface MessageOrigin {
private data class Surrogate( private data class Surrogate(
@SerialName(typeField) @SerialName(typeField)
@Required @Required
@EncodeDefault
val type: String, val type: String,
@SerialName(senderChatField) @SerialName(senderChatField)
val senderChat: PreviewChat? = null, val senderChat: PreviewChat? = null,

View File

@@ -10,7 +10,7 @@ import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.files.Sticker import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.games.RawGame import dev.inmo.tgbotapi.types.games.RawGame
import dev.inmo.tgbotapi.types.giveaway.* import dev.inmo.tgbotapi.types.giveaway.*
import dev.inmo.tgbotapi.types.message.content.ScheduledGiveawayContent import dev.inmo.tgbotapi.types.message.content.GiveawayContent
import dev.inmo.tgbotapi.types.location.Location import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.*
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.*
@@ -96,7 +96,7 @@ internal data class RawMessage(
private val invoice: Invoice? = null, private val invoice: Invoice? = null,
private val dice: Dice? = null, private val dice: Dice? = null,
private val successful_payment: SuccessfulPayment? = null, private val successful_payment: SuccessfulPayment? = null,
private val giveaway: ScheduledGiveaway? = null, private val giveaway: Giveaway? = null,
private val giveaway_winners: GiveawayResults? = null, private val giveaway_winners: GiveawayResults? = null,
private val users_shared: UsersShared? = null, private val users_shared: UsersShared? = null,
@@ -199,7 +199,7 @@ internal data class RawMessage(
venue != null -> VenueContent(venue) venue != null -> VenueContent(venue)
poll != null -> PollContent(poll) poll != null -> PollContent(poll)
invoice != null -> InvoiceContent(invoice) invoice != null -> InvoiceContent(invoice)
giveaway != null -> ScheduledGiveawayContent(chat, messageId, giveaway) giveaway != null -> GiveawayContent(chat, messageId, giveaway)
giveaway_winners is GiveawayPublicResults -> GiveawayPublicResultsContent(giveaway_winners) giveaway_winners is GiveawayPublicResults -> GiveawayPublicResultsContent(giveaway_winners)
else -> null else -> null
} }
@@ -251,7 +251,7 @@ internal data class RawMessage(
} }
} }
val asMessage: AccessibleMessage by lazy { val asMessage: Message by lazy {
if (date.date == 0L) { if (date.date == 0L) {
return@lazy InaccessibleMessage( return@lazy InaccessibleMessage(
chat, chat,

View File

@@ -49,7 +49,7 @@ interface AccessibleMessage : Message
data class InaccessibleMessage( data class InaccessibleMessage(
override val chat: PreviewChat, override val chat: PreviewChat,
override val messageId: MessageId, override val messageId: MessageId,
) : AccessibleMessage { ) : Message {
override val date: DateTime override val date: DateTime
get() = DateTime.invoke(0L) get() = DateTime.invoke(0L)
} }

View File

@@ -4,6 +4,6 @@ import dev.inmo.tgbotapi.types.ReplyInfo
interface PossiblyReplyMessage { interface PossiblyReplyMessage {
val replyInfo: ReplyInfo? val replyInfo: ReplyInfo?
val replyTo: AccessibleMessage? val replyTo: Message?
get() = (replyInfo as? ReplyInfo.Internal) ?.message get() = (replyInfo as? ReplyInfo.Internal) ?.message
} }

View File

@@ -50,7 +50,7 @@ sealed interface MessageContent: ResendableContent {
subclass(InvoiceContent::class) subclass(InvoiceContent::class)
subclass(StoryContent::class) subclass(StoryContent::class)
subclass(GiveawayPublicResultsContent::class) subclass(GiveawayPublicResultsContent::class)
subclass(ScheduledGiveawayContent::class) subclass(GiveawayContent::class)
additionalBuilder() additionalBuilder()
} }

View File

@@ -1,23 +1,19 @@
package dev.inmo.tgbotapi.types.message.content package dev.inmo.tgbotapi.types.message.content
import dev.inmo.micro_utils.language_codes.IetfLang
import dev.inmo.tgbotapi.requests.ForwardMessage import dev.inmo.tgbotapi.requests.ForwardMessage
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat import dev.inmo.tgbotapi.types.giveaway.Giveaway
import dev.inmo.tgbotapi.types.giveaway.GiveawayInfo
import dev.inmo.tgbotapi.types.giveaway.ScheduledGiveaway
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@Serializable @Serializable
data class ScheduledGiveawayContent( data class GiveawayContent(
private val chat: Chat, private val chat: Chat,
private val messageId: MessageId, private val messageId: MessageId,
val giveaway: ScheduledGiveaway val giveaway: Giveaway
) : MessageContent { ) : MessageContent {
override fun createResend( override fun createResend(
chatId: ChatIdentifier, chatId: ChatIdentifier,

View File

@@ -32,7 +32,7 @@ typealias VisualMediaGroupMessage = CommonMessage<VisualMediaGroupPartContent>
typealias VideoMessage = CommonMessage<VideoContent> typealias VideoMessage = CommonMessage<VideoContent>
typealias PhotoMessage = CommonMessage<PhotoContent> typealias PhotoMessage = CommonMessage<PhotoContent>
typealias AnimationMessage = CommonMessage<AnimationContent> typealias AnimationMessage = CommonMessage<AnimationContent>
typealias ScheduledGiveawayContentMessage = CommonMessage<ScheduledGiveawayContent> typealias ScheduledGiveawayContentMessage = CommonMessage<GiveawayContent>
typealias GiveawayPublicResultsContentMessage = CommonMessage<GiveawayPublicResultsContent> typealias GiveawayPublicResultsContentMessage = CommonMessage<GiveawayPublicResultsContent>

View File

@@ -45,5 +45,5 @@ inline fun mention(vararg parts: TextSource) = mention(parts.toList())
inline fun mention(whoToMention: String) = mention(regular(whoToMention)) inline fun mention(whoToMention: String) = mention(regular(whoToMention))
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun mention(whoToMention: Username) = mention(whoToMention.username.dropWhile { it == '@' }) inline fun mention(whoToMention: Username) = mention(whoToMention.full.dropWhile { it == '@' })

View File

@@ -100,6 +100,7 @@ data class PassportElementErrorDataField(
) : PassportSingleElementError() { ) : PassportSingleElementError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = dataField override val source: String = dataField
} }
fun EncryptedPassportElementWithData.createDataError(field: String, message: String) = PassportElementErrorDataField( fun EncryptedPassportElementWithData.createDataError(field: String, message: String) = PassportElementErrorDataField(
@@ -121,6 +122,7 @@ data class PassportElementErrorFrontSide(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = frontSideField override val source: String = frontSideField
} }
fun EncryptedPassportElementWithFrontSide.createFrontSideError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorFrontSide( fun EncryptedPassportElementWithFrontSide.createFrontSideError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorFrontSide(
@@ -141,6 +143,7 @@ data class PassportElementErrorReverseSide(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = reverseSideField override val source: String = reverseSideField
} }
fun EncryptedPassportElementWithReverseSide.createReverseSideError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorReverseSide( fun EncryptedPassportElementWithReverseSide.createReverseSideError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorReverseSide(
@@ -160,6 +163,7 @@ data class PassportElementErrorSelfie(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = selfieField override val source: String = selfieField
} }
fun EncryptedPassportElementWithSelfie.createSelfieError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorSelfie( fun EncryptedPassportElementWithSelfie.createSelfieError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorSelfie(
@@ -181,6 +185,7 @@ data class PassportElementErrorFile(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = fileField override val source: String = fileField
} }
fun EncryptedPassportElementWithFilesCollection.createFileError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorFile( fun EncryptedPassportElementWithFilesCollection.createFileError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorFile(
@@ -200,6 +205,7 @@ data class PassportElementErrorFiles(
) : PassportElementFilesError() { ) : PassportElementFilesError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = filesField override val source: String = filesField
} }
fun EncryptedPassportElementWithFilesCollection.createFilesError(message: String, unencryptedFileHashes: List<PassportElementHash>) = PassportElementErrorFiles( fun EncryptedPassportElementWithFilesCollection.createFilesError(message: String, unencryptedFileHashes: List<PassportElementHash>) = PassportElementErrorFiles(
@@ -221,6 +227,7 @@ data class PassportElementErrorTranslationFile(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = translationFileField override val source: String = translationFileField
} }
fun EncryptedPassportElementTranslatable.createFileError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorTranslationFile( fun EncryptedPassportElementTranslatable.createFileError(message: String, unencryptedFileHash: PassportElementHash) = PassportElementErrorTranslationFile(
@@ -239,6 +246,7 @@ data class PassportElementErrorTranslationFiles(
) : PassportElementFilesError() { ) : PassportElementFilesError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = translationFilesField override val source: String = translationFilesField
} }
fun EncryptedPassportElementTranslatable.createFilesError(message: String, unencryptedFileHashes: List<PassportElementHash>) = PassportElementErrorTranslationFiles( fun EncryptedPassportElementTranslatable.createFilesError(message: String, unencryptedFileHashes: List<PassportElementHash>) = PassportElementErrorTranslationFiles(
@@ -259,6 +267,7 @@ data class PassportElementErrorUnspecified(
) : PassportElementFileError() { ) : PassportElementFileError() {
@SerialName(sourceField) @SerialName(sourceField)
@Required @Required
@EncodeDefault
override val source: String = unspecifiedField override val source: String = unspecifiedField
} }
fun EncryptedPassportElement.createUnspecifiedError(message: String, elementHash: PassportElementHash) = PassportElementErrorUnspecified( fun EncryptedPassportElement.createUnspecifiedError(message: String, elementHash: PassportElementHash) = PassportElementErrorUnspecified(

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.utils.extensions package dev.inmo.tgbotapi.utils.extensions
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyTopicMessage import dev.inmo.tgbotapi.types.message.abstracts.PossiblyTopicMessage
val AccessibleMessage.threadIdOrNull val Message.threadIdOrNull
get() = (this as? PossiblyTopicMessage) ?.threadId get() = (this as? PossiblyTopicMessage) ?.threadId

View File

@@ -33,10 +33,10 @@ class ChatIdentifierTests {
@Test @Test
fun `Cast_from_String_to_Username_is_working_correctly`() { fun `Cast_from_String_to_Username_is_working_correctly`() {
assertEquals(testUsername, testUsername.toUsername().username) assertEquals(testUsername, testUsername.toUsername().full)
assertFails("Username creating must fail when trying to create from string which is not starting from @ symbol") { assertFails("Username creating must fail when trying to create from string which is not starting from @ symbol") {
testUsername.replace("@", "").toUsername().username testUsername.replace("@", "").toUsername().full
} }
} }

View File

@@ -978,346 +978,346 @@ inline fun SecureValue.requireSecureValueWithTranslations(): SecureValueWithTran
this as SecureValueWithTranslations this as SecureValueWithTranslations
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenAnonymousGroupContentMessageImpl(block: (AnonymousGroupContentMessageImpl<MessageContent>) -> T) = inline fun <T> Message.whenAnonymousGroupContentMessageImpl(block: (AnonymousGroupContentMessageImpl<MessageContent>) -> T) =
asAnonymousGroupContentMessageImpl()?.let(block) asAnonymousGroupContentMessageImpl()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl<MessageContent>? = inline fun Message.asAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl<MessageContent>? =
this as? AnonymousGroupContentMessageImpl<MessageContent> this as? AnonymousGroupContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl<MessageContent> = inline fun Message.requireAnonymousGroupContentMessageImpl(): AnonymousGroupContentMessageImpl<MessageContent> =
this as AnonymousGroupContentMessageImpl<MessageContent> this as AnonymousGroupContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenChannelContentMessageImpl(block: (UnconnectedFromChannelGroupContentMessageImpl<MessageContent>) -> T) = inline fun <T> Message.whenChannelContentMessageImpl(block: (UnconnectedFromChannelGroupContentMessageImpl<MessageContent>) -> T) =
asChannelContentMessageImpl()?.let(block) asChannelContentMessageImpl()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asChannelContentMessageImpl(): UnconnectedFromChannelGroupContentMessageImpl<MessageContent>? = inline fun Message.asChannelContentMessageImpl(): UnconnectedFromChannelGroupContentMessageImpl<MessageContent>? =
this as? UnconnectedFromChannelGroupContentMessageImpl<MessageContent> this as? UnconnectedFromChannelGroupContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireChannelContentMessageImpl(): UnconnectedFromChannelGroupContentMessageImpl<MessageContent> = inline fun Message.requireChannelContentMessageImpl(): UnconnectedFromChannelGroupContentMessageImpl<MessageContent> =
this as UnconnectedFromChannelGroupContentMessageImpl<MessageContent> this as UnconnectedFromChannelGroupContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPassportMessage(block: (PassportMessage) -> T) = asPassportMessage()?.let(block) inline fun <T> Message.whenPassportMessage(block: (PassportMessage) -> T) = asPassportMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPassportMessage(): PassportMessage? = this as? PassportMessage inline fun Message.asPassportMessage(): PassportMessage? = this as? PassportMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePassportMessage(): PassportMessage = this as PassportMessage inline fun Message.requirePassportMessage(): PassportMessage = this as PassportMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPrivateContentMessageImpl(block: (PrivateContentMessageImpl<MessageContent>) -> T) = inline fun <T> Message.whenPrivateContentMessageImpl(block: (PrivateContentMessageImpl<MessageContent>) -> T) =
asPrivateContentMessageImpl()?.let(block) asPrivateContentMessageImpl()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPrivateContentMessageImpl(): PrivateContentMessageImpl<MessageContent>? = inline fun Message.asPrivateContentMessageImpl(): PrivateContentMessageImpl<MessageContent>? =
this as? PrivateContentMessageImpl<MessageContent> this as? PrivateContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePrivateContentMessageImpl(): PrivateContentMessageImpl<MessageContent> = inline fun Message.requirePrivateContentMessageImpl(): PrivateContentMessageImpl<MessageContent> =
this as PrivateContentMessageImpl<MessageContent> this as PrivateContentMessageImpl<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenChannelEventMessage(block: (ChannelEventMessage<ChannelEvent>) -> T) = inline fun <T> Message.whenChannelEventMessage(block: (ChannelEventMessage<ChannelEvent>) -> T) =
asChannelEventMessage()?.let(block) asChannelEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asChannelEventMessage(): ChannelEventMessage<ChannelEvent>? = inline fun Message.asChannelEventMessage(): ChannelEventMessage<ChannelEvent>? =
this as? ChannelEventMessage<ChannelEvent> this as? ChannelEventMessage<ChannelEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireChannelEventMessage(): ChannelEventMessage<ChannelEvent> = inline fun Message.requireChannelEventMessage(): ChannelEventMessage<ChannelEvent> =
this as ChannelEventMessage<ChannelEvent> this as ChannelEventMessage<ChannelEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenCommonGroupEventMessage(block: (CommonGroupEventMessage<GroupEvent>) -> T) = inline fun <T> Message.whenCommonGroupEventMessage(block: (CommonGroupEventMessage<GroupEvent>) -> T) =
asCommonGroupEventMessage()?.let(block) asCommonGroupEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asCommonGroupEventMessage(): CommonGroupEventMessage<GroupEvent>? = inline fun Message.asCommonGroupEventMessage(): CommonGroupEventMessage<GroupEvent>? =
this as? CommonGroupEventMessage<GroupEvent> this as? CommonGroupEventMessage<GroupEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireCommonGroupEventMessage(): CommonGroupEventMessage<GroupEvent> = inline fun Message.requireCommonGroupEventMessage(): CommonGroupEventMessage<GroupEvent> =
this as CommonGroupEventMessage<GroupEvent> this as CommonGroupEventMessage<GroupEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenCommonSupergroupEventMessage(block: (CommonSupergroupEventMessage<SupergroupEvent>) -> T) = inline fun <T> Message.whenCommonSupergroupEventMessage(block: (CommonSupergroupEventMessage<SupergroupEvent>) -> T) =
asCommonSupergroupEventMessage()?.let(block) asCommonSupergroupEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asCommonSupergroupEventMessage(): CommonSupergroupEventMessage<SupergroupEvent>? = inline fun Message.asCommonSupergroupEventMessage(): CommonSupergroupEventMessage<SupergroupEvent>? =
this as? CommonSupergroupEventMessage<SupergroupEvent> this as? CommonSupergroupEventMessage<SupergroupEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireCommonSupergroupEventMessage(): CommonSupergroupEventMessage<SupergroupEvent> = inline fun Message.requireCommonSupergroupEventMessage(): CommonSupergroupEventMessage<SupergroupEvent> =
this as CommonSupergroupEventMessage<SupergroupEvent> this as CommonSupergroupEventMessage<SupergroupEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenAnonymousGroupContentMessage(block: (AnonymousGroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenAnonymousGroupContentMessage(block: (AnonymousGroupContentMessage<MessageContent>) -> T) =
asAnonymousGroupContentMessage()?.let(block) asAnonymousGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asAnonymousGroupContentMessage(): AnonymousGroupContentMessage<MessageContent>? = inline fun Message.asAnonymousGroupContentMessage(): AnonymousGroupContentMessage<MessageContent>? =
this as? AnonymousGroupContentMessage<MessageContent> this as? AnonymousGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireAnonymousGroupContentMessage(): AnonymousGroupContentMessage<MessageContent> = inline fun Message.requireAnonymousGroupContentMessage(): AnonymousGroupContentMessage<MessageContent> =
this as AnonymousGroupContentMessage<MessageContent> this as AnonymousGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenChannelContentMessage(block: (ChannelContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenChannelContentMessage(block: (ChannelContentMessage<MessageContent>) -> T) =
asChannelContentMessage()?.let(block) asChannelContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asChannelContentMessage(): ChannelContentMessage<MessageContent>? = inline fun Message.asChannelContentMessage(): ChannelContentMessage<MessageContent>? =
this as? ChannelContentMessage<MessageContent> this as? ChannelContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireChannelContentMessage(): ChannelContentMessage<MessageContent> = inline fun Message.requireChannelContentMessage(): ChannelContentMessage<MessageContent> =
this as ChannelContentMessage<MessageContent> this as ChannelContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenConnectedFromChannelGroupContentMessage(block: (ConnectedFromChannelGroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenConnectedFromChannelGroupContentMessage(block: (ConnectedFromChannelGroupContentMessage<MessageContent>) -> T) =
asConnectedFromChannelGroupContentMessage()?.let(block) asConnectedFromChannelGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asConnectedFromChannelGroupContentMessage(): ConnectedFromChannelGroupContentMessage<MessageContent>? = inline fun Message.asConnectedFromChannelGroupContentMessage(): ConnectedFromChannelGroupContentMessage<MessageContent>? =
this as? ConnectedFromChannelGroupContentMessage<MessageContent> this as? ConnectedFromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireConnectedFromChannelGroupContentMessage(): ConnectedFromChannelGroupContentMessage<MessageContent> = inline fun Message.requireConnectedFromChannelGroupContentMessage(): ConnectedFromChannelGroupContentMessage<MessageContent> =
this as ConnectedFromChannelGroupContentMessage<MessageContent> this as ConnectedFromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenUnconnectedFromChannelGroupContentMessage(block: (UnconnectedFromChannelGroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenUnconnectedFromChannelGroupContentMessage(block: (UnconnectedFromChannelGroupContentMessage<MessageContent>) -> T) =
asUnconnectedFromChannelGroupContentMessage()?.let(block) asUnconnectedFromChannelGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asUnconnectedFromChannelGroupContentMessage(): UnconnectedFromChannelGroupContentMessage<MessageContent>? = inline fun Message.asUnconnectedFromChannelGroupContentMessage(): UnconnectedFromChannelGroupContentMessage<MessageContent>? =
this as? UnconnectedFromChannelGroupContentMessage<MessageContent> this as? UnconnectedFromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireUnconnectedFromChannelGroupContentMessage(): UnconnectedFromChannelGroupContentMessage<MessageContent> = inline fun Message.requireUnconnectedFromChannelGroupContentMessage(): UnconnectedFromChannelGroupContentMessage<MessageContent> =
this as UnconnectedFromChannelGroupContentMessage<MessageContent> this as UnconnectedFromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenChatEventMessage(block: (ChatEventMessage<ChatEvent>) -> T) = inline fun <T> Message.whenChatEventMessage(block: (ChatEventMessage<ChatEvent>) -> T) =
asChatEventMessage()?.let(block) asChatEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asChatEventMessage(): ChatEventMessage<ChatEvent>? = this as? ChatEventMessage<ChatEvent> inline fun Message.asChatEventMessage(): ChatEventMessage<ChatEvent>? = this as? ChatEventMessage<ChatEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireChatEventMessage(): ChatEventMessage<ChatEvent> = this as ChatEventMessage<ChatEvent> inline fun Message.requireChatEventMessage(): ChatEventMessage<ChatEvent> = this as ChatEventMessage<ChatEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenCommonGroupContentMessage(block: (CommonGroupContentMessage<MessageContent>) -> T) =
asCommonGroupContentMessage()?.let(block) asCommonGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asCommonGroupContentMessage(): CommonGroupContentMessage<MessageContent>? = inline fun Message.asCommonGroupContentMessage(): CommonGroupContentMessage<MessageContent>? =
this as? CommonGroupContentMessage<MessageContent> this as? CommonGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireCommonGroupContentMessage(): CommonGroupContentMessage<MessageContent> = inline fun Message.requireCommonGroupContentMessage(): CommonGroupContentMessage<MessageContent> =
this as CommonGroupContentMessage<MessageContent> this as CommonGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenCommonMessage(block: (CommonMessage<MessageContent>) -> T) = asCommonMessage()?.let(block) inline fun <T> Message.whenCommonMessage(block: (CommonMessage<MessageContent>) -> T) = asCommonMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asCommonMessage(): CommonMessage<MessageContent>? = this as? CommonMessage<MessageContent> inline fun Message.asCommonMessage(): CommonMessage<MessageContent>? = this as? CommonMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireCommonMessage(): CommonMessage<MessageContent> = this as CommonMessage<MessageContent> inline fun Message.requireCommonMessage(): CommonMessage<MessageContent> = this as CommonMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenContentMessage(block: (ContentMessage<MessageContent>) -> T) = asContentMessage()?.let(block) inline fun <T> Message.whenContentMessage(block: (ContentMessage<MessageContent>) -> T) = asContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asContentMessage(): ContentMessage<MessageContent>? = this as? ContentMessage<MessageContent> inline fun Message.asContentMessage(): ContentMessage<MessageContent>? = this as? ContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireContentMessage(): ContentMessage<MessageContent> = this as ContentMessage<MessageContent> inline fun Message.requireContentMessage(): ContentMessage<MessageContent> = this as ContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenFromChannelGroupContentMessage(block: (FromChannelGroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenFromChannelGroupContentMessage(block: (FromChannelGroupContentMessage<MessageContent>) -> T) =
asFromChannelGroupContentMessage()?.let(block) asFromChannelGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asFromChannelGroupContentMessage(): FromChannelGroupContentMessage<MessageContent>? = inline fun Message.asFromChannelGroupContentMessage(): FromChannelGroupContentMessage<MessageContent>? =
this as? FromChannelGroupContentMessage<MessageContent> this as? FromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireFromChannelGroupContentMessage(): FromChannelGroupContentMessage<MessageContent> = inline fun Message.requireFromChannelGroupContentMessage(): FromChannelGroupContentMessage<MessageContent> =
this as FromChannelGroupContentMessage<MessageContent> this as FromChannelGroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenGroupEventMessage(block: (GroupEventMessage<GroupEvent>) -> T) = inline fun <T> Message.whenGroupEventMessage(block: (GroupEventMessage<GroupEvent>) -> T) =
asGroupEventMessage()?.let(block) asGroupEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asGroupEventMessage(): GroupEventMessage<GroupEvent>? = this as? GroupEventMessage<GroupEvent> inline fun Message.asGroupEventMessage(): GroupEventMessage<GroupEvent>? = this as? GroupEventMessage<GroupEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireGroupEventMessage(): GroupEventMessage<GroupEvent> = this as GroupEventMessage<GroupEvent> inline fun Message.requireGroupEventMessage(): GroupEventMessage<GroupEvent> = this as GroupEventMessage<GroupEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPrivateEventMessage(block: (PrivateEventMessage<PrivateEvent>) -> T) = inline fun <T> Message.whenPrivateEventMessage(block: (PrivateEventMessage<PrivateEvent>) -> T) =
asPrivateEventMessage()?.let(block) asPrivateEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPrivateEventMessage(): PrivateEventMessage<PrivateEvent>? = inline fun Message.asPrivateEventMessage(): PrivateEventMessage<PrivateEvent>? =
this as? PrivateEventMessage<PrivateEvent> this as? PrivateEventMessage<PrivateEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePrivateEventMessage(): PrivateEventMessage<PrivateEvent> = inline fun Message.requirePrivateEventMessage(): PrivateEventMessage<PrivateEvent> =
this as PrivateEventMessage<PrivateEvent> this as PrivateEventMessage<PrivateEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenGroupContentMessage(block: (GroupContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenGroupContentMessage(block: (GroupContentMessage<MessageContent>) -> T) =
asGroupContentMessage()?.let(block) asGroupContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asGroupContentMessage(): GroupContentMessage<MessageContent>? = inline fun Message.asGroupContentMessage(): GroupContentMessage<MessageContent>? =
this as? GroupContentMessage<MessageContent> this as? GroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireGroupContentMessage(): GroupContentMessage<MessageContent> = inline fun Message.requireGroupContentMessage(): GroupContentMessage<MessageContent> =
this as GroupContentMessage<MessageContent> this as GroupContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenMediaGroupMessage(block: (MediaGroupMessage<MediaGroupPartContent>) -> T) = inline fun <T> Message.whenMediaGroupMessage(block: (MediaGroupMessage<MediaGroupPartContent>) -> T) =
asMediaGroupMessage()?.let(block) asMediaGroupMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asMediaGroupMessage(): MediaGroupMessage<MediaGroupPartContent>? = inline fun Message.asMediaGroupMessage(): MediaGroupMessage<MediaGroupPartContent>? =
this as? MediaGroupMessage<MediaGroupPartContent> this as? MediaGroupMessage<MediaGroupPartContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireMediaGroupMessage(): MediaGroupMessage<MediaGroupPartContent> = inline fun Message.requireMediaGroupMessage(): MediaGroupMessage<MediaGroupPartContent> =
this as MediaGroupMessage<MediaGroupPartContent> this as MediaGroupMessage<MediaGroupPartContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPossiblyEditedMessage(block: (PossiblyEditedMessage) -> T) = inline fun <T> Message.whenPossiblyEditedMessage(block: (PossiblyEditedMessage) -> T) =
asPossiblyEditedMessage()?.let(block) asPossiblyEditedMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPossiblyEditedMessage(): PossiblyEditedMessage? = this as? PossiblyEditedMessage inline fun Message.asPossiblyEditedMessage(): PossiblyEditedMessage? = this as? PossiblyEditedMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePossiblyEditedMessage(): PossiblyEditedMessage = this as PossiblyEditedMessage inline fun Message.requirePossiblyEditedMessage(): PossiblyEditedMessage = this as PossiblyEditedMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPossiblyReplyMessage(block: (PossiblyReplyMessage) -> T) = inline fun <T> Message.whenPossiblyReplyMessage(block: (PossiblyReplyMessage) -> T) =
asPossiblyReplyMessage()?.let(block) asPossiblyReplyMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPossiblyReplyMessage(): PossiblyReplyMessage? = this as? PossiblyReplyMessage inline fun Message.asPossiblyReplyMessage(): PossiblyReplyMessage? = this as? PossiblyReplyMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePossiblyReplyMessage(): PossiblyReplyMessage = this as PossiblyReplyMessage inline fun Message.requirePossiblyReplyMessage(): PossiblyReplyMessage = this as PossiblyReplyMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPossiblyForwardedMessage(block: (PossiblyForwardedMessage) -> T) = inline fun <T> Message.whenPossiblyForwardedMessage(block: (PossiblyForwardedMessage) -> T) =
asPossiblyForwardedMessage()?.let(block) asPossiblyForwardedMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPossiblyForwardedMessage(): PossiblyForwardedMessage? = this as? PossiblyForwardedMessage inline fun Message.asPossiblyForwardedMessage(): PossiblyForwardedMessage? = this as? PossiblyForwardedMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePossiblyForwardedMessage(): PossiblyForwardedMessage = this as PossiblyForwardedMessage inline fun Message.requirePossiblyForwardedMessage(): PossiblyForwardedMessage = this as PossiblyForwardedMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPossiblyPaymentMessage(block: (PossiblyPaymentMessage) -> T) = inline fun <T> Message.whenPossiblyPaymentMessage(block: (PossiblyPaymentMessage) -> T) =
asPossiblyPaymentMessage()?.let(block) asPossiblyPaymentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPossiblyPaymentMessage(): PossiblyPaymentMessage? = this as? PossiblyPaymentMessage inline fun Message.asPossiblyPaymentMessage(): PossiblyPaymentMessage? = this as? PossiblyPaymentMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePossiblyPaymentMessage(): PossiblyPaymentMessage = this as PossiblyPaymentMessage inline fun Message.requirePossiblyPaymentMessage(): PossiblyPaymentMessage = this as PossiblyPaymentMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPrivateContentMessage(block: (PrivateContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenPrivateContentMessage(block: (PrivateContentMessage<MessageContent>) -> T) =
asPrivateContentMessage()?.let(block) asPrivateContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPrivateContentMessage(): PrivateContentMessage<MessageContent>? = inline fun Message.asPrivateContentMessage(): PrivateContentMessage<MessageContent>? =
this as? PrivateContentMessage<MessageContent> this as? PrivateContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePrivateContentMessage(): PrivateContentMessage<MessageContent> = inline fun Message.requirePrivateContentMessage(): PrivateContentMessage<MessageContent> =
this as PrivateContentMessage<MessageContent> this as PrivateContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPublicContentMessage(block: (PublicContentMessage<MessageContent>) -> T) = inline fun <T> Message.whenPublicContentMessage(block: (PublicContentMessage<MessageContent>) -> T) =
asPublicContentMessage()?.let(block) asPublicContentMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPublicContentMessage(): PublicContentMessage<MessageContent>? = inline fun Message.asPublicContentMessage(): PublicContentMessage<MessageContent>? =
this as? PublicContentMessage<MessageContent> this as? PublicContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePublicContentMessage(): PublicContentMessage<MessageContent> = inline fun Message.requirePublicContentMessage(): PublicContentMessage<MessageContent> =
this as PublicContentMessage<MessageContent> this as PublicContentMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenSignedMessage(block: (SignedMessage) -> T) = asSignedMessage()?.let(block) inline fun <T> Message.whenSignedMessage(block: (SignedMessage) -> T) = asSignedMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asSignedMessage(): SignedMessage? = this as? SignedMessage inline fun Message.asSignedMessage(): SignedMessage? = this as? SignedMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireSignedMessage(): SignedMessage = this as SignedMessage inline fun Message.requireSignedMessage(): SignedMessage = this as SignedMessage
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenSupergroupEventMessage(block: (SupergroupEventMessage<SupergroupEvent>) -> T) = inline fun <T> Message.whenSupergroupEventMessage(block: (SupergroupEventMessage<SupergroupEvent>) -> T) =
asSupergroupEventMessage()?.let(block) asSupergroupEventMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asSupergroupEventMessage(): SupergroupEventMessage<SupergroupEvent>? = inline fun Message.asSupergroupEventMessage(): SupergroupEventMessage<SupergroupEvent>? =
this as? SupergroupEventMessage<SupergroupEvent> this as? SupergroupEventMessage<SupergroupEvent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireSupergroupEventMessage(): SupergroupEventMessage<SupergroupEvent> = inline fun Message.requireSupergroupEventMessage(): SupergroupEventMessage<SupergroupEvent> =
this as SupergroupEventMessage<SupergroupEvent> this as SupergroupEventMessage<SupergroupEvent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenUnknownMessageType(block: (UnknownMessageType) -> T) = asUnknownMessageType()?.let(block) inline fun <T> Message.whenUnknownMessageType(block: (UnknownMessageType) -> T) = asUnknownMessageType()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asUnknownMessageType(): UnknownMessageType? = this as? UnknownMessageType inline fun Message.asUnknownMessageType(): UnknownMessageType? = this as? UnknownMessageType
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireUnknownMessageType(): UnknownMessageType = this as UnknownMessageType inline fun Message.requireUnknownMessageType(): UnknownMessageType = this as UnknownMessageType
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenPossiblySentViaBotCommonMessage(block: (PossiblySentViaBotCommonMessage<MessageContent>) -> T) = inline fun <T> Message.whenPossiblySentViaBotCommonMessage(block: (PossiblySentViaBotCommonMessage<MessageContent>) -> T) =
asPossiblySentViaBotCommonMessage()?.let(block) asPossiblySentViaBotCommonMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asPossiblySentViaBotCommonMessage(): PossiblySentViaBotCommonMessage<MessageContent>? = inline fun Message.asPossiblySentViaBotCommonMessage(): PossiblySentViaBotCommonMessage<MessageContent>? =
this as? PossiblySentViaBotCommonMessage<MessageContent> this as? PossiblySentViaBotCommonMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requirePossiblySentViaBotCommonMessage(): PossiblySentViaBotCommonMessage<MessageContent> = inline fun Message.requirePossiblySentViaBotCommonMessage(): PossiblySentViaBotCommonMessage<MessageContent> =
this as PossiblySentViaBotCommonMessage<MessageContent> this as PossiblySentViaBotCommonMessage<MessageContent>
@PreviewFeature @PreviewFeature
inline fun <T> AccessibleMessage.whenFromUserMessage(block: (FromUserMessage) -> T) = asFromUserMessage()?.let(block) inline fun <T> Message.whenFromUserMessage(block: (FromUserMessage) -> T) = asFromUserMessage()?.let(block)
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.asFromUserMessage(): FromUserMessage? = this as? FromUserMessage inline fun Message.asFromUserMessage(): FromUserMessage? = this as? FromUserMessage
@PreviewFeature @PreviewFeature
inline fun AccessibleMessage.requireFromUserMessage(): FromUserMessage = this as FromUserMessage inline fun Message.requireFromUserMessage(): FromUserMessage = this as FromUserMessage
@PreviewFeature @PreviewFeature
inline fun <T> BotAction.whenFindLocationAction(block: (FindLocationAction) -> T) = asFindLocationAction()?.let(block) inline fun <T> BotAction.whenFindLocationAction(block: (FindLocationAction) -> T) = asFindLocationAction()?.let(block)

View File

@@ -298,6 +298,7 @@ import dev.inmo.tgbotapi.types.message.content.DiceContent
import dev.inmo.tgbotapi.types.message.content.DocumentContent import dev.inmo.tgbotapi.types.message.content.DocumentContent
import dev.inmo.tgbotapi.types.message.content.DocumentMediaGroupPartContent import dev.inmo.tgbotapi.types.message.content.DocumentMediaGroupPartContent
import dev.inmo.tgbotapi.types.message.content.GameContent import dev.inmo.tgbotapi.types.message.content.GameContent
import dev.inmo.tgbotapi.types.message.content.GiveawayContent
import dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent import dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent
import dev.inmo.tgbotapi.types.message.content.InvoiceContent import dev.inmo.tgbotapi.types.message.content.InvoiceContent
import dev.inmo.tgbotapi.types.message.content.LiveLocationContent import dev.inmo.tgbotapi.types.message.content.LiveLocationContent
@@ -311,7 +312,6 @@ import dev.inmo.tgbotapi.types.message.content.MessageContent
import dev.inmo.tgbotapi.types.message.content.PhotoContent import dev.inmo.tgbotapi.types.message.content.PhotoContent
import dev.inmo.tgbotapi.types.message.content.PollContent import dev.inmo.tgbotapi.types.message.content.PollContent
import dev.inmo.tgbotapi.types.message.content.ResendableContent import dev.inmo.tgbotapi.types.message.content.ResendableContent
import dev.inmo.tgbotapi.types.message.content.ScheduledGiveawayContent
import dev.inmo.tgbotapi.types.message.content.SpoilerableMediaContent import dev.inmo.tgbotapi.types.message.content.SpoilerableMediaContent
import dev.inmo.tgbotapi.types.message.content.StaticLocationContent import dev.inmo.tgbotapi.types.message.content.StaticLocationContent
import dev.inmo.tgbotapi.types.message.content.StickerContent import dev.inmo.tgbotapi.types.message.content.StickerContent
@@ -3795,6 +3795,15 @@ public inline fun ResendableContent.gameContentOrThrow(): GameContent = this as
public inline fun <T> ResendableContent.ifGameContent(block: (GameContent) -> T): T? = public inline fun <T> ResendableContent.ifGameContent(block: (GameContent) -> T): T? =
gameContentOrNull() ?.let(block) gameContentOrNull() ?.let(block)
public inline fun ResendableContent.giveawayContentOrNull(): GiveawayContent? = this as?
dev.inmo.tgbotapi.types.message.content.GiveawayContent
public inline fun ResendableContent.giveawayContentOrThrow(): GiveawayContent = this as
dev.inmo.tgbotapi.types.message.content.GiveawayContent
public inline fun <T> ResendableContent.ifGiveawayContent(block: (GiveawayContent) -> T): T? =
giveawayContentOrNull() ?.let(block)
public inline fun ResendableContent.giveawayPublicResultsContentOrNull(): public inline fun ResendableContent.giveawayPublicResultsContentOrNull():
GiveawayPublicResultsContent? = this as? GiveawayPublicResultsContent? = this as?
dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent
@@ -3874,16 +3883,6 @@ public inline fun ResendableContent.pollContentOrThrow(): PollContent = this as
public inline fun <T> ResendableContent.ifPollContent(block: (PollContent) -> T): T? = public inline fun <T> ResendableContent.ifPollContent(block: (PollContent) -> T): T? =
pollContentOrNull() ?.let(block) pollContentOrNull() ?.let(block)
public inline fun ResendableContent.scheduledGiveawayContentOrNull(): ScheduledGiveawayContent? =
this as? dev.inmo.tgbotapi.types.message.content.ScheduledGiveawayContent
public inline fun ResendableContent.scheduledGiveawayContentOrThrow(): ScheduledGiveawayContent =
this as dev.inmo.tgbotapi.types.message.content.ScheduledGiveawayContent
public inline fun <T>
ResendableContent.ifScheduledGiveawayContent(block: (ScheduledGiveawayContent) -> T): T? =
scheduledGiveawayContentOrNull() ?.let(block)
public inline fun ResendableContent.stickerContentOrNull(): StickerContent? = this as? public inline fun ResendableContent.stickerContentOrNull(): StickerContent? = this as?
dev.inmo.tgbotapi.types.message.content.StickerContent dev.inmo.tgbotapi.types.message.content.StickerContent

View File

@@ -8,7 +8,7 @@ import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.MessageThreadId import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.Username import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.chat.Chat import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.threadId import dev.inmo.tgbotapi.types.threadId
import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
@@ -32,43 +32,43 @@ inline fun WithPreviewChat.sameChat(chat: Chat) =
* @return true in case if [this] message is placed in the same chat that [other] * @return true in case if [this] message is placed in the same chat that [other]
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun WithPreviewChat.sameChat(other: AccessibleMessage) = sameChat(other.chat) inline fun WithPreviewChat.sameChat(other: Message) = sameChat(other.chat)
/** /**
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [AccessibleMessage.messageId] * @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId]
* equal [messageId] identifier * equal [messageId] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameMessage( inline fun Message.sameMessage(
chatId: ChatIdentifier, chatId: ChatIdentifier,
messageId: MessageId messageId: MessageId
) = sameChat(chatId) && this.messageId == messageId ) = sameChat(chatId) && this.messageId == messageId
/** /**
* @return true in case if [this] message is from the same [chat] and [this] [AccessibleMessage.messageId] equal [messageId] * @return true in case if [this] message is from the same [chat] and [this] [Message.messageId] equal [messageId]
* identifier * identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameMessage( inline fun Message.sameMessage(
chat: Chat, chat: Chat,
messageId: MessageId messageId: MessageId
) = sameChat(chat) && this.messageId == messageId ) = sameChat(chat) && this.messageId == messageId
/** /**
* @return true in case if [this] message is the same as [other]. The same here means that these messages from one chat * @return true in case if [this] message is the same as [other]. The same here means that these messages from one chat
* and have equal [AccessibleMessage.messageId] identifier * and have equal [Message.messageId] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameMessage(other: AccessibleMessage) = sameMessage(other.chat, other.messageId) inline fun Message.sameMessage(other: Message) = sameMessage(other.chat, other.messageId)
/** /**
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is in the chat [chatId] and topic [threadId]. The same here means that these * @return true in case if [this] message is in the chat [chatId] and topic [threadId]. The same here means that these
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * messages from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameTopic( inline fun Message.sameTopic(
chatId: ChatIdentifier, chatId: ChatIdentifier,
threadId: MessageThreadId? = chatId.threadId threadId: MessageThreadId? = chatId.threadId
) = sameChat(chatId) && threadIdOrNull == threadId ) = sameChat(chatId) && threadIdOrNull == threadId
@@ -77,10 +77,10 @@ inline fun AccessibleMessage.sameTopic(
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is in the chat [chatId] and topic [threadId]. The same here means that these * @return true in case if [this] message is in the chat [chatId] and topic [threadId]. The same here means that these
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * messages from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameThread( inline fun Message.sameThread(
chatId: ChatIdentifier, chatId: ChatIdentifier,
threadId: MessageThreadId? = chatId.threadId threadId: MessageThreadId? = chatId.threadId
) = sameTopic(chatId, threadId) ) = sameTopic(chatId, threadId)
@@ -89,10 +89,10 @@ inline fun AccessibleMessage.sameThread(
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is from the [chat] and topic [threadId]. The same here means that these * @return true in case if [this] message is from the [chat] and topic [threadId]. The same here means that these
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * messages from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameTopic( inline fun Message.sameTopic(
chat: Chat, chat: Chat,
threadId: MessageThreadId? = chat.id.threadId threadId: MessageThreadId? = chat.id.threadId
) = sameTopic(chat.id, threadId) ) = sameTopic(chat.id, threadId)
@@ -101,10 +101,10 @@ inline fun AccessibleMessage.sameTopic(
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is from the [chat] and topic [threadId]. The same here means that these * @return true in case if [this] message is from the [chat] and topic [threadId]. The same here means that these
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * messages from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameThread( inline fun Message.sameThread(
chat: Chat, chat: Chat,
threadId: MessageThreadId? = chat.id.threadId threadId: MessageThreadId? = chat.id.threadId
) = sameThread(chat.id, threadId) ) = sameThread(chat.id, threadId)
@@ -113,16 +113,16 @@ inline fun AccessibleMessage.sameThread(
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is from the same chat and topic as [other]. The same here means that these * @return true in case if [this] message is from the same chat and topic as [other]. The same here means that these
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * messages from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameTopic(other: AccessibleMessage) = sameTopic(other.chat, other.threadIdOrNull) inline fun Message.sameTopic(other: Message) = sameTopic(other.chat, other.threadIdOrNull)
/** /**
* Thread is the same thing that topic * Thread is the same thing that topic
* *
* @return true in case if [this] message is in the same topic as the [other]. The same here means that these messages * @return true in case if [this] message is in the same topic as the [other]. The same here means that these messages
* from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier * from one chat and have equal [Message.threadIdOrNull] identifier
*/ */
@Suppress("NOTHING_TO_INLINE") @Suppress("NOTHING_TO_INLINE")
inline fun AccessibleMessage.sameThread(other: AccessibleMessage) = sameTopic(other) inline fun Message.sameThread(other: Message) = sameTopic(other)

View File

@@ -11,7 +11,6 @@ import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.*
import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.ChatEvents.voice.*
import dev.inmo.tgbotapi.types.message.abstracts.ConnectedFromChannelGroupContentMessage import dev.inmo.tgbotapi.types.message.abstracts.ConnectedFromChannelGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
@@ -23,58 +22,58 @@ import dev.inmo.tgbotapi.types.venue.Venue
import dev.inmo.tgbotapi.utils.RiskFeature import dev.inmo.tgbotapi.utils.RiskFeature
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.from: User? inline val Message.from: User?
get() = asFromUser() ?.from get() = asFromUser() ?.from
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.sender_chat: PublicChat? inline val Message.sender_chat: PublicChat?
get() = asFromChannelGroupContentMessage() ?.senderChat get() = asFromChannelGroupContentMessage() ?.senderChat
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_from: User? inline val Message.forward_from: User?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asUserForwardInfo() ?.from get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asUserForwardInfo() ?.from
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_from_chat: Chat? inline val Message.forward_from_chat: Chat?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asForwardFromPublicChatInfo() ?.chat get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asForwardFromPublicChatInfo() ?.chat
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_from_message_id: MessageId? inline val Message.forward_from_message_id: MessageId?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.fromChannelOrNull() ?.messageId get() = asPossiblyForwardedMessage() ?.forwardInfo ?.fromChannelOrNull() ?.messageId
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_signature: ForwardSignature? inline val Message.forward_signature: ForwardSignature?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.fromChannelOrNull() ?.signature get() = asPossiblyForwardedMessage() ?.forwardInfo ?.fromChannelOrNull() ?.signature
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_sender_name: ForwardSenderName? inline val Message.forward_sender_name: ForwardSenderName?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asAnonymousForwardInfo() ?.senderName get() = asPossiblyForwardedMessage() ?.forwardInfo ?.asAnonymousForwardInfo() ?.senderName
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.forward_date: TelegramDate? inline val Message.forward_date: TelegramDate?
get() = asPossiblyForwardedMessage() ?.forwardInfo ?.dateOfOriginal get() = asPossiblyForwardedMessage() ?.forwardInfo ?.dateOfOriginal
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.is_automatic_forward: Boolean? inline val Message.is_automatic_forward: Boolean?
get() = this is ConnectedFromChannelGroupContentMessage<*> get() = this is ConnectedFromChannelGroupContentMessage<*>
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.reply_to_message: AccessibleMessage? inline val Message.reply_to_message: Message?
get() = asPossiblyReplyMessage() ?.replyTo get() = asPossiblyReplyMessage() ?.replyTo
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.via_bot: CommonBot? inline val Message.via_bot: CommonBot?
get() = asPossiblySentViaBotCommonMessage() ?.senderBot get() = asPossiblySentViaBotCommonMessage() ?.senderBot
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.edit_date: TelegramDate? inline val Message.edit_date: TelegramDate?
get() = asPossiblyEditedMessage() ?.editDate ?.toTelegramDate() get() = asPossiblyEditedMessage() ?.editDate ?.toTelegramDate()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.has_protected_content: Boolean? inline val Message.has_protected_content: Boolean?
get() = asContentMessage() ?.hasProtectedContent get() = asContentMessage() ?.hasProtectedContent
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.media_group_id: MediaGroupIdentifier? inline val Message.media_group_id: MediaGroupIdentifier?
get() = asMediaGroupMessage() ?.mediaGroupId get() = asMediaGroupMessage() ?.mediaGroupId
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.author_signature: AuthorSignature? inline val Message.author_signature: AuthorSignature?
get() = asSignedMessage() ?.authorSignature get() = asSignedMessage() ?.authorSignature
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.text: String? inline val Message.text: String?
get() = asContentMessage() ?.content ?.asTextContent() ?.text get() = asContentMessage() ?.content ?.asTextContent() ?.text
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.entities: TextSourcesList? inline val Message.entities: TextSourcesList?
get() = asContentMessage() ?.content ?.asTextContent() ?.textSources get() = asContentMessage() ?.content ?.asTextContent() ?.textSources
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.caption: String? inline val Message.caption: String?
get() = whenContentMessage { get() = whenContentMessage {
if (it.content !is TextContent) { if (it.content !is TextContent) {
it.content.asTextedInput() ?.text it.content.asTextedInput() ?.text
@@ -83,7 +82,7 @@ inline val AccessibleMessage.caption: String?
} }
} }
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.caption_entities: TextSourcesList? inline val Message.caption_entities: TextSourcesList?
get() = whenContentMessage { get() = whenContentMessage {
if (it.content !is TextContent) { if (it.content !is TextContent) {
it.content.asTextedInput() ?.textSources it.content.asTextedInput() ?.textSources
@@ -92,117 +91,117 @@ inline val AccessibleMessage.caption_entities: TextSourcesList?
} }
} }
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.audio: AudioFile? inline val Message.audio: AudioFile?
get() = asContentMessage() ?.content ?.asAudioContent() ?.media get() = asContentMessage() ?.content ?.asAudioContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.document: DocumentFile? inline val Message.document: DocumentFile?
get() = asContentMessage() ?.content ?.asDocumentContent() ?.media get() = asContentMessage() ?.content ?.asDocumentContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.animation: AnimationFile? inline val Message.animation: AnimationFile?
get() = asContentMessage() ?.content ?.asAnimationContent() ?.media get() = asContentMessage() ?.content ?.asAnimationContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.game: Game? inline val Message.game: Game?
get() = asContentMessage() ?.content ?.asGameContent() ?.game get() = asContentMessage() ?.content ?.asGameContent() ?.game
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.photo: Photo? inline val Message.photo: Photo?
get() = asContentMessage() ?.content ?.asPhotoContent() ?.mediaCollection get() = asContentMessage() ?.content ?.asPhotoContent() ?.mediaCollection
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.sticker: Sticker? inline val Message.sticker: Sticker?
get() = asContentMessage() ?.content ?.asStickerContent() ?.media get() = asContentMessage() ?.content ?.asStickerContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video: VideoFile? inline val Message.video: VideoFile?
get() = asContentMessage() ?.content ?.asVideoContent() ?.media get() = asContentMessage() ?.content ?.asVideoContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.voice: VoiceFile? inline val Message.voice: VoiceFile?
get() = asContentMessage() ?.content ?.asVoiceContent() ?.media get() = asContentMessage() ?.content ?.asVoiceContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video_note: VideoNoteFile? inline val Message.video_note: VideoNoteFile?
get() = asContentMessage() ?.content ?.asVideoNoteContent() ?.media get() = asContentMessage() ?.content ?.asVideoNoteContent() ?.media
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.contact: Contact? inline val Message.contact: Contact?
get() = asContentMessage() ?.content ?.asContactContent() ?.contact get() = asContentMessage() ?.content ?.asContactContent() ?.contact
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.location: Location? inline val Message.location: Location?
get() = asContentMessage() ?.content ?.asLocationContent() ?.location get() = asContentMessage() ?.content ?.asLocationContent() ?.location
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.venue: Venue? inline val Message.venue: Venue?
get() = asContentMessage() ?.content ?.asVenueContent() ?.venue get() = asContentMessage() ?.content ?.asVenueContent() ?.venue
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.poll: Poll? inline val Message.poll: Poll?
get() = asContentMessage() ?.content ?.asPollContent() ?.poll get() = asContentMessage() ?.content ?.asPollContent() ?.poll
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.invoice: Invoice? inline val Message.invoice: Invoice?
get() = asContentMessage() ?.content ?.asInvoiceContent() ?.invoice get() = asContentMessage() ?.content ?.asInvoiceContent() ?.invoice
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.dice: Dice? inline val Message.dice: Dice?
get() = asContentMessage() ?.content ?.asDiceContent() ?.dice get() = asContentMessage() ?.content ?.asDiceContent() ?.dice
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.new_chat_members: List<User>? inline val Message.new_chat_members: List<User>?
get() = asChatEventMessage() ?.chatEvent ?.asNewChatMembers() ?.members get() = asChatEventMessage() ?.chatEvent ?.asNewChatMembers() ?.members
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.left_chat_member: User? inline val Message.left_chat_member: User?
get() = asChatEventMessage() ?.chatEvent ?.asLeftChatMember() ?.user get() = asChatEventMessage() ?.chatEvent ?.asLeftChatMember() ?.user
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.new_chat_title: String? inline val Message.new_chat_title: String?
get() = asChatEventMessage() ?.chatEvent ?.asNewChatTitle() ?.title get() = asChatEventMessage() ?.chatEvent ?.asNewChatTitle() ?.title
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.new_chat_photo: Photo? inline val Message.new_chat_photo: Photo?
get() = asChatEventMessage() ?.chatEvent ?.asNewChatPhoto() ?.photo get() = asChatEventMessage() ?.chatEvent ?.asNewChatPhoto() ?.photo
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.delete_chat_photo: Boolean inline val Message.delete_chat_photo: Boolean
get() = asChatEventMessage() ?.chatEvent is DeleteChatPhoto get() = asChatEventMessage() ?.chatEvent is DeleteChatPhoto
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.group_chat_created: Boolean inline val Message.group_chat_created: Boolean
get() = asChatEventMessage() ?.chatEvent is GroupChatCreated get() = asChatEventMessage() ?.chatEvent is GroupChatCreated
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.supergroup_chat_created: Boolean inline val Message.supergroup_chat_created: Boolean
get() = asChatEventMessage() ?.chatEvent is SupergroupChatCreated get() = asChatEventMessage() ?.chatEvent is SupergroupChatCreated
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.channel_chat_created: Boolean inline val Message.channel_chat_created: Boolean
get() = asChatEventMessage() ?.chatEvent is ChannelChatCreated get() = asChatEventMessage() ?.chatEvent is ChannelChatCreated
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.migrate_to_chat_id: IdChatIdentifier? inline val Message.migrate_to_chat_id: IdChatIdentifier?
get() = asChatEventMessage() ?.chatEvent ?.asGroupChatCreated() ?.migratedTo get() = asChatEventMessage() ?.chatEvent ?.asGroupChatCreated() ?.migratedTo
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.migrate_from_chat_id: IdChatIdentifier? inline val Message.migrate_from_chat_id: IdChatIdentifier?
get() = asChatEventMessage() ?.chatEvent ?.let { get() = asChatEventMessage() ?.chatEvent ?.let {
it ?.asSupergroupChatCreated() ?.migratedFrom ?: it ?.asMigratedToSupergroup() ?.migratedFrom it ?.asSupergroupChatCreated() ?.migratedFrom ?: it ?.asMigratedToSupergroup() ?.migratedFrom
} }
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.pinned_message: Message? inline val Message.pinned_message: Message?
get() = asChatEventMessage() ?.chatEvent ?.asPinnedMessage() ?.message get() = asChatEventMessage() ?.chatEvent ?.asPinnedMessage() ?.message
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.successful_payment: SuccessfulPayment? inline val Message.successful_payment: SuccessfulPayment?
get() = asChatEventMessage() ?.chatEvent ?.asSuccessfulPaymentEvent() ?.payment get() = asChatEventMessage() ?.chatEvent ?.asSuccessfulPaymentEvent() ?.payment
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video_chat_scheduled: VideoChatScheduled? inline val Message.video_chat_scheduled: VideoChatScheduled?
get() = asChatEventMessage() ?.chatEvent ?.asVideoChatScheduled() get() = asChatEventMessage() ?.chatEvent ?.asVideoChatScheduled()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video_chat_started: VideoChatStarted? inline val Message.video_chat_started: VideoChatStarted?
get() = asChatEventMessage() ?.chatEvent ?.asVideoChatStarted() get() = asChatEventMessage() ?.chatEvent ?.asVideoChatStarted()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video_chat_ended: VideoChatEnded? inline val Message.video_chat_ended: VideoChatEnded?
get() = asChatEventMessage() ?.chatEvent ?.asVideoChatEnded() get() = asChatEventMessage() ?.chatEvent ?.asVideoChatEnded()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.video_chat_participants_invited: VideoChatParticipantsInvited? inline val Message.video_chat_participants_invited: VideoChatParticipantsInvited?
get() = asChatEventMessage() ?.chatEvent ?.asVideoChatParticipantsInvited() get() = asChatEventMessage() ?.chatEvent ?.asVideoChatParticipantsInvited()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.message_auto_delete_timer_changed: MessageAutoDeleteTimerChanged? inline val Message.message_auto_delete_timer_changed: MessageAutoDeleteTimerChanged?
get() = asChatEventMessage() ?.chatEvent ?.asMessageAutoDeleteTimerChanged() get() = asChatEventMessage() ?.chatEvent ?.asMessageAutoDeleteTimerChanged()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.connected_website: String? inline val Message.connected_website: String?
get() = asChatEventMessage() ?.chatEvent ?.asUserLoggedIn() ?.domain get() = asChatEventMessage() ?.chatEvent ?.asUserLoggedIn() ?.domain
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.proximity_alert_triggered: ProximityAlertTriggered? inline val Message.proximity_alert_triggered: ProximityAlertTriggered?
get() = asChatEventMessage() ?.chatEvent ?.asProximityAlertTriggered() get() = asChatEventMessage() ?.chatEvent ?.asProximityAlertTriggered()
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.passport_data: PassportData? inline val Message.passport_data: PassportData?
get() = asPassportMessage() ?.passportData get() = asPassportMessage() ?.passportData
@RiskFeature(RawFieldsUsageWarning) @RiskFeature(RawFieldsUsageWarning)
inline val AccessibleMessage.reply_markup: InlineKeyboardMarkup? inline val Message.reply_markup: InlineKeyboardMarkup?
get() = asCommonMessage() ?.replyMarkup get() = asCommonMessage() ?.replyMarkup

View File

@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.extensions.utils.formatting
import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.* import dev.inmo.tgbotapi.types.chat.*
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.textsources.link import dev.inmo.tgbotapi.types.message.textsources.link
import io.ktor.http.encodeURLQueryComponent import io.ktor.http.encodeURLQueryComponent
@@ -69,7 +69,7 @@ fun makeLinkToMessage(
): String = makeLinkToMessage(chatId.chatId, messageId, chatId.threadId) ): String = makeLinkToMessage(chatId.chatId, messageId, chatId.threadId)
/** /**
* Link which can be used as by any user to get access to [AccessibleMessage]. Returns null in case when there are no * Link which can be used as by any user to get access to [Message]. Returns null in case when there are no
* known way to build link (for [PrivateChat]s, for example) * known way to build link (for [PrivateChat]s, for example)
*/ */
fun makeLinkToMessage( fun makeLinkToMessage(
@@ -88,7 +88,7 @@ fun makeLinkToMessage(
/** /**
* @see makeLinkToMessage * @see makeLinkToMessage
*/ */
val AccessibleMessage.messageLink: String? val Message.messageLink: String?
get() = makeLinkToMessage( get() = makeLinkToMessage(
chat, chat,
messageId messageId

View File

@@ -3,7 +3,9 @@ package dev.inmo.tgbotapi.extensions.utils.types.buttons
import dev.inmo.tgbotapi.types.buttons.* import dev.inmo.tgbotapi.types.buttons.*
import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton import dev.inmo.tgbotapi.types.buttons.reply.requestChatReplyButton
import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton import dev.inmo.tgbotapi.types.buttons.reply.requestUserReplyButton
import dev.inmo.tgbotapi.types.buttons.reply.requestUsersReplyButton
import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights
import dev.inmo.tgbotapi.types.keyboardButtonRequestUserLimit
import dev.inmo.tgbotapi.types.request.RequestId import dev.inmo.tgbotapi.types.request.RequestId
import dev.inmo.tgbotapi.types.webapps.WebAppInfo import dev.inmo.tgbotapi.types.webapps.WebAppInfo
import dev.inmo.tgbotapi.utils.* import dev.inmo.tgbotapi.utils.*
@@ -137,16 +139,43 @@ inline fun ReplyKeyboardRowBuilder.webAppButton(
* @see replyKeyboard * @see replyKeyboard
* @see ReplyKeyboardBuilder.row * @see ReplyKeyboardBuilder.row
*/ */
inline fun ReplyKeyboardRowBuilder.requestUserButton( inline fun ReplyKeyboardRowBuilder.requestUsersButton(
text: String, text: String,
requestUser: KeyboardButtonRequestUsers requestUser: KeyboardButtonRequestUsers
) = add( ) = add(
requestUserReplyButton( requestUsersReplyButton(
text, text,
requestUser requestUser
) )
) )
/**
* Creates and put [RequestUserKeyboardButton]
*
* @see replyKeyboard
* @see ReplyKeyboardBuilder.row
*/
@Deprecated("Renamed", ReplaceWith("requestUsersButton(text, requestUser)", "dev.inmo.tgbotapi.extensions.utils.types.buttons"))
inline fun ReplyKeyboardRowBuilder.requestUserButton(
text: String,
requestUser: KeyboardButtonRequestUsers
) = requestUsersButton(text, requestUser)
/**
* Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot]
*
* @see replyKeyboard
* @see ReplyKeyboardBuilder.row
*/
inline fun ReplyKeyboardRowBuilder.requestBotsButton(
text: String,
requestId: RequestId,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersButton(
text,
KeyboardButtonRequestUsers.Bot(requestId, maxCount)
)
/** /**
* Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot] * Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Bot]
* *
@@ -156,9 +185,26 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton(
inline fun ReplyKeyboardRowBuilder.requestBotButton( inline fun ReplyKeyboardRowBuilder.requestBotButton(
text: String, text: String,
requestId: RequestId requestId: RequestId
) = requestUserButton( ) = requestBotsButton(
text, text,
KeyboardButtonRequestUsers.Bot(requestId) requestId,
maxCount = keyboardButtonRequestUserLimit.first
)
/**
* Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Common]
*
* @see replyKeyboard
* @see ReplyKeyboardBuilder.row
*/
inline fun ReplyKeyboardRowBuilder.requestUsersButton(
text: String,
requestId: RequestId,
premiumUser: Boolean? = null,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersButton(
text,
KeyboardButtonRequestUsers.Common(requestId, premiumUser, maxCount)
) )
/** /**
@@ -171,9 +217,22 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton(
text: String, text: String,
requestId: RequestId, requestId: RequestId,
premiumUser: Boolean? = null premiumUser: Boolean? = null
) = requestUserButton( ) = requestUsersButton(text, requestId, premiumUser, maxCount = keyboardButtonRequestUserLimit.first)
/**
* Creates and put [RequestUserKeyboardButton] with [KeyboardButtonRequestUsers.Any]
*
* @see replyKeyboard
* @see ReplyKeyboardBuilder.row
*/
inline fun ReplyKeyboardRowBuilder.requestUsersOrBotsButton(
text: String,
requestId: RequestId,
premiumUser: Boolean? = null,
maxCount: Int = keyboardButtonRequestUserLimit.first
) = requestUsersButton(
text, text,
KeyboardButtonRequestUsers.Common(requestId, premiumUser) KeyboardButtonRequestUsers.Any(requestId, premiumUser, maxCount)
) )
/** /**
@@ -185,9 +244,10 @@ inline fun ReplyKeyboardRowBuilder.requestUserButton(
inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton( inline fun ReplyKeyboardRowBuilder.requestUserOrBotButton(
text: String, text: String,
requestId: RequestId requestId: RequestId
) = requestUserButton( ) = requestUsersOrBotsButton(
text, text,
KeyboardButtonRequestUsers.Any(requestId) requestId,
maxCount = keyboardButtonRequestUserLimit.first
) )

View File

@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.extensions.utils.updates
import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
@@ -58,10 +58,10 @@ fun CommonMessage<*>.hasNoCommands(): Boolean = !this.hasCommands()
* } * }
* ``` * ```
* *
* @return true if this [AccessibleMessage] is from forum ([threadIdOrNull] is not null). False otherwise. * @return true if this [Message] is from forum ([threadIdOrNull] is not null). False otherwise.
* @see notForumMessage * @see notForumMessage
*/ */
fun AccessibleMessage.forumMessage(): Boolean = threadIdOrNull != null fun Message.forumMessage(): Boolean = threadIdOrNull != null
/** /**
* A predicate to test that message has not been sent in the forum. * A predicate to test that message has not been sent in the forum.
@@ -76,7 +76,7 @@ fun AccessibleMessage.forumMessage(): Boolean = threadIdOrNull != null
* } * }
* ``` * ```
* *
* @return true if this [AccessibleMessage] is not from forum ([threadIdOrNull] is not null). False otherwise. * @return true if this [Message] is not from forum ([threadIdOrNull] is not null). False otherwise.
* @see forumMessage * @see forumMessage
*/ */
fun AccessibleMessage.notForumMessage(): Boolean = !forumMessage() fun Message.notForumMessage(): Boolean = !forumMessage()