1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-06-10 09:37:20 +00:00

implement guest mode and make HUGE CHANGES IN MESSAGES HIERARCHY

This commit is contained in:
2026-05-17 23:20:10 +06:00
parent d47641c39a
commit 236939eab8
148 changed files with 1888 additions and 1335 deletions

View File

@@ -1130,13 +1130,13 @@ inline fun Message.requireCommonGroupContentMessage(): CommonGroupContentMessage
this as CommonGroupContentMessage<MessageContent>
@PreviewFeature
inline fun <T> Message.whenCommonMessage(block: (CommonMessage<MessageContent>) -> T) = asCommonMessage()?.let(block)
inline fun <T> Message.whenCommonMessage(block: (ChatContentMessage<MessageContent>) -> T) = asCommonMessage()?.let(block)
@PreviewFeature
inline fun Message.asCommonMessage(): CommonMessage<MessageContent>? = this as? CommonMessage<MessageContent>
inline fun Message.asCommonMessage(): ChatContentMessage<MessageContent>? = this as? ChatContentMessage<MessageContent>
@PreviewFeature
inline fun Message.requireCommonMessage(): CommonMessage<MessageContent> = this as CommonMessage<MessageContent>
inline fun Message.requireCommonMessage(): ChatContentMessage<MessageContent> = this as ChatContentMessage<MessageContent>
@PreviewFeature
inline fun <T> Message.whenContentMessage(block: (ContentMessage<MessageContent>) -> T) = asContentMessage()?.let(block)

View File

@@ -330,11 +330,13 @@ import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelDirectMessagesContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelDirectMessagesEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelPaidPost
import dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChatMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonChannelDirectMessagesContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.CommonSuggestedChannelDirectMessagesContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ConnectedFromChannelGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
@@ -346,6 +348,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.FromChannelSuggestedChannelDire
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.GroupEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.GuestContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.OptionallyFromUserMessage
@@ -363,6 +366,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.PrivateForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.PublicContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.SignedMessage
import dev.inmo.tgbotapi.types.message.abstracts.SpecialMessage
import dev.inmo.tgbotapi.types.message.abstracts.SuggestedChannelDirectMessagesContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.SupergroupEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.UnconnectedFromChannelGroupContentMessage
@@ -541,6 +545,7 @@ import dev.inmo.tgbotapi.types.update.DeletedBusinessMessageUpdate
import dev.inmo.tgbotapi.types.update.EditBusinessMessageUpdate
import dev.inmo.tgbotapi.types.update.EditChannelPostUpdate
import dev.inmo.tgbotapi.types.update.EditMessageUpdate
import dev.inmo.tgbotapi.types.update.GuestMessageUpdate
import dev.inmo.tgbotapi.types.update.InlineQueryUpdate
import dev.inmo.tgbotapi.types.update.ManagedBotUpdate
import dev.inmo.tgbotapi.types.update.MessageUpdate
@@ -841,6 +846,12 @@ public inline fun OptionallyWithUser.channelContentMessageOrThrow(): ChannelCont
public inline fun <T> OptionallyWithUser.ifChannelContentMessage(block: (ChannelContentMessage<MessageContent>) -> T): T? = channelContentMessageOrNull() ?.let(block)
public inline fun OptionallyWithUser.guestContentMessageOrNull(): GuestContentMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.GuestContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun OptionallyWithUser.guestContentMessageOrThrow(): GuestContentMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.GuestContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T> OptionallyWithUser.ifGuestContentMessage(block: (GuestContentMessage<MessageContent>) -> T): T? = guestContentMessageOrNull() ?.let(block)
public inline fun OptionallyWithUser.optionallyFromUserMessageOrNull(): OptionallyFromUserMessage? = this as? dev.inmo.tgbotapi.types.message.abstracts.OptionallyFromUserMessage
public inline fun OptionallyWithUser.optionallyFromUserMessageOrThrow(): OptionallyFromUserMessage = this as dev.inmo.tgbotapi.types.message.abstracts.OptionallyFromUserMessage
@@ -2305,6 +2316,12 @@ public inline fun Message.possiblyTopicMessageOrThrow(): PossiblyTopicMessage =
public inline fun <T> Message.ifPossiblyTopicMessage(block: (PossiblyTopicMessage) -> T): T? = possiblyTopicMessageOrNull() ?.let(block)
public inline fun Message.chatContentMessageOrNull(): ChatContentMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.chatContentMessageOrThrow(): ChatContentMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T> Message.ifChatContentMessage(block: (ChatContentMessage<MessageContent>) -> T): T? = chatContentMessageOrNull() ?.let(block)
public inline fun Message.chatEventMessageOrNull(): ChatEventMessage<ChatEvent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage<dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChatEvent>
public inline fun Message.chatEventMessageOrThrow(): ChatEventMessage<ChatEvent> = this as dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage<dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChatEvent>
@@ -2329,6 +2346,12 @@ public inline fun Message.channelContentMessageOrThrow(): ChannelContentMessage<
public inline fun <T> Message.ifChannelContentMessage(block: (ChannelContentMessage<MessageContent>) -> T): T? = channelContentMessageOrNull() ?.let(block)
public inline fun Message.guestContentMessageOrNull(): GuestContentMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.GuestContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.guestContentMessageOrThrow(): GuestContentMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.GuestContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T> Message.ifGuestContentMessage(block: (GuestContentMessage<MessageContent>) -> T): T? = guestContentMessageOrNull() ?.let(block)
public inline fun Message.optionallyFromUserMessageOrNull(): OptionallyFromUserMessage? = this as? dev.inmo.tgbotapi.types.message.abstracts.OptionallyFromUserMessage
public inline fun Message.optionallyFromUserMessageOrThrow(): OptionallyFromUserMessage = this as dev.inmo.tgbotapi.types.message.abstracts.OptionallyFromUserMessage
@@ -2371,6 +2394,18 @@ public inline fun Message.accessibleMessageOrThrow(): AccessibleMessage = this a
public inline fun <T> Message.ifAccessibleMessage(block: (AccessibleMessage) -> T): T? = accessibleMessageOrNull() ?.let(block)
public inline fun Message.chatMessageOrNull(): ChatMessage? = this as? dev.inmo.tgbotapi.types.message.abstracts.ChatMessage
public inline fun Message.chatMessageOrThrow(): ChatMessage = this as dev.inmo.tgbotapi.types.message.abstracts.ChatMessage
public inline fun <T> Message.ifChatMessage(block: (ChatMessage) -> T): T? = chatMessageOrNull() ?.let(block)
public inline fun Message.specialMessageOrNull(): SpecialMessage? = this as? dev.inmo.tgbotapi.types.message.abstracts.SpecialMessage
public inline fun Message.specialMessageOrThrow(): SpecialMessage = this as dev.inmo.tgbotapi.types.message.abstracts.SpecialMessage
public inline fun <T> Message.ifSpecialMessage(block: (SpecialMessage) -> T): T? = specialMessageOrNull() ?.let(block)
public inline fun Message.inaccessibleMessageOrNull(): InaccessibleMessage? = this as? dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
public inline fun Message.inaccessibleMessageOrThrow(): InaccessibleMessage = this as dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
@@ -2389,6 +2424,12 @@ public inline fun Message.publicContentMessageOrThrow(): PublicContentMessage<Me
public inline fun <T> Message.ifPublicContentMessage(block: (PublicContentMessage<MessageContent>) -> T): T? = publicContentMessageOrNull() ?.let(block)
public inline fun Message.commonContentMessageOrNull(): CommonContentMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.CommonContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.commonContentMessageOrThrow(): CommonContentMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.CommonContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T> Message.ifCommonContentMessage(block: (CommonContentMessage<MessageContent>) -> T): T? = commonContentMessageOrNull() ?.let(block)
public inline fun Message.possiblySentViaBotCommonMessageOrNull(): PossiblySentViaBotCommonMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.PossiblySentViaBotCommonMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.possiblySentViaBotCommonMessageOrThrow(): PossiblySentViaBotCommonMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.PossiblySentViaBotCommonMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
@@ -2407,12 +2448,6 @@ public inline fun Message.possiblyPaymentMessageOrThrow(): PossiblyPaymentMessag
public inline fun <T> Message.ifPossiblyPaymentMessage(block: (PossiblyPaymentMessage) -> T): T? = possiblyPaymentMessageOrNull() ?.let(block)
public inline fun Message.commonMessageOrNull(): CommonMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.CommonMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.commonMessageOrThrow(): CommonMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.CommonMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun <T> Message.ifCommonMessage(block: (CommonMessage<MessageContent>) -> T): T? = commonMessageOrNull() ?.let(block)
public inline fun Message.contentMessageOrNull(): ContentMessage<MessageContent>? = this as? dev.inmo.tgbotapi.types.message.abstracts.ContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
public inline fun Message.contentMessageOrThrow(): ContentMessage<MessageContent> = this as dev.inmo.tgbotapi.types.message.abstracts.ContentMessage<dev.inmo.tgbotapi.types.message.content.MessageContent>
@@ -4273,6 +4308,12 @@ public inline fun Update.preCheckoutQueryUpdateOrThrow(): PreCheckoutQueryUpdate
public inline fun <T> Update.ifPreCheckoutQueryUpdate(block: (PreCheckoutQueryUpdate) -> T): T? = preCheckoutQueryUpdateOrNull() ?.let(block)
public inline fun Update.guestMessageUpdateOrNull(): GuestMessageUpdate? = this as? dev.inmo.tgbotapi.types.update.GuestMessageUpdate
public inline fun Update.guestMessageUpdateOrThrow(): GuestMessageUpdate = this as dev.inmo.tgbotapi.types.update.GuestMessageUpdate
public inline fun <T> Update.ifGuestMessageUpdate(block: (GuestMessageUpdate) -> T): T? = guestMessageUpdateOrNull() ?.let(block)
public inline fun Update.paidMediaPurchasedUpdateOrNull(): PaidMediaPurchasedUpdate? = this as? dev.inmo.tgbotapi.types.update.PaidMediaPurchasedUpdate
public inline fun Update.paidMediaPurchasedUpdateOrThrow(): PaidMediaPurchasedUpdate = this as dev.inmo.tgbotapi.types.update.PaidMediaPurchasedUpdate

View File

@@ -6,9 +6,9 @@ import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.coroutines.flow.*
/**
* Simple factory to convert [ContentMessage] to a [CommonMessage]
* Simple factory to convert [ContentMessage] to a [ChatContentMessage]
*/
fun <C: MessageContent, T : ContentMessage<C>> Flow<T>.onlyCommonMessages() = filterIsInstance<CommonMessage<C>>()
fun <C: MessageContent, T : ContentMessage<C>> Flow<T>.onlyCommonMessages() = filterIsInstance<ChatContentMessage<C>>()
/**
* Shortcut for [onlyCommonMessages]
@@ -17,7 +17,7 @@ fun <C: MessageContent, T : ContentMessage<C>> Flow<T>.onlyCommonMessages() = fi
inline fun <C: MessageContent, T : ContentMessage<C>> Flow<T>.commonMessages() = onlyCommonMessages()
/**
* Filter the messages and checking that incoming [CommonMessage] is [PossiblySentViaBotCommonMessage] and its
* Filter the messages and checking that incoming [ChatContentMessage] is [PossiblySentViaBotCommonMessage] and its
* [PossiblySentViaBotCommonMessage.senderBot] is not null
*/
fun <MC : MessageContent, M : ContentMessage<MC>> Flow<M>.onlySentViaBot() = mapNotNull {
@@ -29,7 +29,7 @@ fun <MC : MessageContent, M : ContentMessage<MC>> Flow<M>.onlySentViaBot() = map
}
/**
* Filter the messages and checking that incoming [CommonMessage] not is [PossiblySentViaBotCommonMessage] or its
* Filter the messages and checking that incoming [ChatContentMessage] not is [PossiblySentViaBotCommonMessage] or its
* [PossiblySentViaBotCommonMessage.senderBot] is null
*/
fun <MC : MessageContent, M : ContentMessage<MC>> Flow<M>.withoutSentViaBot() = filter {

View File

@@ -3,14 +3,13 @@
package dev.inmo.tgbotapi.extensions.utils
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent
import dev.inmo.tgbotapi.types.message.content.MessageContent
inline fun <reified T : MessageContent> ContentMessage<*>.withContentOrNull() = if (content is T) { this as ContentMessage<T> } else { null }
inline fun <reified T : MessageContent> ContentMessage<*>.withContentOrThrow() = withContentOrNull<T>()!!
inline fun <reified T : MessageContent> CommonMessage<*>.withContentOrNull() = if (content is T) { this as CommonMessage<T> } else { null }
inline fun <reified T : MessageContent> CommonMessage<*>.withContentOrThrow() = withContentOrNull<T>()!!
inline fun <reified T : MessageContent> ChatContentMessage<*>.withContentOrNull() = if (content is T) { this as ChatContentMessage<T> } else { null }
inline fun <reified T : MessageContent> ChatContentMessage<*>.withContentOrThrow() = withContentOrNull<T>()!!
inline fun <reified T : MessageContent> PossiblySentViaBotCommonMessage<*>.withContentOrNull() = if (content is T) { this as PossiblySentViaBotCommonMessage<T>
} else { null }

View File

@@ -3,15 +3,13 @@
package dev.inmo.tgbotapi.extensions.utils
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MediaGroupMessage
import dev.inmo.tgbotapi.types.message.content.MediaGroupPartContent
import dev.inmo.tgbotapi.types.message.content.MessageContent
inline fun <reified T : MessageContent> ContentMessage<*>.withContent() = if (content is T) { this as ContentMessage<T> } else { null }
inline fun <reified T : MessageContent> ContentMessage<*>.requireWithContent() = withContent<T>()!!
inline fun <reified T : MessageContent> CommonMessage<*>.withContent() = if (content is T) { this as CommonMessage<T> } else { null }
inline fun <reified T : MessageContent> CommonMessage<*>.requireWithContent() = withContent<T>()!!
inline fun <reified T : MessageContent> ChatContentMessage<*>.withContent() = if (content is T) { this as ChatContentMessage<T> } else { null }
inline fun <reified T : MessageContent> ChatContentMessage<*>.requireWithContent() = withContent<T>()!!
inline fun <reified T : MessageContent> PossiblySentViaBotCommonMessage<*>.withContent() = if (content is T) { this as PossiblySentViaBotCommonMessage<T>
} else { null }

View File

@@ -1,10 +1,6 @@
package dev.inmo.tgbotapi.extensions.utils.shortcuts
import dev.inmo.tgbotapi.extensions.utils.aggregateFlows
import dev.inmo.tgbotapi.extensions.utils.flatMap
import dev.inmo.tgbotapi.extensions.utils.flatten
import dev.inmo.tgbotapi.extensions.utils.updates.asContentMessagesFlow
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.content.*
import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.extensions.utils.updates
import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
@@ -20,10 +20,10 @@ import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
* }
* ```
*
* @return true if this [CommonMessage] contains any commands. False otherwise.
* @return true if this [ChatContentMessage] contains any commands. False otherwise.
* @see hasNoCommands
*/
fun CommonMessage<*>.hasCommands(): Boolean = withContentOrNull<TextContent>() ?.content ?.textSources ?.any {
fun ChatContentMessage<*>.hasCommands(): Boolean = withContentOrNull<TextContent>() ?.content ?.textSources ?.any {
it is BotCommandTextSource
} ?: false
@@ -40,10 +40,10 @@ fun CommonMessage<*>.hasCommands(): Boolean = withContentOrNull<TextContent>() ?
* }
* ```
*
* @return true if this [CommonMessage] does not contain any commands. False otherwise.
* @return true if this [ChatContentMessage] does not contain any commands. False otherwise.
* @see hasCommands
*/
fun CommonMessage<*>.hasNoCommands(): Boolean = !this.hasCommands()
fun ChatContentMessage<*>.hasNoCommands(): Boolean = !this.hasCommands()
/**
* A predicate to test that message has been sent in the forum.

View File

@@ -16,10 +16,10 @@ fun <T : BaseSentMessageUpdate> Flow<T>.asContentMessagesFlow() = mapNotNull {
}
/**
* Will map incoming [BaseSentMessageUpdate]s to [CommonMessage] from [BaseSentMessageUpdate.data]
* Will map incoming [BaseSentMessageUpdate]s to [ChatContentMessage] from [BaseSentMessageUpdate.data]
*/
fun <T : BaseSentMessageUpdate> Flow<T>.asCommonMessagesFlow() = mapNotNull {
it.data as? CommonMessage<*>
it.data as? ChatContentMessage<*>
}
@Suppress("NOTHING_TO_INLINE")

View File

@@ -9,7 +9,7 @@ import dev.inmo.tgbotapi.extensions.utils.updates.convertWithMediaGroupUpdates
import dev.inmo.tgbotapi.requests.GetUpdates
import dev.inmo.tgbotapi.requests.webhook.DeleteWebhook
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChatContentMessage
import dev.inmo.tgbotapi.types.message.content.MediaGroupContent
import dev.inmo.tgbotapi.types.update.*
import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate
@@ -102,7 +102,7 @@ fun TelegramBot.longPollingFlow(
*/
val updates = if (
originalUpdates.size == getUpdatesLimit.last
&& ((converted.last() as? BaseSentMessageUpdate)?.data as? CommonMessage<*>)?.content is MediaGroupContent<*>
&& ((converted.last() as? BaseSentMessageUpdate)?.data as? ChatContentMessage<*>)?.content is MediaGroupContent<*>
) {
converted - converted.last()
} else {