1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-09-08 09:42:59 +00:00
This commit is contained in:
2018-12-26 16:07:24 +08:00
parent 120db4c445
commit 89eda29965
330 changed files with 6934 additions and 3 deletions

View File

@@ -0,0 +1,21 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.actions.BotAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendChatMessageRequest
import kotlinx.serialization.*
import kotlinx.serialization.internal.BooleanSerializer
/**
* Send notification to user which will be shown for 5 seconds or while user have no messages from bot
*/
@Serializable
data class SendAction(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(actionField)
val action: BotAction
): SendChatMessageRequest<Boolean> {
override fun method(): String = "sendChatAction"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
}

View File

@@ -0,0 +1,63 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import kotlinx.serialization.*
@Serializable
data class SendContact(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(phoneNumberField)
val phoneNumber: String,
@SerialName(firstNameField)
val firstName: String,
@SerialName(lastNameField)
@Optional
val lastName: String? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>
{
constructor(
chatId: ChatIdentifier,
contact: Contact,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): this(
chatId,
contact.phoneNumber,
contact.firstName,
contact.lastName,
disableNotification,
replyToMessageId,
replyMarkup
)
override fun method(): String = "sendVenue"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
fun Contact.toRequest(
chatId: ChatIdentifier,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): SendContact = SendContact(
chatId,
this,
disableNotification,
replyToMessageId,
replyMarkup
)

View File

@@ -0,0 +1,37 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import kotlinx.serialization.*
// TODO:: Add location tracker for tracking location
@Serializable
data class SendLocation(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(latitudeField)
override val latitude: Double,
@SerialName(longitudeField)
override val longitude: Double,
@SerialName(livePeriodField)
@Optional
val livePeriod: Long? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
PositionedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendLocation"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}

View File

@@ -0,0 +1,41 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableWebPagePreview
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import kotlinx.serialization.*
@Serializable
data class SendMessage(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(textField)
override val text: String,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(disableWebPagePreviewField)
@Optional
override val disableWebPagePreview: Boolean? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
DisableWebPagePreview
{
override fun method(): String = "sendMessage"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}

View File

@@ -0,0 +1,71 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import kotlinx.serialization.*
@Serializable
data class SendVenue(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(latitudeField)
override val latitude: Double,
@SerialName(longitudeField)
override val longitude: Double,
@SerialName(titleField)
override val title: String,
@SerialName(addressField)
val address: String,
@SerialName(foursquareIdField)
@Optional
val foursquareId: String? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>,
PositionedSendMessageRequest<RawMessage>,
TitledSendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>
{
constructor(
chatId: ChatIdentifier,
venue: Venue,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): this(
chatId,
venue.location.latitude,
venue.location.longitude,
venue.title,
venue.address,
venue.foursquareId,
disableNotification,
replyToMessageId,
replyMarkup
)
override fun method(): String = "sendVenue"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
fun Venue.toRequest(
chatId: ChatIdentifier,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): SendVenue = SendVenue(
chatId,
this,
disableNotification,
replyToMessageId,
replyMarkup
)

View File

@@ -0,0 +1,8 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
interface DuratedSendMessageRequest<T: Any>: SendMessageRequest<T> {
/**
* Duration of media, usually in seconds
*/
val duration: Int?
}

View File

@@ -0,0 +1,6 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
interface PositionedSendMessageRequest<T: Any>: SendMessageRequest<T> {
val latitude: Double
val longitude: Double
}

View File

@@ -0,0 +1,5 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup
interface ReplyingMarkupSendMessageRequest<T: Any>: SendMessageRequest<T>, ReplyMarkup

View File

@@ -0,0 +1,6 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest
interface SendChatMessageRequest<T: Any> : SimpleRequest<T>, ChatRequest

View File

@@ -0,0 +1,6 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableNotification
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMessageId
interface SendMessageRequest<T: Any> : SendChatMessageRequest<T>, ReplyMessageId, DisableNotification

View File

@@ -0,0 +1,6 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
interface SizedSendMessageRequest<T: Any> : SendMessageRequest<T> {
val width: Int?
val height: Int?
}

View File

@@ -0,0 +1,8 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
interface TextableSendMessageRequest<T: Any>: SendMessageRequest<T> {
val text: String?
val parseMode: ParseMode?
}

View File

@@ -0,0 +1,5 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
interface ThumbedSendMessageRequest<T: Any>: SendMessageRequest<T> {
val thumb: String?
}

View File

@@ -0,0 +1,5 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts
interface TitledSendMessageRequest<T: Any>: SendMessageRequest<T> {
val title: String?
}

View File

@@ -0,0 +1,33 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.games
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.ReplyingMarkupSendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Optional
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class SendGame (
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(gameShortNameField)
val gameShortName: String,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>,
ReplyMarkup {
override fun method(): String = "sendGame"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}

View File

@@ -0,0 +1,109 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendAnimation(
chatId: ChatIdentifier,
animation: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
duration: Int? = null,
width: Int? = null,
height: Int? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val animationAsFileId = (animation as? FileId) ?.fileId
val animationAsFile = animation as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendAnimationData(
chatId,
animationAsFileId,
thumbAsFileId,
caption,
parseMode,
duration,
width,
height,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (animationAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendAnimationFiles(animationAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendAnimationData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(animationField)
@Optional
val animation: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(durationField)
@Optional
override val duration: Int? = null,
@SerialName(widthField)
@Optional
override val width: Int? = null,
@SerialName(heightField)
@Optional
override val height: Int? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>,
DuratedSendMessageRequest<RawMessage>,
SizedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendAnimation"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendAnimationFiles internal constructor(
val animation: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
animationField to animation,
thumbField to thumb
)

View File

@@ -0,0 +1,109 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendAudio(
chatId: ChatIdentifier,
audio: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
duration: Int? = null,
performer: String? = null,
title: String? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val audioAsFileId = (audio as? FileId) ?.fileId
val audioAsFile = audio as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendAudioData(
chatId,
audioAsFileId,
thumbAsFileId,
caption,
parseMode,
duration,
performer,
title,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (audioAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendAudioFiles(audioAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendAudioData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(audioField)
@Optional
val audio: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(durationField)
@Optional
override val duration: Int? = null,
@SerialName(performerField)
@Optional
val performer: String? = null,
@SerialName(titleField)
@Optional
override val title: String? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>,
TitledSendMessageRequest<RawMessage>,
DuratedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendAudio"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendAudioFiles internal constructor(
val audio: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
audioField to audio,
thumbField to thumb
)

View File

@@ -0,0 +1,92 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendDocument(
chatId: ChatIdentifier,
document: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val documentAsFileId = (document as? FileId) ?.fileId
val documentAsFile = document as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendDocumentData(
chatId,
documentAsFileId,
thumbAsFileId,
caption,
parseMode,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (documentAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendDocumentFiles(documentAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendDocumentData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(documentField)
@Optional
val document: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendDocument"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendDocumentFiles internal constructor(
val document: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
documentField to document,
thumbField to thumb
)

View File

@@ -0,0 +1,90 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMemberInputMedia
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.ThumbedInputMedia
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls
import kotlinx.serialization.*
import kotlinx.serialization.internal.ArrayListSerializer
import kotlinx.serialization.json.jsonArray
val membersCountInMediaGroup: IntRange = 2 .. 10
fun SendMediaGroup(
chatId: ChatIdentifier,
media: List<MediaGroupMemberInputMedia>,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null
): Request<List<RawMessage>> {
if (media.size !in membersCountInMediaGroup) {
throw IllegalArgumentException("Count of members for media group must be in $membersCountInMediaGroup range")
}
val files: List<MultipartFile> = media.flatMap {
listOfNotNull(
it.file as? MultipartFile,
if (it is ThumbedInputMedia) {
it.thumb as? MultipartFile
} else {
null
}
)
}
val data = SendMediaGroupData(
chatId,
media,
disableNotification,
replyToMessageId
)
return if (files.isEmpty()) {
data
} else {
MultipartRequestImpl(
data,
SendMediaGroupFiles(files)
)
}
}
private val serializer = ArrayListSerializer(RawMessage.serializer())
@Serializable
data class SendMediaGroupData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@Transient
val media: List<MediaGroupMemberInputMedia> = emptyList(),
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null
) : Data<List<RawMessage>>,
SendMessageRequest<List<RawMessage>>
{
// TODO:: fix this nail when kotlin serialisation will support
@ImplicitReflectionSerializer
@SerialName(mediaField)
private val convertedMedia: String
get() = jsonArray {
media.forEach {
+it.toJsonWithoutNulls()
}
}.toString()
override fun method(): String = "sendMediaGroup"
override fun resultSerializer(): KSerializer<List<RawMessage>> = serializer
}
data class SendMediaGroupFiles internal constructor(
val files: List<MultipartFile>
) : Files by (files.map { it.fileId to it }.toMap())

View File

@@ -0,0 +1,74 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import kotlinx.serialization.*
fun SendPhoto(
chatId: ChatIdentifier,
photo: InputFile,
caption: String? = null,
parseMode: ParseMode? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val data = SendPhotoData(
chatId,
(photo as? FileId) ?.fileId,
caption,
parseMode,
disableNotification,
replyToMessageId,
replyMarkup
)
return data.photo ?.let {
data
} ?: MultipartRequestImpl(
data,
SendPhotoFiles(photo as MultipartFile)
)
}
@Serializable
data class SendPhotoData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(photoField)
@Optional
val photo: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>
{
override fun method(): String = "sendPhoto"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendPhotoFiles internal constructor(
val photo: MultipartFile
) : Files by mapOf(
photoField to photo
)

View File

@@ -0,0 +1,62 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.ReplyingMarkupSendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls
import kotlinx.serialization.*
import kotlinx.serialization.json.JsonObject
fun SendSticker(
chatId: ChatIdentifier,
sticker: InputFile,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> = SendStickerByFileId(
chatId,
sticker as? FileId,
disableNotification,
replyToMessageId,
replyMarkup
).let {
when (sticker) {
is MultipartFile -> SendStickerByFile(it, sticker)
is FileId -> it
}
}
@Serializable
data class SendStickerByFileId internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(stickerField)
@Optional
val sticker: FileId? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : SendMessageRequest<RawMessage>, ReplyingMarkupSendMessageRequest<RawMessage> {
override fun method(): String = "sendSticker"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendStickerByFile internal constructor(
@Transient
private val sendStickerByFileId: SendStickerByFileId,
val sticker: MultipartFile
) : MultipartRequest<RawMessage>, Request<RawMessage> by sendStickerByFileId {
override val mediaMap: Map<String, MultipartFile> = mapOf(stickerField to sticker)
override val paramsJson: JsonObject = sendStickerByFileId.toJsonWithoutNulls(SendStickerByFileId.serializer())
}

View File

@@ -0,0 +1,114 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendVideo(
chatId: ChatIdentifier,
video: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
duration: Int? = null,
width: Int? = null,
height: Int? = null,
supportStreaming: Boolean? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val videoAsFileId = (video as? FileId) ?.fileId
val videoAsFile = video as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendVideoData(
chatId,
videoAsFileId,
thumbAsFileId,
caption,
parseMode,
duration,
width,
height,
supportStreaming,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (videoAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendVideoFiles(videoAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendVideoData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(videoField)
@Optional
val video: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(durationField)
@Optional
override val duration: Int? = null,
@SerialName(widthField)
@Optional
override val width: Int? = null,
@SerialName(heightField)
@Optional
override val height: Int? = null,
@SerialName(supportStreamingField)
@Optional
val supportStreaming: Boolean? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>,
DuratedSendMessageRequest<RawMessage>,
SizedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendVideo"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendVideoFiles internal constructor(
val video: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
videoField to video,
thumbField to thumb
)

View File

@@ -0,0 +1,108 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendVideoNote(
chatId: ChatIdentifier,
videoNote: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
duration: Int? = null,
size: Int? = null, // in documentation - length (size of video side)
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val videoNoteAsFileId = (videoNote as? FileId) ?.fileId
val videoNoteAsFile = videoNote as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendVideoNoteData(
chatId,
videoNoteAsFileId,
thumbAsFileId,
caption,
parseMode,
duration,
size,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (videoNoteAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendVideoNoteFiles(videoNoteAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendVideoNoteData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(videoNoteField)
@Optional
val videoNote: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(durationField)
@Optional
override val duration: Int? = null,
@SerialName(lengthField)
@Optional
override val width: Int? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>,
DuratedSendMessageRequest<RawMessage>,
SizedSendMessageRequest<RawMessage>
{
@Transient
override val height: Int?
get() = width
override fun method(): String = "sendVideoNote"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendVideoNoteFiles internal constructor(
val videoNote: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
videoNoteField to videoNote,
thumbField to thumb
)

View File

@@ -0,0 +1,98 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull
import kotlinx.serialization.*
fun SendVoice(
chatId: ChatIdentifier,
voice: InputFile,
thumb: InputFile?,
caption: String? = null,
parseMode: ParseMode? = null,
duration: Int? = null,
disableNotification: Boolean = false,
replyToMessageId: MessageIdentifier? = null,
replyMarkup: KeyboardMarkup? = null
): Request<RawMessage> {
val voiceAsFileId = (voice as? FileId) ?.fileId
val voiceAsFile = voice as? MultipartFile
val thumbAsFileId = (thumb as? FileId) ?.fileId
val thumbAsFile = thumb as? MultipartFile
val data = SendVoiceData(
chatId,
voiceAsFileId,
thumbAsFileId,
caption,
parseMode,
duration,
disableNotification,
replyToMessageId,
replyMarkup
)
return if (voiceAsFile == null && thumbAsFile == null) {
data
} else {
MultipartRequestImpl(
data,
SendVoiceFiles(voiceAsFile, thumbAsFile)
)
}
}
@Serializable
data class SendVoiceData internal constructor(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(voiceField)
@Optional
val voice: String? = null,
@SerialName(thumbField)
@Optional
override val thumb: String? = null,
@SerialName(captionField)
@Optional
override val text: String? = null,
@SerialName(parseModeField)
@Optional
override val parseMode: ParseMode? = null,
@SerialName(durationField)
@Optional
override val duration: Int? = null,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: KeyboardMarkup? = null
) : Data<RawMessage>,
SendMessageRequest<RawMessage>,
ReplyingMarkupSendMessageRequest<RawMessage>,
TextableSendMessageRequest<RawMessage>,
ThumbedSendMessageRequest<RawMessage>,
DuratedSendMessageRequest<RawMessage>
{
override fun method(): String = "sendVoice"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
}
data class SendVoiceFiles internal constructor(
val voice: MultipartFile? = null,
val thumb: MultipartFile? = null
) : Files by mapOfNotNull(
voiceField to voice,
thumbField to thumb
)

View File

@@ -0,0 +1,5 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
interface Data<T: Any> : SimpleRequest<T>

View File

@@ -0,0 +1,5 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile
typealias Files = Map<String, MultipartFile>

View File

@@ -0,0 +1,21 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartRequest
import kotlinx.serialization.ImplicitReflectionSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.JsonObject
/**
* Will be used as SimpleRequest if
*/
class MultipartRequestImpl<D: Data<R>, F: Files, R: Any>(
val data: D,
val files: F
) : MultipartRequest<R> {
override fun method(): String = data.method()
override fun resultSerializer(): KSerializer<R> = data.resultSerializer()
@ImplicitReflectionSerializer
override val paramsJson: JsonObject = data.json()
override val mediaMap: Map<String, MultipartFile> = files
}

View File

@@ -0,0 +1,113 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.payments
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPrice
import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPricesSerializer
import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.*
import kotlinx.serialization.*
import kotlinx.serialization.Optional
import java.util.*
/**
* @param providerData - JSON-ENCODED FIELD
*/
@Serializable
data class SendInvoice(
@SerialName(chatIdField)
override val chatId: ChatId,
@SerialName(titleField)
val title: String,
@SerialName(descriptionField)
val description: String,
@SerialName(payloadField)
val payload: String,
@SerialName(providerTokenField)
val providerToken: String,
@SerialName(startParameterField)
val startParameter: StartParameter,
@Serializable(CurrencySerializer::class)
@SerialName(currencyField)
override val currency: Currency,
@Serializable(LabeledPricesSerializer::class)
@SerialName(pricesField)
override val prices: List<LabeledPrice>,
@SerialName(providerDataField)
@Optional
val providerData: String? = null,
@SerialName(requireNameField)
@Optional
val requireName: Boolean = false,
@SerialName(requirePhoneNumberField)
@Optional
val requirePhoneNumber: Boolean = false,
@SerialName(requireEmailField)
@Optional
val requireEmail: Boolean = false,
@SerialName(requireShippingAddressField)
@Optional
val requireShippingAddress: Boolean = false,
@SerialName(shouldSendPhoneNumberToProviderField)
@Optional
val shouldSendPhoneNumberToProvider: Boolean = false,
@SerialName(shouldSendEmailToProviderField)
@Optional
val shouldSendEmailToProvider: Boolean = false,
@SerialName(priceDependOnShipAddressField)
@Optional
val priceDependOnShipAddress: Boolean = false,
@SerialName(disableNotificationField)
@Optional
override val disableNotification: Boolean = false,
@SerialName(replyToMessageIdField)
@Optional
override val replyToMessageId: MessageIdentifier? = null,
@SerialName(replyMarkupField)
@Optional
override val replyMarkup: InlineKeyboardMarkup? = null
) : Currencied,
Priced,
ChatRequest,
DisableNotification,
ReplyMessageId,
ReplyMarkup,
SendMessageRequest<RawMessage> {
override fun method(): String = "sendInvoice"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
@SerialName(photoUrlField)
var photoUrl: String? = null
private set
@SerialName(photoSizeField)
var photoSize: Long? = null
private set
@SerialName(photoWidthField)
var photoWidth: Int? = null
private set
@SerialName(photoHeightField)
var photoHeight: Int? = null
private set
fun setPhoto(
photoUrl: String,
photoSize: Long? = null,
photoWidth: Int? = null,
photoHeight: Int? = null
) {
this.photoUrl = photoUrl
this.photoSize = photoSize
this.photoWidth = photoWidth
this.photoHeight = photoHeight
}
fun unsetPhoto() {
photoUrl = null
photoSize = null
photoWidth = null
photoHeight = null
}
}