1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-12-27 00:19:24 +00:00

Compare commits

...

7 Commits

96 changed files with 1391 additions and 551 deletions

View File

@@ -6,9 +6,8 @@ import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.MediaGroupCollectionContent
import dev.inmo.tgbotapi.types.message.content.MediaGroupContent
suspend fun TelegramBot.deleteMessage(
chatId: ChatIdentifier,
@@ -23,7 +22,7 @@ suspend fun TelegramBot.deleteMessage(
) = deleteMessage(chat.id, messageId)
suspend fun TelegramBot.deleteMessage(
message: Message
message: AccessibleMessage
): Boolean {
val mediaGroupContent = ((message as? ContentMessage<*>) ?.content as? MediaGroupCollectionContent<*>)
if (mediaGroupContent == null) {
@@ -46,9 +45,9 @@ suspend fun TelegramBot.delete(
) = deleteMessage(chat, messageId)
suspend fun TelegramBot.delete(
message: Message
message: AccessibleMessage
) = deleteMessage(message)
suspend fun Message.delete(
suspend fun AccessibleMessage.delete(
requestsExecutor: TelegramBot
) = requestsExecutor.deleteMessage(this)

View File

@@ -1,11 +1,9 @@
package dev.inmo.tgbotapi.extensions.api
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.DeleteMessage
import dev.inmo.tgbotapi.requests.DeleteMessages
import dev.inmo.tgbotapi.requests.ForwardMessages
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
suspend fun TelegramBot.deleteMessages(
chatId: ChatIdentifier,
@@ -37,7 +35,7 @@ suspend fun TelegramBot.deleteMessages(
)
suspend fun TelegramBot.deleteMessages(
messages: List<Message>
messages: List<AccessibleMessage>
) = messages.groupBy { it.chat }.map { (chat, messages) ->
deleteMessages(
chatId = chat.id,
@@ -63,5 +61,5 @@ suspend fun TelegramBot.delete(
) = deleteMessages(chatId = chatId, messageIds = (listOf(firstMessageId, secondMessageId) + messageIds.toList()))
suspend fun TelegramBot.delete(
messages: List<Message>
messages: List<AccessibleMessage>
) = deleteMessages(messages)

View File

@@ -6,7 +6,7 @@ import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.threadId
suspend fun TelegramBot.forwardMessage(
@@ -49,7 +49,7 @@ suspend fun TelegramBot.forwardMessage(
suspend fun TelegramBot.forwardMessage(
toChatId: ChatIdentifier,
message: Message,
message: AccessibleMessage,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false
@@ -57,7 +57,7 @@ suspend fun TelegramBot.forwardMessage(
suspend fun TelegramBot.forwardMessage(
toChat: Chat,
message: Message,
message: AccessibleMessage,
threadId: MessageThreadId? = toChat.id.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false

View File

@@ -3,7 +3,7 @@ package dev.inmo.tgbotapi.extensions.api
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.ForwardMessages
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
suspend fun TelegramBot.forwardMessages(
toChatId: ChatIdentifier,
@@ -66,7 +66,7 @@ suspend fun TelegramBot.forwardMessages(
suspend fun TelegramBot.forwardMessages(
toChatId: ChatIdentifier,
messages: List<Message>,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -141,7 +141,7 @@ suspend fun TelegramBot.forward(
suspend fun TelegramBot.forward(
toChatId: ChatIdentifier,
messages: List<Message>,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,

View File

@@ -2,39 +2,24 @@ package dev.inmo.tgbotapi.extensions.api
import korlibs.time.DateTime
import korlibs.time.TimeSpan
import dev.inmo.micro_utils.coroutines.LinkedSupervisorJob
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
import dev.inmo.tgbotapi.abstracts.types.WithReplyMarkup
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.api.edit.edit
import dev.inmo.tgbotapi.extensions.api.edit.location.live.editLiveLocation
import dev.inmo.tgbotapi.extensions.api.edit.location.live.stopLiveLocation
import dev.inmo.tgbotapi.extensions.api.send.send
import dev.inmo.tgbotapi.extensions.api.send.sendLiveLocation
import dev.inmo.tgbotapi.requests.send.SendLiveLocation
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.location.LiveLocation
import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.location.StaticLocation
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.LocationContent
import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
import io.ktor.utils.io.core.Closeable
import korlibs.time.millisecondsLong
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlin.js.JsName
import kotlin.jvm.JvmName
import kotlin.math.ceil
val defaultLivePeriodDelayMillis = (livePeriodLimit.last - 60L) * 1000L
@@ -253,7 +238,7 @@ suspend fun TelegramBot.startLiveLocation(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.replyWithLiveLocation(
to: Message,
to: AccessibleMessage,
scope: CoroutineScope,
latitude: Double,
longitude: Double,
@@ -288,7 +273,7 @@ suspend inline fun TelegramBot.replyWithLiveLocation(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.replyWithLiveLocation(
to: Message,
to: AccessibleMessage,
scope: CoroutineScope,
location: StaticLocation,
liveTimeMillis: Long = defaultLivePeriodDelayMillis,

View File

@@ -5,7 +5,7 @@ import dev.inmo.tgbotapi.requests.StopPoll
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
/**
* @param replyMarkup Some [InlineKeyboardMarkup]. See [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard]
@@ -35,7 +35,7 @@ suspend fun TelegramBot.stopPoll(
*/
suspend fun TelegramBot.stopPoll(
chatId: IdChatIdentifier,
message: Message,
message: AccessibleMessage,
replyMarkup: InlineKeyboardMarkup? = null
) = stopPoll(chatId, message.messageId, replyMarkup)
@@ -45,6 +45,6 @@ suspend fun TelegramBot.stopPoll(
*/
suspend fun TelegramBot.stopPoll(
chat: Chat,
message: Message,
message: AccessibleMessage,
replyMarkup: InlineKeyboardMarkup? = null
) = stopPoll(chat.id, message.messageId, replyMarkup)

View File

@@ -5,7 +5,7 @@ import dev.inmo.tgbotapi.requests.chat.modify.PinChatMessage
import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
suspend fun TelegramBot.pinChatMessage(
chatId: ChatIdentifier,
@@ -20,6 +20,6 @@ suspend fun TelegramBot.pinChatMessage(
) = pinChatMessage(chat.id, messageId, disableNotification)
suspend fun TelegramBot.pinChatMessage(
message: Message,
message: AccessibleMessage,
disableNotification: Boolean = false
) = pinChatMessage(message.chat.id, message.messageId, disableNotification)

View File

@@ -5,7 +5,7 @@ import dev.inmo.tgbotapi.requests.chat.modify.UnpinChatMessage
import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
suspend fun TelegramBot.unpinChatMessage(
chatId: ChatIdentifier,
@@ -18,5 +18,5 @@ suspend fun TelegramBot.unpinChatMessage(
) = unpinChatMessage(chat.id, messageId)
suspend fun TelegramBot.unpinChatMessage(
message: Message
message: AccessibleMessage
) = unpinChatMessage(message.chat.id, message.messageId)

View File

@@ -14,7 +14,7 @@ import dev.inmo.tgbotapi.types.location.LiveLocation
import dev.inmo.tgbotapi.types.media.TelegramMedia
import dev.inmo.tgbotapi.types.message.ParseMode
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.*
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
@@ -181,7 +181,7 @@ suspend fun TelegramBot.edit(
* as a builder for that
*/
suspend fun TelegramBot.edit(
message: Message,
message: AccessibleMessage,
replyMarkup: InlineKeyboardMarkup? = null
) = editMessageReplyMarkup(message, replyMarkup)

View File

@@ -11,7 +11,7 @@ import dev.inmo.tgbotapi.types.message.ParseMode
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.MediaContent
import dev.inmo.tgbotapi.utils.RiskFeature
@@ -98,7 +98,7 @@ suspend fun <T> TelegramBot.editMessageCaption(
*/
@RiskFeature("This method is unsafe due to absence of any guaranties about the type of message. In case if message is not media message this method will throw an exception")
suspend fun <T> TelegramBot.editMessageCaption(
message: Message,
message: AccessibleMessage,
entities: List<TextSource>,
replyMarkup: InlineKeyboardMarkup? = null
): ContentMessage<MediaContent> where T : TextedWithTextSources, T : MediaContent {

View File

@@ -6,7 +6,7 @@ import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
/**
* @param replyMarkup Some [InlineKeyboardMarkup]. See [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard]
@@ -35,7 +35,7 @@ suspend fun TelegramBot.editMessageReplyMarkup(
* as a builder for that
*/
suspend fun TelegramBot.editMessageReplyMarkup(
message: Message,
message: AccessibleMessage,
replyMarkup: InlineKeyboardMarkup? = null
) = editMessageReplyMarkup(message.chat.id, message.messageId, replyMarkup)

View File

@@ -10,7 +10,7 @@ import dev.inmo.tgbotapi.types.message.ParseMode
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.utils.*
@@ -174,7 +174,7 @@ suspend fun TelegramBot.editMessageText(
*/
@RiskFeature("This method is unsafe due to absence of any guaranties about the type of message. In case if message is not text message this method will throw an exception")
suspend fun TelegramBot.editMessageText(
message: Message,
message: AccessibleMessage,
entities: TextSourcesList,
linkPreviewOptions: LinkPreviewOptions? = null,
replyMarkup: InlineKeyboardMarkup? = null
@@ -186,7 +186,7 @@ suspend fun TelegramBot.editMessageText(
*/
@RiskFeature("This method is unsafe due to absence of any guaranties about the type of message. In case if message is not text message this method will throw an exception")
suspend fun TelegramBot.editMessageText(
message: Message,
message: AccessibleMessage,
separator: TextSource? = null,
linkPreviewOptions: LinkPreviewOptions? = null,
replyMarkup: InlineKeyboardMarkup? = null,
@@ -199,7 +199,7 @@ suspend fun TelegramBot.editMessageText(
*/
@RiskFeature("This method is unsafe due to absence of any guaranties about the type of message. In case if message is not text message this method will throw an exception")
suspend fun TelegramBot.editMessageText(
message: Message,
message: AccessibleMessage,
separator: String,
linkPreviewOptions: LinkPreviewOptions? = null,
replyMarkup: InlineKeyboardMarkup? = null,

View File

@@ -9,7 +9,7 @@ import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.message.ParseMode
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.threadId
/**
@@ -186,7 +186,7 @@ suspend inline fun TelegramBot.copyMessage(
*/
suspend inline fun TelegramBot.copyMessage(
toChatId: ChatIdentifier,
message: Message,
message: AccessibleMessage,
text: String? = null,
parseMode: ParseMode? = null,
threadId: MessageThreadId? = toChatId.threadId,
@@ -203,7 +203,7 @@ suspend inline fun TelegramBot.copyMessage(
*/
suspend inline fun TelegramBot.copyMessage(
toChat: Chat,
message: Message,
message: AccessibleMessage,
text: String? = null,
parseMode: ParseMode? = null,
threadId: MessageThreadId? = toChat.id.threadId,
@@ -220,7 +220,7 @@ suspend inline fun TelegramBot.copyMessage(
*/
suspend inline fun TelegramBot.copyMessage(
toChatId: ChatIdentifier,
message: Message,
message: AccessibleMessage,
entities: TextSourcesList,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
@@ -236,7 +236,7 @@ suspend inline fun TelegramBot.copyMessage(
*/
suspend inline fun TelegramBot.copyMessage(
toChat: Chat,
message: Message,
message: AccessibleMessage,
entities: TextSourcesList,
threadId: MessageThreadId? = toChat.id.threadId,
disableNotification: Boolean = false,

View File

@@ -3,7 +3,7 @@ package dev.inmo.tgbotapi.extensions.api.send
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.send.CopyMessages
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
suspend fun TelegramBot.copyMessages(
toChatId: ChatIdentifier,
@@ -66,7 +66,7 @@ suspend fun TelegramBot.copyMessages(
suspend fun TelegramBot.copyMessages(
toChatId: ChatIdentifier,
messages: List<Message>,
messages: List<AccessibleMessage>,
threadId: MessageThreadId? = toChatId.threadId,
disableNotification: Boolean = false,
protectContent: Boolean = false,

View File

@@ -22,8 +22,7 @@ import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.games.Game
import dev.inmo.tgbotapi.types.location.*
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyTopicMessage
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.*
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.types.payments.LabeledPrice
@@ -44,7 +43,7 @@ import kotlin.jvm.JvmName
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
phoneNumber: String,
firstName: String,
lastName: String? = null,
@@ -70,7 +69,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
contact: Contact,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -95,7 +94,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.replyWithDice(
to: Message,
to: AccessibleMessage,
animationType: DiceAnimationType? = null,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -108,7 +107,7 @@ suspend inline fun TelegramBot.replyWithDice(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
animationType: DiceAnimationType,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -124,7 +123,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
latitude: Double,
longitude: Double,
disableNotification: Boolean = false,
@@ -148,7 +147,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
location: StaticLocation,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -173,7 +172,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
text: String,
parseMode: ParseMode? = null,
linkPreviewOptions: LinkPreviewOptions? = null,
@@ -199,7 +198,7 @@ suspend inline fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
entities: TextSourcesList,
linkPreviewOptions: LinkPreviewOptions? = null,
disableNotification: Boolean = false,
@@ -223,7 +222,7 @@ suspend inline fun TelegramBot.reply(
* as a builder for that
*/
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
separator: TextSource? = null,
linkPreviewOptions: LinkPreviewOptions? = null,
disableNotification: Boolean = false,
@@ -238,7 +237,7 @@ suspend fun TelegramBot.reply(
* as a builder for that
*/
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
separator: String,
linkPreviewOptions: LinkPreviewOptions? = null,
disableNotification: Boolean = false,
@@ -256,7 +255,7 @@ suspend fun TelegramBot.reply(
* [dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard] as a builders for that param
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
latitude: Double,
longitude: Double,
title: String,
@@ -288,7 +287,7 @@ suspend inline fun TelegramBot.reply(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
location: StaticLocation,
title: String,
address: String,
@@ -319,7 +318,7 @@ suspend inline fun TelegramBot.reply(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
venue: Venue,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -340,7 +339,7 @@ suspend inline fun TelegramBot.reply(
// Game
suspend inline fun TelegramBot.replyWithGame(
to: Message,
to: AccessibleMessage,
gameShortName: String,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -351,7 +350,7 @@ suspend inline fun TelegramBot.replyWithGame(
)
suspend inline fun TelegramBot.replyWithGame(
to: Message,
to: AccessibleMessage,
game: Game,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -362,7 +361,7 @@ suspend inline fun TelegramBot.replyWithGame(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
game: Game,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -374,7 +373,7 @@ suspend inline fun TelegramBot.reply(
// Animation
suspend inline fun TelegramBot.replyWithAnimation(
to: Message,
to: AccessibleMessage,
animation: InputFile,
thumb: InputFile? = null,
text: String? = null,
@@ -406,7 +405,7 @@ suspend inline fun TelegramBot.replyWithAnimation(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
animation: AnimationFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -421,7 +420,7 @@ suspend inline fun TelegramBot.reply(
) = sendAnimation(to.chat, animation, text, parseMode, spoilered, duration, width, height, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.replyWithAnimation(
to: Message,
to: AccessibleMessage,
animation: InputFile,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -451,7 +450,7 @@ suspend inline fun TelegramBot.replyWithAnimation(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
animation: AnimationFile,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -468,7 +467,7 @@ suspend inline fun TelegramBot.reply(
// Audio
suspend inline fun TelegramBot.replyWithAudio(
to: Message,
to: AccessibleMessage,
audio: InputFile,
thumb: InputFile? = null,
text: String? = null,
@@ -483,7 +482,7 @@ suspend inline fun TelegramBot.replyWithAudio(
) = sendAudio(to.chat, audio, thumb, text, parseMode, duration, performer, title, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
audio: AudioFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -495,7 +494,7 @@ suspend inline fun TelegramBot.reply(
) = sendAudio(to.chat, audio, text, parseMode, title, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.replyWithAudio(
to: Message,
to: AccessibleMessage,
audio: InputFile,
thumb: InputFile? = null,
entities: TextSourcesList,
@@ -509,7 +508,7 @@ suspend inline fun TelegramBot.replyWithAudio(
) = sendAudio(to.chat, audio, thumb, entities, duration, performer, title, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
audio: AudioFile,
entities: TextSourcesList,
title: String? = null,
@@ -523,7 +522,7 @@ suspend inline fun TelegramBot.reply(
// Documents
suspend inline fun TelegramBot.replyWithDocument(
to: Message,
to: AccessibleMessage,
document: InputFile,
thumb: InputFile? = null,
text: String? = null,
@@ -536,7 +535,7 @@ suspend inline fun TelegramBot.replyWithDocument(
) = sendDocument(to.chat, document, thumb, text, parseMode, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup, disableContentTypeDetection)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
document: DocumentFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -548,7 +547,7 @@ suspend inline fun TelegramBot.reply(
) = sendDocument(to.chat, document, text, parseMode, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup, disableContentTypeDetection)
suspend inline fun TelegramBot.replyWithDocument(
to: Message,
to: AccessibleMessage,
document: InputFile,
thumb: InputFile? = null,
entities: TextSourcesList,
@@ -560,7 +559,7 @@ suspend inline fun TelegramBot.replyWithDocument(
) = sendDocument(to.chat, document, thumb, entities, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup, disableContentTypeDetection)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
document: DocumentFile,
entities: TextSourcesList,
disableNotification: Boolean = false,
@@ -575,7 +574,7 @@ suspend inline fun TelegramBot.reply(
@RiskFeature(rawSendingMediaGroupsWarning)
suspend inline fun TelegramBot.replyWithMediaGroup(
to: Message,
to: AccessibleMessage,
media: List<MediaGroupMemberTelegramMedia>,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -583,7 +582,7 @@ suspend inline fun TelegramBot.replyWithMediaGroup(
) = sendMediaGroup(to.chat, media, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply)
suspend inline fun TelegramBot.replyWithPlaylist(
to: Message,
to: AccessibleMessage,
media: List<AudioMediaGroupMemberTelegramMedia>,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -591,7 +590,7 @@ suspend inline fun TelegramBot.replyWithPlaylist(
) = sendPlaylist(to.chat, media, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply)
suspend inline fun TelegramBot.replyWithDocuments(
to: Message,
to: AccessibleMessage,
media: List<DocumentMediaGroupMemberTelegramMedia>,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -599,7 +598,7 @@ suspend inline fun TelegramBot.replyWithDocuments(
) = sendDocumentsGroup(to.chat, media, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply)
suspend inline fun TelegramBot.replyWithGallery(
to: Message,
to: AccessibleMessage,
media: List<VisualMediaGroupMemberTelegramMedia>,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -610,7 +609,7 @@ suspend inline fun TelegramBot.replyWithGallery(
// Photo
suspend inline fun TelegramBot.replyWithPhoto(
to: Message,
to: AccessibleMessage,
fileId: InputFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -622,7 +621,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
) = sendPhoto(to.chat, fileId, text, parseMode, spoilered, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
photo: Photo,
text: String? = null,
parseMode: ParseMode? = null,
@@ -634,7 +633,7 @@ suspend inline fun TelegramBot.reply(
) = sendPhoto(to.chat, photo, text, parseMode, spoilered, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
photoSize: PhotoSize,
text: String? = null,
parseMode: ParseMode? = null,
@@ -647,7 +646,7 @@ suspend inline fun TelegramBot.reply(
suspend inline fun TelegramBot.replyWithPhoto(
to: Message,
to: AccessibleMessage,
fileId: InputFile,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -658,7 +657,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
) = sendPhoto(to.chat, fileId, entities, spoilered, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
photo: Photo,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -669,7 +668,7 @@ suspend inline fun TelegramBot.reply(
) = sendPhoto(to.chat, photo, entities, spoilered, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
photoSize: PhotoSize,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -683,7 +682,7 @@ suspend inline fun TelegramBot.reply(
// Sticker
suspend inline fun TelegramBot.replyWithSticker(
to: Message,
to: AccessibleMessage,
sticker: InputFile,
emoji: String? = null,
disableNotification: Boolean = false,
@@ -693,7 +692,7 @@ suspend inline fun TelegramBot.replyWithSticker(
) = sendSticker(to.chat, sticker, to.threadIdOrNull, emoji, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
sticker: Sticker,
emoji: String? = null,
disableNotification: Boolean = false,
@@ -706,7 +705,7 @@ suspend inline fun TelegramBot.reply(
// Videos
suspend inline fun TelegramBot.replyWithVideo(
to: Message,
to: AccessibleMessage,
video: InputFile,
thumb: InputFile? = null,
text: String? = null,
@@ -722,7 +721,7 @@ suspend inline fun TelegramBot.replyWithVideo(
) = sendVideo(to.chat, video, thumb, text, parseMode, spoilered, duration, width, height, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
video: VideoFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -734,7 +733,7 @@ suspend inline fun TelegramBot.reply(
) = sendVideo(to.chat, video, text, parseMode, spoilered, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.replyWithVideo(
to: Message,
to: AccessibleMessage,
video: InputFile,
thumb: InputFile? = null,
entities: TextSourcesList,
@@ -749,7 +748,7 @@ suspend inline fun TelegramBot.replyWithVideo(
) = sendVideo(to.chat, video, thumb, entities, spoilered, duration, width, height, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
video: VideoFile,
entities: TextSourcesList,
spoilered: Boolean = false,
@@ -763,7 +762,7 @@ suspend inline fun TelegramBot.reply(
// VideoNotes
suspend inline fun TelegramBot.replyWithVideoNote(
to: Message,
to: AccessibleMessage,
videoNote: InputFile,
thumb: InputFile? = null,
duration: Long? = null,
@@ -775,7 +774,7 @@ suspend inline fun TelegramBot.replyWithVideoNote(
) = sendVideoNote(to.chat, videoNote, thumb, duration, size, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
videoNote: VideoNoteFile,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -787,7 +786,7 @@ suspend inline fun TelegramBot.reply(
// Voice
suspend inline fun TelegramBot.replyWithVoice(
to: Message,
to: AccessibleMessage,
voice: InputFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -799,7 +798,7 @@ suspend inline fun TelegramBot.replyWithVoice(
) = sendVoice(to.chat, voice, text, parseMode, duration, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
voice: VoiceFile,
text: String? = null,
parseMode: ParseMode? = null,
@@ -811,7 +810,7 @@ suspend inline fun TelegramBot.reply(
suspend inline fun TelegramBot.replyWithVoice(
to: Message,
to: AccessibleMessage,
voice: InputFile,
entities: TextSourcesList,
duration: Long? = null,
@@ -822,7 +821,7 @@ suspend inline fun TelegramBot.replyWithVoice(
) = sendVoice(to.chat, voice, entities, duration, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
voice: VoiceFile,
entities: TextSourcesList,
disableNotification: Boolean = false,
@@ -839,7 +838,7 @@ suspend inline fun TelegramBot.reply(
* as a builder for that
*/
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
title: String,
description: String,
payload: String,
@@ -867,7 +866,7 @@ suspend inline fun TelegramBot.reply(
// Polls
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
question: String,
options: List<String>,
isAnonymous: Boolean = true,
@@ -881,7 +880,7 @@ suspend inline fun TelegramBot.reply(
) = sendRegularPoll(to.chat, question, options, isAnonymous, isClosed, allowMultipleAnswers, closeInfo, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
poll: RegularPoll,
isClosed: Boolean = false,
question: String = poll.question,
@@ -896,7 +895,7 @@ suspend inline fun TelegramBot.reply(
) = sendRegularPoll(to.chat, poll, isClosed, question, options, isAnonymous, allowMultipleAnswers, closeInfo, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
question: String,
options: List<String>,
correctOptionId: Int,
@@ -912,7 +911,7 @@ suspend inline fun TelegramBot.reply(
) = sendQuizPoll(to.chat, question, options, correctOptionId, isAnonymous, isClosed, explanation, parseMode, closeInfo, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
quizPoll: QuizPoll,
isClosed: Boolean = false,
question: String = quizPoll.question,
@@ -929,7 +928,7 @@ suspend inline fun TelegramBot.reply(
) = sendQuizPoll(to.chat, isClosed, quizPoll, question, options, correctOptionId, isAnonymous, explanation, parseMode, closeInfo, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
question: String,
options: List<String>,
correctOptionId: Int,
@@ -944,7 +943,7 @@ suspend inline fun TelegramBot.reply(
) = sendQuizPoll(to.chat, question, options, correctOptionId, isAnonymous, isClosed, entities, closeInfo, to.threadIdOrNull, disableNotification, protectContent, to.messageId, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
quizPoll: QuizPoll,
entities: TextSourcesList,
isClosed: Boolean = false,
@@ -961,7 +960,7 @@ suspend inline fun TelegramBot.reply(
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
poll: Poll,
isClosed: Boolean = false,
question: String = poll.question,
@@ -1006,7 +1005,7 @@ suspend inline fun TelegramBot.reply(
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
fromChatId: ChatIdentifier,
messageId: MessageId,
text: String? = null,
@@ -1030,7 +1029,7 @@ suspend inline fun TelegramBot.reply(
)
suspend inline fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
fromChat: Chat,
messageId: MessageId,
text: String? = null,
@@ -1042,8 +1041,8 @@ suspend inline fun TelegramBot.reply(
) = reply(to, fromChat.id, messageId, text, parseMode, disableNotification, protectContent, allowSendingWithoutReply, replyMarkup)
suspend inline fun TelegramBot.reply(
to: Message,
copy: Message,
to: AccessibleMessage,
copy: AccessibleMessage,
text: String? = null,
parseMode: ParseMode? = null,
disableNotification: Boolean = false,
@@ -1053,13 +1052,13 @@ suspend inline fun TelegramBot.reply(
) = reply(to, copy.chat.id, copy.messageId, text, parseMode, disableNotification, protectContent, allowSendingWithoutReply, replyMarkup)
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
content: MessageContent,
disableNotification: Boolean = false,
protectContent: Boolean = false,
allowSendingWithoutReply: Boolean? = null,
replyMarkup: KeyboardMarkup? = null
): Message = execute(
): AccessibleMessage = execute(
content.createResend(
to.chat.id,
to.threadIdOrNull,
@@ -1077,7 +1076,7 @@ suspend fun TelegramBot.reply(
* @see handleLiveLocation
*/
suspend fun TelegramBot.reply(
message: Message,
message: AccessibleMessage,
locationsFlow: Flow<EditLiveLocationInfo>,
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
disableNotification: Boolean = false,
@@ -1102,7 +1101,7 @@ suspend fun TelegramBot.reply(
@JvmName("replyLiveLocationWithLocation")
@JsName("replyLiveLocationWithLocation")
suspend fun TelegramBot.reply(
message: Message,
message: AccessibleMessage,
locationsFlow: Flow<Location>,
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
disableNotification: Boolean = false,
@@ -1129,7 +1128,7 @@ suspend fun TelegramBot.reply(
@JvmName("replyLiveLocationWithLatLong")
@JsName("replyLiveLocationWithLatLong")
suspend fun TelegramBot.reply(
message: Message,
message: AccessibleMessage,
locationsFlow: Flow<Pair<Double, Double>>,
liveTimeMillis: Long = defaultLivePeriodDelayMillis,
disableNotification: Boolean = false,
@@ -1149,7 +1148,7 @@ suspend fun TelegramBot.reply(
}
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
mediaFile: TelegramMediaFile,
disableNotification: Boolean = false,
protectContent: Boolean = false,
@@ -1233,7 +1232,7 @@ suspend fun TelegramBot.reply(
}
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
content: TextedMediaContent,
text: String?,
parseMode: ParseMode? = null,
@@ -1307,7 +1306,7 @@ suspend fun TelegramBot.reply(
}
suspend fun TelegramBot.reply(
to: Message,
to: AccessibleMessage,
content: TextedMediaContent,
entities: TextSourcesList,
disableNotification: Boolean = false,

View File

@@ -23,7 +23,7 @@ import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.games.Game
import dev.inmo.tgbotapi.types.location.*
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.content.*
import dev.inmo.tgbotapi.types.payments.LabeledPrice
import dev.inmo.tgbotapi.types.payments.abstracts.Currency
@@ -1166,7 +1166,7 @@ suspend inline fun TelegramBot.reply(
suspend inline fun TelegramBot.reply(
toChatId: IdChatIdentifier,
toMessageId: MessageId,
copy: Message,
copy: AccessibleMessage,
text: String? = null,
parseMode: ParseMode? = null,
threadId: MessageThreadId? = toChatId.threadId,

View File

@@ -1,16 +1,12 @@
package dev.inmo.tgbotapi.extensions.api.send
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.requests.send.SendAction
import dev.inmo.tgbotapi.requests.send.SetMessageReactions
import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.actions.*
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.reactions.Reaction
import dev.inmo.tgbotapi.types.threadId
suspend fun TelegramBot.setMessageReactions(
chatId: ChatIdentifier,
@@ -43,13 +39,13 @@ suspend fun TelegramBot.setMessageReaction(
) = setMessageReaction(chat.id, messageId, reaction, big)
suspend fun TelegramBot.setMessageReactions(
message: Message,
message: AccessibleMessage,
reactions: List<Reaction>,
big: Boolean = false
) = setMessageReactions(message.chat, message.messageId, reactions, big)
suspend fun TelegramBot.setMessageReaction(
message: Message,
message: AccessibleMessage,
reaction: Reaction?,
big: Boolean = false
) = setMessageReaction(message.chat, message.messageId, reaction, big)

View File

@@ -138,3 +138,13 @@ suspend fun BehaviourContext.waitMediaContent(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContent(initRequest, errorFactory).mapContent<MediaContent>()
suspend fun BehaviourContext.waitScheduledGiveawayContent(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContent(initRequest, errorFactory).mapContent<ScheduledGiveawayContent>()
suspend fun BehaviourContext.waitGiveawayPublicResultsContent(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContent(initRequest, errorFactory).mapContent<GiveawayPublicResultsContent>()

View File

@@ -152,3 +152,13 @@ suspend fun BehaviourContext.waitMediaContentMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContentMessage(initRequest, errorFactory).mapWithContent<MediaContent>()
suspend fun BehaviourContext.waitScheduledGiveawayContentMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContentMessage(initRequest, errorFactory).mapWithContent<ScheduledGiveawayContent>()
suspend fun BehaviourContext.waitGiveawayPublicResultsContentMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitContentMessage(initRequest, errorFactory).mapWithContent<GiveawayPublicResultsContent>()

View File

@@ -130,3 +130,14 @@ suspend fun BehaviourContext.waitEditedInvoice(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContent<InvoiceContent>(initRequest, false, errorFactory)
suspend fun BehaviourContext.waitEditedScheduledGiveawayContent(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContent<ScheduledGiveawayContent>(initRequest, false, errorFactory)
suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContent(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContent<GiveawayPublicResultsContent>(initRequest, false, errorFactory)

View File

@@ -136,3 +136,14 @@ suspend fun BehaviourContext.waitEditedInvoiceMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContentMessage<InvoiceContent>(initRequest, errorFactory)
suspend fun BehaviourContext.waitEditedScheduledGiveawayContentMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContentMessage<ScheduledGiveawayContent>(initRequest, errorFactory)
suspend fun BehaviourContext.waitEditedGiveawayPublicResultsContentMessage(
initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }
) = waitEditedContentMessage<GiveawayPublicResultsContent>(initRequest, errorFactory)

View File

@@ -6,24 +6,24 @@ import dev.inmo.tgbotapi.extensions.utils.extensions.sourceUser
import dev.inmo.tgbotapi.types.InlineQueries.query.InlineQuery
import dev.inmo.tgbotapi.types.chat.ChatJoinRequest
import dev.inmo.tgbotapi.types.chat.member.ChatMemberUpdated
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.payments.PreCheckoutQuery
import dev.inmo.tgbotapi.types.payments.ShippingQuery
import dev.inmo.tgbotapi.types.queries.callback.CallbackQuery
import dev.inmo.tgbotapi.types.update.abstracts.Update
/**
* Allow only events from the same chat as base [Message]
* Allow only events from the same chat as base [AccessibleMessage]
*/
val MessageFilterByChat: BehaviourContextAndTwoTypesReceiver<Boolean, Message, Update> = { message, update ->
val MessageFilterByChat: BehaviourContextAndTwoTypesReceiver<Boolean, AccessibleMessage, Update> = { message, update ->
update.sourceChat() ?.let {
it.id == message.chat.id
} != false
}
/**
* Allow only events from the same chat as base [List] of [Message]
* Allow only events from the same chat as base [List] of [AccessibleMessage]
*/
val MessagesFilterByChat: BehaviourContextAndTwoTypesReceiver<Boolean, List<Message>, Update> = { messages, update ->
val MessagesFilterByChat: BehaviourContextAndTwoTypesReceiver<Boolean, List<AccessibleMessage>, Update> = { messages, update ->
val sourceChatId = update.sourceChat() ?.id
sourceChatId != null && messages.all { sourceChatId == it.chat.id }
}

View File

@@ -1,15 +1,13 @@
package dev.inmo.tgbotapi.extensions.behaviour_builder.filters
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MediaGroupContent
import dev.inmo.tgbotapi.types.message.content.MediaGroupMessage
import dev.inmo.tgbotapi.types.update.abstracts.Update
/**
* Allow only messages which are not [MediaGroupMessage]
*/
val CommonMessageFilterExcludeMediaGroups = SimpleFilter<Message> {
val CommonMessageFilterExcludeMediaGroups = SimpleFilter<AccessibleMessage> {
it !is CommonMessage<*> || it.content !is MediaGroupContent<*>
}

View File

@@ -7,6 +7,6 @@ import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull
/**
* Allow only messages which are not in some forum
*/
val MessageFilterForums = SimpleFilter<Message> {
val MessageFilterForums = SimpleFilter<AccessibleMessage> {
it.threadIdOrNull == null
}

View File

@@ -703,3 +703,52 @@ suspend fun <BC : BehaviourContext> BC.onMediaContent(
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.onScheduledGiveawayContent(
initialFilter: CommonMessageFilter<ScheduledGiveawayContent>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, ScheduledGiveawayContentMessage, Update>? = MessageFilterByChat,
markerFactory: MarkerFactory<in ScheduledGiveawayContentMessage, Any> = ByChatMessageMarkerFactory,
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, ScheduledGiveawayContentMessage>
) = onContentMessageWithType(
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.onScheduledGiveawayContent(
initialFilter: CommonMessageFilter<GiveawayPublicResultsContent>? = null,
subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver<BC, Boolean, GiveawayPublicResultsContentMessage, Update>? = MessageFilterByChat,
markerFactory: MarkerFactory<in GiveawayPublicResultsContentMessage, Any> = ByChatMessageMarkerFactory,
scenarioReceiver: CustomBehaviourContextAndTypeReceiver<BC, Unit, GiveawayPublicResultsContentMessage>
) = onContentMessageWithType(
initialFilter,
subcontextUpdatesFilter,
markerFactory,
scenarioReceiver
)

View File

@@ -2,12 +2,12 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories
import dev.inmo.tgbotapi.types.message.abstracts.*
object ByChatMessageMarkerFactory : MarkerFactory<Message, Any> {
override suspend fun invoke(data: Message) = data.chat
object ByChatMessageMarkerFactory : MarkerFactory<AccessibleMessage, Any> {
override suspend fun invoke(data: AccessibleMessage) = data.chat
}
object ByUserMessageMarkerFactory : MarkerFactory<Message, Any> {
override suspend fun invoke(data: Message) = when (data) {
object ByUserMessageMarkerFactory : MarkerFactory<AccessibleMessage, Any> {
override suspend fun invoke(data: AccessibleMessage) = when (data) {
is FromUserMessage -> data.user
is FromChannelGroupContentMessage<*> -> data.channel
else -> data.chat // including anonymous

View File

@@ -1,6 +1,5 @@
package dev.inmo.tgbotapi.requests
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.update.abstracts.Update
import dev.inmo.tgbotapi.types.update.abstracts.UpdateSerializerWithoutSerialization
@@ -15,7 +14,7 @@ private val updatesListSerializer = ListSerializer(
* Request updates from Telegram Bot API system. It is important, that the result updates WILL NOT include
* [dev.inmo.tgbotapi.types.update.MediaGroupUpdates.MediaGroupUpdate] objects due to the fact,
* that it is internal abstraction and in fact any [dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage]
* is just a common [dev.inmo.tgbotapi.types.message.abstracts.Message]
* is just a common [dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage]
*
* @see dev.inmo.tgbotapi.extensions.utils.updates.retrieving.updateHandlerWithMediaGroupsAdaptation
* @see dev.inmo.tgbotapi.utils.convertWithMediaGroupUpdates

View File

@@ -201,6 +201,10 @@ const val tgWebAppStartParamField = "tgWebAppStartParam"
const val chatIdField = "chat_id"
const val senderChatIdField = "sender_chat_id"
const val senderChatField = "sender_chat"
const val authorSignatureField = "author_signature"
const val senderUserField = "sender_user"
const val senderUserNameField = "sender_user_name"
const val messageIdField = "message_id"
const val giveawayMessageIdField = "giveaway_message_id"
const val messageIdsField = "message_ids"
@@ -236,6 +240,7 @@ const val accentColorIdField = "accent_color_id"
const val profileAccentColorIdField = "profile_accent_color_id"
const val backgroundCustomEmojiIdField = "background_custom_emoji_id"
const val profileBackgroundCustomEmojiIdField = "profile_background_custom_emoji_id"
const val hasVisibleHistoryField = "has_visible_history"
const val iconCustomEmojiIdField = "icon_custom_emoji_id"
const val canJoinGroupsField = "can_join_groups"
const val canReadAllGroupMessagesField = "can_read_all_group_messages"
@@ -486,6 +491,7 @@ const val isBigField = "is_big"
const val oldReactionField = "old_reaction"
const val newReactionField = "new_reaction"
const val chatField = "chat"
const val originField = "origin"
const val chatsField = "chats"
const val usernameField = "username"
const val bioField = "bio"

View File

@@ -16,4 +16,4 @@ data class Contact(
val userId: UserId? = null,
@SerialName(vcardField)
override val vcard: String? = null
) : CommonContactData
) : CommonContactData, ExternalReplyInfo.ContentVariant

View File

@@ -0,0 +1,166 @@
package dev.inmo.tgbotapi.types
import dev.inmo.tgbotapi.abstracts.SpoilerableData
import dev.inmo.tgbotapi.types.chat.SuperPublicChat
import dev.inmo.tgbotapi.types.dice.Dice
import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.games.Game
import dev.inmo.tgbotapi.types.games.RawGame
import dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
import dev.inmo.tgbotapi.types.giveaway.ScheduledGiveaway
import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.message.MessageOrigin
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.payments.Invoice
import dev.inmo.tgbotapi.types.polls.Poll
import dev.inmo.tgbotapi.types.stories.Story
import dev.inmo.tgbotapi.types.venue.Venue
import dev.inmo.tgbotapi.utils.RiskFeature
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
@Serializable(ExternalReplyInfo.Companion::class)
@ClassCastsIncluded
sealed interface ExternalReplyInfo {
val origin: MessageOrigin
val chat: SuperPublicChat?
val messageMeta: Message.MetaInfo?
interface ContentVariant
@Serializable
data class Text(
override val origin: MessageOrigin,
override val chat: SuperPublicChat?,
override val messageMeta: Message.MetaInfo?,
val linkPreviewOptions: LinkPreviewOptions?
) : ExternalReplyInfo
@Serializable(ExternalReplyInfo.Companion::class)
sealed interface Content : ExternalReplyInfo {
val content: ContentVariant
@Serializable
data class Simple(
override val origin: MessageOrigin,
override val chat: SuperPublicChat?,
override val messageMeta: Message.MetaInfo?,
override val content: ContentVariant
) : Content
@Serializable
data class Media<T>(
override val origin: MessageOrigin,
override val chat: SuperPublicChat?,
override val messageMeta: Message.MetaInfo?,
override val spoilered: Boolean,
override val content: T
) : Content, SpoilerableData where T: ContentVariant, T : TelegramMediaFile
}
@Serializable
private data class Surrogate(
val origin: MessageOrigin,
val chat: SuperPublicChat? = null,
val message_id: MessageId? = null,
val link_preview_options: LinkPreviewOptions? = null,
val has_media_spoiler: Boolean? = null,
private val story: Story? = null,
private val audio: AudioFile? = null,
private val document: DocumentFile? = null,
private val animation: AnimationFile? = null,
private val game: RawGame? = null,
@Serializable(PhotoSerializer::class)
private val photo: Photo? = null,
private val sticker: Sticker? = null,
private val video: VideoFile? = null,
private val voice: VoiceFile? = null,
private val video_note: VideoNoteFile? = null,
private val contact: Contact? = null,
private val location: Location? = null,
private val venue: Venue? = null,
private val poll: Poll? = null,
private val invoice: Invoice? = null,
private val dice: Dice? = null,
private val giveaway: ScheduledGiveaway? = null,
private val giveaway_winners: GiveawayPublicResults? = null,
) {
val asExternalReplyInfo: ExternalReplyInfo
get() {
val messageMeta = chat ?.let {
message_id ?.let {
Message.MetaInfo(
chat.id,
message_id
)
}
}
val content: ContentVariant? = when {
story != null -> story
audio != null -> audio
video != null -> video
video_note != null -> video_note
animation != null -> animation
document != null -> document
voice != null -> voice
photo != null -> photo
sticker != null -> sticker
dice != null -> dice
game != null -> game.asGame
contact != null -> contact
location != null -> location
venue != null -> venue
poll != null -> poll
invoice != null -> invoice
giveaway != null -> giveaway
giveaway_winners != null -> giveaway_winners
else -> null
}
return content ?.let {
when (it) {
is TelegramMediaFile -> {
Content.Media(
origin,
chat,
messageMeta,
has_media_spoiler == true,
it
)
}
else -> Content.Simple(
origin,
chat,
messageMeta,
it
)
}
} ?: Text(
origin,
chat,
messageMeta,
link_preview_options
)
}
}
@RiskFeature("This serializer currently support only deserialization, but not serialization")
companion object : KSerializer<ExternalReplyInfo> {
override val descriptor: SerialDescriptor
get() = Surrogate.serializer().descriptor
override fun deserialize(decoder: Decoder): ExternalReplyInfo {
return Surrogate.serializer().deserialize(decoder).asExternalReplyInfo
}
override fun serialize(encoder: Encoder, value: ExternalReplyInfo) {
}
}
}

View File

@@ -49,6 +49,8 @@ data class ExtendedChannelChatImpl(
override val backgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(hasVisibleHistoryField)
override val newMembersSeeHistory: Boolean = false
) : ExtendedChannelChat
@Serializable
@@ -85,6 +87,8 @@ data class ExtendedGroupChatImpl(
override val backgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(hasVisibleHistoryField)
override val newMembersSeeHistory: Boolean = false,
) : ExtendedGroupChat
@Serializable
@@ -178,6 +182,8 @@ data class ExtendedSupergroupChatImpl(
override val backgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(hasVisibleHistoryField)
override val newMembersSeeHistory: Boolean = false,
) : ExtendedSupergroupChat
@Serializable
@@ -234,6 +240,8 @@ data class ExtendedForumChatImpl(
override val backgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,
@SerialName(hasVisibleHistoryField)
override val newMembersSeeHistory: Boolean = false,
) : ExtendedForumChat
@Serializable
@@ -279,5 +287,5 @@ data class UnknownExtendedChat(
@SerialName(backgroundCustomEmojiIdField)
override val backgroundCustomEmojiId: CustomEmojiId? = null
@SerialName(profileBackgroundCustomEmojiIdField)
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null,\
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null
}

View File

@@ -2,10 +2,10 @@ package dev.inmo.tgbotapi.types.chat
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.colors.ColorId
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
import dev.inmo.tgbotapi.types.reactions.Reaction
import korlibs.time.DateTime
import kotlinx.serialization.Serializable
@Serializable(ExtendedChatSerializer.Companion::class)
@@ -50,6 +50,7 @@ sealed interface ExtendedPublicChat : ExtendedChat, PublicChat, ExtendedNonBotCh
val pinnedMessage: Message?
val membersHidden: Boolean
val availableReactions: List<Reaction>?
val newMembersSeeHistory: Boolean
}
@Serializable(ExtendedChatSerializer.Companion::class)

View File

@@ -10,4 +10,4 @@ data class Dice(
val value: DiceResult,
@SerialName(emojiField)
val animationType: DiceAnimationType
)
) : ExternalReplyInfo.ContentVariant

View File

@@ -23,4 +23,5 @@ data class AnimationFile(
override val mimeType: MimeType? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null
) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, CustomNamedMediaFile, SizedMediaFile
) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, CustomNamedMediaFile, SizedMediaFile,
ExternalReplyInfo.ContentVariant

View File

@@ -28,6 +28,6 @@ data class AudioFile(
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null
) : TelegramMediaFile, CustomNamedMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, TitledMediaFile,
Performerable
Performerable, ExternalReplyInfo.ContentVariant
fun AudioFile.asVoiceFile() = VoiceFile(fileId, fileUniqueId, duration, mimeType, fileSize)

View File

@@ -20,7 +20,7 @@ data class DocumentFile(
override val mimeType: MimeType? = null,
@SerialName(fileNameField)
override val fileName: String? = null
) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile
) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile, ExternalReplyInfo.ContentVariant
@Suppress("NOTHING_TO_INLINE")
inline fun TelegramMediaFile.asDocumentFile() = if (this is DocumentFile) {

View File

@@ -6,17 +6,20 @@ import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.utils.RiskFeature
import kotlinx.serialization.*
import kotlinx.serialization.builtins.ListSerializer
import kotlin.jvm.JvmInline
typealias Photo = List<PhotoSize>
@Serializable
@JvmInline
value class Photo(
val photos: List<PhotoSize>
) : List<PhotoSize> by photos, ExternalReplyInfo.ContentVariant
fun Photo.biggest(): PhotoSize? = maxByOrNull {
it.resolution
}
@RiskFeature
object PhotoSerializer : KSerializer<Photo> by ListSerializer(
PhotoSize.serializer()
)
object PhotoSerializer : KSerializer<Photo> by Photo.serializer()
@Serializable
data class PhotoSize(

View File

@@ -34,7 +34,7 @@ data class StickerSurrogate(
// TODO:: Serializer
@Serializable(StickerSerializer::class)
sealed interface Sticker : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile {
sealed interface Sticker : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile, ExternalReplyInfo.ContentVariant {
val emoji: String?
val stickerSetName: StickerSetName?
val stickerFormat: StickerFormat

View File

@@ -29,7 +29,8 @@ data class VideoFile(
override val mimeType: MimeType? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null
) : TelegramMediaFile, CustomNamedMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile
) : TelegramMediaFile, CustomNamedMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile,
ExternalReplyInfo.ContentVariant
@Suppress("NOTHING_TO_INLINE")
inline fun VideoFile.toTelegramMediaVideo(

View File

@@ -18,7 +18,7 @@ data class VideoNoteFile(
override val thumbnail: PhotoSize? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null
) : TelegramMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile {
) : TelegramMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile, ExternalReplyInfo.ContentVariant {
override val height: Int
get() = width
}

View File

@@ -19,7 +19,7 @@ data class VoiceFile(
override val mimeType: MimeType? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null
) : TelegramMediaFile, MimedMediaFile, PlayableMediaFile
) : TelegramMediaFile, MimedMediaFile, PlayableMediaFile, ExternalReplyInfo.ContentVariant
fun VoiceFile.asAudioFile(
performer: String? = null,

View File

@@ -2,6 +2,7 @@ package dev.inmo.tgbotapi.types.games
import dev.inmo.tgbotapi.abstracts.TextedInput
import dev.inmo.tgbotapi.abstracts.Titled
import dev.inmo.tgbotapi.types.ExternalReplyInfo
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
import dev.inmo.tgbotapi.types.files.AnimationFile
import dev.inmo.tgbotapi.types.files.Photo
@@ -15,4 +16,4 @@ data class Game(
override val text: String? = null,
override val textSources: TextSourcesList = emptyList(),
val animation: AnimationFile? = null
) : Titled, TextedInput
) : Titled, TextedInput, ExternalReplyInfo.ContentVariant

View File

@@ -1,9 +1,9 @@
package dev.inmo.tgbotapi.types.giveaway
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChatEvent
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PublicChatEvent
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
@@ -12,5 +12,5 @@ data class GiveawayPrivateResults(
override val chat: PreviewChat,
override val unclaimedCount: Int,
@Transient // TODO::Add message serializer
val message: Message? = null
) : GiveawayResults
val message: AccessibleMessage? = null
) : GiveawayResults, ChatEvent, PublicChatEvent

View File

@@ -13,7 +13,8 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
@Serializable(GiveawayPublicResults.Companion::class)
sealed interface GiveawayPublicResults: GiveawayInfo, GiveawayResults, WithPreviewChatAndMessageId {
sealed interface GiveawayPublicResults: GiveawayInfo, GiveawayResults, WithPreviewChatAndMessageId,
ExternalReplyInfo.ContentVariant {
val count: Int
val winners: List<PreviewUser>
val additionalChats: Int

View File

@@ -6,6 +6,6 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PublicChatEvent
import kotlinx.serialization.Serializable
@Serializable
sealed interface GiveawayResults : WithPreviewChat, ChatEvent, PublicChatEvent {
sealed interface GiveawayResults : WithPreviewChat {
val unclaimedCount: Int
}

View File

@@ -1,16 +1,19 @@
package dev.inmo.tgbotapi.types.giveaway
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.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChannelEvent
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.Serializable
@Serializable
data class Giveaway(
data class ScheduledGiveaway(
@SerialName(chatsField)
val chats: List<PreviewChat>,
@SerialName(winnersSelectionDateField)
@@ -27,4 +30,4 @@ data class Giveaway(
val countries: List<IetfLang>? = null,
@SerialName(premiumSubscriptionMonthCountField)
override val premiumMonths: Int? = null
) : GiveawayInfo, ChatEvent, PublicChatEvent
) : GiveawayInfo, ExternalReplyInfo.ContentVariant

View File

@@ -20,7 +20,7 @@ import kotlinx.serialization.json.JsonObject
*/
@Serializable(LocationSerializer::class)
@ClassCastsIncluded
sealed interface Location : Locationed, HorizontallyAccured
sealed interface Location : Locationed, HorizontallyAccured, ExternalReplyInfo.ContentVariant
@Serializable
data class StaticLocation(

View File

@@ -3,7 +3,6 @@ package dev.inmo.tgbotapi.types.message
import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.ChannelChat
import dev.inmo.tgbotapi.types.chat.CommonBot
import dev.inmo.tgbotapi.types.chat.PreviewChannelChat
import dev.inmo.tgbotapi.types.message.abstracts.*
@@ -16,10 +15,27 @@ data class ChannelContentMessageImpl<T: MessageContent>(
override val date: DateTime,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val forwardInfo: ForwardInfo?,
override val replyTo: Message?,
override val forwardOrigin: MessageOrigin?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : ChannelContentMessage<T>
) : ChannelContentMessage<T> {
constructor(
messageId: MessageId,
chat: PreviewChannelChat,
content: T,
date: DateTime,
editDate: DateTime?,
hasProtectedContent: Boolean,
forwardInfo: ForwardInfo,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
messageId, chat, content, date, editDate, hasProtectedContent, forwardInfo.messageOrigin(), replyTo, replyMarkup, senderBot, authorSignature, mediaGroupId
)
}

View File

@@ -1,6 +1,7 @@
package dev.inmo.tgbotapi.types.message.ChatEvents
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.CommonEvent
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
data class PinnedMessage(

View File

@@ -57,3 +57,55 @@ sealed interface ForwardInfo {
}
}
}
fun MessageOrigin.forwardInfo() = when(this) {
is MessageOrigin.HiddenUser -> ForwardInfo.ByAnonymous(
date,
name
)
is MessageOrigin.Public.Channel -> ForwardInfo.PublicChat.FromChannel(
date,
messageId,
chat,
authorSignature
)
is MessageOrigin.Public.Sender -> when (chat) {
is ChannelChat -> ForwardInfo.PublicChat.SentByChannel(
date,
chat
)
is SupergroupChat -> ForwardInfo.PublicChat.FromSupergroup(
date,
chat
)
}
is MessageOrigin.User -> ForwardInfo.ByUser(
date,
user
)
}
fun ForwardInfo.messageOrigin() = when (this) {
is ForwardInfo.ByAnonymous -> MessageOrigin.HiddenUser(
senderName,
dateOfOriginal
)
is ForwardInfo.ByUser -> MessageOrigin.User(
user,
dateOfOriginal
)
is ForwardInfo.PublicChat.FromChannel -> MessageOrigin.Public.Channel(
channelChat,
messageId,
dateOfOriginal,
signature
)
is ForwardInfo.PublicChat.FromSupergroup -> MessageOrigin.Public.Sender(
group,
dateOfOriginal
)
is ForwardInfo.PublicChat.SentByChannel -> MessageOrigin.Public.Sender(
channelChat,
dateOfOriginal
)
}

View File

@@ -14,62 +14,133 @@ data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
override val channel: PreviewChannelChat,
override val messageId: MessageId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : ConnectedFromChannelGroupContentMessage<T>
) : ConnectedFromChannelGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
channel: PreviewChannelChat,
messageId: MessageId,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, channel, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, authorSignature, mediaGroupId
)
}
data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
override val chat: PreviewGroupChat,
override val channel: PreviewChannelChat,
override val messageId: MessageId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : UnconnectedFromChannelGroupContentMessage<T>
) : UnconnectedFromChannelGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
channel: PreviewChannelChat,
messageId: MessageId,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, channel, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, authorSignature, mediaGroupId
)
}
data class AnonymousGroupContentMessageImpl<T : MessageContent>(
override val chat: PreviewGroupChat,
override val messageId: MessageId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : AnonymousGroupContentMessage<T>
) : AnonymousGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
messageId: MessageId,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, authorSignature, mediaGroupId
)
}
data class CommonGroupContentMessageImpl<T : MessageContent>(
override val chat: PreviewGroupChat,
override val messageId: MessageId,
override val from: User,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val mediaGroupId: MediaGroupIdentifier?,
) : CommonGroupContentMessage<T>
) : CommonGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
messageId: MessageId,
from: User,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, messageId, from, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, mediaGroupId
)
}
data class FromChannelForumContentMessageImpl<T: MessageContent>(
override val chat: PreviewForumChat,
@@ -77,32 +148,69 @@ data class FromChannelForumContentMessageImpl<T: MessageContent>(
override val messageId: MessageId,
override val threadId: MessageThreadId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : FromChannelForumContentMessage<T>
) : FromChannelForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
channel: PreviewChannelChat,
messageId: MessageId,
threadId: MessageThreadId,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, channel, messageId, threadId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, authorSignature, mediaGroupId
)
}
data class AnonymousForumContentMessageImpl<T : MessageContent>(
override val chat: PreviewForumChat,
override val messageId: MessageId,
override val threadId: MessageThreadId,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupIdentifier?,
) : AnonymousForumContentMessage<T>
) : AnonymousForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
messageId: MessageId,
threadId: MessageThreadId,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, messageId, threadId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, authorSignature, mediaGroupId
)
}
data class CommonForumContentMessageImpl<T : MessageContent>(
override val chat: PreviewForumChat,
@@ -110,12 +218,30 @@ data class CommonForumContentMessageImpl<T : MessageContent>(
override val threadId: MessageThreadId,
override val from: User,
override val date: DateTime,
override val forwardInfo: ForwardInfo?,
override val forwardOrigin: MessageOrigin?,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val replyTo: Message?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val content: T,
override val senderBot: CommonBot?,
override val mediaGroupId: MediaGroupIdentifier?,
) : CommonForumContentMessage<T>
) : CommonForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
messageId: MessageId,
threadId: MessageThreadId,
from: User,
date: DateTime,
forwardInfo: ForwardInfo,
editDate: DateTime?,
hasProtectedContent: Boolean,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
content: T,
senderBot: CommonBot?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
chat, messageId, threadId, from, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo, replyMarkup, content, senderBot, mediaGroupId
)
}

View File

@@ -0,0 +1,179 @@
package dev.inmo.tgbotapi.types.message
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.chat.*
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Required
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.decodeFromJsonElement
@Serializable(MessageOrigin.Companion::class)
sealed interface MessageOrigin {
val type: String
val date: TelegramDate
@Serializable
data class User(
@SerialName(senderUserField)
val user: PreviewUser,
@SerialName(dateField)
override val date: TelegramDate
) : MessageOrigin {
@SerialName(typeField)
@Required
override val type: String = Companion.type
companion object {
val type: String = "user"
}
}
@Serializable
data class HiddenUser(
@SerialName(senderUserNameField)
val name: String,
@SerialName(dateField)
override val date: TelegramDate
) : MessageOrigin {
@SerialName(typeField)
@Required
override val type: String = Companion.type
companion object {
val type: String = "hidden_user"
}
}
@Serializable(MessageOrigin.Companion::class)
sealed interface Public : MessageOrigin {
val chat: PublicChat
val authorSignature: AuthorSignature?
@Serializable
data class Sender(
@SerialName(senderChatField)
override val chat: SuperPublicChat,
@SerialName(dateField)
override val date: TelegramDate,
@SerialName(authorSignatureField)
override val authorSignature: AuthorSignature? = null
) : Public {
@SerialName(typeField)
@Required
override val type: String = Companion.type
companion object {
val type: String = "chat"
}
}
@Serializable
data class Channel(
@SerialName(chatField)
override val chat: ChannelChat,
@SerialName(messageIdField)
val messageId: MessageId,
@SerialName(dateField)
override val date: TelegramDate,
@SerialName(authorSignatureField)
override val authorSignature: AuthorSignature? = null
) : Public {
@SerialName(typeField)
@Required
override val type: String = Companion.type
companion object {
val type: String = "channel"
}
}
}
@Serializable
data class Unknown internal constructor(
override val type: String,
override val date: TelegramDate,
val source: JsonElement?
) : MessageOrigin
@Serializable
private data class Surrogate(
@SerialName(typeField)
@Required
val type: String,
@SerialName(senderChatField)
val senderChat: PreviewChat? = null,
@SerialName(chatField)
val chat: PreviewChat? = null,
@SerialName(dateField)
val date: TelegramDate,
@SerialName(authorSignatureField)
val authorSignature: AuthorSignature? = null,
@SerialName(messageIdField)
val messageId: MessageId? = null,
@SerialName(senderUserNameField)
val name: String? = null,
@SerialName(senderUserField)
val user: PreviewUser? = null
)
companion object : KSerializer<MessageOrigin> {
override val descriptor: SerialDescriptor
get() = Surrogate.serializer().descriptor
override fun deserialize(decoder: Decoder): MessageOrigin {
val (surrogate, json) = if (decoder is JsonDecoder) {
val json = decoder.decodeJsonElement()
val surrogate = decoder.json.decodeFromJsonElement(Surrogate.serializer(), json)
surrogate to json
} else {
Surrogate.serializer().deserialize(decoder) to null
}
return let {
when (surrogate.type) {
HiddenUser.type -> HiddenUser(
surrogate.name ?: return@let null,
surrogate.date
)
Public.Channel.type -> Public.Channel(
surrogate.chat as? ChannelChat ?: return@let null,
surrogate.messageId ?: return@let null,
surrogate.date,
surrogate.authorSignature
)
Public.Sender.type -> Public.Sender(
surrogate.senderChat as? ChannelChat ?: return@let null,
surrogate.date,
surrogate.authorSignature
)
User.type -> User(
surrogate.user ?: return@let null,
surrogate.date
)
else -> null
}
} ?: Unknown(
surrogate.type,
surrogate.date,
json
)
}
override fun serialize(encoder: Encoder, value: MessageOrigin) {
when (value) {
is HiddenUser -> HiddenUser.serializer().serialize(encoder, value)
is Public.Channel -> Public.Channel.serializer().serialize(encoder, value)
is Public.Sender -> Public.Sender.serializer().serialize(encoder, value)
is Unknown -> value.source ?.let { JsonElement.serializer().serialize(encoder, it) } ?: Unknown.serializer().serialize(encoder, value)
is User -> User.serializer().serialize(encoder, value)
}
}
}
}

View File

@@ -3,10 +3,9 @@ package dev.inmo.tgbotapi.types.message
import korlibs.time.DateTime
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.abstracts.FromUserMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.passport.PassportData
data class PassportMessage(
@@ -15,4 +14,4 @@ data class PassportMessage(
override val from: User,
override val date: DateTime,
val passportData: PassportData
) : Message, FromUserMessage
) : AccessibleMessage, FromUserMessage

View File

@@ -6,7 +6,7 @@ import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.chat.*
import dev.inmo.tgbotapi.types.chat.CommonBot
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
@@ -18,9 +18,26 @@ data class PrivateContentMessageImpl<T: MessageContent>(
override val date: DateTime,
override val editDate: DateTime?,
override val hasProtectedContent: Boolean,
override val forwardInfo: ForwardInfo?,
override val replyTo: Message?,
override val forwardOrigin: MessageOrigin?,
override val replyTo: AccessibleMessage?,
override val replyMarkup: InlineKeyboardMarkup?,
override val senderBot: CommonBot?,
override val mediaGroupId: MediaGroupIdentifier?,
) : PrivateContentMessage<T>
) : PrivateContentMessage<T> {
constructor(
messageId: MessageId,
from: User,
chat: PreviewPrivateChat,
content: T,
date: DateTime,
editDate: DateTime?,
hasProtectedContent: Boolean,
forwardInfo: ForwardInfo,
replyTo: AccessibleMessage?,
replyMarkup: InlineKeyboardMarkup?,
senderBot: CommonBot?,
mediaGroupId: MediaGroupIdentifier?,
) : this(
messageId, from, chat, content, date, editDate, hasProtectedContent, forwardInfo.messageOrigin(), replyTo, replyMarkup, senderBot, mediaGroupId
)
}

View File

@@ -9,10 +9,8 @@ import dev.inmo.tgbotapi.types.dice.Dice
import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.games.RawGame
import dev.inmo.tgbotapi.types.giveaway.Giveaway
import dev.inmo.tgbotapi.types.giveaway.GiveawayCreated
import dev.inmo.tgbotapi.types.giveaway.GiveawayPrivateResults
import dev.inmo.tgbotapi.types.giveaway.GiveawayResults
import dev.inmo.tgbotapi.types.giveaway.*
import dev.inmo.tgbotapi.types.message.content.ScheduledGiveawayContent
import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.message.ChatEvents.*
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.*
@@ -52,12 +50,8 @@ internal data class RawMessage(
private val messageThreadId: MessageThreadId? = null,
private val from: User? = null,
private val sender_chat: PreviewPublicChat? = null,
private val forward_from: User? = null,
private val forward_from_chat: Chat? = null,
private val forward_from_message_id: MessageId? = null,
private val forward_signature: ForwardSignature? = null,
private val forward_sender_name: ForwardSenderName? = null,
private val forward_date: TelegramDate? = null,
private val forward_origin: MessageOrigin? = null,
private val is_topic_message: Boolean? = null,
private val is_automatic_forward: Boolean? = null,
private val reply_to_message: RawMessage? = null,
private val via_bot: CommonBot? = null,
@@ -100,6 +94,8 @@ internal data class RawMessage(
private val invoice: Invoice? = null,
private val dice: Dice? = null,
private val successful_payment: SuccessfulPayment? = null,
private val giveaway: ScheduledGiveaway? = null,
private val giveaway_winners: GiveawayResults? = null,
private val users_shared: UsersShared? = null,
private val chat_shared: ChatShared? = null,
@@ -138,8 +134,6 @@ internal data class RawMessage(
// Giveaways
private val giveaway_created: GiveawayCreated? = null,
private val giveaway: Giveaway? = null,
private val giveaway_winners: GiveawayResults? = null,
private val giveaway_completed: GiveawayPrivateResults? = null,
) {
private val content: MessageContent? by lazy {
@@ -183,7 +177,7 @@ internal data class RawMessage(
adaptedCaptionEntities
)
photo != null -> PhotoContent(
photo.toList(),
photo,
caption,
adaptedCaptionEntities,
has_media_spoiler ?: false
@@ -197,44 +191,8 @@ internal data class RawMessage(
venue != null -> VenueContent(venue)
poll != null -> PollContent(poll)
invoice != null -> InvoiceContent(invoice)
else -> null
}
}
private val forwarded: ForwardInfo? by lazy {
forward_date
?: return@lazy null // According to the documentation, now any forwarded message contains this field
when {
forward_sender_name != null -> ForwardInfo.ByAnonymous(
forward_date,
forward_sender_name
)
forward_from_chat is ChannelChat -> if (forward_from_message_id == null) {
ForwardInfo.PublicChat.SentByChannel(
forward_date,
forward_from_chat,
forward_signature
)
} else {
ForwardInfo.PublicChat.FromChannel(
forward_date,
forward_from_message_id,
forward_from_chat,
forward_signature
)
}
forward_from_chat is SupergroupChat -> ForwardInfo.PublicChat.FromSupergroup(
forward_date,
forward_from_chat
)
forward_from != null -> ForwardInfo.ByUser(
forward_date,
forward_from
)
giveaway != null -> ScheduledGiveawayContent(chat, messageId, giveaway)
giveaway_winners is GiveawayPublicResults -> GiveawayPublicResultsContent(giveaway_winners)
else -> null
}
}
@@ -244,7 +202,7 @@ internal data class RawMessage(
new_chat_members != null -> NewChatMembers(new_chat_members.toList())
left_chat_member != null -> LeftChatMemberEvent(left_chat_member)
new_chat_title != null -> NewChatTitle(new_chat_title)
new_chat_photo != null -> NewChatPhoto(new_chat_photo.toList())
new_chat_photo != null -> NewChatPhoto(new_chat_photo)
video_chat_started != null -> video_chat_started
video_chat_scheduled != null -> video_chat_scheduled
message_auto_delete_timer_changed != null -> message_auto_delete_timer_changed
@@ -279,14 +237,20 @@ internal data class RawMessage(
users_shared != null -> users_shared
chat_shared != null -> chat_shared
giveaway_created != null -> giveaway_created
giveaway != null -> giveaway
giveaway_winners != null -> giveaway_winners
giveaway_winners is GiveawayPrivateResults -> giveaway_winners
giveaway_completed != null -> giveaway_completed
else -> null
}
}
val asMessage: Message by lazy {
val asMessage: AccessibleMessage by lazy {
if (date.date == 0L) {
return@lazy InaccessibleMessage(
chat,
messageId
)
}
try {
chatEvent?.let { chatEvent ->
when (chat) {
@@ -327,7 +291,7 @@ internal data class RawMessage(
date.asDate,
edit_date?.asDate,
has_protected_content == true,
forwarded,
forward_origin,
reply_to_message?.asMessage,
reply_markup,
via_bot,
@@ -349,7 +313,7 @@ internal data class RawMessage(
messageId,
messageThreadId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -364,7 +328,7 @@ internal data class RawMessage(
messageId,
messageThreadId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -380,7 +344,7 @@ internal data class RawMessage(
messageThreadId,
from ?: error("It is expected that in messages from non anonymous users and channels user must be specified"),
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -398,7 +362,7 @@ internal data class RawMessage(
sender_chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -414,7 +378,7 @@ internal data class RawMessage(
sender_chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -429,7 +393,7 @@ internal data class RawMessage(
chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -444,7 +408,7 @@ internal data class RawMessage(
messageId,
from ?: error("It is expected that in messages from non anonymous users and channels user must be specified"),
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -462,7 +426,7 @@ internal data class RawMessage(
sender_chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -478,7 +442,7 @@ internal data class RawMessage(
sender_chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -493,7 +457,7 @@ internal data class RawMessage(
chat,
messageId,
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -508,7 +472,7 @@ internal data class RawMessage(
messageId,
from ?: error("It is expected that in messages from non anonymous users and channels user must be specified"),
date.asDate,
forwarded,
forward_origin,
edit_date ?.asDate,
has_protected_content == true,
reply_to_message ?.asMessage,
@@ -527,7 +491,7 @@ internal data class RawMessage(
date.asDate,
edit_date?.asDate,
has_protected_content == true,
forwarded,
forward_origin,
reply_to_message?.asMessage,
reply_markup,
via_bot,

View File

@@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.ChatEvent
interface ChatEventMessage<T : ChatEvent> : Message {
interface ChatEventMessage<T : ChatEvent> : AccessibleMessage {
val chatEvent: T
}

View File

@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface CommonMessage<out T: MessageContent> : Message,
sealed interface CommonMessage<out T: MessageContent> : AccessibleMessage,
PossiblyForwardedMessage,
PossiblyEditedMessage,
PossiblyReplyMessage,

View File

@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.message.content.MessageContent
interface ContentMessage<out T: MessageContent>: Message {
interface ContentMessage<out T: MessageContent>: AccessibleMessage {
val hasProtectedContent: Boolean
val content: T

View File

@@ -2,4 +2,4 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.abstracts.FromUser
interface FromUserMessage : FromUser, Message
interface FromUserMessage : FromUser, AccessibleMessage

View File

@@ -2,21 +2,56 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.abstracts.WithMessageId
import korlibs.time.DateTime
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
import dev.inmo.tgbotapi.abstracts.WithPreviewChatAndMessageId
import dev.inmo.tgbotapi.types.ChatIdentifier
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.threadId
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlin.jvm.JvmInline
@ClassCastsIncluded(excludeRegex = ".*Impl")
interface Message : WithPreviewChatAndMessageId {
val date: DateTime
val metaInfo: MetaInfo
get() = MetaInfo(chat.id, messageId)
@Serializable
@JvmInline
value class MetaInfo(
val chatIdMessageIdThreadId: Triple<ChatIdentifier, MessageId, MessageThreadId?>
) : WithMessageId {
val chatId: ChatIdentifier
get() = chatIdMessageIdThreadId.first
override val messageId: MessageId
get() = chatIdMessageIdThreadId.second
val threadId: MessageThreadId?
get() = chatIdMessageIdThreadId.third
constructor(chatId: ChatIdentifier, messageId: MessageId, threadId: MessageThreadId? = chatId.threadId) : this(Triple(chatId, messageId, threadId))
constructor(chatIdMessageId: Pair<ChatIdentifier, MessageId>, threadId: MessageThreadId? = chatIdMessageId.first.threadId) : this(Triple(chatIdMessageId.first, chatIdMessageId.second, threadId))
fun copy(
chatId: ChatIdentifier = this.chatId, messageId: MessageId = this.messageId, threadId: MessageThreadId? = chatId.threadId
) = MetaInfo(chatId, messageId, threadId)
}
}
interface AccessibleMessage : Message
@Serializable
data class InaccessibleMessage(
override val chat: PreviewChat,
override val messageId: MessageId,
) : AccessibleMessage {
override val date: DateTime
get() = DateTime.invoke(0L)
}
data class UnknownMessageType(
@@ -24,7 +59,7 @@ data class UnknownMessageType(
override val chat: PreviewChat,
override val date: DateTime,
val insideException: Exception
) : Message
) : AccessibleMessage
internal class TelegramBotAPIMessageDeserializationStrategyClass<T> : DeserializationStrategy<T> {
@OptIn(InternalSerializationApi::class)

View File

@@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
import korlibs.time.DateTime
interface PossiblyEditedMessage : Message {
interface PossiblyEditedMessage : AccessibleMessage {
val editDate: DateTime?
}

View File

@@ -1,7 +1,11 @@
package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.message.ForwardInfo
import dev.inmo.tgbotapi.types.message.MessageOrigin
import dev.inmo.tgbotapi.types.message.forwardInfo
interface PossiblyForwardedMessage : Message {
interface PossiblyForwardedMessage : AccessibleMessage {
val forwardOrigin: MessageOrigin?
val forwardInfo: ForwardInfo?
get() = forwardOrigin ?.forwardInfo()
}

View File

@@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.message.payments.abstracts.PaymentInfo
interface PossiblyPaymentMessage : Message {
interface PossiblyPaymentMessage : AccessibleMessage {
val paymentInfo: PaymentInfo?
}

View File

@@ -1,5 +1,5 @@
package dev.inmo.tgbotapi.types.message.abstracts
interface PossiblyReplyMessage {
val replyTo: Message?
val replyTo: AccessibleMessage?
}

View File

@@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.MessageThreadId
interface PossiblyTopicMessage : Message {
interface PossiblyTopicMessage : AccessibleMessage {
val threadId: MessageThreadId?
}

View File

@@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.types.message.abstracts
import dev.inmo.tgbotapi.types.AuthorSignature
interface SignedMessage : Message {
interface SignedMessage : AccessibleMessage {
val authorSignature: AuthorSignature?
}

View File

@@ -52,6 +52,8 @@ sealed interface MessageContent: ResendableContent {
subclass(StickerContent::class)
subclass(InvoiceContent::class)
subclass(StoryContent::class)
subclass(GiveawayPublicResultsContent::class)
subclass(ScheduledGiveawayContent::class)
additionalBuilder()
}
@@ -139,18 +141,6 @@ sealed interface TextedContent : MessageContent, TextedInput
sealed interface MediaContent: MessageContent {
val media: TelegramMediaFile
fun asTelegramMedia(): TelegramMedia
override fun createResend(
chatId: ChatIdentifier,
messageThreadId: MessageThreadId?,
disableNotification: Boolean,
protectContent: Boolean,
replyToMessageId: MessageId?,
allowSendingWithoutReply: Boolean?,
replyMarkup: KeyboardMarkup?
): Request<out ContentMessage<MediaContent>> {
TODO("Not yet implemented")
}
}
sealed interface SpoilerableMediaContent : MediaContent, SpoilerableData
@@ -165,5 +155,5 @@ sealed interface ResendableContent {
replyToMessageId: MessageId? = null,
allowSendingWithoutReply: Boolean? = null,
replyMarkup: KeyboardMarkup? = null
): Request<out Message>
): Request<out AccessibleMessage>
}

View File

@@ -0,0 +1,33 @@
package dev.inmo.tgbotapi.types.message.content
import dev.inmo.tgbotapi.requests.ForwardMessage
import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import kotlinx.serialization.Serializable
@Serializable
data class GiveawayPublicResultsContent(
val giveaway: GiveawayPublicResults
) : MessageContent {
override fun createResend(
chatId: ChatIdentifier,
messageThreadId: MessageThreadId?,
disableNotification: Boolean,
protectContent: Boolean,
replyToMessageId: MessageId?,
allowSendingWithoutReply: Boolean?,
replyMarkup: KeyboardMarkup?
): Request<out AccessibleMessage> {
return ForwardMessage(
giveaway.chat.id,
toChatId = chatId,
messageId = giveaway.messageId,
threadId = messageThreadId,
disableNotification = disableNotification,
protectContent = protectContent
)
}
}

View File

@@ -10,7 +10,6 @@ import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.media.TelegramMedia
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import kotlinx.serialization.Serializable

View File

@@ -0,0 +1,40 @@
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.abstracts.Request
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.giveaway.GiveawayInfo
import dev.inmo.tgbotapi.types.giveaway.ScheduledGiveaway
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class ScheduledGiveawayContent(
private val chat: Chat,
private val messageId: MessageId,
val giveaway: ScheduledGiveaway
) : MessageContent {
override fun createResend(
chatId: ChatIdentifier,
messageThreadId: MessageThreadId?,
disableNotification: Boolean,
protectContent: Boolean,
replyToMessageId: MessageId?,
allowSendingWithoutReply: Boolean?,
replyMarkup: KeyboardMarkup?
): Request<out AccessibleMessage> {
return ForwardMessage(
chat.id,
toChatId = chatId,
messageId = messageId,
threadId = messageThreadId,
disableNotification = disableNotification,
protectContent = protectContent
)
}
}

View File

@@ -7,8 +7,6 @@ import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.MessageThreadId
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyForwardedMessage
import dev.inmo.tgbotapi.types.stories.Story
import kotlinx.serialization.Serializable

View File

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

View File

@@ -17,4 +17,4 @@ data class Invoice(
override val currency: Currency,
@SerialName(totalAmountField)
override val amount: Long
) : Amounted, Currencied
) : Amounted, Currencied, ExternalReplyInfo.ContentVariant

View File

@@ -49,7 +49,7 @@ val LongSeconds.asExactScheduledCloseInfo
@Serializable(PollSerializer::class)
@ClassCastsIncluded
sealed interface Poll {
sealed interface Poll : ExternalReplyInfo.ContentVariant {
val id: PollIdentifier
val question: String
val options: List<PollOption>

View File

@@ -0,0 +1,9 @@
package dev.inmo.tgbotapi.types.queries.callback
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface AbstractMessageCallbackQuery : CallbackQuery {
val message: Message
}

View File

@@ -0,0 +1,7 @@
package dev.inmo.tgbotapi.types.queries.callback
import dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
sealed interface InaccessibleMessageCallbackQuery : AbstractMessageCallbackQuery {
override val message: InaccessibleMessage
}

View File

@@ -0,0 +1,16 @@
package dev.inmo.tgbotapi.types.queries.callback
import dev.inmo.tgbotapi.types.CallbackQueryIdentifier
import dev.inmo.tgbotapi.types.chat.CommonUser
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
data class InaccessibleMessageDataCallbackQuery(
override val id: CallbackQueryIdentifier,
override val from: CommonUser,
override val chatInstance: String,
override val message: InaccessibleMessage,
override val data: String
) : DataCallbackQuery, InaccessibleMessageCallbackQuery

View File

@@ -0,0 +1,16 @@
package dev.inmo.tgbotapi.types.queries.callback
import dev.inmo.tgbotapi.types.CallbackQueryIdentifier
import dev.inmo.tgbotapi.types.chat.CommonUser
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.InaccessibleMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
data class InaccessibleMessageGameShortNameCallbackQuery(
override val id: CallbackQueryIdentifier,
override val from: CommonUser,
override val chatInstance: String,
override val message: InaccessibleMessage,
override val gameShortName: String
) : GameShortNameCallbackQuery, InaccessibleMessageCallbackQuery

View File

@@ -3,6 +3,6 @@ package dev.inmo.tgbotapi.types.queries.callback
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
sealed interface MessageCallbackQuery : CallbackQuery {
val message: ContentMessage<MessageContent>
sealed interface MessageCallbackQuery : AbstractMessageCallbackQuery {
override val message: ContentMessage<MessageContent>
}

View File

@@ -16,7 +16,7 @@ internal data class RawCallbackQuery(
@SerialName(fromField)
val from: CommonUser,
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
val message: ContentMessage<MessageContent>? = null,
val message: Message? = null,
@SerialName(inlineMessageIdField)
val inlineMessageId: InlineMessageIdentifier? = null,
@SerialName("chat_instance")
@@ -28,8 +28,26 @@ internal data class RawCallbackQuery(
private var inited: CallbackQuery? = null
fun asCallbackQuery(raw: String): CallbackQuery {
return inited ?: when {
message != null && data != null -> MessageDataCallbackQuery(id, from, chatInstance, message, data)
message != null && gameShortName != null -> MessageGameShortNameCallbackQuery(id, from, chatInstance, message, gameShortName)
message != null && data != null -> when {
message is ContentMessage<*> -> MessageDataCallbackQuery(id, from, chatInstance, message, data)
message is InaccessibleMessage -> InaccessibleMessageDataCallbackQuery(id, from, chatInstance, message, data)
else -> UnknownCallbackQueryType(
id,
from,
chatInstance,
raw
)
}
message != null && gameShortName != null -> when {
message is ContentMessage<*> -> MessageGameShortNameCallbackQuery(id, from, chatInstance, message, gameShortName)
message is InaccessibleMessage -> InaccessibleMessageGameShortNameCallbackQuery(id, from, chatInstance, message, gameShortName)
else -> UnknownCallbackQueryType(
id,
from,
chatInstance,
raw
)
}
inlineMessageId != null && data != null -> InlineMessageIdDataCallbackQuery(id, from, chatInstance, inlineMessageId, data)
inlineMessageId != null && gameShortName != null -> InlineMessageIdGameShortNameCallbackQuery(id, from, chatInstance, inlineMessageId, gameShortName)
else -> UnknownCallbackQueryType(

View File

@@ -1,6 +1,7 @@
package dev.inmo.tgbotapi.types.stories
import dev.inmo.tgbotapi.types.ExternalReplyInfo
import kotlinx.serialization.Serializable
@Serializable
class Story
class Story : ExternalReplyInfo.ContentVariant

View File

@@ -1,12 +1,12 @@
package dev.inmo.tgbotapi.types.update
import dev.inmo.tgbotapi.types.UpdateIdentifier
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate
data class ChannelPostUpdate(
override val updateId: UpdateIdentifier,
override val data: Message
override val data: AccessibleMessage
) : BaseSentMessageUpdate {
override fun copy(newData: Message): BaseSentMessageUpdate = copy(updateId, newData)
override fun copy(newData: AccessibleMessage): BaseSentMessageUpdate = copy(updateId, newData)
}

View File

@@ -1,12 +1,12 @@
package dev.inmo.tgbotapi.types.update
import dev.inmo.tgbotapi.types.UpdateIdentifier
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate
data class MessageUpdate(
override val updateId: UpdateIdentifier,
override val data: Message
override val data: AccessibleMessage
) : BaseSentMessageUpdate {
override fun copy(newData: Message) = copy(updateId, newData)
override fun copy(newData: AccessibleMessage) = copy(updateId, newData)
}

View File

@@ -28,11 +28,11 @@ internal data class RawUpdate constructor(
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
private val edited_message: CommonMessage<*>? = null,
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
private val message: Message? = null,
private val message: AccessibleMessage? = null,
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
private val edited_channel_post: CommonMessage<*>? = null,
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
private val channel_post: Message? = null,
private val channel_post: AccessibleMessage? = null,
private val inline_query: RawInlineQuery? = null,
private val chosen_inline_result: RawChosenInlineResult? = null,
private val callback_query: RawCallbackQuery? = null,

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.types.update.abstracts
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
interface BaseMessageUpdate : Update {
override val data: Message
override val data: AccessibleMessage
}

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.types.update.abstracts
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
interface BaseSentMessageUpdate : BaseMessageUpdate {
fun copy(newData: Message): BaseSentMessageUpdate
fun copy(newData: AccessibleMessage): BaseSentMessageUpdate
}

View File

@@ -23,4 +23,4 @@ data class Venue(
override val googlePlaceId: GooglePlaceId? = null,
@SerialName(googlePlaceTypeField)
override val googlePlaceType: GooglePlaceType? = null
) : CommonVenueData, Locationed by location
) : CommonVenueData, Locationed by location, ExternalReplyInfo.ContentVariant

View File

@@ -1,6 +1,5 @@
package dev.inmo.tgbotapi.utils.extensions
import dev.inmo.tgbotapi.types.MediaGroupIdentifier
import dev.inmo.tgbotapi.types.message.AnonymousForumContentMessageImpl
import dev.inmo.tgbotapi.types.message.AnonymousGroupContentMessageImpl
import dev.inmo.tgbotapi.types.message.ChannelContentMessageImpl
@@ -15,7 +14,6 @@ import dev.inmo.tgbotapi.types.message.abstracts.AnonymousGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage
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.ConnectedFromChannelGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.FromChannelForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.PossiblySentViaBotCommonMessage
@@ -41,7 +39,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.date,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.replyTo,
sourceMessage.replyMarkup,
sourceMessage.senderBot,
@@ -56,7 +54,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.date,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.replyTo,
sourceMessage.replyMarkup,
sourceMessage.senderBot,
@@ -66,7 +64,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.chat,
sourceMessage.messageId,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -81,7 +79,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.messageId,
sourceMessage.user,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -95,7 +93,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.channel,
sourceMessage.messageId,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -110,7 +108,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.channel,
sourceMessage.messageId,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -125,7 +123,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.messageId,
sourceMessage.threadId,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -141,7 +139,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.threadId,
sourceMessage.user,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,
@@ -156,7 +154,7 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
sourceMessage.messageId,
sourceMessage.threadId,
sourceMessage.date,
sourceMessage.forwardInfo,
sourceMessage.forwardOrigin,
sourceMessage.editDate,
sourceMessage.hasProtectedContent,
sourceMessage.replyTo,

View File

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

View File

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

View File

@@ -197,11 +197,8 @@ import dev.inmo.tgbotapi.types.files.VideoFile
import dev.inmo.tgbotapi.types.files.VideoNoteFile
import dev.inmo.tgbotapi.types.files.VideoSticker
import dev.inmo.tgbotapi.types.files.VoiceFile
import dev.inmo.tgbotapi.types.giveaway.Giveaway
import dev.inmo.tgbotapi.types.giveaway.GiveawayCreated
import dev.inmo.tgbotapi.types.giveaway.GiveawayPrivateResults
import dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
import dev.inmo.tgbotapi.types.giveaway.GiveawayResults
import dev.inmo.tgbotapi.types.location.LiveLocation
import dev.inmo.tgbotapi.types.location.Location
import dev.inmo.tgbotapi.types.location.StaticLocation
@@ -260,6 +257,7 @@ import dev.inmo.tgbotapi.types.message.CommonSupergroupEventMessage
import dev.inmo.tgbotapi.types.message.ForwardInfo
import dev.inmo.tgbotapi.types.message.PassportMessage
import dev.inmo.tgbotapi.types.message.PrivateEventMessage
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.AnonymousForumContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.AnonymousGroupContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.ChannelContentMessage
@@ -275,6 +273,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.FromChannelGroupContentMessage
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.InaccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyEditedMessage
import dev.inmo.tgbotapi.types.message.abstracts.PossiblyForwardedMessage
@@ -296,6 +295,7 @@ import dev.inmo.tgbotapi.types.message.content.DiceContent
import dev.inmo.tgbotapi.types.message.content.DocumentContent
import dev.inmo.tgbotapi.types.message.content.DocumentMediaGroupPartContent
import dev.inmo.tgbotapi.types.message.content.GameContent
import dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent
import dev.inmo.tgbotapi.types.message.content.InvoiceContent
import dev.inmo.tgbotapi.types.message.content.LiveLocationContent
import dev.inmo.tgbotapi.types.message.content.LocationContent
@@ -308,6 +308,7 @@ import dev.inmo.tgbotapi.types.message.content.MessageContent
import dev.inmo.tgbotapi.types.message.content.PhotoContent
import dev.inmo.tgbotapi.types.message.content.PollContent
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.StaticLocationContent
import dev.inmo.tgbotapi.types.message.content.StickerContent
@@ -414,9 +415,13 @@ import dev.inmo.tgbotapi.types.polls.QuizPoll
import dev.inmo.tgbotapi.types.polls.RegularPoll
import dev.inmo.tgbotapi.types.polls.ScheduledCloseInfo
import dev.inmo.tgbotapi.types.polls.UnknownPollType
import dev.inmo.tgbotapi.types.queries.callback.AbstractMessageCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.CallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.DataCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.GameShortNameCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageDataCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageGameShortNameCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InlineMessageIdCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InlineMessageIdDataCallbackQuery
import dev.inmo.tgbotapi.types.queries.callback.InlineMessageIdGameShortNameCallbackQuery
@@ -841,6 +846,16 @@ public inline fun WithUser.pollAnswerOrThrow(): PollAnswer = this as
public inline fun <T> WithUser.ifPollAnswer(block: (PollAnswer) -> T): T? = pollAnswerOrNull()
?.let(block)
public inline fun WithUser.abstractMessageCallbackQueryOrNull(): AbstractMessageCallbackQuery? =
this as? dev.inmo.tgbotapi.types.queries.callback.AbstractMessageCallbackQuery
public inline fun WithUser.abstractMessageCallbackQueryOrThrow(): AbstractMessageCallbackQuery =
this as dev.inmo.tgbotapi.types.queries.callback.AbstractMessageCallbackQuery
public inline fun <T>
WithUser.ifAbstractMessageCallbackQuery(block: (AbstractMessageCallbackQuery) -> T): T? =
abstractMessageCallbackQueryOrNull() ?.let(block)
public inline fun WithUser.callbackQueryOrNull(): CallbackQuery? = this as?
dev.inmo.tgbotapi.types.queries.callback.CallbackQuery
@@ -878,6 +893,42 @@ public inline fun <T>
WithUser.ifGameShortNameCallbackQuery(block: (GameShortNameCallbackQuery) -> T): T? =
gameShortNameCallbackQueryOrNull() ?.let(block)
public inline fun WithUser.inaccessibleMessageCallbackQueryOrNull():
InaccessibleMessageCallbackQuery? = this as?
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageCallbackQuery
public inline fun WithUser.inaccessibleMessageCallbackQueryOrThrow():
InaccessibleMessageCallbackQuery = this as
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageCallbackQuery
public inline fun <T>
WithUser.ifInaccessibleMessageCallbackQuery(block: (InaccessibleMessageCallbackQuery) -> T): T?
= inaccessibleMessageCallbackQueryOrNull() ?.let(block)
public inline fun WithUser.inaccessibleMessageDataCallbackQueryOrNull():
InaccessibleMessageDataCallbackQuery? = this as?
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageDataCallbackQuery
public inline fun WithUser.inaccessibleMessageDataCallbackQueryOrThrow():
InaccessibleMessageDataCallbackQuery = this as
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageDataCallbackQuery
public inline fun <T>
WithUser.ifInaccessibleMessageDataCallbackQuery(block: (InaccessibleMessageDataCallbackQuery) -> T):
T? = inaccessibleMessageDataCallbackQueryOrNull() ?.let(block)
public inline fun WithUser.inaccessibleMessageGameShortNameCallbackQueryOrNull():
InaccessibleMessageGameShortNameCallbackQuery? = this as?
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageGameShortNameCallbackQuery
public inline fun WithUser.inaccessibleMessageGameShortNameCallbackQueryOrThrow():
InaccessibleMessageGameShortNameCallbackQuery = this as
dev.inmo.tgbotapi.types.queries.callback.InaccessibleMessageGameShortNameCallbackQuery
public inline fun <T>
WithUser.ifInaccessibleMessageGameShortNameCallbackQuery(block: (InaccessibleMessageGameShortNameCallbackQuery) -> T):
T? = inaccessibleMessageGameShortNameCallbackQueryOrNull() ?.let(block)
public inline fun WithUser.inlineMessageIdCallbackQueryOrNull(): InlineMessageIdCallbackQuery? =
this as? dev.inmo.tgbotapi.types.queries.callback.InlineMessageIdCallbackQuery
@@ -2729,15 +2780,6 @@ public inline fun TelegramMedia.titledTelegramMediaOrThrow(): TitledTelegramMedi
public inline fun <T> TelegramMedia.ifTitledTelegramMedia(block: (TitledTelegramMedia) -> T): T? =
titledTelegramMediaOrNull() ?.let(block)
public inline fun ChatEvent.giveawayOrNull(): Giveaway? = this as?
dev.inmo.tgbotapi.types.giveaway.Giveaway
public inline fun ChatEvent.giveawayOrThrow(): Giveaway = this as
dev.inmo.tgbotapi.types.giveaway.Giveaway
public inline fun <T> ChatEvent.ifGiveaway(block: (Giveaway) -> T): T? = giveawayOrNull()
?.let(block)
public inline fun ChatEvent.giveawayCreatedOrNull(): GiveawayCreated? = this as?
dev.inmo.tgbotapi.types.giveaway.GiveawayCreated
@@ -2756,24 +2798,6 @@ public inline fun ChatEvent.giveawayPrivateResultsOrThrow(): GiveawayPrivateResu
public inline fun <T> ChatEvent.ifGiveawayPrivateResults(block: (GiveawayPrivateResults) -> T): T? =
giveawayPrivateResultsOrNull() ?.let(block)
public inline fun ChatEvent.giveawayPublicResultsOrNull(): GiveawayPublicResults? = this as?
dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
public inline fun ChatEvent.giveawayPublicResultsOrThrow(): GiveawayPublicResults = this as
dev.inmo.tgbotapi.types.giveaway.GiveawayPublicResults
public inline fun <T> ChatEvent.ifGiveawayPublicResults(block: (GiveawayPublicResults) -> T): T? =
giveawayPublicResultsOrNull() ?.let(block)
public inline fun ChatEvent.giveawayResultsOrNull(): GiveawayResults? = this as?
dev.inmo.tgbotapi.types.giveaway.GiveawayResults
public inline fun ChatEvent.giveawayResultsOrThrow(): GiveawayResults = this as
dev.inmo.tgbotapi.types.giveaway.GiveawayResults
public inline fun <T> ChatEvent.ifGiveawayResults(block: (GiveawayResults) -> T): T? =
giveawayResultsOrNull() ?.let(block)
public inline fun ChatEvent.channelChatCreatedOrNull(): ChannelChatCreated? = this as?
dev.inmo.tgbotapi.types.message.ChatEvents.ChannelChatCreated
@@ -3396,6 +3420,24 @@ public inline fun <T>
Message.ifCommonForumContentMessage(block: (CommonForumContentMessage<MessageContent>) -> T): T?
= commonForumContentMessageOrNull() ?.let(block)
public inline fun Message.accessibleMessageOrNull(): AccessibleMessage? = this as?
dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
public inline fun Message.accessibleMessageOrThrow(): AccessibleMessage = this as
dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
public inline fun <T> Message.ifAccessibleMessage(block: (AccessibleMessage) -> T): T? =
accessibleMessageOrNull() ?.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
public inline fun <T> Message.ifInaccessibleMessage(block: (InaccessibleMessage) -> T): T? =
inaccessibleMessageOrNull() ?.let(block)
public inline fun Message.unknownMessageTypeOrNull(): UnknownMessageType? = this as?
dev.inmo.tgbotapi.types.message.abstracts.UnknownMessageType
@@ -3678,6 +3720,18 @@ public inline fun ResendableContent.gameContentOrThrow(): GameContent = this as
public inline fun <T> ResendableContent.ifGameContent(block: (GameContent) -> T): T? =
gameContentOrNull() ?.let(block)
public inline fun ResendableContent.giveawayPublicResultsContentOrNull():
GiveawayPublicResultsContent? = this as?
dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent
public inline fun ResendableContent.giveawayPublicResultsContentOrThrow():
GiveawayPublicResultsContent = this as
dev.inmo.tgbotapi.types.message.content.GiveawayPublicResultsContent
public inline fun <T>
ResendableContent.ifGiveawayPublicResultsContent(block: (GiveawayPublicResultsContent) -> T): T?
= giveawayPublicResultsContentOrNull() ?.let(block)
public inline fun ResendableContent.invoiceContentOrNull(): InvoiceContent? = this as?
dev.inmo.tgbotapi.types.message.content.InvoiceContent
@@ -3745,6 +3799,16 @@ public inline fun ResendableContent.pollContentOrThrow(): PollContent = this as
public inline fun <T> ResendableContent.ifPollContent(block: (PollContent) -> T): T? =
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?
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.Username
import dev.inmo.tgbotapi.types.chat.Chat
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.threadId
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]
*/
@Suppress("NOTHING_TO_INLINE")
inline fun WithPreviewChat.sameChat(other: Message) = sameChat(other.chat)
inline fun WithPreviewChat.sameChat(other: AccessibleMessage) = sameChat(other.chat)
/**
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [Message.messageId]
* @return true in case if [this] message is from the same chat (with id == [chatId]) and [this] [AccessibleMessage.messageId]
* equal [messageId] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameMessage(
inline fun AccessibleMessage.sameMessage(
chatId: ChatIdentifier,
messageId: MessageId
) = sameChat(chatId) && this.messageId == messageId
/**
* @return true in case if [this] message is from the same [chat] and [this] [Message.messageId] equal [messageId]
* @return true in case if [this] message is from the same [chat] and [this] [AccessibleMessage.messageId] equal [messageId]
* identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameMessage(
inline fun AccessibleMessage.sameMessage(
chat: Chat,
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
* and have equal [Message.messageId] identifier
* and have equal [AccessibleMessage.messageId] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameMessage(other: Message) = sameMessage(other.chat, other.messageId)
inline fun AccessibleMessage.sameMessage(other: AccessibleMessage) = sameMessage(other.chat, other.messageId)
/**
* 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
* messages from one chat and have equal [Message.threadIdOrNull] identifier
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameTopic(
inline fun AccessibleMessage.sameTopic(
chatId: ChatIdentifier,
threadId: MessageThreadId? = chatId.threadId
) = sameChat(chatId) && threadIdOrNull == threadId
@@ -77,10 +77,10 @@ inline fun Message.sameTopic(
* 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
* messages from one chat and have equal [Message.threadIdOrNull] identifier
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameThread(
inline fun AccessibleMessage.sameThread(
chatId: ChatIdentifier,
threadId: MessageThreadId? = chatId.threadId
) = sameTopic(chatId, threadId)
@@ -89,10 +89,10 @@ inline fun Message.sameThread(
* 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
* messages from one chat and have equal [Message.threadIdOrNull] identifier
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameTopic(
inline fun AccessibleMessage.sameTopic(
chat: Chat,
threadId: MessageThreadId? = chat.id.threadId
) = sameTopic(chat.id, threadId)
@@ -101,10 +101,10 @@ inline fun Message.sameTopic(
* 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
* messages from one chat and have equal [Message.threadIdOrNull] identifier
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameThread(
inline fun AccessibleMessage.sameThread(
chat: Chat,
threadId: MessageThreadId? = chat.id.threadId
) = sameThread(chat.id, threadId)
@@ -113,16 +113,16 @@ inline fun Message.sameThread(
* 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
* messages from one chat and have equal [Message.threadIdOrNull] identifier
* messages from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameTopic(other: Message) = sameTopic(other.chat, other.threadIdOrNull)
inline fun AccessibleMessage.sameTopic(other: AccessibleMessage) = sameTopic(other.chat, other.threadIdOrNull)
/**
* 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
* from one chat and have equal [Message.threadIdOrNull] identifier
* from one chat and have equal [AccessibleMessage.threadIdOrNull] identifier
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Message.sameThread(other: Message) = sameTopic(other)
inline fun AccessibleMessage.sameThread(other: AccessibleMessage) = sameTopic(other)

View File

@@ -18,9 +18,8 @@ import dev.inmo.tgbotapi.utils.PreviewFeature
fun CallbackQuery.sourceChat() = when (this) {
is InlineMessageIdDataCallbackQuery -> null
is MessageDataCallbackQuery -> message.chat
is AbstractMessageCallbackQuery -> message.chat
is InlineMessageIdGameShortNameCallbackQuery -> null
is MessageGameShortNameCallbackQuery -> message.chat
is UnknownCallbackQueryType -> null
}

View File

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

View File

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