mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-22 16:23:48 +00:00
commit
c2cc6ee1ec
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,5 +1,15 @@
|
|||||||
# TelegramBotAPI changelog
|
# TelegramBotAPI changelog
|
||||||
|
|
||||||
|
## 2.1.0
|
||||||
|
|
||||||
|
__This update contains including of [Telegram Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)__
|
||||||
|
|
||||||
|
* Add support of functionality for `WebApp`s from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
* Add support of functionality for premium feature from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
* Add support of `addedToAttachmentMenu` in `CommonUser` from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
* Add support of `secret_token` in `SetWebhook` request from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
* Add support of `createInvoiceLink` request from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
|
||||||
## 2.0.3
|
## 2.0.3
|
||||||
|
|
||||||
* `Core`:
|
* `Core`:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-6.0-blue)](https://core.telegram.org/bots/api-changelog#april-16-2022)
|
# TelegramBotAPI [![Maven Central](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi/badge.svg)](https://maven-badges.herokuapp.com/maven-central/dev.inmo/tgbotapi) [![Supported version](https://img.shields.io/badge/Telegram%20Bot%20API-6.1-blue)](https://core.telegram.org/bots/api-changelog#june-20-2022)
|
||||||
|
|
||||||
| [![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin) [![Build Status](https://github.com/InsanusMokrassar/TelegramBotAPI/workflows/Build/badge.svg)](https://github.com/InsanusMokrassar/TelegramBotAPI/actions) [![Small survey](https://img.shields.io/static/v1?label=Google&message=Survey&color=blue&logo=google-sheets)](https://docs.google.com/forms/d/e/1FAIpQLSctdJHT_aEniyYT0-IUAEfo1hsIlezX2owlkEAYX4KPl2V2_A/viewform?usp=sf_link) [![Chat in Telegram](https://img.shields.io/static/v1?label=Telegram&message=Chat&color=blue&logo=telegram)](https://t.me/InMoTelegramBotAPI) |
|
| [![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin) [![Build Status](https://github.com/InsanusMokrassar/TelegramBotAPI/workflows/Build/badge.svg)](https://github.com/InsanusMokrassar/TelegramBotAPI/actions) [![Small survey](https://img.shields.io/static/v1?label=Google&message=Survey&color=blue&logo=google-sheets)](https://docs.google.com/forms/d/e/1FAIpQLSctdJHT_aEniyYT0-IUAEfo1hsIlezX2owlkEAYX4KPl2V2_A/viewform?usp=sf_link) [![Chat in Telegram](https://img.shields.io/static/v1?label=Telegram&message=Chat&color=blue&logo=telegram)](https://t.me/InMoTelegramBotAPI) |
|
||||||
|:---:|
|
|:---:|
|
||||||
|
@ -20,6 +20,6 @@ javax_activation_version=1.1.1
|
|||||||
dokka_version=1.6.21
|
dokka_version=1.6.21
|
||||||
|
|
||||||
library_group=dev.inmo
|
library_group=dev.inmo
|
||||||
library_version=2.0.3
|
library_version=2.1.0
|
||||||
|
|
||||||
github_release_plugin_version=2.4.1
|
github_release_plugin_version=2.4.1
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
package dev.inmo.tgbotapi.extensions.api.send.payments
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||||
|
import dev.inmo.tgbotapi.requests.send.payments.CreateInvoiceLink
|
||||||
|
import dev.inmo.tgbotapi.requests.send.payments.SendInvoice
|
||||||
|
import dev.inmo.tgbotapi.types.*
|
||||||
|
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||||
|
import dev.inmo.tgbotapi.types.chat.CommonUser
|
||||||
|
import dev.inmo.tgbotapi.types.payments.LabeledPrice
|
||||||
|
import dev.inmo.tgbotapi.types.payments.abstracts.Currency
|
||||||
|
|
||||||
|
suspend fun TelegramBot.createInvoiceLink(
|
||||||
|
title: String,
|
||||||
|
description: String,
|
||||||
|
payload: String,
|
||||||
|
providerToken: String,
|
||||||
|
currency: Currency,
|
||||||
|
prices: List<LabeledPrice>,
|
||||||
|
maxTipAmount: Int? = null,
|
||||||
|
suggestedTipAmounts: List<Int>? = null,
|
||||||
|
providerData: String? = null,
|
||||||
|
requireName: Boolean = false,
|
||||||
|
requirePhoneNumber: Boolean = false,
|
||||||
|
requireEmail: Boolean = false,
|
||||||
|
requireShippingAddress: Boolean = false,
|
||||||
|
shouldSendPhoneNumberToProvider: Boolean = false,
|
||||||
|
shouldSendEmailToProvider: Boolean = false,
|
||||||
|
priceDependOnShipAddress: Boolean = false
|
||||||
|
) = execute(
|
||||||
|
CreateInvoiceLink(title, description, payload, providerToken, currency, prices, maxTipAmount, suggestedTipAmounts ?.sorted(), providerData, requireName, requirePhoneNumber, requireEmail, requireShippingAddress, shouldSendPhoneNumberToProvider, shouldSendEmailToProvider, priceDependOnShipAddress)
|
||||||
|
)
|
@ -13,10 +13,11 @@ suspend fun TelegramBot.setWebhookInfo(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) = execute(
|
) = execute(
|
||||||
SetWebhook(
|
SetWebhook(
|
||||||
url, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates
|
url, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates, secretToken
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,10 +30,11 @@ suspend fun TelegramBot.setWebhookInfo(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) = execute(
|
) = execute(
|
||||||
SetWebhook(
|
SetWebhook(
|
||||||
url, certificate, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates
|
url, certificate, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates, secretToken
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -45,9 +47,10 @@ suspend fun TelegramBot.setWebhookInfo(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) = execute(
|
) = execute(
|
||||||
SetWebhook(
|
SetWebhook(
|
||||||
url, certificate, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates
|
url, certificate, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates, secretToken
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,105 @@
|
|||||||
|
package dev.inmo.tgbotapi.requests.send.payments
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.abstracts.CommonSendInvoiceData
|
||||||
|
import dev.inmo.tgbotapi.abstracts.types.*
|
||||||
|
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||||
|
import dev.inmo.tgbotapi.requests.send.abstracts.SendMessageRequest
|
||||||
|
import dev.inmo.tgbotapi.types.*
|
||||||
|
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||||
|
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||||
|
import dev.inmo.tgbotapi.types.message.content.InvoiceContent
|
||||||
|
import dev.inmo.tgbotapi.types.payments.LabeledPrice
|
||||||
|
import dev.inmo.tgbotapi.types.payments.LabeledPricesSerializer
|
||||||
|
import dev.inmo.tgbotapi.types.payments.abstracts.Currency
|
||||||
|
import kotlinx.serialization.*
|
||||||
|
import kotlinx.serialization.builtins.serializer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param providerData - JSON-ENCODED FIELD
|
||||||
|
*/
|
||||||
|
@Serializable
|
||||||
|
data class CreateInvoiceLink(
|
||||||
|
@SerialName(titleField)
|
||||||
|
override val title: String,
|
||||||
|
@SerialName(descriptionField)
|
||||||
|
override val description: String,
|
||||||
|
@SerialName(payloadField)
|
||||||
|
override val payload: String,
|
||||||
|
@SerialName(providerTokenField)
|
||||||
|
override val providerToken: String,
|
||||||
|
@SerialName(currencyField)
|
||||||
|
override val currency: Currency,
|
||||||
|
@Serializable(LabeledPricesSerializer::class)
|
||||||
|
@SerialName(pricesField)
|
||||||
|
override val prices: List<LabeledPrice>,
|
||||||
|
@SerialName(maxTipAmountField)
|
||||||
|
override val maxTipAmount: Int? = null,
|
||||||
|
@SerialName(suggestedTipAmountsField)
|
||||||
|
override val suggestedTipAmounts: List<Int>? = null,
|
||||||
|
@SerialName(providerDataField)
|
||||||
|
override val providerData: String? = null,
|
||||||
|
@SerialName(requireNameField)
|
||||||
|
override val requireName: Boolean = false,
|
||||||
|
@SerialName(requirePhoneNumberField)
|
||||||
|
override val requirePhoneNumber: Boolean = false,
|
||||||
|
@SerialName(requireEmailField)
|
||||||
|
override val requireEmail: Boolean = false,
|
||||||
|
@SerialName(requireShippingAddressField)
|
||||||
|
override val requireShippingAddress: Boolean = false,
|
||||||
|
@SerialName(shouldSendPhoneNumberToProviderField)
|
||||||
|
override val shouldSendPhoneNumberToProvider: Boolean = false,
|
||||||
|
@SerialName(shouldSendEmailToProviderField)
|
||||||
|
override val shouldSendEmailToProvider: Boolean = false,
|
||||||
|
@SerialName(priceDependOnShipAddressField)
|
||||||
|
override val priceDependOnShipAddress: Boolean = false
|
||||||
|
) : CommonSendInvoiceData, SimpleRequest<String> {
|
||||||
|
override fun method(): String = "sendInvoice"
|
||||||
|
override val resultDeserializer: DeserializationStrategy<String>
|
||||||
|
get() = String.serializer()
|
||||||
|
override val requestSerializer: SerializationStrategy<*>
|
||||||
|
get() = serializer()
|
||||||
|
|
||||||
|
@SerialName(photoUrlField)
|
||||||
|
override var photoUrl: String? = null
|
||||||
|
private set
|
||||||
|
@SerialName(photoSizeField)
|
||||||
|
override var photoSize: Long? = null
|
||||||
|
private set
|
||||||
|
|
||||||
|
@SerialName(photoWidthField)
|
||||||
|
override var photoWidth: Int? = null
|
||||||
|
private set
|
||||||
|
@SerialName(photoHeightField)
|
||||||
|
override var photoHeight: Int? = null
|
||||||
|
private set
|
||||||
|
|
||||||
|
init {
|
||||||
|
suggestedTipAmounts ?.let { _ ->
|
||||||
|
require(suggestedTipAmounts.size in suggestedTipAmountsLimit)
|
||||||
|
maxTipAmount ?.let { _ ->
|
||||||
|
require(
|
||||||
|
suggestedTipAmounts.none { it > maxTipAmount }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setPhoto(
|
||||||
|
photoUrl: String,
|
||||||
|
photoSize: Long?,
|
||||||
|
photoWidth: Int?,
|
||||||
|
photoHeight: Int?
|
||||||
|
) {
|
||||||
|
this.photoUrl = photoUrl
|
||||||
|
this.photoSize = photoSize
|
||||||
|
this.photoWidth = photoWidth
|
||||||
|
this.photoHeight = photoHeight
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun unsetPhoto() {
|
||||||
|
photoUrl = null
|
||||||
|
photoSize = null
|
||||||
|
photoWidth = null
|
||||||
|
photoHeight = null
|
||||||
|
}
|
||||||
|
}
|
@ -20,7 +20,8 @@ class MultipartSetWebhookRequest(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) : SetWebhookRequest(), MultipartRequest<Boolean> by MultipartRequestImpl(
|
) : SetWebhookRequest(), MultipartRequest<Boolean> by MultipartRequestImpl(
|
||||||
SetWebhook(
|
SetWebhook(
|
||||||
correctWebhookUrl(url),
|
correctWebhookUrl(url),
|
||||||
@ -28,7 +29,8 @@ class MultipartSetWebhookRequest(
|
|||||||
ipAddress,
|
ipAddress,
|
||||||
maxAllowedConnections,
|
maxAllowedConnections,
|
||||||
allowedUpdates,
|
allowedUpdates,
|
||||||
dropPendingUpdates
|
dropPendingUpdates,
|
||||||
|
secretToken
|
||||||
),
|
),
|
||||||
mapOf(certificateField to certificate)
|
mapOf(certificateField to certificate)
|
||||||
)
|
)
|
||||||
@ -39,14 +41,16 @@ fun SetWebhook(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
): MultipartSetWebhookRequest = MultipartSetWebhookRequest(
|
): MultipartSetWebhookRequest = MultipartSetWebhookRequest(
|
||||||
correctWebhookUrl(url),
|
correctWebhookUrl(url),
|
||||||
certificate,
|
certificate,
|
||||||
ipAddress,
|
ipAddress,
|
||||||
maxAllowedConnections,
|
maxAllowedConnections,
|
||||||
allowedUpdates,
|
allowedUpdates,
|
||||||
dropPendingUpdates
|
dropPendingUpdates,
|
||||||
|
secretToken
|
||||||
)
|
)
|
||||||
|
|
||||||
fun SetWebhook(
|
fun SetWebhook(
|
||||||
@ -55,14 +59,16 @@ fun SetWebhook(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
): SetWebhook = SetWebhook(
|
): SetWebhook = SetWebhook(
|
||||||
correctWebhookUrl(url),
|
correctWebhookUrl(url),
|
||||||
certificate.fileId,
|
certificate.fileId,
|
||||||
ipAddress,
|
ipAddress,
|
||||||
maxAllowedConnections,
|
maxAllowedConnections,
|
||||||
allowedUpdates,
|
allowedUpdates,
|
||||||
dropPendingUpdates
|
dropPendingUpdates,
|
||||||
|
secretToken
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,10 +85,11 @@ fun SetWebhook(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) = when (certificate) {
|
) = when (certificate) {
|
||||||
is MultipartFile -> SetWebhook(correctWebhookUrl(url), certificate as MultipartFile, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates)
|
is MultipartFile -> SetWebhook(correctWebhookUrl(url), certificate as MultipartFile, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates, secretToken)
|
||||||
is FileId -> SetWebhook(correctWebhookUrl(url), certificate as FileId, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates)
|
is FileId -> SetWebhook(correctWebhookUrl(url), certificate as FileId, ipAddress, maxAllowedConnections, allowedUpdates, dropPendingUpdates, secretToken)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,14 +105,16 @@ fun SetWebhook(
|
|||||||
ipAddress: String? = null,
|
ipAddress: String? = null,
|
||||||
maxAllowedConnections: Int? = null,
|
maxAllowedConnections: Int? = null,
|
||||||
allowedUpdates: List<String>? = null,
|
allowedUpdates: List<String>? = null,
|
||||||
dropPendingUpdates: Boolean? = null
|
dropPendingUpdates: Boolean? = null,
|
||||||
|
secretToken: String? = null
|
||||||
) = SetWebhook(
|
) = SetWebhook(
|
||||||
correctWebhookUrl(url),
|
correctWebhookUrl(url),
|
||||||
null,
|
null,
|
||||||
ipAddress,
|
ipAddress,
|
||||||
maxAllowedConnections,
|
maxAllowedConnections,
|
||||||
allowedUpdates,
|
allowedUpdates,
|
||||||
dropPendingUpdates
|
dropPendingUpdates,
|
||||||
|
secretToken
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,7 +137,9 @@ data class SetWebhook internal constructor(
|
|||||||
@SerialName(allowedUpdatesField)
|
@SerialName(allowedUpdatesField)
|
||||||
val allowedUpdates: List<String>? = null,
|
val allowedUpdates: List<String>? = null,
|
||||||
@SerialName(dropPendingUpdatesField)
|
@SerialName(dropPendingUpdatesField)
|
||||||
val dropPendingUpdates: Boolean? = null
|
val dropPendingUpdates: Boolean? = null,
|
||||||
|
@SerialName(secretTokenField)
|
||||||
|
val secretToken: String? = null
|
||||||
) : SetWebhookRequest(), DataRequest<Boolean> {
|
) : SetWebhookRequest(), DataRequest<Boolean> {
|
||||||
override fun method(): String = "setWebhook"
|
override fun method(): String = "setWebhook"
|
||||||
override val resultDeserializer: DeserializationStrategy<Boolean>
|
override val resultDeserializer: DeserializationStrategy<Boolean>
|
||||||
|
@ -117,6 +117,8 @@ const val isBotField = "is_bot"
|
|||||||
const val firstNameField = "first_name"
|
const val firstNameField = "first_name"
|
||||||
const val lastNameField = "last_name"
|
const val lastNameField = "last_name"
|
||||||
const val languageCodeField = "language_code"
|
const val languageCodeField = "language_code"
|
||||||
|
const val addedToAttachmentMenuField = "added_to_attachment_menu"
|
||||||
|
const val isPremiumField = "is_premium"
|
||||||
const val hasPrivateForwardsField = "has_private_forwards"
|
const val hasPrivateForwardsField = "has_private_forwards"
|
||||||
const val canJoinGroupsField = "can_join_groups"
|
const val canJoinGroupsField = "can_join_groups"
|
||||||
const val canReadAllGroupMessagesField = "can_read_all_group_messages"
|
const val canReadAllGroupMessagesField = "can_read_all_group_messages"
|
||||||
@ -124,6 +126,7 @@ const val supportInlineQueriesField = "supports_inline_queries"
|
|||||||
const val textEntitiesField = "text_entities"
|
const val textEntitiesField = "text_entities"
|
||||||
const val entitiesField = "entities"
|
const val entitiesField = "entities"
|
||||||
const val stickerSetNameField = "set_name"
|
const val stickerSetNameField = "set_name"
|
||||||
|
const val premiumAnimationField = "premium_animation"
|
||||||
const val stickerSetNameFullField = "sticker_set_name"
|
const val stickerSetNameFullField = "sticker_set_name"
|
||||||
const val slowModeDelayField = "slow_mode_delay"
|
const val slowModeDelayField = "slow_mode_delay"
|
||||||
const val maskPositionField = "mask_position"
|
const val maskPositionField = "mask_position"
|
||||||
@ -155,6 +158,7 @@ const val switchPmParameterField = "switch_pm_parameter"
|
|||||||
const val maxAllowedConnectionsField = "max_connections"
|
const val maxAllowedConnectionsField = "max_connections"
|
||||||
const val allowedUpdatesField = "allowed_updates"
|
const val allowedUpdatesField = "allowed_updates"
|
||||||
const val dropPendingUpdatesField = "drop_pending_updates"
|
const val dropPendingUpdatesField = "drop_pending_updates"
|
||||||
|
const val secretTokenField = "secret_token"
|
||||||
const val hasCustomCertificateField = "has_custom_certificate"
|
const val hasCustomCertificateField = "has_custom_certificate"
|
||||||
const val pendingUpdateCountField = "pending_update_count"
|
const val pendingUpdateCountField = "pending_update_count"
|
||||||
const val lastErrorDateField = "last_error_date"
|
const val lastErrorDateField = "last_error_date"
|
||||||
@ -180,6 +184,8 @@ const val customTitleField = "custom_title"
|
|||||||
const val optionIdsField = "option_ids"
|
const val optionIdsField = "option_ids"
|
||||||
const val ipAddressField = "ip_address"
|
const val ipAddressField = "ip_address"
|
||||||
const val linkedChatIdField = "linked_chat_id"
|
const val linkedChatIdField = "linked_chat_id"
|
||||||
|
const val joinToSendMessagesField = "join_to_send_messages"
|
||||||
|
const val joinByRequestField = "join_by_request"
|
||||||
const val horizontalAccuracyField = "horizontal_accuracy"
|
const val horizontalAccuracyField = "horizontal_accuracy"
|
||||||
const val revokeMessagesField = "revoke_messages"
|
const val revokeMessagesField = "revoke_messages"
|
||||||
const val messageAutoDeleteTimeField = "message_auto_delete_time"
|
const val messageAutoDeleteTimeField = "message_auto_delete_time"
|
||||||
|
@ -32,6 +32,16 @@ sealed interface UsernameChat : Chat {
|
|||||||
val username: Username?
|
val username: Username?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface PossiblyPremiumChat : Chat {
|
||||||
|
val isPremium: Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
@Serializable(PreviewChatSerializer::class)
|
||||||
|
sealed interface AbleToAddInAttachmentMenuChat : Chat {
|
||||||
|
val addedToAttachmentMenu: Boolean
|
||||||
|
}
|
||||||
|
|
||||||
@Serializable(PreviewChatSerializer::class)
|
@Serializable(PreviewChatSerializer::class)
|
||||||
sealed interface Chat {
|
sealed interface Chat {
|
||||||
val id: ChatId
|
val id: ChatId
|
||||||
|
@ -65,7 +65,8 @@ object PreviewChatSerializer : KSerializer<Chat> {
|
|||||||
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
|
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ChannelChatImpl.serializer(), decodedJson)
|
||||||
is ChatType.UnknownChatType -> UnknownChatType(
|
is ChatType.UnknownChatType -> UnknownChatType(
|
||||||
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
|
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
|
||||||
decodedJson.toString()
|
decodedJson.toString(),
|
||||||
|
decodedJson
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,6 +78,10 @@ object PreviewChatSerializer : KSerializer<Chat> {
|
|||||||
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
|
is GroupChatImpl -> GroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
|
is SupergroupChatImpl -> SupergroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value)
|
is ChannelChatImpl -> ChannelChatImpl.serializer().serialize(encoder, value)
|
||||||
|
is CommonBot -> CommonBot.serializer().serialize(encoder, value)
|
||||||
|
is ExtendedBot -> ExtendedBot.serializer().serialize(encoder, value)
|
||||||
|
is CommonUser -> CommonUser.serializer().serialize(encoder, value)
|
||||||
|
is UnknownChatType -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,7 +104,8 @@ object ExtendedChatSerializer : KSerializer<ExtendedChat> {
|
|||||||
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson)
|
ChatType.ChannelChatType -> formatter.decodeFromJsonElement(ExtendedChannelChatImpl.serializer(), decodedJson)
|
||||||
is ChatType.UnknownChatType -> UnknownExtendedChat(
|
is ChatType.UnknownChatType -> UnknownExtendedChat(
|
||||||
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
|
formatter.decodeFromJsonElement(Long.serializer(), decodedJson[chatIdField] ?: JsonPrimitive(-1)).toChatId(),
|
||||||
decodedJson.toString()
|
decodedJson.toString(),
|
||||||
|
decodedJson
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,6 +116,7 @@ object ExtendedChatSerializer : KSerializer<ExtendedChat> {
|
|||||||
is ExtendedGroupChatImpl -> ExtendedGroupChatImpl.serializer().serialize(encoder, value)
|
is ExtendedGroupChatImpl -> ExtendedGroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
|
is ExtendedSupergroupChatImpl -> ExtendedSupergroupChatImpl.serializer().serialize(encoder, value)
|
||||||
is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value)
|
is ExtendedChannelChatImpl -> ExtendedChannelChatImpl.serializer().serialize(encoder, value)
|
||||||
|
is UnknownExtendedChat -> JsonObject.serializer().serialize(encoder, value.rawJson)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.Message
|
|||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
|
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
|
||||||
import kotlinx.serialization.SerialName
|
import kotlinx.serialization.SerialName
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class ExtendedChannelChatImpl(
|
data class ExtendedChannelChatImpl(
|
||||||
@ -94,7 +95,11 @@ data class ExtendedSupergroupChatImpl(
|
|||||||
@SerialName(linkedChatIdField)
|
@SerialName(linkedChatIdField)
|
||||||
override val linkedChannelChatId: ChatId? = null,
|
override val linkedChannelChatId: ChatId? = null,
|
||||||
@SerialName(locationField)
|
@SerialName(locationField)
|
||||||
override val location: ChatLocation? = null
|
override val location: ChatLocation? = null,
|
||||||
|
@SerialName(joinToSendMessagesField)
|
||||||
|
override val requiresJoinForMessaging: Boolean = false,
|
||||||
|
@SerialName(joinByRequestField)
|
||||||
|
override val requireAdminApproveToJoin: Boolean = false
|
||||||
) : ExtendedSupergroupChat
|
) : ExtendedSupergroupChat
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@ -119,7 +124,8 @@ data class ExtendedBot(
|
|||||||
|
|
||||||
data class UnknownExtendedChat(
|
data class UnknownExtendedChat(
|
||||||
override val id: ChatId,
|
override val id: ChatId,
|
||||||
val raw: String
|
val raw: String,
|
||||||
|
val rawJson: JsonObject
|
||||||
) : ExtendedChat {
|
) : ExtendedChat {
|
||||||
override val chatPhoto: ChatPhoto? = null
|
override val chatPhoto: ChatPhoto? = null
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package dev.inmo.tgbotapi.types.chat
|
package dev.inmo.tgbotapi.types.chat
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.*
|
import dev.inmo.tgbotapi.types.*
|
||||||
import dev.inmo.tgbotapi.types.chat.ExtendedChat
|
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
||||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
|
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
@ -39,6 +38,16 @@ sealed interface ExtendedSupergroupChat : SupergroupChat, ExtendedGroupChat {
|
|||||||
val canSetStickerSet: Boolean
|
val canSetStickerSet: Boolean
|
||||||
val linkedChannelChatId: ChatId?
|
val linkedChannelChatId: ChatId?
|
||||||
val location: ChatLocation?
|
val location: ChatLocation?
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This field represents field "join_to_send_messages" from API
|
||||||
|
*/
|
||||||
|
val requiresJoinForMessaging: Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This field represents field "join_by_request" from API
|
||||||
|
*/
|
||||||
|
val requireAdminApproveToJoin: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
@Serializable(ExtendedChatSerializer::class)
|
@Serializable(ExtendedChatSerializer::class)
|
||||||
|
@ -80,8 +80,12 @@ data class CommonUser(
|
|||||||
override val username: Username? = null,
|
override val username: Username? = null,
|
||||||
@SerialName(languageCodeField)
|
@SerialName(languageCodeField)
|
||||||
@Serializable(IetfLanguageCodeSerializer::class)
|
@Serializable(IetfLanguageCodeSerializer::class)
|
||||||
override val ietfLanguageCode: IetfLanguageCode? = null
|
override val ietfLanguageCode: IetfLanguageCode? = null,
|
||||||
) : User(), WithOptionalLanguageCode {
|
@SerialName(isPremiumField)
|
||||||
|
override val isPremium: Boolean = false,
|
||||||
|
@SerialName(addedToAttachmentMenuField)
|
||||||
|
override val addedToAttachmentMenu: Boolean = false
|
||||||
|
) : User(), WithOptionalLanguageCode, PossiblyPremiumChat, AbleToAddInAttachmentMenuChat {
|
||||||
constructor(
|
constructor(
|
||||||
id: UserId,
|
id: UserId,
|
||||||
firstName: String,
|
firstName: String,
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package dev.inmo.tgbotapi.types.chat
|
package dev.inmo.tgbotapi.types.chat
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.types.ChatId
|
import dev.inmo.tgbotapi.types.ChatId
|
||||||
import dev.inmo.tgbotapi.types.chat.Chat
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
|
||||||
data class UnknownChatType(
|
data class UnknownChatType(
|
||||||
override val id: ChatId,
|
override val id: ChatId,
|
||||||
val raw: String
|
val raw: String,
|
||||||
|
val rawJson: JsonObject
|
||||||
) : Chat
|
) : Chat
|
||||||
|
@ -22,7 +22,8 @@ data class StickerSurrogate(
|
|||||||
val emoji: String? = null,
|
val emoji: String? = null,
|
||||||
val set_name: StickerSetName? = null,
|
val set_name: StickerSetName? = null,
|
||||||
val mask_position: MaskPosition? = null,
|
val mask_position: MaskPosition? = null,
|
||||||
val file_size: Long? = null
|
val file_size: Long? = null,
|
||||||
|
val premium_animation: File? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO:: Serializer
|
// TODO:: Serializer
|
||||||
@ -31,6 +32,7 @@ sealed interface Sticker : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile {
|
|||||||
val emoji: String?
|
val emoji: String?
|
||||||
val maskPosition: MaskPosition?
|
val maskPosition: MaskPosition?
|
||||||
val stickerSetName: StickerSetName?
|
val stickerSetName: StickerSetName?
|
||||||
|
val premiumAnimationFile: File?
|
||||||
|
|
||||||
val isAnimated
|
val isAnimated
|
||||||
get() = this is AnimatedSticker
|
get() = this is AnimatedSticker
|
||||||
@ -53,6 +55,7 @@ object StickerSerializer : KSerializer<Sticker> {
|
|||||||
surrogate.thumb,
|
surrogate.thumb,
|
||||||
surrogate.emoji,
|
surrogate.emoji,
|
||||||
surrogate.set_name,
|
surrogate.set_name,
|
||||||
|
surrogate.premium_animation,
|
||||||
surrogate.mask_position,
|
surrogate.mask_position,
|
||||||
surrogate.file_size
|
surrogate.file_size
|
||||||
)
|
)
|
||||||
@ -64,6 +67,7 @@ object StickerSerializer : KSerializer<Sticker> {
|
|||||||
surrogate.thumb,
|
surrogate.thumb,
|
||||||
surrogate.emoji,
|
surrogate.emoji,
|
||||||
surrogate.set_name,
|
surrogate.set_name,
|
||||||
|
surrogate.premium_animation,
|
||||||
surrogate.mask_position,
|
surrogate.mask_position,
|
||||||
surrogate.file_size
|
surrogate.file_size
|
||||||
)
|
)
|
||||||
@ -75,6 +79,7 @@ object StickerSerializer : KSerializer<Sticker> {
|
|||||||
surrogate.thumb,
|
surrogate.thumb,
|
||||||
surrogate.emoji,
|
surrogate.emoji,
|
||||||
surrogate.set_name,
|
surrogate.set_name,
|
||||||
|
surrogate.premium_animation,
|
||||||
surrogate.mask_position,
|
surrogate.mask_position,
|
||||||
surrogate.file_size
|
surrogate.file_size
|
||||||
)
|
)
|
||||||
@ -103,6 +108,8 @@ data class SimpleSticker(
|
|||||||
override val emoji: String? = null,
|
override val emoji: String? = null,
|
||||||
@SerialName(stickerSetNameField)
|
@SerialName(stickerSetNameField)
|
||||||
override val stickerSetName: StickerSetName? = null,
|
override val stickerSetName: StickerSetName? = null,
|
||||||
|
@SerialName(premiumAnimationField)
|
||||||
|
override val premiumAnimationFile: File?,
|
||||||
@SerialName(maskPositionField)
|
@SerialName(maskPositionField)
|
||||||
override val maskPosition: MaskPosition? = null,
|
override val maskPosition: MaskPosition? = null,
|
||||||
@SerialName(fileSizeField)
|
@SerialName(fileSizeField)
|
||||||
@ -124,6 +131,8 @@ data class AnimatedSticker(
|
|||||||
override val emoji: String? = null,
|
override val emoji: String? = null,
|
||||||
@SerialName(stickerSetNameField)
|
@SerialName(stickerSetNameField)
|
||||||
override val stickerSetName: StickerSetName? = null,
|
override val stickerSetName: StickerSetName? = null,
|
||||||
|
@SerialName(premiumAnimationField)
|
||||||
|
override val premiumAnimationFile: File?,
|
||||||
@SerialName(maskPositionField)
|
@SerialName(maskPositionField)
|
||||||
override val maskPosition: MaskPosition? = null,
|
override val maskPosition: MaskPosition? = null,
|
||||||
@SerialName(fileSizeField)
|
@SerialName(fileSizeField)
|
||||||
@ -145,6 +154,8 @@ data class VideoSticker(
|
|||||||
override val emoji: String? = null,
|
override val emoji: String? = null,
|
||||||
@SerialName(stickerSetNameField)
|
@SerialName(stickerSetNameField)
|
||||||
override val stickerSetName: StickerSetName? = null,
|
override val stickerSetName: StickerSetName? = null,
|
||||||
|
@SerialName(premiumAnimationField)
|
||||||
|
override val premiumAnimationFile: File?,
|
||||||
@SerialName(maskPositionField)
|
@SerialName(maskPositionField)
|
||||||
override val maskPosition: MaskPosition? = null,
|
override val maskPosition: MaskPosition? = null,
|
||||||
@SerialName(fileSizeField)
|
@SerialName(fileSizeField)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
package dev.inmo.tgbotapi.extensions.utils
|
package dev.inmo.tgbotapi.extensions.utils
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.abstracts.*
|
import dev.inmo.tgbotapi.abstracts.*
|
||||||
|
import dev.inmo.tgbotapi.requests.send.payments.CreateInvoiceLink
|
||||||
import dev.inmo.tgbotapi.requests.send.payments.SendInvoice
|
import dev.inmo.tgbotapi.requests.send.payments.SendInvoice
|
||||||
import dev.inmo.tgbotapi.types.*
|
import dev.inmo.tgbotapi.types.*
|
||||||
import dev.inmo.tgbotapi.types.queries.callback.*
|
import dev.inmo.tgbotapi.types.queries.callback.*
|
||||||
@ -235,6 +236,24 @@ inline fun Chat.asExtendedSupergroupChat(): ExtendedSupergroupChat? = this as? E
|
|||||||
@PreviewFeature
|
@PreviewFeature
|
||||||
inline fun Chat.requireExtendedSupergroupChat(): ExtendedSupergroupChat = this as ExtendedSupergroupChat
|
inline fun Chat.requireExtendedSupergroupChat(): ExtendedSupergroupChat = this as ExtendedSupergroupChat
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun <T> Chat.whenPossiblyPremiumChat(block: (PossiblyPremiumChat) -> T) = asPossiblyPremiumChat() ?.let(block)
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun Chat.asPossiblyPremiumChat(): PossiblyPremiumChat? = this as? PossiblyPremiumChat
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun Chat.requirePossiblyPremiumChat(): PossiblyPremiumChat = this as PossiblyPremiumChat
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun <T> Chat.whenAbleToAddInAttachmentMenuChat(block: (AbleToAddInAttachmentMenuChat) -> T) = asAbleToAddInAttachmentMenuChat() ?.let(block)
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun Chat.asAbleToAddInAttachmentMenuChat(): AbleToAddInAttachmentMenuChat? = this as? AbleToAddInAttachmentMenuChat
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun Chat.requireAbleToAddInAttachmentMenuChat(): AbleToAddInAttachmentMenuChat = this as AbleToAddInAttachmentMenuChat
|
||||||
|
|
||||||
@PreviewFeature
|
@PreviewFeature
|
||||||
inline fun <T> CallbackQuery.whenDataCallbackQuery(block: (DataCallbackQuery) -> T) = asDataCallbackQuery() ?.let(block)
|
inline fun <T> CallbackQuery.whenDataCallbackQuery(block: (DataCallbackQuery) -> T) = asDataCallbackQuery() ?.let(block)
|
||||||
|
|
||||||
@ -3255,7 +3274,16 @@ inline fun <T> CommonSendInvoiceData.whenSendInvoice(block: (SendInvoice) -> T)
|
|||||||
inline fun CommonSendInvoiceData.asSendInvoice(): SendInvoice? = this as? SendInvoice
|
inline fun CommonSendInvoiceData.asSendInvoice(): SendInvoice? = this as? SendInvoice
|
||||||
|
|
||||||
@PreviewFeature
|
@PreviewFeature
|
||||||
inline fun CommonSendInvoiceData.requireVoiceChatParticipantsInvited(): SendInvoice = this as SendInvoice
|
inline fun CommonSendInvoiceData.requireSendInvoice(): SendInvoice = this as SendInvoice
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun <T> CommonSendInvoiceData.whenCreateInvoiceLink(block: (CreateInvoiceLink) -> T) = asCreateInvoiceLink() ?.let(block)
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun CommonSendInvoiceData.asCreateInvoiceLink(): CreateInvoiceLink? = this as? CreateInvoiceLink
|
||||||
|
|
||||||
|
@PreviewFeature
|
||||||
|
inline fun CommonSendInvoiceData.requireCreateInvoiceLink(): CreateInvoiceLink = this as CreateInvoiceLink
|
||||||
|
|
||||||
@PreviewFeature
|
@PreviewFeature
|
||||||
inline fun <T> CommonSendInvoiceData.whenInputInvoiceMessageContent(block: (InputInvoiceMessageContent) -> T) = asInputInvoiceMessageContent() ?.let(block)
|
inline fun <T> CommonSendInvoiceData.whenInputInvoiceMessageContent(block: (InputInvoiceMessageContent) -> T) = asInputInvoiceMessageContent() ?.let(block)
|
||||||
|
@ -19,3 +19,5 @@ inline val Sticker.mask_position: MaskPosition?
|
|||||||
get() = maskPosition
|
get() = maskPosition
|
||||||
inline val Sticker.file_size: Long?
|
inline val Sticker.file_size: Long?
|
||||||
get() = fileSize
|
get() = fileSize
|
||||||
|
inline val Sticker.premium_animation: File?
|
||||||
|
get() = premiumAnimationFile
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
|
external interface BackButton {
|
||||||
|
val isVisible: Boolean
|
||||||
|
|
||||||
|
fun onClick(callback: () -> Unit)
|
||||||
|
fun offClick(callback: () -> Unit)
|
||||||
|
|
||||||
|
fun show()
|
||||||
|
fun hide()
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
sealed interface Color {
|
||||||
|
val value: String
|
||||||
|
@Serializable
|
||||||
|
value class BackgroundColor(override val value: String) : Color
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
value class Hex(override val value: String) : Color
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val BackgroundColor = BackgroundColor("bg_color")
|
||||||
|
val SecondaryBackgroundColor = BackgroundColor("secondary_bg_color")
|
||||||
|
|
||||||
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
inline operator fun invoke(value: String) = Hex(value)
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,7 @@
|
|||||||
package dev.inmo.tgbotapi.webapps
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.webapps.invoice.InvoiceClosedInfo
|
||||||
|
|
||||||
typealias EventHandler = WebApp.() -> Unit
|
typealias EventHandler = WebApp.() -> Unit
|
||||||
typealias ViewportChangedEventHandler = WebApp.(ViewportChangedData) -> Unit
|
typealias ViewportChangedEventHandler = WebApp.(ViewportChangedData) -> Unit
|
||||||
|
typealias InvoiceClosedEventHandler = WebApp.(InvoiceClosedInfo) -> Unit
|
||||||
|
@ -4,4 +4,7 @@ sealed class EventType(val typeName: String) {
|
|||||||
object ThemeChanged : EventType("themeChanged")
|
object ThemeChanged : EventType("themeChanged")
|
||||||
object ViewportChanged : EventType("viewportChanged")
|
object ViewportChanged : EventType("viewportChanged")
|
||||||
object MainButtonClicked : EventType("mainButtonClicked")
|
object MainButtonClicked : EventType("mainButtonClicked")
|
||||||
|
object BackButtonClicked : EventType("backButtonClicked")
|
||||||
|
object SettingsButtonClicked : EventType("settingsButtonClicked")
|
||||||
|
object InvoiceClosed : EventType("invoiceClosed")
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
|
typealias HEXColor = String
|
@ -23,6 +23,7 @@ external class MainButton {
|
|||||||
fun hideProgress(): MainButton
|
fun hideProgress(): MainButton
|
||||||
|
|
||||||
internal fun onClick(eventHandler: () -> Unit): MainButton
|
internal fun onClick(eventHandler: () -> Unit): MainButton
|
||||||
|
internal fun offClick(eventHandler: () -> Unit): MainButton
|
||||||
|
|
||||||
internal fun setParams(params: Json): MainButton
|
internal fun setParams(params: Json): MainButton
|
||||||
}
|
}
|
||||||
|
@ -2,15 +2,32 @@ package dev.inmo.tgbotapi.webapps
|
|||||||
|
|
||||||
external interface ThemeParams {
|
external interface ThemeParams {
|
||||||
@JsName("bg_color")
|
@JsName("bg_color")
|
||||||
val backgroundColor: String?
|
val backgroundColor: HEXColor?
|
||||||
|
@JsName("secondary_bg_color")
|
||||||
|
val secondaryBackgroundColor: HEXColor?
|
||||||
@JsName("text_color")
|
@JsName("text_color")
|
||||||
val textColor: String?
|
val textColor: HEXColor?
|
||||||
@JsName("hint_color")
|
@JsName("hint_color")
|
||||||
val hintColor: String?
|
val hintColor: HEXColor?
|
||||||
@JsName("link_color")
|
@JsName("link_color")
|
||||||
val linkColor: String?
|
val linkColor: HEXColor?
|
||||||
@JsName("button_color")
|
@JsName("button_color")
|
||||||
val buttonColor: String?
|
val buttonColor: HEXColor?
|
||||||
@JsName("button_text_color")
|
@JsName("button_text_color")
|
||||||
val buttonTextColor: String?
|
val buttonTextColor: HEXColor?
|
||||||
|
|
||||||
|
@JsName("bg_color")
|
||||||
|
val backgroundColorHex: Color.Hex?
|
||||||
|
@JsName("secondary_bg_color")
|
||||||
|
val secondaryBackgroundColorHex: Color.Hex?
|
||||||
|
@JsName("text_color")
|
||||||
|
val textColorHex: Color.Hex?
|
||||||
|
@JsName("hint_color")
|
||||||
|
val hintColorHex: Color.Hex?
|
||||||
|
@JsName("link_color")
|
||||||
|
val linkColorHex: Color.Hex?
|
||||||
|
@JsName("button_color")
|
||||||
|
val buttonColorHex: Color.Hex?
|
||||||
|
@JsName("button_text_color")
|
||||||
|
val buttonTextColorHex: Color.Hex?
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,21 @@
|
|||||||
package dev.inmo.tgbotapi.webapps
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
|
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
|
||||||
|
import dev.inmo.tgbotapi.webapps.haptic.HapticFeedback
|
||||||
|
import dev.inmo.tgbotapi.webapps.invoice.InvoiceClosedInfo
|
||||||
|
|
||||||
external class WebApp {
|
external class WebApp {
|
||||||
|
val version: String
|
||||||
|
|
||||||
val initData: String
|
val initData: String
|
||||||
val initDataUnsafe: WebAppInitData
|
val initDataUnsafe: WebAppInitData
|
||||||
|
|
||||||
|
val headerColor: HEXColor?
|
||||||
|
fun setHeaderColor(color: Color.BackgroundColor)
|
||||||
|
val backgroundColor: HEXColor?
|
||||||
|
fun setBackgroundColor(color: Color.Hex)
|
||||||
|
fun setBackgroundColor(color: Color.BackgroundColor)
|
||||||
|
|
||||||
@JsName("colorScheme")
|
@JsName("colorScheme")
|
||||||
val colorSchemeRaw: String
|
val colorSchemeRaw: String
|
||||||
val themeParams: ThemeParams
|
val themeParams: ThemeParams
|
||||||
@ -17,19 +27,34 @@ external class WebApp {
|
|||||||
@JsName("MainButton")
|
@JsName("MainButton")
|
||||||
val mainButton: MainButton
|
val mainButton: MainButton
|
||||||
|
|
||||||
|
@JsName("BackButton")
|
||||||
|
val backButton: BackButton
|
||||||
|
|
||||||
|
@JsName("HapticFeedback")
|
||||||
|
val hapticFeedback: HapticFeedback
|
||||||
|
|
||||||
internal fun onEvent(type: String, callback: () -> Unit)
|
internal fun onEvent(type: String, callback: () -> Unit)
|
||||||
@JsName("onEvent")
|
@JsName("onEvent")
|
||||||
internal fun onEventWithBoolean(type: String, callback: (ViewportChangedData) -> Unit)
|
internal fun onEventWithViewportChangedData(type: String, callback: (ViewportChangedData) -> Unit)
|
||||||
|
@JsName("onEvent")
|
||||||
|
internal fun onEventWithInvoiceClosedInfo(type: String, callback: (InvoiceClosedInfo) -> Unit)
|
||||||
|
|
||||||
fun offEvent(type: String, callback: () -> Unit)
|
fun offEvent(type: String, callback: () -> Unit)
|
||||||
@JsName("offEvent")
|
@JsName("offEvent")
|
||||||
fun offEventWithBoolean(type: String, callback: (ViewportChangedData) -> Unit)
|
fun offEventWithViewportChangedData(type: String, callback: (ViewportChangedData) -> Unit)
|
||||||
|
@JsName("offEvent")
|
||||||
|
fun offEventWithInvoiceClosedInfo(type: String, callback: (InvoiceClosedInfo) -> Unit)
|
||||||
|
|
||||||
fun sendData(data: String)
|
fun sendData(data: String)
|
||||||
|
|
||||||
fun ready()
|
fun ready()
|
||||||
fun expand()
|
fun expand()
|
||||||
fun close()
|
fun close()
|
||||||
|
|
||||||
|
fun isVersionAtLeast(version: String): Boolean
|
||||||
|
fun openLink(url: String)
|
||||||
|
fun openTelegramLink(url: String)
|
||||||
|
fun openInvoice(url: String, callback: (InvoiceClosedInfo) -> Unit = definedExternally)
|
||||||
}
|
}
|
||||||
|
|
||||||
val WebApp.colorScheme: ColorScheme
|
val WebApp.colorScheme: ColorScheme
|
||||||
@ -57,7 +82,19 @@ fun WebApp.onEvent(type: EventType, eventHandler: EventHandler) = {
|
|||||||
fun WebApp.onEvent(type: EventType.ViewportChanged, eventHandler: ViewportChangedEventHandler) = { it: ViewportChangedData ->
|
fun WebApp.onEvent(type: EventType.ViewportChanged, eventHandler: ViewportChangedEventHandler) = { it: ViewportChangedData ->
|
||||||
eventHandler(js("this").unsafeCast<WebApp>(), it)
|
eventHandler(js("this").unsafeCast<WebApp>(), it)
|
||||||
}.also {
|
}.also {
|
||||||
onEventWithBoolean(
|
onEventWithViewportChangedData(
|
||||||
|
type.typeName,
|
||||||
|
callback = it
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The callback which should be used in case you want to turn off events handling
|
||||||
|
*/
|
||||||
|
fun WebApp.onEvent(type: EventType.InvoiceClosed, eventHandler: InvoiceClosedEventHandler) = { it: InvoiceClosedInfo ->
|
||||||
|
eventHandler(js("this").unsafeCast<WebApp>(), it)
|
||||||
|
}.also {
|
||||||
|
onEventWithInvoiceClosedInfo(
|
||||||
type.typeName,
|
type.typeName,
|
||||||
callback = it
|
callback = it
|
||||||
)
|
)
|
||||||
@ -75,6 +112,18 @@ fun WebApp.onMainButtonClicked(eventHandler: EventHandler) = onEvent(EventType.M
|
|||||||
* @return The callback which should be used in case you want to turn off events handling
|
* @return The callback which should be used in case you want to turn off events handling
|
||||||
*/
|
*/
|
||||||
fun WebApp.onViewportChanged(eventHandler: ViewportChangedEventHandler) = onEvent(EventType.ViewportChanged, eventHandler)
|
fun WebApp.onViewportChanged(eventHandler: ViewportChangedEventHandler) = onEvent(EventType.ViewportChanged, eventHandler)
|
||||||
|
/**
|
||||||
|
* @return The callback which should be used in case you want to turn off events handling
|
||||||
|
*/
|
||||||
|
fun WebApp.onBackButtonClicked(eventHandler: EventHandler) = onEvent(EventType.BackButtonClicked, eventHandler)
|
||||||
|
/**
|
||||||
|
* @return The callback which should be used in case you want to turn off events handling
|
||||||
|
*/
|
||||||
|
fun WebApp.onSettingsButtonClicked(eventHandler: EventHandler) = onEvent(EventType.SettingsButtonClicked, eventHandler)
|
||||||
|
/**
|
||||||
|
* @return The callback which should be used in case you want to turn off events handling
|
||||||
|
*/
|
||||||
|
fun WebApp.onInvoiceClosed(eventHandler: InvoiceClosedEventHandler) = onEvent(EventType.InvoiceClosed, eventHandler)
|
||||||
|
|
||||||
fun WebApp.isInitDataSafe(botToken: String) = TelegramAPIUrlsKeeper(botToken).checkWebAppData(
|
fun WebApp.isInitDataSafe(botToken: String) = TelegramAPIUrlsKeeper(botToken).checkWebAppData(
|
||||||
initData,
|
initData,
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.types.ChatIdentifier
|
||||||
|
import dev.inmo.tgbotapi.types.Username
|
||||||
|
import dev.inmo.tgbotapi.types.chat.PublicChat
|
||||||
|
|
||||||
|
external interface WebAppChat {
|
||||||
|
val id: ChatIdentifier
|
||||||
|
val type: String
|
||||||
|
val title: String
|
||||||
|
val username: Username?
|
||||||
|
@JsName("photo_url")
|
||||||
|
val photoUrl: String?
|
||||||
|
}
|
@ -15,5 +15,10 @@ external interface WebAppInitData {
|
|||||||
@JsName("auth_date")
|
@JsName("auth_date")
|
||||||
val authDate: MilliSeconds
|
val authDate: MilliSeconds
|
||||||
|
|
||||||
|
@JsName("can_send_after")
|
||||||
|
val canSendAfter: MilliSeconds
|
||||||
|
|
||||||
|
val chat: WebAppChat
|
||||||
|
|
||||||
val hash: String
|
val hash: String
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps.haptic
|
||||||
|
|
||||||
|
external interface HapticFeedback {
|
||||||
|
fun impactOccurred(style: HapticFeedbackStyle)
|
||||||
|
fun notificationOccurred(type: HapticFeedbackType)
|
||||||
|
fun selectionChanged()
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps.haptic
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.Warning
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
value class HapticFeedbackStyle @Warning("Do not use this constructor if available objects from companion cover your needs") constructor(
|
||||||
|
val name: String
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
val Light = HapticFeedbackStyle("light")
|
||||||
|
val Medium = HapticFeedbackStyle("medium")
|
||||||
|
val Heavy = HapticFeedbackStyle("heavy")
|
||||||
|
val Rigid = HapticFeedbackStyle("rigid")
|
||||||
|
val Soft = HapticFeedbackStyle("soft")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps.haptic
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.Warning
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
value class HapticFeedbackType @Warning("Do not use this constructor if available objects from companion cover your needs") constructor(
|
||||||
|
val name: String
|
||||||
|
) {
|
||||||
|
companion object {
|
||||||
|
val Error = HapticFeedbackType("error")
|
||||||
|
val Success = HapticFeedbackType("success")
|
||||||
|
val Warning = HapticFeedbackType("warning")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps.invoice
|
||||||
|
|
||||||
|
external interface InvoiceClosedInfo {
|
||||||
|
val url: String
|
||||||
|
val status: String
|
||||||
|
}
|
||||||
|
|
||||||
|
val InvoiceClosedInfo.statusTyped
|
||||||
|
get() = when (status) {
|
||||||
|
InvoiceStatus.Paid.name -> InvoiceStatus.Paid
|
||||||
|
InvoiceStatus.Cancelled.name -> InvoiceStatus.Cancelled
|
||||||
|
InvoiceStatus.Failed.name -> InvoiceStatus.Failed
|
||||||
|
InvoiceStatus.Pending.name -> InvoiceStatus.Pending
|
||||||
|
else -> InvoiceStatus.Unknown(status)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
package dev.inmo.tgbotapi.webapps.invoice
|
||||||
|
|
||||||
|
sealed interface InvoiceStatus {
|
||||||
|
val name: String
|
||||||
|
object Paid : InvoiceStatus { override val name: String = "paid" }
|
||||||
|
object Cancelled : InvoiceStatus { override val name: String = "cancelled" }
|
||||||
|
object Failed : InvoiceStatus { override val name: String = "failed" }
|
||||||
|
object Pending : InvoiceStatus { override val name: String = "pending" }
|
||||||
|
value class Unknown(override val name: String) : InvoiceStatus
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user