mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-26 03:58:44 +00:00
add support of menu buttons
This commit is contained in:
parent
63bcc4bcf8
commit
7bac4a3a32
@ -0,0 +1,15 @@
|
||||
package dev.inmo.tgbotapi.extensions.api.chat.get
|
||||
|
||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.chat.get.GetChatMenuButton
|
||||
import dev.inmo.tgbotapi.requests.chat.modify.*
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.chat.abstracts.PrivateChat
|
||||
|
||||
suspend fun TelegramBot.getChatMenuButton(
|
||||
chatId: ChatId
|
||||
) = execute(GetChatMenuButton(chatId))
|
||||
|
||||
suspend fun TelegramBot.getChatMenuButton(
|
||||
chat: PrivateChat
|
||||
) = getChatMenuButton(chat.id)
|
@ -0,0 +1,8 @@
|
||||
package dev.inmo.tgbotapi.extensions.api.chat.get
|
||||
|
||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.chat.get.GetDefaultChatMenuButton
|
||||
import dev.inmo.tgbotapi.requests.chat.modify.SetDefaultChatMenuButton
|
||||
import dev.inmo.tgbotapi.types.MenuButton
|
||||
|
||||
suspend fun TelegramBot.getDefaultChatMenuButton() = execute(GetDefaultChatMenuButton)
|
@ -0,0 +1,16 @@
|
||||
package dev.inmo.tgbotapi.extensions.api.chat.modify
|
||||
|
||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.chat.modify.*
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.chat.abstracts.PrivateChat
|
||||
|
||||
suspend fun TelegramBot.setChatMenuButton(
|
||||
chatId: ChatId,
|
||||
menuButton: MenuButton
|
||||
) = execute(SetChatMenuButton(chatId, menuButton))
|
||||
|
||||
suspend fun TelegramBot.setChatMenuButton(
|
||||
chat: PrivateChat,
|
||||
menuButton: MenuButton
|
||||
) = setChatMenuButton(chat.id, menuButton)
|
@ -0,0 +1,9 @@
|
||||
package dev.inmo.tgbotapi.extensions.api.chat.modify
|
||||
|
||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.chat.modify.SetDefaultChatMenuButton
|
||||
import dev.inmo.tgbotapi.types.MenuButton
|
||||
|
||||
suspend fun TelegramBot.setDefaultChatMenuButton(
|
||||
menuButton: MenuButton
|
||||
) = execute(SetDefaultChatMenuButton(menuButton))
|
@ -2,6 +2,6 @@ package dev.inmo.tgbotapi.CommonAbstracts.types
|
||||
|
||||
import dev.inmo.tgbotapi.types.ChatIdentifier
|
||||
|
||||
interface ChatRequest {
|
||||
val chatId: ChatIdentifier
|
||||
interface ChatRequest : OptionalChatRequest {
|
||||
override val chatId: ChatIdentifier
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package dev.inmo.tgbotapi.CommonAbstracts.types
|
||||
|
||||
import dev.inmo.tgbotapi.types.ChatIdentifier
|
||||
|
||||
interface OptionalChatRequest {
|
||||
val chatId: ChatIdentifier?
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package dev.inmo.tgbotapi.requests.chat.get
|
||||
|
||||
import dev.inmo.tgbotapi.CommonAbstracts.types.ChatRequest
|
||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@Serializable
|
||||
data class GetChatMenuButton(
|
||||
@SerialName(chatIdField)
|
||||
override val chatId: ChatIdentifier
|
||||
) : ChatRequest, SimpleRequest<MenuButton> {
|
||||
override val requestSerializer: SerializationStrategy<*>
|
||||
get() = serializer()
|
||||
|
||||
override fun method(): String = GetDefaultChatMenuButton.method()
|
||||
|
||||
override val resultDeserializer: DeserializationStrategy<MenuButton>
|
||||
get() = MenuButtonSerializer
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package dev.inmo.tgbotapi.requests.chat.get
|
||||
|
||||
import dev.inmo.tgbotapi.CommonAbstracts.types.ChatRequest
|
||||
import dev.inmo.tgbotapi.CommonAbstracts.types.OptionalChatRequest
|
||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@Serializable
|
||||
object GetDefaultChatMenuButton : OptionalChatRequest, SimpleRequest<MenuButton> {
|
||||
override val chatId: ChatIdentifier?
|
||||
get() = null
|
||||
override val requestSerializer: SerializationStrategy<*>
|
||||
get() = serializer()
|
||||
|
||||
override fun method(): String = "getChatMenuButton"
|
||||
|
||||
override val resultDeserializer: DeserializationStrategy<MenuButton>
|
||||
get() = MenuButtonSerializer
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package dev.inmo.tgbotapi.requests.chat.modify
|
||||
|
||||
import dev.inmo.tgbotapi.CommonAbstracts.types.ChatRequest
|
||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@Serializable
|
||||
data class SetChatMenuButton(
|
||||
@SerialName(chatIdField)
|
||||
override val chatId: ChatIdentifier,
|
||||
@Serializable(MenuButtonSerializer::class)
|
||||
@SerialName(menuButtonField)
|
||||
val menuButton: MenuButton
|
||||
) : ChatRequest, SimpleRequest<Boolean> {
|
||||
override val requestSerializer: SerializationStrategy<*>
|
||||
get() = serializer()
|
||||
|
||||
override fun method(): String = SetDefaultChatMenuButton.method()
|
||||
|
||||
override val resultDeserializer: DeserializationStrategy<Boolean>
|
||||
get() = Boolean.serializer()
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package dev.inmo.tgbotapi.requests.chat.modify
|
||||
|
||||
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@Serializable
|
||||
data class SetDefaultChatMenuButton(
|
||||
@Serializable(MenuButtonSerializer::class)
|
||||
@SerialName(menuButtonField)
|
||||
val menuButton: MenuButton
|
||||
) : SimpleRequest<Boolean> {
|
||||
override val requestSerializer: SerializationStrategy<*>
|
||||
get() = serializer()
|
||||
|
||||
override fun method(): String = Companion.method()
|
||||
|
||||
override val resultDeserializer: DeserializationStrategy<Boolean>
|
||||
get() = Boolean.serializer()
|
||||
|
||||
companion object {
|
||||
fun method() = "setChatMenuButton"
|
||||
}
|
||||
}
|
@ -439,3 +439,5 @@ const val passportRegistrationField = "passport_registration"
|
||||
const val temporaryRegistrationField = "temporary_registration"
|
||||
|
||||
const val buttonTextField = "button_text"
|
||||
const val webAppField = "web_app"
|
||||
const val menuButtonField = "menu_button"
|
||||
|
@ -0,0 +1,122 @@
|
||||
package dev.inmo.tgbotapi.types
|
||||
|
||||
import dev.inmo.tgbotapi.types.webapps.WebAppInfo
|
||||
import dev.inmo.tgbotapi.utils.RiskFeature
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
import kotlinx.serialization.json.*
|
||||
|
||||
@Serializable(MenuButtonSerializer::class)
|
||||
sealed interface MenuButton {
|
||||
@Required
|
||||
val type: String
|
||||
|
||||
@Serializable
|
||||
object Commands : MenuButton {
|
||||
@Required
|
||||
override val type: String
|
||||
get() = "commands"
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class WebApp(
|
||||
val text: String,
|
||||
@SerialName(webAppField)
|
||||
val webApp: WebAppInfo
|
||||
) : MenuButton {
|
||||
@Required
|
||||
override val type: String
|
||||
get() = Companion.type
|
||||
|
||||
companion object {
|
||||
val type: String
|
||||
get() = "web_app"
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
object Default : MenuButton {
|
||||
@Required
|
||||
override val type: String
|
||||
get() = "default"
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@RiskFeature
|
||||
data class Unknown (
|
||||
override val type: String,
|
||||
val rawJson: JsonElement
|
||||
) : MenuButton
|
||||
|
||||
companion object {
|
||||
fun serializer(): KSerializer<MenuButton> = MenuButtonSerializer
|
||||
}
|
||||
}
|
||||
|
||||
@Serializable
|
||||
internal data class MenuButtonSurrogate(
|
||||
val type: String,
|
||||
val text: String? = null,
|
||||
@SerialName(webAppField)
|
||||
val webApp: WebAppInfo? = null,
|
||||
val srcJsonElement: JsonElement? = null
|
||||
)
|
||||
|
||||
@Serializer(MenuButton::class)
|
||||
object MenuButtonSerializer : KSerializer<MenuButton> {
|
||||
override val descriptor: SerialDescriptor
|
||||
get() = MenuButtonSurrogate.serializer().descriptor
|
||||
|
||||
override fun deserialize(decoder: Decoder): MenuButton {
|
||||
val surrogate = if (decoder is JsonDecoder) {
|
||||
val json = JsonElement.serializer().deserialize(decoder)
|
||||
runCatching {
|
||||
decoder.json.decodeFromJsonElement(MenuButtonSurrogate.serializer(), json)
|
||||
}.onFailure {
|
||||
return MenuButton.Unknown(
|
||||
runCatching { json.jsonObject[typeField] ?.jsonPrimitive ?.content }.getOrNull() ?: "",
|
||||
json
|
||||
)
|
||||
}.getOrThrow().copy(
|
||||
srcJsonElement = json
|
||||
)
|
||||
} else {
|
||||
MenuButtonSurrogate.serializer().deserialize(decoder)
|
||||
}
|
||||
|
||||
return when (surrogate.type) {
|
||||
MenuButton.Commands.type -> MenuButton.Commands
|
||||
MenuButton.Default.type -> MenuButton.Default
|
||||
MenuButton.WebApp.type -> if (surrogate.text != null && surrogate.webApp != null) {
|
||||
MenuButton.WebApp(surrogate.text, surrogate.webApp)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
else -> null
|
||||
} ?: MenuButton.Unknown(
|
||||
surrogate.type,
|
||||
surrogate.srcJsonElement ?: buildJsonObject { }
|
||||
)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: MenuButton) {
|
||||
encoder.encodeSerializableValue(
|
||||
MenuButtonSurrogate.serializer(),
|
||||
when (value) {
|
||||
MenuButton.Default,
|
||||
MenuButton.Commands -> MenuButtonSurrogate(value.type)
|
||||
is MenuButton.WebApp -> MenuButtonSurrogate(value.type, value.text, value.webApp)
|
||||
is MenuButton.Unknown -> {
|
||||
encoder.encodeSerializableValue(
|
||||
JsonElement.serializer(),
|
||||
value.rawJson
|
||||
)
|
||||
return
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package dev.inmo.tgbotapi.types.webapps
|
||||
|
||||
import dev.inmo.tgbotapi.types.urlField
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class WebAppInfo(
|
||||
@SerialName(urlField)
|
||||
val url: String
|
||||
)
|
Loading…
Reference in New Issue
Block a user