mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2025-09-16 13:49:26 +00:00
add boosts support
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
package dev.inmo.tgbotapi.abstracts
|
||||
|
||||
import dev.inmo.tgbotapi.types.MessageId
|
||||
|
||||
/**
|
||||
* All inheritors of this interface have [messageId] field and related to this [messageId]
|
||||
*/
|
||||
interface WithMessageId {
|
||||
val messageId: MessageId
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
package dev.inmo.tgbotapi.abstracts
|
||||
|
||||
interface WithPreviewChatAndMessageId : WithPreviewChat, WithMessageId
|
@@ -1,7 +1,5 @@
|
||||
package dev.inmo.tgbotapi.abstracts.types
|
||||
|
||||
import dev.inmo.tgbotapi.types.MessageId
|
||||
import dev.inmo.tgbotapi.abstracts.WithMessageId
|
||||
|
||||
interface MessageAction: ChatRequest {
|
||||
val messageId: MessageId
|
||||
}
|
||||
interface MessageAction : ChatRequest, WithMessageId
|
||||
|
@@ -0,0 +1,24 @@
|
||||
package dev.inmo.tgbotapi.requests.get
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.types.ChatRequest
|
||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.boosts.UserChatBoosts
|
||||
import kotlinx.serialization.DeserializationStrategy
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.SerializationStrategy
|
||||
|
||||
@Serializable
|
||||
data class GetUserChatBoosts(
|
||||
@SerialName(chatIdField)
|
||||
override val chatId: ChatIdentifier,
|
||||
@SerialName(userIdField)
|
||||
val userId: UserId
|
||||
) : SimpleRequest<UserChatBoosts>, ChatRequest {
|
||||
override fun method(): String = "getUserChatBoosts"
|
||||
override val resultDeserializer: DeserializationStrategy<UserChatBoosts>
|
||||
get() = UserChatBoosts.serializer()
|
||||
override val requestSerializer: SerializationStrategy<*>
|
||||
get() = serializer()
|
||||
}
|
@@ -202,6 +202,7 @@ const val tgWebAppStartParamField = "tgWebAppStartParam"
|
||||
const val chatIdField = "chat_id"
|
||||
const val senderChatIdField = "sender_chat_id"
|
||||
const val messageIdField = "message_id"
|
||||
const val giveawayMessageIdField = "giveaway_message_id"
|
||||
const val messageIdsField = "message_ids"
|
||||
const val actorChatField = "actor_chat"
|
||||
const val messageThreadIdField = "message_thread_id"
|
||||
@@ -609,6 +610,7 @@ const val secretField = "secret"
|
||||
|
||||
const val errorsField = "errors"
|
||||
const val sourceField = "source"
|
||||
const val isUnclaimedField = "is_unclaimed"
|
||||
const val fieldNameField = "field_name"
|
||||
const val dataHashField = "data_hash"
|
||||
const val fileHashField = "file_hash"
|
||||
@@ -634,3 +636,10 @@ const val buttonTextField = "button_text"
|
||||
const val webAppField = "web_app"
|
||||
const val webAppNameField = "web_app_name"
|
||||
const val menuButtonField = "menu_button"
|
||||
|
||||
const val boostIdField = "boost_id"
|
||||
const val boostField = "boost"
|
||||
const val addDateField = "add_date"
|
||||
const val expirationDateField = "expiration_date"
|
||||
const val removeDateField = "remove_date"
|
||||
const val boostsField = "boosts"
|
||||
|
@@ -0,0 +1,10 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlin.jvm.JvmInline
|
||||
|
||||
@Serializable
|
||||
@JvmInline
|
||||
value class BoostId(
|
||||
val string: String
|
||||
)
|
@@ -0,0 +1,17 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ChatBoost(
|
||||
@SerialName(boostIdField)
|
||||
val id: BoostId,
|
||||
@SerialName(addDateField)
|
||||
val addDate: TelegramDate,
|
||||
@SerialName(expirationDateField)
|
||||
val expirationDate: TelegramDate,
|
||||
@SerialName(sourceField)
|
||||
val source: ChatBoostSource
|
||||
)
|
@@ -0,0 +1,19 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ChatBoostRemoved(
|
||||
@SerialName(chatField)
|
||||
override val chat: PreviewChat,
|
||||
@SerialName(boostIdField)
|
||||
val boostId: BoostId,
|
||||
@SerialName(removeDateField)
|
||||
val removeDate: TelegramDate,
|
||||
@SerialName(sourceField)
|
||||
val source: ChatBoostSource
|
||||
) : WithPreviewChat
|
@@ -0,0 +1,171 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.WithMessageId
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.chat.PreviewUser
|
||||
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
|
||||
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(ChatBoostSource.Companion::class)
|
||||
@ClassCastsIncluded
|
||||
sealed interface ChatBoostSource {
|
||||
val sourceName: String
|
||||
val user: PreviewUser?
|
||||
|
||||
sealed interface ByUser : ChatBoostSource {
|
||||
override val user: PreviewUser
|
||||
}
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
data class Premium(
|
||||
@SerialName(userField)
|
||||
override val user: PreviewUser
|
||||
) : ByUser {
|
||||
@Required
|
||||
@SerialName(sourceField)
|
||||
override val sourceName: String = sourceCode
|
||||
|
||||
companion object {
|
||||
const val sourceCode = "premium"
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
data class GiftCode(
|
||||
@SerialName(userField)
|
||||
override val user: PreviewUser
|
||||
) : ByUser {
|
||||
@Required
|
||||
@SerialName(sourceField)
|
||||
override val sourceName: String = sourceCode
|
||||
|
||||
companion object {
|
||||
const val sourceCode = "gift_code"
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
sealed interface Giveaway : ChatBoostSource, WithMessageId {
|
||||
val unclaimed: Boolean
|
||||
val claimed: Boolean
|
||||
get() = !unclaimed
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
data class Claimed(
|
||||
@SerialName(giveawayMessageIdField)
|
||||
override val messageId: MessageId,
|
||||
@SerialName(userField)
|
||||
override val user: PreviewUser
|
||||
) : Giveaway, ByUser {
|
||||
@Required
|
||||
@SerialName(sourceField)
|
||||
override val sourceName: String = Giveaway.sourceCode
|
||||
@Required
|
||||
@SerialName(isUnclaimedField)
|
||||
override val unclaimed: Boolean = false
|
||||
}
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
data class Unclaimed(
|
||||
@SerialName(giveawayMessageIdField)
|
||||
override val messageId: MessageId
|
||||
) : Giveaway {
|
||||
@Required
|
||||
@SerialName(sourceField)
|
||||
override val sourceName: String = Giveaway.sourceCode
|
||||
@Required
|
||||
@SerialName(isUnclaimedField)
|
||||
override val unclaimed: Boolean = true
|
||||
@SerialName(userField)
|
||||
override val user: PreviewUser? = null
|
||||
}
|
||||
|
||||
companion object {
|
||||
val sourceCode = "giveaway"
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable(ChatBoostSource.Companion::class)
|
||||
data class Unknown(
|
||||
override val sourceName: String,
|
||||
override val user: PreviewUser?,
|
||||
val json: JsonElement?
|
||||
) : ChatBoostSource
|
||||
|
||||
@Serializable
|
||||
private data class Surrogate(
|
||||
@Required
|
||||
@SerialName(sourceField)
|
||||
val sourceName: String,
|
||||
@SerialName(userField)
|
||||
val user: PreviewUser? = null,
|
||||
@SerialName(giveawayMessageIdField)
|
||||
val messageId: MessageId? = null,
|
||||
@SerialName(isUnclaimedField)
|
||||
val unclaimed: Boolean? = null
|
||||
)
|
||||
|
||||
companion object : KSerializer<ChatBoostSource> {
|
||||
override val descriptor: SerialDescriptor
|
||||
get() = Surrogate.serializer().descriptor
|
||||
|
||||
override fun deserialize(decoder: Decoder): ChatBoostSource {
|
||||
val (surrogate, json) = when {
|
||||
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 when {
|
||||
surrogate.sourceName == Premium.sourceCode && surrogate.user != null -> {
|
||||
Premium(surrogate.user)
|
||||
}
|
||||
surrogate.sourceName == GiftCode.sourceCode && surrogate.user != null -> {
|
||||
GiftCode(surrogate.user)
|
||||
}
|
||||
surrogate.sourceName == Giveaway.sourceCode && surrogate.messageId != null -> {
|
||||
when {
|
||||
surrogate.user != null && surrogate.unclaimed == false -> Giveaway.Claimed(
|
||||
surrogate.messageId,
|
||||
surrogate.user
|
||||
)
|
||||
surrogate.unclaimed == true -> Giveaway.Unclaimed(
|
||||
surrogate.messageId
|
||||
)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
else -> null
|
||||
} ?: Unknown(surrogate.sourceName, surrogate.user, json)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: ChatBoostSource) {
|
||||
if (value is Unknown && value.json != null) {
|
||||
JsonElement.serializer().serialize(encoder, value.json)
|
||||
return
|
||||
}
|
||||
|
||||
val surrogate = Surrogate(
|
||||
value.sourceName,
|
||||
value.user,
|
||||
(value as? Giveaway) ?.messageId,
|
||||
(value as? Giveaway) ?.unclaimed,
|
||||
)
|
||||
|
||||
Surrogate.serializer().serialize(encoder, surrogate)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||
import dev.inmo.tgbotapi.types.boostField
|
||||
import dev.inmo.tgbotapi.types.chat.PreviewChat
|
||||
import dev.inmo.tgbotapi.types.chatField
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ChatBoostUpdated(
|
||||
@SerialName(chatField)
|
||||
override val chat: PreviewChat,
|
||||
@SerialName(boostField)
|
||||
val boost: ChatBoost
|
||||
) : WithPreviewChat
|
@@ -0,0 +1,11 @@
|
||||
package dev.inmo.tgbotapi.types.boosts
|
||||
|
||||
import dev.inmo.tgbotapi.types.boostsField
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class UserChatBoosts(
|
||||
@SerialName(boostsField)
|
||||
val boosts: List<ChatBoost>
|
||||
)
|
@@ -1,5 +1,7 @@
|
||||
package dev.inmo.tgbotapi.types.chat
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChatAndMessageId
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.reactions.Reaction
|
||||
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
|
||||
@@ -14,9 +16,7 @@ import kotlinx.serialization.json.JsonElement
|
||||
|
||||
@Serializable(ChatMessageReactionUpdated.Companion::class)
|
||||
@ClassCastsIncluded
|
||||
sealed interface ChatMessageReactionUpdated {
|
||||
val chat: PreviewChat
|
||||
val messageId: MessageIdentifier
|
||||
sealed interface ChatMessageReactionUpdated : WithPreviewChatAndMessageId {
|
||||
val reactedUser: PreviewUser?
|
||||
val reactedChat: PreviewChat?
|
||||
val date: TelegramDate
|
||||
|
@@ -1,5 +1,7 @@
|
||||
package dev.inmo.tgbotapi.types.chat
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChat
|
||||
import dev.inmo.tgbotapi.abstracts.WithPreviewChatAndMessageId
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.reactions.ReactionsCount
|
||||
import kotlinx.serialization.SerialName
|
||||
@@ -8,12 +10,12 @@ import kotlinx.serialization.Serializable
|
||||
@Serializable
|
||||
data class ChatMessageReactionsCountUpdated(
|
||||
@SerialName(chatField)
|
||||
val chat: PreviewChat,
|
||||
override val chat: PreviewChat,
|
||||
@SerialName(messageIdField)
|
||||
val messageId: MessageIdentifier,
|
||||
override val messageId: MessageIdentifier,
|
||||
@Serializable(TelegramDateSerializer::class)
|
||||
@SerialName(dateField)
|
||||
val date: TelegramDate,
|
||||
@SerialName(reactionsField)
|
||||
val reactions: List<ReactionsCount>
|
||||
)
|
||||
) : WithPreviewChatAndMessageId
|
||||
|
@@ -1,7 +1,9 @@
|
||||
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.utils.internal.ClassCastsIncluded
|
||||
import dev.inmo.tgbotapi.types.MessageId
|
||||
import dev.inmo.tgbotapi.types.chat.Chat
|
||||
@@ -13,8 +15,7 @@ import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
|
||||
@ClassCastsIncluded(excludeRegex = ".*Impl")
|
||||
interface Message : WithPreviewChat {
|
||||
val messageId: MessageId
|
||||
interface Message : WithPreviewChatAndMessageId {
|
||||
val date: DateTime
|
||||
}
|
||||
|
||||
|
@@ -0,0 +1,14 @@
|
||||
package dev.inmo.tgbotapi.types.update
|
||||
|
||||
import dev.inmo.tgbotapi.types.UpdateIdentifier
|
||||
import dev.inmo.tgbotapi.types.boosts.ChatBoostRemoved
|
||||
import dev.inmo.tgbotapi.types.boosts.ChatBoostUpdated
|
||||
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionUpdated
|
||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ChatBoostRemovedUpdate(
|
||||
override val updateId: UpdateIdentifier,
|
||||
override val data: ChatBoostRemoved
|
||||
) : Update
|
@@ -0,0 +1,13 @@
|
||||
package dev.inmo.tgbotapi.types.update
|
||||
|
||||
import dev.inmo.tgbotapi.types.UpdateIdentifier
|
||||
import dev.inmo.tgbotapi.types.boosts.ChatBoostUpdated
|
||||
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionUpdated
|
||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class ChatBoostUpdatedUpdate(
|
||||
override val updateId: UpdateIdentifier,
|
||||
override val data: ChatBoostUpdated
|
||||
) : Update
|
@@ -4,6 +4,8 @@ import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.queries.callback.RawCallbackQuery
|
||||
import dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult.RawChosenInlineResult
|
||||
import dev.inmo.tgbotapi.types.InlineQueries.query.RawInlineQuery
|
||||
import dev.inmo.tgbotapi.types.boosts.ChatBoostRemoved
|
||||
import dev.inmo.tgbotapi.types.boosts.ChatBoostUpdated
|
||||
import dev.inmo.tgbotapi.types.chat.ChatJoinRequest
|
||||
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionUpdated
|
||||
import dev.inmo.tgbotapi.types.chat.ChatMessageReactionsCountUpdated
|
||||
@@ -42,7 +44,9 @@ internal data class RawUpdate constructor(
|
||||
private val chat_member: ChatMemberUpdated? = null,
|
||||
private val chat_join_request: ChatJoinRequest? = null,
|
||||
private val message_reaction: ChatMessageReactionUpdated? = null,
|
||||
private val message_reaction_count: ChatMessageReactionsCountUpdated? = null
|
||||
private val message_reaction_count: ChatMessageReactionsCountUpdated? = null,
|
||||
private val chat_boost: ChatBoostUpdated? = null,
|
||||
private val removed_chat_boost: ChatBoostRemoved? = null
|
||||
) {
|
||||
private var initedUpdate: Update? = null
|
||||
/**
|
||||
@@ -71,6 +75,8 @@ internal data class RawUpdate constructor(
|
||||
chat_join_request != null -> ChatJoinRequestUpdate(updateId, chat_join_request)
|
||||
message_reaction != null -> ChatMessageReactionUpdatedUpdate(updateId, message_reaction)
|
||||
message_reaction_count != null -> ChatMessageReactionsCountUpdatedUpdate(updateId, message_reaction_count)
|
||||
chat_boost != null -> ChatBoostUpdatedUpdate(updateId, chat_boost)
|
||||
removed_chat_boost != null -> ChatBoostRemovedUpdate(updateId, removed_chat_boost)
|
||||
else -> UnknownUpdate(
|
||||
updateId,
|
||||
raw
|
||||
|
@@ -39,6 +39,8 @@ interface FlowsUpdatesFilter : UpdatesFilter {
|
||||
val chatJoinRequestUpdateFlow: Flow<ChatJoinRequestUpdate>
|
||||
val chatMessageReactionUpdatedUpdateFlow: Flow<ChatMessageReactionUpdatedUpdate>
|
||||
val chatMessageReactionsCountUpdatedUpdateFlow: Flow<ChatMessageReactionsCountUpdatedUpdate>
|
||||
val chatBoostUpdatedUpdateFlow: Flow<ChatBoostUpdatedUpdate>
|
||||
val chatBoostRemovedUpdateFlow: Flow<ChatBoostRemovedUpdate>
|
||||
val unknownUpdatesFlow: Flow<UnknownUpdate>
|
||||
}
|
||||
|
||||
@@ -60,6 +62,8 @@ abstract class AbstractFlowsUpdatesFilter : FlowsUpdatesFilter {
|
||||
override val chatMessageReactionUpdatedUpdateFlow: Flow<ChatMessageReactionUpdatedUpdate> by lazy { allUpdatesFlow.filterIsInstance() }
|
||||
override val chatMessageReactionsCountUpdatedUpdateFlow: Flow<ChatMessageReactionsCountUpdatedUpdate> by lazy { allUpdatesFlow.filterIsInstance() }
|
||||
override val unknownUpdatesFlow: Flow<UnknownUpdate> by lazy { allUpdatesFlow.filterIsInstance() }
|
||||
override val chatBoostUpdatedUpdateFlow: Flow<ChatBoostUpdatedUpdate> by lazy { allUpdatesFlow.filterIsInstance() }
|
||||
override val chatBoostRemovedUpdateFlow: Flow<ChatBoostRemovedUpdate> by lazy { allUpdatesFlow.filterIsInstance() }
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user