From 89eda29965ea3df5b285d3e14f8f24247d64ebc5 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Wed, 26 Dec 2018 16:07:24 +0800 Subject: [PATCH] init --- .gitignore | 10 + CHANGELOG | 1 + LICENSE | 4 +- README.md | 27 +- build.gradle | 40 +++ gradle.properties | 6 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55436 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++ gradlew.bat | 84 ++++++ settings.gradle | 18 ++ .../insanusmokrassar/TelegramBotAPI/Index.kt | 24 ++ .../bot/DefaultRequestsExecutor.kt | 16 ++ .../bot/Ktor/KtorCallFactory.kt | 13 + .../bot/Ktor/KtorRequestsExecutor.kt | 69 +++++ .../Ktor/base/MultipartRequestCallFactory.kt | 51 ++++ .../bot/Ktor/base/SimpleRequestCallFactory.kt | 39 +++ .../TelegramBotAPI/bot/ProxySettings.kt | 37 +++ .../TelegramBotAPI/bot/RequestException.kt | 13 + .../TelegramBotAPI/bot/RequestsExecutor.kt | 8 + .../TelegramBotAPI/requests/DeleteMessage.kt | 18 ++ .../TelegramBotAPI/requests/ForwardMessage.kt | 23 ++ .../TelegramBotAPI/requests/GetMe.kt | 10 + .../TelegramBotAPI/requests/GetUpdates.kt | 50 ++++ .../requests/abstracts/InputFile.kt | 45 ++++ .../requests/abstracts/MultipartRequest.kt | 8 + .../requests/abstracts/Request.kt | 20 ++ .../requests/abstracts/SimpleRequest.kt | 3 + .../abstracts/types/ByInlineMessageId.kt | 7 + .../requests/abstracts/types/ByMessageId.kt | 7 + .../requests/abstracts/types/ChatRequest.kt | 7 + .../abstracts/types/DisableNotification.kt | 5 + .../abstracts/types/DisableWebPagePreview.kt | 5 + .../requests/abstracts/types/ReplyMarkup.kt | 7 + .../abstracts/types/ReplyMessageId.kt | 7 + .../requests/abstracts/types/UntilDate.kt | 7 + .../requests/answers/AnswerCallbackQuery.kt | 35 +++ .../payments/AnswerPreCheckoutQuery.kt | 39 +++ .../answers/payments/AnswerShippingQuery.kt | 49 ++++ .../abstracts/AnswerPreCheckoutQuery.kt | 14 + .../payments/abstracts/AnswerShippingQuery.kt | 14 + .../requests/chat/ExportChatInviteLink.kt | 17 ++ .../TelegramBotAPI/requests/chat/LeaveChat.kt | 18 ++ .../requests/chat/UnpinChatMessage.kt | 0 .../chat/abstracts/ChatMemberRequest.kt | 9 + .../requests/chat/get/GetChat.kt | 19 ++ .../chat/get/GetChatAdministrators.kt | 19 ++ .../requests/chat/get/GetChatMembersCount.kt | 17 ++ .../requests/chat/members/GetChatMember.kt | 19 ++ .../requests/chat/members/KickChatMember.kt | 21 ++ .../chat/members/PromoteChatMember.kt | 45 ++++ .../chat/members/RestrictChatMember.kt | 33 +++ .../requests/chat/members/UnbanChatMember.kt | 17 ++ .../requests/chat/modify/DeleteChatPhoto.kt | 18 ++ .../requests/chat/modify/PinChatMessage.kt | 22 ++ .../chat/modify/SetChatDescription.kt | 24 ++ .../requests/chat/modify/SetChatPhoto.kt | 22 ++ .../requests/chat/modify/SetChatTitle.kt | 24 ++ .../requests/chat/modify/UnpinChatMessage.kt | 18 ++ .../chat/stickers/DeleteChatStickerSet.kt | 16 ++ .../chat/stickers/SetChatStickerSet.kt | 18 ++ .../common/CommonMultipartFileRequest.kt | 13 + .../EditChatMessageLiveLocation.kt | 26 ++ .../EditInlineMessageLiveLocation.kt | 24 ++ .../StopChatMessageLiveLocation.kt | 22 ++ .../StopInlineMessageLiveLocation.kt | 20 ++ .../ReplyMarkup/EditChatMessageReplyMarkup.kt | 25 ++ .../EditInlineMessageReplyMarkup.kt | 21 ++ .../edit/abstracts/EditChatMessage.kt | 11 + .../EditDisableWebPagePreviewMessage.kt | 5 + .../edit/abstracts/EditInlineMessage.kt | 9 + .../edit/abstracts/EditLocationMessage.kt | 6 + .../edit/abstracts/EditMediaMessage.kt | 7 + .../edit/abstracts/EditReplyMessage.kt | 8 + .../edit/abstracts/EditTextChatMessage.kt | 10 + .../edit/caption/EditChatMessageCaption.kt | 31 +++ .../edit/caption/EditInlineMessageCaption.kt | 27 ++ .../edit/media/EditChatMessageMedia.kt | 35 +++ .../edit/media/EditInlineMessageMedia.kt | 32 +++ .../requests/edit/text/EditChatMessageText.kt | 35 +++ .../edit/text/EditInlineMessageText.kt | 31 +++ .../requests/games/GetGameHighScoresByChat.kt | 17 ++ .../GetGameHighScoresByInlineMessageId.kt | 15 ++ .../requests/games/SetGameScoreByChatId.kt | 24 ++ .../games/SetGameScoreByInlineMessageId.kt | 22 ++ .../games/abstracts/GetGameHighScores.kt | 16 ++ .../requests/games/abstracts/SetGameScore.kt | 16 ++ .../TelegramBotAPI/requests/get/GetFile.kt | 16 ++ .../requests/get/GetStickerSet.kt | 17 ++ .../requests/get/GetUserProfilePhotos.kt | 27 ++ .../requests/send/SendAction.kt | 21 ++ .../requests/send/SendContact.kt | 63 +++++ .../requests/send/SendLocation.kt | 37 +++ .../requests/send/SendMessage.kt | 41 +++ .../TelegramBotAPI/requests/send/SendVenue.kt | 71 ++++++ .../abstracts/DuratedSendMessageRequest.kt | 8 + .../abstracts/PositionedSendMessageRequest.kt | 6 + .../ReplyingMarkupSendMessageRequest.kt | 5 + .../send/abstracts/SendChatMessageRequest.kt | 6 + .../send/abstracts/SendMessageRequest.kt | 6 + .../send/abstracts/SizedSendMessageRequest.kt | 6 + .../abstracts/TextableSendMessageRequest.kt | 8 + .../abstracts/ThumbedSendMessageRequest.kt | 5 + .../abstracts/TitledSendMessageRequest.kt | 5 + .../requests/send/games/SendGame.kt | 33 +++ .../requests/send/media/SendAnimation.kt | 109 ++++++++ .../requests/send/media/SendAudio.kt | 109 ++++++++ .../requests/send/media/SendDocument.kt | 92 +++++++ .../requests/send/media/SendMediaGroup.kt | 90 +++++++ .../requests/send/media/SendPhoto.kt | 74 ++++++ .../send/media/SendStickerByFileId.kt | 62 +++++ .../requests/send/media/SendVideo.kt | 114 +++++++++ .../requests/send/media/SendVideoNote.kt | 108 ++++++++ .../requests/send/media/SendVoice.kt | 98 +++++++ .../requests/send/media/base/Data.kt | 5 + .../requests/send/media/base/Files.kt | 5 + .../send/media/base/MultipartRequestImpl.kt | 21 ++ .../requests/send/payments/SendInvoice.kt | 113 +++++++++ .../requests/stickers/AddStickerToSet.kt | 49 ++++ .../requests/stickers/CreateNewStickerSet.kt | 53 ++++ .../requests/stickers/DeleteStickerFromSet.kt | 16 ++ .../stickers/SetStickerPositionInSet.kt | 24 ++ .../requests/stickers/UploadStickerFile.kt | 28 ++ .../stickers/abstracts/StickerSetAction.kt | 16 ++ .../types/CallbackQuery/CallbackQuery.kt | 10 + .../types/CallbackQuery/DataCallbackQuery.kt | 5 + .../GameShortNameCallbackQuery.kt | 5 + .../InlineMessageIdCallbackQuery.kt | 7 + .../InlineMessageIdDataCallbackQuery.kt | 11 + ...lineMessageIdGameShortNameCallbackQuery.kt | 11 + .../CallbackQuery/MessageCallbackQuery.kt | 7 + .../CallbackQuery/MessageDataCallbackQuery.kt | 13 + .../MessageGameShortNameCallbackQuery.kt | 13 + .../types/CallbackQuery/RawCallbackQuery.kt | 36 +++ .../TelegramBotAPI/types/ChatIdentifier.kt | 48 ++++ .../ChatMember/AdministratorChatMember.kt | 16 ++ .../types/ChatMember/BannedChatMember.kt | 5 + .../types/ChatMember/ChatMember.kt | 7 + .../types/ChatMember/CreatorChatMember.kt | 5 + .../types/ChatMember/KickedChatMember.kt | 10 + .../types/ChatMember/LeftChatMember.kt | 5 + .../types/ChatMember/MemberChatMember.kt | 5 + .../types/ChatMember/RawChatMember.kt | 85 +++++++ .../types/ChatMember/RestrictedChatMember.kt | 14 + .../TelegramBotAPI/types/ChatPhoto.kt | 12 + .../TelegramBotAPI/types/Common.kt | 181 +++++++++++++ .../TelegramBotAPI/types/Contact.kt | 19 ++ .../BaseChosenInlineResult.kt | 11 + .../LocationChosenInlineResult.kt | 12 + .../RawChosenInlineResult.kt | 28 ++ .../InlineQueryResultArticle.kt | 46 ++++ .../InlineQueryResultGame.kt | 17 ++ .../abstracts/CaptionedInlineQueryResult.kt | 5 + .../abstracts/DescribedInlineQueryResult.kt | 5 + .../abstracts/DuratedInlineResultQuery.kt | 5 + .../abstracts/FileInlineQueryResult.kt | 7 + .../abstracts/InlineQueryResult.kt | 13 + .../OptionallyTitledInlineQueryResult.kt | 7 + .../abstracts/PositionedInlineQueryResult.kt | 5 + .../abstracts/SizedInlineQueryResult.kt | 6 + .../abstracts/ThumbSizedInlineQueryResult.kt | 6 + .../abstracts/ThumbedInlineQueryResult.kt | 5 + .../abstracts/TitledInlineQueryResult.kt | 5 + .../abstracts/UrlInlineQueryResult.kt | 5 + .../abstracts/WithFileIdInlineQueryResult.kt | 7 + ...ithInputMessageContentInlineQueryResult.kt | 7 + .../abstracts/ChosenInlineResult.kt | 10 + .../InlineQueries/abstracts/InlineQuery.kt | 13 + .../abstracts/InputMessageContent.kt | 4 + .../InlineQueries/query/BaseInlineQuery.kt | 16 ++ .../query/LocationInlineQuery.kt | 16 ++ .../InlineQueries/query/RawInlineQuery.kt | 26 ++ .../types/InputMedia/CaptionedInputMedia.kt | 8 + .../types/InputMedia/DuratedInputMedia.kt | 5 + .../types/InputMedia/InputMedia.kt | 10 + .../types/InputMedia/InputMediaAnimation.kt | 37 +++ .../types/InputMedia/InputMediaAudio.kt | 36 +++ .../types/InputMedia/InputMediaDocument.kt | 31 +++ .../types/InputMedia/InputMediaPhoto.kt | 44 ++++ .../types/InputMedia/InputMediaVideo.kt | 42 +++ .../InputMedia/MediaGroupMemberInputMedia.kt | 8 + .../types/InputMedia/SizedInputMedia.kt | 6 + .../types/InputMedia/ThumbedInputMedia.kt | 20 ++ .../types/InputMedia/TitledInputMedia.kt | 5 + .../TelegramBotAPI/types/Location.kt | 13 + .../MessageEntity/BoldTextMessageEntity.kt | 9 + .../MessageEntity/BotCommandMessageEntity.kt | 11 + .../MessageEntity/CodeTextMessageEntity.kt | 9 + .../types/MessageEntity/EMailMessageEntity.kt | 11 + .../MessageEntity/HashTagMessageEntity.kt | 7 + .../MessageEntity/ItalicTextMessageEntity.kt | 9 + .../MessageEntity/MentionMessageEntity.kt | 10 + .../types/MessageEntity/MessageEntity.kt | 10 + .../MessageEntity/PhoneNumberMessageEntity.kt | 7 + .../MessageEntity/PreTextMessageEntity.kt | 9 + .../types/MessageEntity/RawMessageEntity.kt | 42 +++ .../MessageEntity/TextLinkMessageEntity.kt | 12 + .../MessageEntity/TextMentionMessageEntity.kt | 14 + .../types/MessageEntity/TextMessageEntity.kt | 9 + .../types/MessageEntity/URLMessageEntity.kt | 14 + .../types/ParseMode/ParseMode.kt | 41 +++ .../types/ResponseParameters.kt | 30 +++ .../TelegramBotAPI/types/TelegramDate.kt | 36 +++ .../TelegramBotAPI/types/User.kt | 31 +++ .../TelegramBotAPI/types/UserProfilePhotos.kt | 18 ++ .../TelegramBotAPI/types/Venue.kt | 19 ++ .../types/abstracts/Captioned.kt | 8 + .../types/abstracts/Locationed.kt | 6 + .../TelegramBotAPI/types/actions/BotAction.kt | 75 ++++++ .../TelegramBotAPI/types/buttons/Common.kt | 3 + .../types/buttons/ForceReply.kt | 12 + .../CallbackDataInlineKeyboardButton.kt | 14 + .../InlineKeyboardButton.kt | 5 + .../PayInlineKeyboardButton.kt | 10 + ...ineQueryCurrentChatInlineKeyboardButton.kt | 11 + .../SwitchInlineQueryInlineKeyboardButton.kt | 11 + .../URLInlineKeyboardButton.kt | 9 + .../types/buttons/InlineKeyboardMarkup.kt | 11 + .../types/buttons/KeyboardButton.kt | 14 + .../types/buttons/KeyboardMarkup.kt | 3 + .../types/buttons/ReplyKeyboardMarkup.kt | 16 ++ .../types/buttons/ReplyKeyboardRemove.kt | 12 + .../TelegramBotAPI/types/chat/ChannelChat.kt | 14 + .../TelegramBotAPI/types/chat/Chat.kt | 8 + .../TelegramBotAPI/types/chat/GroupChat.kt | 14 + .../TelegramBotAPI/types/chat/PrivateChat.kt | 11 + .../TelegramBotAPI/types/chat/PublicChat.kt | 6 + .../TelegramBotAPI/types/chat/RawChat.kt | 58 +++++ .../types/chat/SupergroupChat.kt | 17 ++ .../types/files/AnimationFile.kt | 26 ++ .../TelegramBotAPI/types/files/AudioFile.kt | 25 ++ .../types/files/DocumentFile.kt | 22 ++ .../TelegramBotAPI/types/files/File.kt | 14 + .../TelegramBotAPI/types/files/PathedFile.kt | 26 ++ .../TelegramBotAPI/types/files/PhotoSize.kt | 38 +++ .../TelegramBotAPI/types/files/Sticker.kt | 32 +++ .../types/files/TelegramFile.kt | 17 ++ .../TelegramBotAPI/types/files/VideoFile.kt | 23 ++ .../types/files/VideoNoteFile.kt | 23 ++ .../TelegramBotAPI/types/files/VoiceFile.kt | 19 ++ .../files/abstracts/CustomNamedMediaFile.kt | 7 + .../types/files/abstracts/MimedMediaFile.kt | 7 + .../files/abstracts/PlayableMediaFile.kt | 5 + .../types/files/abstracts/SizedMediaFile.kt | 6 + .../files/abstracts/TelegramMediaFile.kt | 15 ++ .../types/files/abstracts/ThumbedMediaFile.kt | 7 + .../types/files/abstracts/TitledMediaFile.kt | 5 + .../types/games/CallbackGame.kt | 10 + .../TelegramBotAPI/types/games/Game.kt | 34 +++ .../types/games/GameHighScore.kt | 15 ++ .../types/message/ChannelEventMessage.kt | 14 + .../types/message/ChannelMessage.kt | 20 ++ .../message/ChatEvents/ChannelChatCreated.kt | 5 + .../message/ChatEvents/DeleteChatPhoto.kt | 5 + .../message/ChatEvents/GroupChatCreated.kt | 8 + .../message/ChatEvents/LeftChatMember.kt | 8 + .../message/ChatEvents/NewChatMembers.kt | 9 + .../types/message/ChatEvents/NewChatPhoto.kt | 8 + .../types/message/ChatEvents/NewChatTitle.kt | 7 + .../types/message/ChatEvents/PinnedMessage.kt | 8 + .../ChatEvents/SupergroupChatCreated.kt | 8 + .../ChatEvents/abstracts/ChannelEvent.kt | 3 + .../message/ChatEvents/abstracts/ChatEvent.kt | 3 + .../ChatEvents/abstracts/CommonEvent.kt | 3 + .../ChatEvents/abstracts/GroupEvent.kt | 3 + .../ChatEvents/abstracts/SupergroupEvent.kt | 3 + .../types/message/CommonMessageImpl.kt | 22 ++ .../types/message/ForwardedMessage.kt | 23 ++ .../types/message/GroupEventMessage.kt | 14 + .../types/message/RawMessage.kt | 239 ++++++++++++++++++ .../types/message/SupergroupEventMessage.kt | 14 + .../abstracts/AbleToBeEditedMessage.kt | 7 + .../abstracts/AbleToBeForwardedMessage.kt | 7 + .../abstracts/AbleToBePaymentedMessage.kt | 7 + .../message/abstracts/AbleToReplyMessage.kt | 5 + .../message/abstracts/ChatEventMessage.kt | 7 + .../types/message/abstracts/CommonMessage.kt | 9 + .../types/message/abstracts/ContentMessage.kt | 7 + .../message/abstracts/MediaGroupMessage.kt | 8 + .../types/message/abstracts/Message.kt | 11 + .../types/message/content/ContactContent.kt | 8 + .../types/message/content/GameContent.kt | 8 + .../types/message/content/LocationContent.kt | 8 + .../types/message/content/TextContent.kt | 9 + .../types/message/content/VenueContent.kt | 8 + .../abstracts/CaptionedMediaContent.kt | 8 + .../abstracts/MediaCollectionContent.kt | 7 + .../message/content/abstracts/MediaContent.kt | 7 + .../content/abstracts/MediaGroupContent.kt | 3 + .../content/abstracts/MessageContent.kt | 3 + .../message/content/media/AnimationContent.kt | 10 + .../message/content/media/AudioContent.kt | 12 + .../message/content/media/DocumentContent.kt | 12 + .../message/content/media/PhotoContent.kt | 11 + .../message/content/media/StickerContent.kt | 8 + .../message/content/media/VideoContent.kt | 11 + .../message/content/media/VideoNoteContent.kt | 8 + .../message/content/media/VoiceContent.kt | 12 + .../message/payments/InvoiceOfPayment.kt | 8 + .../message/payments/SuccessfulPaymentInfo.kt | 8 + .../message/payments/abstracts/PaymentInfo.kt | 3 + .../TelegramBotAPI/types/payments/Invoice.kt | 22 ++ .../types/payments/LabeledPrice.kt | 14 + .../types/payments/OrderInfo.kt | 17 ++ .../types/payments/PreCheckoutQuery.kt | 29 +++ .../types/payments/ShippingAddress.kt | 22 ++ .../types/payments/ShippingOption.kt | 21 ++ .../types/payments/ShippingQuery.kt | 17 ++ .../types/payments/SuccessfulPayment.kt | 28 ++ .../types/payments/abstracts/Amounted.kt | 7 + .../types/payments/abstracts/Currencied.kt | 21 ++ .../types/payments/abstracts/Priced.kt | 7 + .../types/stickers/MaskPosition.kt | 17 ++ .../types/stickers/StickerSet.kt | 18 ++ .../types/update/CallbackQueryUpdate.kt | 10 + .../types/update/ChannelPostUpdate.kt | 10 + .../types/update/ChosenInlineResultUpdate.kt | 10 + .../types/update/EditChannelPostUpdate.kt | 10 + .../types/update/EditMessageUpdate.kt | 10 + .../types/update/InlineQueryUpdate.kt | 10 + .../types/update/MessageUpdate.kt | 10 + .../types/update/PreCheckoutQueryUpdate.kt | 10 + .../TelegramBotAPI/types/update/RawUpdate.kt | 46 ++++ .../types/update/ShippingQueryUpdate.kt | 10 + .../update/abstracts/BaseMessageUpdate.kt | 5 + .../types/update/abstracts/Update.kt | 8 + .../TelegramBotAPI/utils/JSON.kt | 47 ++++ .../TelegramBotAPI/utils/Map.kt | 18 ++ .../TelegramBotAPI/utils/Matrix.kt | 32 +++ .../utils/extensions/RequestsExecutor.kt | 131 ++++++++++ 330 files changed, 6934 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 CHANGELOG create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/UnpinChatMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt create mode 100644 src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..5dc177e271 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.idea +out/* +*.iml +target + +settings.xml + +.gradle/ +build/ +out/ diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000000..8597f6cc7b --- /dev/null +++ b/CHANGELOG @@ -0,0 +1 @@ +# TelegramBotAPI changelog \ No newline at end of file diff --git a/LICENSE b/LICENSE index 261eeb9e9f..cf01d26fa4 100644 --- a/LICENSE +++ b/LICENSE @@ -178,7 +178,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018 Insanus Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index e2227ebccf..8e0e91cef6 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# TelegramBotAPI \ No newline at end of file +# TelegramBotAPI + +## What is it? + +It is one more project which wish to be useful and full Telegram Bots API bridge for Kotlin. Most part of some specific +solves or unuseful moments are describing by official [Telegram Bot API](https://core.telegram.org/bots/api). + +## How to work with library? + +By default in any documentation will be meaning that you have variable in scope with names + +| Name of variable | Description | Where to get? (Examples) | +|:----------------:|:-----------:|:------------------------:| +| executor | [RequestsExecutor](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt) | [Ktor RequestExecutor realisation](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt) | + +## Requests Examples + +### Get Me + +```kotlin +executor.execute(GetMe()) +``` + +As a result you will receive `User` object. This object used as is now (as in API documentation), but it is possible +that this class will be renamed to `RawUser` and you will be able to get real realisation of this object like `Bot` (in +cases when `isBot` == `true`) or `User` (otherwise) diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..f48dc7f1f8 --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'java' +apply plugin: "application" +apply plugin: 'kotlin' +apply plugin: 'kotlinx-serialization' + +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + } +} + +repositories { + mavenLocal() + jcenter() + mavenCentral() + maven { url "https://kotlin.bintray.com/kotlinx" } + maven { url "https://dl.bintray.com/kotlin/ktor" } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlin_serialisation_runtime_version" + implementation "joda-time:joda-time:$joda_time_version" + implementation "io.ktor:ktor-client-core:$ktor_version" + implementation "io.ktor:ktor-client-okhttp:$ktor_version" + + // Use JUnit test framework + testImplementation 'junit:junit:4.12' +} + +mainClassName = "com.github.insanusmokrassar.TelegramBotAPI.IndexKt" + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..196d42ab4d --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +kotlin.code.style=official +kotlin_version=1.3.11 +kotlin_coroutines_version=1.1.0 +kotlin_serialisation_runtime_version=0.9.1 +joda_time_version=2.10.1 +ktor_version=1.0.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5971d8fb24e1f8389bccbfefbe4c3c599d717219 GIT binary patch literal 55436 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�M!C3? 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..bdeff908db --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Nov 07 21:46:14 CST 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..4453ccea33 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..c0b8bff845 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.4.1/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'TelegramBotAPI' diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt new file mode 100644 index 0000000000..9060345edd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorRequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.bot.ProxySettings +import com.github.insanusmokrassar.TelegramBotAPI.bot.useWith +import com.github.insanusmokrassar.TelegramBotAPI.types.message.CommonMessageImpl +import com.github.insanusmokrassar.TelegramBotAPI.requests.get.GetUserProfilePhotos +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.toInputMediaPhoto +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.SendMediaGroup +import com.github.insanusmokrassar.TelegramBotAPI.types.files.biggest +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.* +import io.ktor.client.engine.okhttp.OkHttp +import kotlinx.coroutines.runBlocking + +fun main(args: Array) { + runBlocking { + KtorRequestsExecutor( + args[0], + OkHttp.create() + ).apply { + // It is just template of creating requests executor + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt new file mode 100644 index 0000000000..dd1ac11d42 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors + +abstract class BaseRequestsExecutor( + token: String, + hostUrl: String = "https://api.telegram.org" +) : RequestsExecutor { + protected val baseUrl: String = "$hostUrl/bot$token" + + protected val scope: CoroutineScope = CoroutineScope( + Executors.newSingleThreadExecutor().asCoroutineDispatcher() + ) +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt new file mode 100644 index 0000000000..e2aa6cfaeb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall + +interface KtorCallFactory { + suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ) : HttpClientCall? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt new file mode 100644 index 0000000000..7be50995b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt @@ -0,0 +1,69 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor + +import com.github.insanusmokrassar.TelegramBotAPI.bot.BaseRequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base.MultipartRequestCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base.SimpleRequestCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestException +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.engine.HttpClientEngine +import io.ktor.client.engine.okhttp.OkHttp +import io.ktor.util.cio.toByteArray +import kotlinx.io.charsets.Charset +import kotlinx.serialization.json.JSON + +class KtorRequestsExecutor( + token: String, + private val client: HttpClient = HttpClient(OkHttp), + hostUrl: String = "https://api.telegram.org", + callsFactories: List = emptyList(), + excludeDefaultFactories: Boolean = false +) : BaseRequestsExecutor(token, hostUrl) { + constructor( + token: String, + engine: HttpClientEngine = OkHttp.create(), + hostUrl: String = "https://api.telegram.org" + ) : this( + token, + HttpClient(engine), + hostUrl + ) + + private val callsFactories: List = callsFactories.run { + if (!excludeDefaultFactories) { + asSequence().plus(SimpleRequestCallFactory()).plus(MultipartRequestCallFactory()).toList() + } else { + this + } + } + + override suspend fun execute(request: Request): T { + var call: HttpClientCall? = null + for (factory in callsFactories) { + call = factory.prepareCall( + client, + baseUrl, + request + ) + if (call != null) { + break + } + } + if (call == null) { + throw IllegalArgumentException("Can't execute request: $request") + } + val content = call.response.content.toByteArray().toString(Charset.defaultCharset()) + val responseObject = JSON.parse( + ResponseParameters.serializer(request.resultSerializer()), + content + ) + return responseObject.result ?: call.let { + throw RequestException( + responseObject, + "Can't get result object" + ) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt new file mode 100644 index 0000000000..80c2b5f8df --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt @@ -0,0 +1,51 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapWithCommonValues +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.call.call +import io.ktor.client.request.accept +import io.ktor.client.request.forms.MultiPartFormDataContent +import io.ktor.client.request.forms.formData +import io.ktor.client.request.url +import io.ktor.http.* +import kotlinx.io.streams.asInput +import kotlinx.serialization.ImplicitReflectionSerializer + +class MultipartRequestCallFactory : KtorCallFactory { + @ImplicitReflectionSerializer + override suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ): HttpClientCall? = (request as? MultipartRequest) ?.let { + castedRequest -> + client.call { + url("$baseUrl/${castedRequest.method()}") + method = HttpMethod.Post + accept(ContentType.Application.Json) + body = MultiPartFormDataContent( + formData { + val params = castedRequest.paramsJson.mapWithCommonValues() + for ((key, value) in castedRequest.mediaMap + params) { + when (value) { + is MultipartFile -> append( + key, + value.file.inputStream().asInput(), + Headers.build { + append(HttpHeaders.ContentType, value.mimeType) + append(HttpHeaders.ContentDisposition, "filename=${value.fileId}") + } + ) + is FileId -> append(key, value.fileId) + else -> append(key, value.toString()) + } + } + } + ) + build() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt new file mode 100644 index 0000000000..b50a8a83e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt @@ -0,0 +1,39 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.call.call +import io.ktor.client.request.accept +import io.ktor.client.request.url +import io.ktor.http.ContentType +import io.ktor.http.HttpMethod +import io.ktor.http.content.TextContent +import kotlinx.serialization.ImplicitReflectionSerializer + +class SimpleRequestCallFactory : KtorCallFactory { + @ImplicitReflectionSerializer + override suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ): HttpClientCall? = (request as? SimpleRequest) ?.let { + castedRequest -> + client.call { + url("$baseUrl/${castedRequest.method()}") + method = HttpMethod.Post + accept(ContentType.Application.Json) + + val content = request.toJsonWithoutNulls().toString() + + body = TextContent( + content, + ContentType.Application.Json + ) + build() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt new file mode 100644 index 0000000000..1023292e76 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import okhttp3.Credentials +import okhttp3.OkHttpClient +import java.net.InetSocketAddress +import java.net.Proxy + +data class ProxySettings( + val host: String = "localhost", + val port: Int = 1080, + val username: String? = null, + val password: String? = null +) + +fun OkHttpClient.Builder.useWith(proxySettings: ProxySettings) { + proxy( + Proxy( + Proxy.Type.SOCKS, + InetSocketAddress( + proxySettings.host, + proxySettings.port + ) + ) + ) + proxySettings.password ?.let { + password -> + proxyAuthenticator { + _, response -> + response.request().newBuilder().apply { + addHeader( + "Proxy-Authorization", + Credentials.basic(proxySettings.username ?: "", password) + ) + }.build() + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt new file mode 100644 index 0000000000..5bba979f4b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import java.io.IOException + +class RequestException( + val response: ResponseParameters<*>, + message: String? = null, + cause: Throwable? = null +) : IOException( + message, + cause +) \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt new file mode 100644 index 0000000000..467185130b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request + +interface RequestsExecutor { + @Throws(RequestException::class) + suspend fun execute(request: Request): T +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt new file mode 100644 index 0000000000..fdff4adecf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteMessage( + @SerialName(chatIdField) + val chatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier +) : SimpleRequest { + override fun method(): String = "deleteMessage" + + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt new file mode 100644 index 0000000000..4d0d52d4b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class ForwardMessage( + @SerialName(fromChatIdField) + val fromChatId: ChatIdentifier, + @SerialName(chatIdField) + val toChatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(disableNotificationField) + @Optional + val disableNotification: Boolean = false +): SimpleRequest { + override fun method(): String = "forwardMessage" + + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt new file mode 100644 index 0000000000..fc958b3c3f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.KSerializer + +class GetMe : SimpleRequest { + override fun method(): String = "getMe" + override fun resultSerializer(): KSerializer = User.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt new file mode 100644 index 0000000000..4da6df31b3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt @@ -0,0 +1,50 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.update.RawUpdate +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +const val UPDATE_MESSAGE = "message" +const val UPDATE_EDITED_MESSAGE = "edited_message" +const val UPDATE_CHANNEL_POST = "channel_post" +const val UPDATE_EDITED_CHANNEL_POST = "edited_channel_post" +const val UPDATE_CHOSEN_INLINE_RESULT = "chosen_inline_result" +const val UPDATE_INLINE_QUERY = "inline_query" +const val UPDATE_CALLBACK_QUERY = "callback_query" +const val UPDATE_SHIPPING_QUERY = "shipping_query" +const val UPDATE_PRE_CHECKOUT_QUERY = "pre_checkout_query" +/* + + @Optional private val inline_query: RawInlineQuery? = null, + @Optional private val chosen_inline_result: Unit? = null, + @Optional private val callback_query: RawCallbackQuery? = null, + @Optional private val shipping_query: Unit? = null, + @Optional private val pre_checkout_query: Unit? = null + */ +@Serializable +data class GetUpdates( + @Optional + val offset: UpdateIdentifier? = null,// set `last update id + 1` to receive next part of updates + @Optional + val limit: Int? = null, + @Optional + val timeout: Int? = null, + @Optional + val allowed_updates: List? = listOf( + UPDATE_MESSAGE, + UPDATE_EDITED_MESSAGE, + UPDATE_CHANNEL_POST, + UPDATE_EDITED_CHANNEL_POST, + UPDATE_CHOSEN_INLINE_RESULT, + UPDATE_INLINE_QUERY, + UPDATE_CALLBACK_QUERY, + UPDATE_SHIPPING_QUERY, + UPDATE_PRE_CHECKOUT_QUERY + ) +): SimpleRequest> { + override fun method(): String = "getUpdates" + + override fun resultSerializer(): KSerializer> = ArrayListSerializer(RawUpdate.serializer()) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt new file mode 100644 index 0000000000..5488db6c0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt @@ -0,0 +1,45 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import kotlinx.serialization.* +import java.io.File +import java.nio.file.Files +import java.util.* + +sealed class InputFile { + abstract val fileId: String +} + +// TODO:: add checks for file url/file id regex +/** + * Contains file id or file url + */ +@Serializable(FileIdSerializer::class) +data class FileId( + override val fileId: String +) : InputFile() + +fun String.toInputFile(): InputFile = FileId(this) + +@Serializer(FileId::class) +object FileIdSerializer : KSerializer { + override fun serialize(output: Encoder, obj: FileId) = output.encodeString(obj.fileId) + override fun deserialize(input: Decoder): FileId = FileId(input.decodeString()) +} + +// TODO:: add checks for files size +/** + * Contains info about file for sending + */ +data class MultipartFile ( + val file: File, + val mimeType: String = Files.probeContentType(file.toPath()), + val filename: String = file.name +) : InputFile() { + override val fileId: String by lazy { + "${UUID.randomUUID()}.${file.extension}" + } +} + +fun File.toInputFile(): InputFile = MultipartFile( + this +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt new file mode 100644 index 0000000000..33199b0a07 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import kotlinx.serialization.json.JsonObject + +interface MultipartRequest : Request { + val paramsJson: JsonObject + val mediaMap: Map +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt new file mode 100644 index 0000000000..addf37c658 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.utils.* +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonObject + +interface Request { + fun method(): String + fun resultSerializer(): KSerializer + @ImplicitReflectionSerializer + fun json(): JsonObject = toJsonWithoutNulls() +} + +fun StringFormat.extractResult( + from: String, + dataSerializer: KSerializer +): ResponseParameters { + return parse(ResponseParameters.serializer(dataSerializer), from) +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt new file mode 100644 index 0000000000..b1aab229dd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +interface SimpleRequest : Request diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt new file mode 100644 index 0000000000..9bf0c75555 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface ByInlineMessageId { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt new file mode 100644 index 0000000000..844c1ddfbb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier + +interface ByMessageId : ChatRequest { + val messageId: MessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt new file mode 100644 index 0000000000..e538f3ac14 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChatRequest { + val chatId: ChatIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt new file mode 100644 index 0000000000..e9feb38ff1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +interface DisableNotification { + val disableNotification: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt new file mode 100644 index 0000000000..60790ab8c5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +interface DisableWebPagePreview { + val disableWebPagePreview: Boolean? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt new file mode 100644 index 0000000000..71fc490fc2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup + +interface ReplyMarkup { + val replyMarkup: KeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt new file mode 100644 index 0000000000..9c72d3c704 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier + +interface ReplyMessageId { + val replyToMessageId: MessageIdentifier? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt new file mode 100644 index 0000000000..3b22c62855 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate + +interface UntilDate { + val untilDate: TelegramDate? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt new file mode 100644 index 0000000000..6eb8b3d1c6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class AnswerCallbackQuery( + @SerialName(callbackQueryIdField) + val callbackQueryId: CallbackQueryIdentifier, + @SerialName(textField) + @Optional + val text: String? = null, + @SerialName(showAlertField) + @Optional + val showAlert: Boolean? = null, + @SerialName(urlField) + @Optional + val url: String? = null, + @SerialName(cachedTimeField) + @Optional + val cachedTimeSeconds: Int? = null +) : SimpleRequest { + override fun method(): String = "answerCallbackQuery" + override fun resultSerializer(): KSerializer = BooleanSerializer +} + +fun CallbackQuery.createAnswer( + text: String? = null, + showAlert: Boolean? = null, + url: String? = null, + cachedTimeSeconds: Int? = null +): AnswerCallbackQuery = AnswerCallbackQuery(id, text, showAlert, url, cachedTimeSeconds) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt new file mode 100644 index 0000000000..4eb4a896da --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt @@ -0,0 +1,39 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments + +import com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts.AnswerPreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class AnswerPreCheckoutQueryOk( + @SerialName(preCheckoutQueryIdField) + override val preCheckoutQueryId: PreCheckoutQueryId +) : AnswerPreCheckoutQuery { + @SerialName(okField) + override val isOk: Boolean = true +} + + +@Serializable +data class AnswerPreCheckoutQueryError( + @SerialName(preCheckoutQueryIdField) + override val preCheckoutQueryId: PreCheckoutQueryId, + @SerialName(errorMessageField) + val errorMessage: String +) : AnswerPreCheckoutQuery { + @SerialName(okField) + override val isOk: Boolean = false +} + +fun PreCheckoutQuery.createAnswerOk(): AnswerPreCheckoutQueryOk = AnswerPreCheckoutQueryOk( + id +) + +fun PreCheckoutQuery.createAnswerError( + error: String +): AnswerPreCheckoutQueryError = AnswerPreCheckoutQueryError( + id, + error +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt new file mode 100644 index 0000000000..1aa62665f8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt @@ -0,0 +1,49 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments + +import com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts.AnswerShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingOption +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class AnswerShippingQueryOk( + @SerialName(shippingQueryIdField) + override val shippingQueryId: ShippingQueryIdentifier, + @Serializable(ShippingOptionsSerializer::class) + @SerialName(shippingOptionsField) + val shippingOptions: List +) : AnswerShippingQuery { + @SerialName(okField) + override val isOk: Boolean = true +} + +object ShippingOptionsSerializer : KSerializer> by ArrayListSerializer( + ShippingOption.serializer() +) + +@Serializable +data class AnswerShippingQueryError( + @SerialName(shippingQueryIdField) + override val shippingQueryId: ShippingQueryIdentifier, + @SerialName(errorMessageField) + val error: String +) : AnswerShippingQuery { + @SerialName(okField) + override val isOk: Boolean = false +} + +fun ShippingQuery.createAnswerOk( + shippingOptions: List +): AnswerShippingQueryOk = AnswerShippingQueryOk( + id, + shippingOptions +) + +fun ShippingQuery.createAnswerError( + error: String +): AnswerShippingQueryError = AnswerShippingQueryError( + id, + error +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt new file mode 100644 index 0000000000..b1b38da42b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.PreCheckoutQueryId +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface AnswerPreCheckoutQuery : SimpleRequest { + override fun method(): String = "answerPreCheckoutQuery" + override fun resultSerializer(): KSerializer = Boolean.serializer() + + val preCheckoutQueryId: PreCheckoutQueryId + val isOk: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt new file mode 100644 index 0000000000..2888ef05a4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ShippingQueryIdentifier +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface AnswerShippingQuery : SimpleRequest { + override fun method(): String = "answerShippingQuery" + override fun resultSerializer(): KSerializer = Boolean.serializer() + + val shippingQueryId: ShippingQueryIdentifier + val isOk: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt new file mode 100644 index 0000000000..d88cdbd862 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class ExportChatInviteLink( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "exportChatInviteLink" + override fun resultSerializer(): KSerializer = StringSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt new file mode 100644 index 0000000000..2f8b66f55d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class LeaveChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "leaveChat" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/UnpinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/UnpinChatMessage.kt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt new file mode 100644 index 0000000000..afa4ab863c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChatMemberRequest : ChatRequest, SimpleRequest { + val userId: UserId +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt new file mode 100644 index 0000000000..d8ab733578 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.RawChat +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class GetChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "getChat" + override fun resultSerializer(): KSerializer = RawChat.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt new file mode 100644 index 0000000000..e1ceb4cc60 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.RawChat +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.* + +@Serializable +data class GetChatAdministrators( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest> { + override fun method(): String = "getChatAdministrators" + override fun resultSerializer(): KSerializer> = ArrayListSerializer(RawChatMember.serializer()) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt new file mode 100644 index 0000000000..4bb43799c2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.* + +@Serializable +data class GetChatMembersCount( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "getChatMembersCount" + override fun resultSerializer(): KSerializer = IntSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt new file mode 100644 index 0000000000..df40b239db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class GetChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId +) : ChatMemberRequest { + override fun method(): String = "getChatMember" + override fun resultSerializer(): KSerializer = RawChatMember.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt new file mode 100644 index 0000000000..d6c9db5775 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class KickChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "kickChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt new file mode 100644 index 0000000000..599834c976 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt @@ -0,0 +1,45 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class PromoteChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null, + @SerialName(canChangeInfoField) + @Optional + private val canChangeInfo: Boolean? = null, + @SerialName(canPostMessagesField) + @Optional + private val canPostMessages: Boolean? = null, + @SerialName(canEditMessagesField) + @Optional + private val canEditMessages: Boolean? = null, + @SerialName(canDeleteMessagesField) + @Optional + private val canDeleteMessages: Boolean? = null, + @SerialName(canInviteUsersField) + @Optional + private val canInviteUsers: Boolean? = null, + @SerialName(canRestrictMembersField) + @Optional + private val canRestrictMembers: Boolean? = null, + @SerialName(canPinMessagesField) + @Optional + private val canPinMessages: Boolean? = null, + @SerialName(canPromoteMembersField) + @Optional + private val canPromoteMembers: Boolean? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "promoteChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt new file mode 100644 index 0000000000..6706b899b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt @@ -0,0 +1,33 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class RestrictChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null, + @SerialName(canSendMessagesField) + @Optional + private val canSendMessages: Boolean? = null, + @SerialName(canSendMediaMessagesField) + @Optional + private val canSendMediaMessages: Boolean? = null, + @SerialName(canSendOtherMessagesField) + @Optional + private val canSendOtherMessages: Boolean? = null, + @SerialName(canAddWebPagePreviewsField) + @Optional + private val canAddWebPagePreviews: Boolean? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "restrictChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt new file mode 100644 index 0000000000..70492e7f8c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class UnbanChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId +) : ChatMemberRequest { + override fun method(): String = "unbanChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt new file mode 100644 index 0000000000..3bec4c4317 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class DeleteChatPhoto( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "deleteChatPhoto" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt new file mode 100644 index 0000000000..93ad6d990c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableNotification +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class PinChatMessage ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false +): ChatRequest, SimpleRequest, DisableNotification { + override fun method(): String = "pinChatMessage" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt new file mode 100644 index 0000000000..53cd8aac9f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatDescription ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(descriptionField) + val description: String +): ChatRequest, SimpleRequest { + init { + if (description.length !in chatDescriptionLength) { + throw IllegalArgumentException("Chat description must be in $chatDescriptionLength range") + } + } + + override fun method(): String = "setChatDescription" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt new file mode 100644 index 0000000000..59934570ac --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonTreeMapper + +@Serializable +data class SetChatPhoto ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @Transient + val photo: MultipartFile = throw IllegalArgumentException("Unfortunately, this type of objects can't be parsed automatically") +): ChatRequest, MultipartRequest { + override fun method(): String = "setChatPhoto" + override fun resultSerializer(): KSerializer = BooleanSerializer + override val mediaMap: Map = mapOf(photoField to photo) + override val paramsJson: JsonObject = JsonTreeMapper().writeTree(this, serializer()).jsonObject +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt new file mode 100644 index 0000000000..e288d4701e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatTitle ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(titleField) + val title: String +): ChatRequest, SimpleRequest { + init { + if (title.length !in chatTitleLength) { + throw IllegalArgumentException("Chat title must be in $chatTitleLength range") + } + } + + override fun method(): String = "setChatTitle" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt new file mode 100644 index 0000000000..3b6538712d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class UnpinChatMessage( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "unpinChatMessage" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt new file mode 100644 index 0000000000..af90e60f30 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteChatStickerSet( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "deleteChatStickerSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt new file mode 100644 index 0000000000..207895dc4c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatStickerSet( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(stickerSetNameField) + val stickerSetName: String +): ChatRequest, SimpleRequest { + override fun method(): String = "setChatStickerSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt new file mode 100644 index 0000000000..efa5240cbd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.common + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.json.JsonObject + +data class CommonMultipartFileRequest( + val data: Request, + override val mediaMap: Map +) : MultipartRequest, Request by data { + @ImplicitReflectionSerializer + override val paramsJson: JsonObject = data.json() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt new file mode 100644 index 0000000000..eb0a780abd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +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.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class EditChatMessageLiveLocation( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage, EditLocationMessage { + override fun method(): String = "editMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt new file mode 100644 index 0000000000..cc8bf27f6b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +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.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class EditInlineMessageLiveLocation( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage, EditLocationMessage { + override fun method(): String = "editMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt new file mode 100644 index 0000000000..b5e9c2d11d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +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.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class StopChatMessageLiveLocation( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage { + override fun method(): String = "stopMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt new file mode 100644 index 0000000000..64bf13498a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +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.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class StopInlineMessageLiveLocation( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage { + override fun method(): String = "stopMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt new file mode 100644 index 0000000000..9b3ddc3979 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt @@ -0,0 +1,25 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.ReplyMarkup + +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.requests.edit.abstracts.EditChatMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage +import kotlinx.serialization.* + +const val editMessageReplyMarkupMethod = "editMessageReplyMarkup" + +@Serializable +data class EditChatMessageReplyMarkup( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage { + + override fun method(): String = editMessageReplyMarkupMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt new file mode 100644 index 0000000000..0ac7ddd734 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.ReplyMarkup + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditInlineMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageReplyMarkup( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage { + + override fun method(): String = editMessageReplyMarkupMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt new file mode 100644 index 0000000000..7fd82be401 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface EditChatMessage : SimpleRequest { + val chatId: ChatIdentifier + val messageId: MessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt new file mode 100644 index 0000000000..0dd745574c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +interface EditDisableWebPagePreviewMessage { + val disableWebPagePreview: Boolean? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt new file mode 100644 index 0000000000..e20a5d9083 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface EditInlineMessage : SimpleRequest { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt new file mode 100644 index 0000000000..a7b8cc8a9b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +interface EditLocationMessage { + val latitude: Double + val longitude: Double +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt new file mode 100644 index 0000000000..8f1cb3be3c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia + +interface EditMediaMessage { + val media: InputMedia +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt new file mode 100644 index 0000000000..94fcf34ff6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup + +interface EditReplyMessage : ReplyMarkup { + override val replyMarkup: InlineKeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt new file mode 100644 index 0000000000..01a413ed18 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface EditTextChatMessage : SimpleRequest { + val text: String + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt new file mode 100644 index 0000000000..6c2fc8ad94 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.caption + +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.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +const val editMessageCaptionMethod = "editMessageCaption" + +@Serializable +data class EditChatMessageCaption( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(captionField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditTextChatMessage, EditReplyMessage { + + override fun method(): String = editMessageCaptionMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt new file mode 100644 index 0000000000..afb40f83a3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt @@ -0,0 +1,27 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.caption + +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.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageCaption( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(captionField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditTextChatMessage, EditReplyMessage { + + override fun method(): String = editMessageCaptionMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt new file mode 100644 index 0000000000..24fa044895 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media + +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.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +const val editMessageMediaMethod = "editMessageMedia" + +@Serializable +data class EditChatMessageMedia( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(mediaField) + override val media: InputMedia, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage, EditMediaMessage { + + init { + if (media.file is MultipartFile) { + throw IllegalArgumentException("For editing of media messages you MUST use file id (according to documentation)") + } + } + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt new file mode 100644 index 0000000000..64e1f3af0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +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.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +@Serializable +data class EditInlineMessageMedia( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(mediaField) + override val media: InputMedia, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage, EditMediaMessage { + + init { + if (media.file is MultipartFile) { + throw IllegalArgumentException("For editing of media messages you MUST use file id (according to documentation)") + } + } + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt new file mode 100644 index 0000000000..53898228bd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +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.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import kotlinx.serialization.* + +const val editMessageTextMethod = "editMessageText" + +@Serializable +data class EditChatMessageText( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(textField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableWebPagePreviewField) + @Optional + override val disableWebPagePreview: Boolean? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage { + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt new file mode 100644 index 0000000000..29e7367eaa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +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.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageText( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(textField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableWebPagePreviewField) + @Optional + override val disableWebPagePreview: Boolean? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage { + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt new file mode 100644 index 0000000000..bbc42ff686 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetGameHighScoresByChat ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(chatIdField) + override val chatId: ChatId, + @SerialName(messageIdField) + override val messageId: MessageIdentifier +) : GetGameHighScores, ByMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt new file mode 100644 index 0000000000..6d9d8cae81 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByInlineMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetGameHighScoresByInlineMessageId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier +) : GetGameHighScores, ByInlineMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt new file mode 100644 index 0000000000..e6a96cccb7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.SetGameScore +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class SetGameScoreByChatId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(scoreField) + override val score: Long, + @SerialName(chatIdField) + override val chatId: ChatId, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(forceField) + @Optional + override val force: Boolean = false, + @SerialName(disableEditMessageField) + @Optional + override val disableEditMessage: Boolean = false +) : SetGameScore, ByMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt new file mode 100644 index 0000000000..efd78d4563 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByInlineMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.SetGameScore +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class SetGameScoreByInlineMessageId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(scoreField) + override val score: Long, + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(forceField) + @Optional + override val force: Boolean = false, + @SerialName(disableEditMessageField) + @Optional + override val disableEditMessage: Boolean = false +) : SetGameScore, ByInlineMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt new file mode 100644 index 0000000000..e0499783eb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import com.github.insanusmokrassar.TelegramBotAPI.types.games.GameHighScore +import kotlinx.serialization.KSerializer +import kotlinx.serialization.internal.ArrayListSerializer + +interface GetGameHighScores : SimpleRequest> { + val userId: UserId + + override fun method(): String = "getGameHighScores" + override fun resultSerializer(): KSerializer> = GameHighScoresSerializer +} + +object GameHighScoresSerializer : KSerializer> by ArrayListSerializer(GameHighScore.serializer()) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt new file mode 100644 index 0000000000..5ba912b016 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface SetGameScore : SimpleRequest { + val userId: UserId + val score: Long + val force: Boolean + val disableEditMessage: Boolean + + override fun method(): String = "setGameScore" + override fun resultSerializer(): KSerializer = Boolean.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt new file mode 100644 index 0000000000..ca27a73746 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PathedFile +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.fileIdField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class GetFile( + @SerialName(fileIdField) + val fileId: FileId +): SimpleRequest { + override fun method(): String = "getFile" + override fun resultSerializer(): KSerializer = PathedFile.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt new file mode 100644 index 0000000000..b183a9671e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.stickerSetNameField +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.StickerSet +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetStickerSet( + @SerialName(stickerSetNameField) + val name: String +): SimpleRequest { + override fun method(): String = "getStickerSet" + override fun resultSerializer(): KSerializer = StickerSet.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt new file mode 100644 index 0000000000..83f95a29cd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt @@ -0,0 +1,27 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class GetUserProfilePhotos( + @SerialName(userIdField) + val userId: UserId, + @SerialName(offsetField) + val offset: Int? = null, + @SerialName(limitField) + val limit: Int? = null +): SimpleRequest { + init { + if (offset != null && offset < 0) { + throw IllegalArgumentException("Offset for getting user profile photos must be positive") + } + if (limit != null && limit !in userProfilePhotosRequestLimit) { + throw IllegalArgumentException("Limit for getting user profile photos must be in 0 .. 100 range") + } + } + + override fun method(): String = "getUserProfilePhotos" + override fun resultSerializer(): KSerializer = UserProfilePhotos.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt new file mode 100644 index 0000000000..23e73fb89a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt @@ -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 { + override fun method(): String = "sendChatAction" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt new file mode 100644 index 0000000000..9850ec5ff5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt @@ -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, + ReplyingMarkupSendMessageRequest +{ + 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.serializer() +} + +fun Contact.toRequest( + chatId: ChatIdentifier, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): SendContact = SendContact( + chatId, + this, + disableNotification, + replyToMessageId, + replyMarkup +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt new file mode 100644 index 0000000000..a596500970 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt @@ -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, + ReplyingMarkupSendMessageRequest, + PositionedSendMessageRequest +{ + + override fun method(): String = "sendLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt new file mode 100644 index 0000000000..be39134045 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt @@ -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, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + DisableWebPagePreview +{ + + override fun method(): String = "sendMessage" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt new file mode 100644 index 0000000000..30506e5509 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt @@ -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, + PositionedSendMessageRequest, + TitledSendMessageRequest, + ReplyingMarkupSendMessageRequest +{ + 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.serializer() +} + +fun Venue.toRequest( + chatId: ChatIdentifier, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): SendVenue = SendVenue( + chatId, + this, + disableNotification, + replyToMessageId, + replyMarkup +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt new file mode 100644 index 0000000000..43c746c2fb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface DuratedSendMessageRequest: SendMessageRequest { + /** + * Duration of media, usually in seconds + */ + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt new file mode 100644 index 0000000000..f538b7e378 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface PositionedSendMessageRequest: SendMessageRequest { + val latitude: Double + val longitude: Double +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt new file mode 100644 index 0000000000..adcfaeff88 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup + +interface ReplyingMarkupSendMessageRequest: SendMessageRequest, ReplyMarkup \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt new file mode 100644 index 0000000000..56ed3cb4d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt @@ -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 : SimpleRequest, ChatRequest \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt new file mode 100644 index 0000000000..31ea67cf0a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt @@ -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 : SendChatMessageRequest, ReplyMessageId, DisableNotification diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt new file mode 100644 index 0000000000..d95b2c5930 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface SizedSendMessageRequest : SendMessageRequest { + val width: Int? + val height: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt new file mode 100644 index 0000000000..a34f8df3d8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface TextableSendMessageRequest: SendMessageRequest { + val text: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt new file mode 100644 index 0000000000..3597137c56 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface ThumbedSendMessageRequest: SendMessageRequest { + val thumb: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt new file mode 100644 index 0000000000..144a234f52 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface TitledSendMessageRequest: SendMessageRequest { + val title: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt new file mode 100644 index 0000000000..8de32c9618 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt @@ -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, + ReplyMarkup { + override fun method(): String = "sendGame" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt new file mode 100644 index 0000000000..f4842d455c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + + override fun method(): String = "sendAnimation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendAnimationFiles internal constructor( + val animation: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + animationField to animation, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt new file mode 100644 index 0000000000..5f19b644fb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + TitledSendMessageRequest, + DuratedSendMessageRequest +{ + + override fun method(): String = "sendAudio" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendAudioFiles internal constructor( + val audio: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + audioField to audio, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt new file mode 100644 index 0000000000..b98ce44d00 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest +{ + + override fun method(): String = "sendDocument" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendDocumentFiles internal constructor( + val document: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + documentField to document, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt new file mode 100644 index 0000000000..247edf9975 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt @@ -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, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +): Request> { + if (media.size !in membersCountInMediaGroup) { + throw IllegalArgumentException("Count of members for media group must be in $membersCountInMediaGroup range") + } + + val files: List = 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 = emptyList(), + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null +) : Data>, + SendMessageRequest> +{ + // 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> = serializer +} + +data class SendMediaGroupFiles internal constructor( + val files: List +) : Files by (files.map { it.fileId to it }.toMap()) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt new file mode 100644 index 0000000000..6cbcfa39e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest +{ + override fun method(): String = "sendPhoto" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendPhotoFiles internal constructor( + val photo: MultipartFile +) : Files by mapOf( + photoField to photo +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt new file mode 100644 index 0000000000..3ad1b96fc5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt @@ -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 = 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, ReplyingMarkupSendMessageRequest { + override fun method(): String = "sendSticker" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendStickerByFile internal constructor( + @Transient + private val sendStickerByFileId: SendStickerByFileId, + val sticker: MultipartFile +) : MultipartRequest, Request by sendStickerByFileId { + override val mediaMap: Map = mapOf(stickerField to sticker) + override val paramsJson: JsonObject = sendStickerByFileId.toJsonWithoutNulls(SendStickerByFileId.serializer()) +} + + diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt new file mode 100644 index 0000000000..bb47ea2b2c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + + override fun method(): String = "sendVideo" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVideoFiles internal constructor( + val video: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + videoField to video, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt new file mode 100644 index 0000000000..33c423f3c6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + @Transient + override val height: Int? + get() = width + + + override fun method(): String = "sendVideoNote" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVideoNoteFiles internal constructor( + val videoNote: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + videoNoteField to videoNote, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt new file mode 100644 index 0000000000..e859a0dbc3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt @@ -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 { + 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, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest +{ + + override fun method(): String = "sendVoice" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVoiceFiles internal constructor( + val voice: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + voiceField to voice, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt new file mode 100644 index 0000000000..e2bd40e3d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface Data : SimpleRequest \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt new file mode 100644 index 0000000000..e94cf03d33 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile + +typealias Files = Map diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt new file mode 100644 index 0000000000..bcb68d8306 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt @@ -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, F: Files, R: Any>( + val data: D, + val files: F +) : MultipartRequest { + override fun method(): String = data.method() + override fun resultSerializer(): KSerializer = data.resultSerializer() + @ImplicitReflectionSerializer + override val paramsJson: JsonObject = data.json() + override val mediaMap: Map = files +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt new file mode 100644 index 0000000000..4c7d4b6c9d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt @@ -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, + @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 { + override fun method(): String = "sendInvoice" + override fun resultSerializer(): KSerializer = 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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt new file mode 100644 index 0000000000..164d42d9ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt @@ -0,0 +1,49 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.common.CommonMultipartFileRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts.StickerSetAction +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +fun AddStickerToSet( + userId: UserId, + stickerSetName: String, + sticker: InputFile, + emojis: String, + maskPosition: MaskPosition? = null +): Request { + val data = AddStickerToSet(userId, stickerSetName, emojis, sticker as? FileId, maskPosition) + return when (sticker) { + is MultipartFile -> CommonMultipartFileRequest( + data, + mapOf(pngStickerField to sticker) + ) + is FileId -> data + } +} + +@Serializable +data class AddStickerToSet internal constructor( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(nameField) + override val name: String, + @SerialName(emojisField) + override val emojis: String, + @SerialName(pngStickerField) + @Optional + val sticker: FileId? = null, + @SerialName(maskPositionField) + @Optional + override val maskPosition: MaskPosition? = null +) : StickerSetAction { + init { + if(emojis.isEmpty()) { + throw IllegalArgumentException("Emojis must not be empty") + } + } + + override fun method(): String = "addStickerToSet" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt new file mode 100644 index 0000000000..feb74bcfdd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt @@ -0,0 +1,53 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.common.CommonMultipartFileRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts.StickerSetAction +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +fun CreateNewStickerSet( + userId: UserId, + name: String, + sticker: InputFile, + emojis: String, + containsMasks: Boolean? = null, + maskPosition: MaskPosition? = null +): Request { + val data = CreateNewStickerSet(userId, name, emojis, sticker as? FileId, containsMasks, maskPosition) + return when (sticker) { + is MultipartFile -> CommonMultipartFileRequest( + data, + mapOf(pngStickerField to sticker) + ) + is FileId -> data + } +} + +@Serializable +data class CreateNewStickerSet internal constructor( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(nameField) + override val name: String, + @SerialName(emojisField) + override val emojis: String, + @SerialName(pngStickerField) + @Optional + val sticker: FileId? = null, + @SerialName(containsMasksField) + @Optional + val containsMasks: Boolean? = null, + @SerialName(maskPositionField) + @Optional + override val maskPosition: MaskPosition? = null +) : StickerSetAction { + init { + if(emojis.isEmpty()) { + throw IllegalArgumentException("Emojis must not be empty") + } + } + + override fun method(): String = "createNewStickerSet" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt new file mode 100644 index 0000000000..4075829a75 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteStickerFromSet( + @SerialName(stickerField) + val sticker: FileId +) : SimpleRequest { + override fun method(): String = "deleteStickerFromSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt new file mode 100644 index 0000000000..930021f27f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetStickerPositionInSet( + @SerialName(stickerField) + val sticker: FileId, + @SerialName(positionField) + val position: Int +) : SimpleRequest { + init { + if (position < 0) { + throw IllegalArgumentException("Position must be positive or 0") + } + } + + override fun method(): String = "setStickerPositionInSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt new file mode 100644 index 0000000000..8267d8f809 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.File +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonObject + +@Serializable +data class UploadStickerFile( + @SerialName(userIdField) + val userId: UserId, + @Transient + val sticker: MultipartFile = throw IllegalStateException("Detected autocreating try: this class can't be deserialized") +): MultipartRequest { + init { + // TODO:: add check of width/height of image and type of file - it must be png with max side length is 512px + } + + override fun method(): String = "uploadStickerFile" + @Transient + override val mediaMap: Map = mapOf(pngStickerField to sticker) + @Transient + override val paramsJson: JsonObject = toJsonWithoutNulls(serializer()) + override fun resultSerializer(): KSerializer = File.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt new file mode 100644 index 0000000000..d53110b07e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.KSerializer +import kotlinx.serialization.internal.BooleanSerializer + +interface StickerSetAction : SimpleRequest { + val userId: UserId + val name: String + val emojis: String // must be more than one + val maskPosition: MaskPosition? + + override fun resultSerializer(): KSerializer = BooleanSerializer +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt new file mode 100644 index 0000000000..a46fba7a1d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface CallbackQuery { + val id: CallbackQueryIdentifier + val user: User + val chatInstance: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt new file mode 100644 index 0000000000..8f85fb2ff9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +interface DataCallbackQuery : CallbackQuery { + val data: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..644ac332b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +interface GameShortNameCallbackQuery : CallbackQuery { + val gameShortName: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt new file mode 100644 index 0000000000..b2d7acf5b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface InlineMessageIdCallbackQuery : CallbackQuery { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt new file mode 100644 index 0000000000..3af1d0d875 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class InlineMessageIdDataCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val inlineMessageId: InlineMessageIdentifier, + override val data: String +) : DataCallbackQuery, InlineMessageIdCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..b2572bc55a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class InlineMessageIdGameShortNameCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val inlineMessageId: InlineMessageIdentifier, + override val gameShortName: String +) : GameShortNameCallbackQuery, InlineMessageIdCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt new file mode 100644 index 0000000000..c5e7dba7a2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +interface MessageCallbackQuery : CallbackQuery { + val message: Message +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt new file mode 100644 index 0000000000..40130dc649 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class MessageDataCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val message: Message, + override val data: String +) : DataCallbackQuery, MessageCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..dd304d7ef9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class MessageGameShortNameCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val message: Message, + override val gameShortName: String +) : GameShortNameCallbackQuery, MessageCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt new file mode 100644 index 0000000000..611ec6a730 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import kotlinx.serialization.* + +@Serializable +data class RawCallbackQuery( + @SerialName(idField) + val id: CallbackQueryIdentifier, + @SerialName(fromField) + val from: User, + @Optional + val message: RawMessage? = null, + @SerialName(inlineMessageIdField) + @Optional + val inlineMessageId: InlineMessageIdentifier? = null, + @SerialName("chat_instance") + val chatInstance: String, + @Optional + val data: String? = null, + @SerialName("game_short_name") + @Optional + val gameShortName: String? = null +) { + @Transient + val asCallbackQuery: CallbackQuery by lazy { + when { + message != null && data != null -> MessageDataCallbackQuery(id, from, chatInstance, message.asMessage, data) + message != null && gameShortName != null -> MessageGameShortNameCallbackQuery(id, from, chatInstance, message.asMessage, gameShortName) + inlineMessageId != null && data != null -> InlineMessageIdDataCallbackQuery(id, from, chatInstance, inlineMessageId, data) + inlineMessageId != null && gameShortName != null -> InlineMessageIdGameShortNameCallbackQuery(id, from, chatInstance, inlineMessageId, gameShortName) + else -> throw IllegalStateException("Strange answer from server, can't create callback query") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt new file mode 100644 index 0000000000..79b353f25d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt @@ -0,0 +1,48 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable(ChatIdentifierSerializer::class) +sealed class ChatIdentifier + +/** + * Also used as User Identifier + */ +@Serializable(ChatIdentifierSerializer::class) +class ChatId( + val chatId: Identifier +) : ChatIdentifier() + +typealias UserId = ChatId + +fun Identifier.toChatId(): ChatId = ChatId(this) + +@Serializable(ChatIdentifierSerializer::class) +class Username( + val username: String +) : ChatIdentifier() { + init { + if (!username.startsWith("@")) { + throw IllegalArgumentException("Username must starts with `@`") + } + } +} + +fun String.asUsername(): Username = Username(this) + +@Serializer(ChatIdentifier::class) +internal class ChatIdentifierSerializer: KSerializer { + override fun deserialize(input: Decoder): ChatIdentifier { + val id = input.decodeString() + return id.toLongOrNull() ?.let { + ChatId(it) + } ?: Username(id) + } + + override fun serialize(output: Encoder, obj: ChatIdentifier) { + when (obj) { + is ChatId -> output.encodeString(obj.chatId.toString()) + is Username -> output.encodeString(obj.username) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt new file mode 100644 index 0000000000..f9dd24f588 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class AdministratorChatMember( + override val user: User, + val canBeEdited: Boolean, + val canChangeInfo: Boolean, + val canPostMessages: Boolean, + val canEditMessages: Boolean, + val canRemoveMessages: Boolean, + val canInviteUsers: Boolean, + val canRestrictMembers: Boolean, + val canPinMessages: Boolean, + val canPromoteMembers: Boolean +) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt new file mode 100644 index 0000000000..31ef2097bc --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate + +interface BannedChatMember : ChatMember, UntilDate \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt new file mode 100644 index 0000000000..86f70d1bb3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface ChatMember { + val user: User +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt new file mode 100644 index 0000000000..1999680d49 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class CreatorChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt new file mode 100644 index 0000000000..b97c314669 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import org.joda.time.DateTime + +data class KickedChatMember( + override val user: User, + override val untilDate: TelegramDate? +) : BannedChatMember \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt new file mode 100644 index 0000000000..0fbcd3b4b7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class LeftChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt new file mode 100644 index 0000000000..b6ce19920c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class MemberChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt new file mode 100644 index 0000000000..f216b1fbe0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt @@ -0,0 +1,85 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class RawChatMember( + val user: User, + private val status: String, + @Optional + private val until_date: TelegramDate? = null, + @SerialName(canBeEditedField) + @Optional + private val canBeEdited: Boolean = false, + @SerialName(canChangeInfoField) + @Optional + private val canChangeInfo: Boolean = false, + @SerialName(canPostMessagesField) + @Optional + private val canPostMessages: Boolean = false, + @SerialName(canEditMessagesField) + @Optional + private val canEditMessages: Boolean = false, + @SerialName(canDeleteMessagesField) + @Optional + private val canDeleteMessages: Boolean = false, + @SerialName(canInviteUsersField) + @Optional + private val canInviteUsers: Boolean = false, + @SerialName(canRestrictMembersField) + @Optional + private val canRestrictMembers: Boolean = false, + @SerialName(canPinMessagesField) + @Optional + private val canPinMessages: Boolean = false, + @SerialName(canPromoteMembersField) + @Optional + private val canPromoteMembers: Boolean = false, + @SerialName(canSendMessagesField) + @Optional + private val canSendMessages: Boolean = false, + @SerialName(canSendMediaMessagesField) + @Optional + private val canSendMediaMessages: Boolean = false, + @SerialName(canSendOtherMessagesField) + @Optional + private val canSendOtherMessages: Boolean = false, + @SerialName(canAddWebPagePreviewsField) + @Optional + private val canAddWebPagePreviews: Boolean = false +) { + @Transient + val asChatMember: ChatMember by lazy { + when (status) { + "creator" -> CreatorChatMember(user) + "administrator" -> AdministratorChatMember( + user, + canBeEdited, + canChangeInfo, + canPostMessages, + canEditMessages, + canDeleteMessages, + canInviteUsers, + canRestrictMembers, + canPinMessages, + canPromoteMembers + ) + "member" -> MemberChatMember(user) + "restricted" -> RestrictedChatMember( + user, + until_date, + canSendMessages, + canSendMediaMessages, + canSendOtherMessages, + canAddWebPagePreviews + ) + "left" -> LeftChatMember(user) + "kicked" -> KickedChatMember( + user, + until_date + ) + else -> throw IllegalStateException("Can't understand type of user: $status") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt new file mode 100644 index 0000000000..0e19d60752 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import org.joda.time.DateTime + +data class RestrictedChatMember( + override val user: User, + override val untilDate: TelegramDate?, + val canSendMessages: Boolean, + val canSendMediaMessages: Boolean, + val canSendOtherMessages: Boolean, + val canAddWebpagePreviews: Boolean +) : BannedChatMember \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt new file mode 100644 index 0000000000..ba6784430d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ChatPhoto( + @SerialName("small_file_id") + val smallFileId: String, + @SerialName("big_file_id") + val bigFileId: String +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt new file mode 100644 index 0000000000..8e5431c570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt @@ -0,0 +1,181 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +typealias Identifier = Long +typealias MessageIdentifier = Long +typealias InlineQueryIdentifier = String +typealias UpdateIdentifier = Long +typealias MediaGroupIdentifier = String +typealias ForwardSignature = String +typealias AuthorSignature = ForwardSignature +typealias CallbackQueryIdentifier = String +typealias PaymentQueryIdentifier = String +typealias PreCheckoutQueryId = String +typealias ShippingQueryIdentifier = String +typealias InvoicePayload = String +typealias ShippingOptionIdentifier = String +typealias StartParameter = String +typealias InlineMessageIdentifier = String + +val callbackQueryAnswerLength = 0 .. 200 +val captionLength = 0 .. 1024 +val textLength = 0 .. 4096 +val userProfilePhotosRequestLimit = 0 .. 100 +val chatTitleLength = 1 .. 255 +val chatDescriptionLength = 0 .. 255 +val inlineResultQueryIdLingth = 1 .. 64 + +val invoiceTitleLimit = 1 .. 32 +val invoiceDescriptionLimit = 1 .. 255 +val invoicePayloadBytesLimit = 1 .. 128 + +const val chatIdField = "chat_id" +const val messageIdField = "message_id" +const val updateIdField = "update_id" +const val fromChatIdField = "from_chat_id" +const val disableWebPagePreviewField = "disable_web_page_preview" +const val disableNotificationField = "disable_notification" +const val replyToMessageIdField = "reply_to_message_id" +const val replyMarkupField = "reply_markup" +const val supportStreamingField = "support_streaming" +const val livePeriodField = "live_period" +const val isBotField = "is_bot" +const val firstNameField = "first_name" +const val lastNameField = "last_name" +const val languageCodeField = "language_code" +const val textEntitiesField = "text_entities" +const val stickerSetNameField = "set_name" +const val maskPositionField = "mask_position" +const val phoneNumberField = "phone_number" +const val userIdField = "user_id" +const val containsMasksField = "contains_masks" +const val resultIdField = "result_id" +const val inlineMessageIdField = "inline_message_id" +const val callbackDataField = "callback_data" +const val callbackQueryIdField = "callback_query_id" +const val showAlertField = "show_alert" +const val cachedTimeField = "cached_time" +const val foursquareIdField = "foursquare_id" +const val foursquareTypeField = "foursquare_type" +const val untilDateField = "until_date" +const val errorMessageField = "error_message" + +const val photoUrlField = "photo_url" +const val photoSizeField = "photo_size" +const val photoFileIdField = "photo_file_id" +const val gifUrlField = "gif_url" +const val gifFileIdField = "gif_file_id" +const val thumbUrlField = "thumb_url" +const val thumbWidthField = "thumb_width" +const val thumbHeightField = "thumb_height" +const val photoWidthField = "photo_width" +const val photoHeightField = "photo_height" +const val gifWidthField = "gif_width" +const val gifHeightField = "gif_height" +const val gifDurationField = "gif_duration" +const val inputMessageContentField = "input_message_content" +const val hideUrlField = "hide_url" +const val gameShortNameField = "game_short_name" + +const val canSendMessagesField = "can_send_messages" +const val canSendMediaMessagesField = "can_send_media_messages" +const val canSendOtherMessagesField = "can_send_other_messages" +const val canAddWebPagePreviewsField = "can_add_web_page_previews" + +const val canBeEditedField = "can_be_edited" +const val canChangeInfoField = "can_change_info" +const val canPostMessagesField = "can_post_messages" +const val canEditMessagesField = "can_edit_messages" +const val canDeleteMessagesField = "can_delete_messages" +const val canInviteUsersField = "can_invite_users" +const val canRestrictMembersField = "can_restrict_members" +const val canPinMessagesField = "can_pin_messages" +const val canPromoteMembersField = "can_promote_members" +const val pngStickerField = "png_sticker" + +const val okField = "ok" +const val captionField = "caption" +const val idField = "id" +const val textField = "text" +const val thumbField = "thumb" +const val emojiField = "emoji" +const val emojisField = "emojis" +const val titleField = "title" +const val descriptionField = "description" +const val performerField = "performer" +const val durationField = "duration" +const val widthField = "width" +const val heightField = "height" +const val lengthField = "length" +const val latitudeField = "latitude" +const val longitudeField = "longitude" +const val fromField = "from" +const val userField = "user" +const val dateField = "date" +const val chatField = "chat" +const val usernameField = "username" +const val nameField = "name" +const val emailField = "email" +const val locationField = "location" +const val queryField = "query" +const val offsetField = "offset" +const val limitField = "limit" +const val stickersField = "stickers" +const val stickerField = "sticker" +const val urlField = "url" +const val addressField = "address" +const val actionField = "action" +const val positionField = "position" +const val labelField = "label" +const val amountField = "amount" +const val pricesField = "prices" +const val payloadField = "payload" + +const val pointField = "point" +const val xShiftField = "x_shift" +const val yShiftField = "y_shift" +const val scaleField = "y_shift" + + +const val currencyField = "currency" +const val startParameterField = "start_parameter" +const val totalAmountField = "total_amount" +const val invoicePayloadField = "invoice_payload" +const val shippingOptionIdField = "shipping_option_id" +const val shippingQueryIdField = "shipping_query_id" +const val preCheckoutQueryIdField = "pre_checkout_query_id" +const val shippingOptionsField = "shipping_options" +const val countryCodeField = "country_code" +const val stateField = "state" +const val cityField = "city" +const val firstStreetLineField = "street_line1" +const val secondStreetLineField = "street_line2" +const val postCodeField = "post_code" +const val shippingAddressField = "shipping_address" +const val orderInfoField = "order_info" +const val telegramPaymentChargeIdField = "telegram_payment_charge_id" +const val providerPaymentChargeIdField = "provider_payment_charge_id" +const val providerTokenField = "provider_token" +const val providerDataField = "provider_data" + +const val requireNameField = "need_name" +const val requirePhoneNumberField = "need_phone_number" +const val requireEmailField = "need_email" +const val requireShippingAddressField = "need_shipping_address" + +const val shouldSendPhoneNumberToProviderField = "send_phone_number_to_provider" +const val shouldSendEmailToProviderField = "send_email_to_provider" + +const val priceDependOnShipAddressField = "is_flexible" + +const val documentField = "document" +const val photoField = "photo" +const val audioField = "audio" +const val videoField = "video" +const val animationField = "animation" +const val voiceField = "voice" +const val videoNoteField = "video_note" +const val mediaField = "media" + +const val disableEditMessageField = "disable_edit_message" +const val scoreField = "score" +const val forceField = "force" diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt new file mode 100644 index 0000000000..09b4ed72ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable +data class Contact( + @SerialName(phoneNumberField) + val phoneNumber: String, + @SerialName(firstNameField) + val firstName: String, + @SerialName(lastNameField) + @Optional + val lastName: String? = null, + @SerialName(userIdField) + @Optional + val userId: UserId? = null, + @Optional + val vcard: String? = null +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt new file mode 100644 index 0000000000..df975d8d30 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult + +data class BaseChosenInlineResult( + override val resultId: InlineQueryIdentifier, + override val user: User, + override val inlineMessageId: InlineMessageIdentifier?, + override val query: String +) : ChosenInlineResult diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt new file mode 100644 index 0000000000..474643a5a2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult + +data class LocationChosenInlineResult( + override val resultId: InlineQueryIdentifier, + override val user: User, + val location: Location, + override val inlineMessageId: InlineMessageIdentifier?, + override val query: String +) : ChosenInlineResult diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt new file mode 100644 index 0000000000..5b54fd5ae7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import kotlinx.serialization.* + +@Serializable +data class RawChosenInlineResult( + @SerialName(resultIdField) + val resultId: InlineQueryIdentifier, //chosen temporary, can be changed + @SerialName(fromField) + val user: User, + @SerialName(queryField) + val query: String, + @SerialName(locationField) + @Optional + val location: Location? = null, + @SerialName(inlineMessageIdField) + @Optional + val inlineMessageId: InlineMessageIdentifier? = null +) { + @Transient + val asChosenInlineResult: ChosenInlineResult by lazy { + location ?.let { + LocationChosenInlineResult(resultId, user, location, inlineMessageId, query) + } ?: BaseChosenInlineResult(resultId, user, inlineMessageId, query) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt new file mode 100644 index 0000000000..9a298647a0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt @@ -0,0 +1,46 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InputMessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import kotlinx.serialization.Optional +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient + +@Serializable +class InlineQueryResultArticle( + @SerialName(idField) + override val id: String, + @SerialName(titleField) + override val title: String, + @SerialName(inputMessageContentField) + override val inputMessageContent: InputMessageContent, + @SerialName(replyMarkupField) + override val replyMarkup: InlineKeyboardMarkup? = null, + @SerialName(urlField) + @Optional + val url: String? = null, + @SerialName(hideUrlField) + @Optional + val hideUrl: Boolean? = null, + @SerialName(descriptionField) + @Optional + override val description: String? = null, + @SerialName(thumbUrlField) + @Optional + override val thumbUrl: String? = null, + @SerialName(thumbWidthField) + @Optional + override val thumbWidth: Int? = null, + @SerialName(thumbHeightField) + @Optional + override val thumbHeight: Int? = null +) : InlineQueryResult, + ThumbSizedInlineQueryResult, + TitledInlineQueryResult, + DescribedInlineQueryResult, + WithInputMessageContentInlineQueryResult { + override val type: String = "article" +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt new file mode 100644 index 0000000000..2f45277614 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts.InlineQueryResult +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.gameShortNameField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class InlineQueryResultGame( + override val id: String, + @SerialName(gameShortNameField) + val gameShortName: String, + override val replyMarkup: InlineKeyboardMarkup? = null +) : InlineQueryResult { + override val type: String = "game" +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt new file mode 100644 index 0000000000..0e00f81679 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Captioned + +interface CaptionedInlineQueryResult : InlineQueryResult, Captioned diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt new file mode 100644 index 0000000000..4e24811179 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface DescribedInlineQueryResult : InlineQueryResult { + val description: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt new file mode 100644 index 0000000000..a86254f568 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface DuratedInlineResultQuery { + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt new file mode 100644 index 0000000000..ee381456d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +interface FileInlineQueryResult: InlineQueryResult { + val fileId: FileId +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt new file mode 100644 index 0000000000..7e461c1f48 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.idField +import com.github.insanusmokrassar.TelegramBotAPI.types.replyMarkupField +import kotlinx.serialization.Optional +import kotlinx.serialization.SerialName + +interface InlineQueryResult { + val type: String + val id: String + val replyMarkup: InlineKeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt new file mode 100644 index 0000000000..cf20f42c64 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface OptionallyTitledInlineQueryResult : InlineQueryResult { + val title: String? + + +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt new file mode 100644 index 0000000000..b1b1748b66 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Locationed + +interface PositionedInlineQueryResult : InlineQueryResult, Locationed \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt new file mode 100644 index 0000000000..7ea6dda6ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface SizedInlineQueryResult : InlineQueryResult { + val width: Int? + val height: Int? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt new file mode 100644 index 0000000000..45a1f7b766 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface ThumbSizedInlineQueryResult : InlineQueryResult, ThumbedInlineQueryResult { + val thumbWidth: Int? + val thumbHeight: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt new file mode 100644 index 0000000000..e5a1f58ca1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface ThumbedInlineQueryResult : InlineQueryResult { + val thumbUrl: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt new file mode 100644 index 0000000000..ff5781c058 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface TitledInlineQueryResult : OptionallyTitledInlineQueryResult { + override val title: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt new file mode 100644 index 0000000000..3c7ea70a62 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface UrlInlineQueryResult : InlineQueryResult { + val url: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt new file mode 100644 index 0000000000..b2b1cac02d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +interface WithFileIdInlineQueryResult { + val fileId: FileId +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt new file mode 100644 index 0000000000..31ae77210c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InputMessageContent + +interface WithInputMessageContentInlineQueryResult : InlineQueryResult { + val inputMessageContent: InputMessageContent +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt new file mode 100644 index 0000000000..88f4d3f570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChosenInlineResult { + val resultId: InlineQueryIdentifier //chosen temporary, can be changed + val user: User + val inlineMessageId: InlineMessageIdentifier? + val query: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt new file mode 100644 index 0000000000..b602c21716 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface InlineQuery { + val id: InlineQueryIdentifier + val from: User + val query: String + val offset: Long + + fun answerQuery() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt new file mode 100644 index 0000000000..fa2ec1f741 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt @@ -0,0 +1,4 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +interface InputMessageContent { +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt new file mode 100644 index 0000000000..fd95001d15 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class BaseInlineQuery( + override val id: InlineQueryIdentifier, + override val from: User, + override val query: String, + override val offset: Long +) : InlineQuery { + override fun answerQuery() { + TODO() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt new file mode 100644 index 0000000000..7afa62f9c7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery + +data class LocationInlineQuery( + override val id: InlineQueryIdentifier, + override val from: User, + override val query: String, + override val offset: Long, + val location: Location +) : InlineQuery { + override fun answerQuery() { + TODO() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt new file mode 100644 index 0000000000..015a2f05b1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class RawInlineQuery( + @SerialName(idField) + val id: InlineQueryIdentifier, + @SerialName(fromField) + val from: User, + @SerialName(queryField) + val query: String, + @SerialName(offsetField) + val offset: Long, + @SerialName(locationField) + @Optional + val location: Location? = null +) { + @Transient + val asInlineQuery by lazy { + location ?.let { + LocationInlineQuery(id, from, query, offset, location) + } ?: BaseInlineQuery(id, from, query, offset) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt new file mode 100644 index 0000000000..d1191a90bf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface CaptionedInputMedia: InputMedia { + val caption: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt new file mode 100644 index 0000000000..3ba3c0820a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface DuratedInputMedia : InputMedia { + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt new file mode 100644 index 0000000000..03388e0ba5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.InputFile + +const val inputMediaFileAttachmentNameTemplate = "attach://%s" + +interface InputMedia { + val type: String + val file: InputFile +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt new file mode 100644 index 0000000000..61c681e1e8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaAnimation( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val width: Int? = null, + @Optional + override val height: Int? = null, + @Optional + override val duration: Int? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, CaptionedInputMedia { + override val type: String = "animation" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt new file mode 100644 index 0000000000..f154442e62 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaAudio( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val duration: Int? = null, + @Optional + val performer: String? = null, + @Optional + override val title: String? = null, + override val thumb: InputFile? = null +) : InputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedInputMedia { + override val type: String = "audio" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt new file mode 100644 index 0000000000..4f6afce48d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaDocument( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, ThumbedInputMedia, CaptionedInputMedia { + override val type: String = "document" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt new file mode 100644 index 0000000000..81225da074 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt @@ -0,0 +1,44 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaPhoto( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null +) : InputMedia, CaptionedInputMedia, MediaGroupMemberInputMedia { + override val type: String = "photo" + + override fun serialize(format: StringFormat): String = format.stringify(serializer(), this) + + @Transient + override val arguments: Map = Mapper.mapNullable(serializer(), this) + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} + +fun PhotoSize.toInputMediaPhoto( + caption: String? = null, + parseMode: ParseMode? = null +): InputMediaPhoto = InputMediaPhoto( + fileId, + caption, + parseMode +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt new file mode 100644 index 0000000000..f915c0b7b6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt @@ -0,0 +1,42 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaVideo( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val width: Int? = null, + @Optional + override val height: Int? = null, + @Optional + override val duration: Int? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, CaptionedInputMedia, MediaGroupMemberInputMedia { + override val type: String = "video" + + override fun serialize(format: StringFormat): String = format.stringify(serializer(), this) + + @Transient + override val arguments: Map = Mapper.mapNullable(serializer(), this) + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt new file mode 100644 index 0000000000..ddaa944184 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import kotlinx.serialization.StringFormat + +interface MediaGroupMemberInputMedia: InputMedia { + fun serialize(format: StringFormat): String + val arguments: Map +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt new file mode 100644 index 0000000000..010f8c4f72 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface SizedInputMedia : InputMedia { + val width: Int? + val height: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt new file mode 100644 index 0000000000..69f24997c9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.thumbField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +// TODO:: fill thumbed +interface ThumbedInputMedia : InputMedia { + val thumb: InputFile? + @Serializable + @SerialName(thumbField) + val thumbMedia: String? + get() = thumb ?.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt new file mode 100644 index 0000000000..d6d58540a8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface TitledInputMedia : InputMedia { + val title: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt new file mode 100644 index 0000000000..3d313c268d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Locationed +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Location( + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(latitudeField) + override val latitude: Double +) : Locationed diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt new file mode 100644 index 0000000000..91c92bb650 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class BoldTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "*" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt new file mode 100644 index 0000000000..4556f722c0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class BotCommandMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + val command: String by lazy { + sourceString.substring(1)// skip first symbol like "/" or "!" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt new file mode 100644 index 0000000000..741a0a60d3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class CodeTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "`" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt new file mode 100644 index 0000000000..cdd17c79cb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +class EMailMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString](mailto://$sourceString)" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt new file mode 100644 index 0000000000..1bc3c9a1ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class HashTagMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt new file mode 100644 index 0000000000..32e4665b25 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class ItalicTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "_" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt new file mode 100644 index 0000000000..59e2ae08db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +class MentionMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + override val asMarkdownSource: String + get() = sourceString +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt new file mode 100644 index 0000000000..5c181d7fbf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +interface MessageEntity { + val offset: Int + val length: Int + val sourceString: String + + val asMarkdownSource: String + get() = sourceString +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt new file mode 100644 index 0000000000..6bccd2e78f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class PhoneNumberMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt new file mode 100644 index 0000000000..e9789d7ad0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class PreTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "```" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt new file mode 100644 index 0000000000..e841ef3afe --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt @@ -0,0 +1,42 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class RawMessageEntity( + val type: String, + val offset: Int, + val length: Int, + @Optional + val url: String? = null, + @Optional + val user: User? = null +) { + fun asMessageEntity(source: String): MessageEntity { + val sourceSubstring = source.substring(offset, offset + length) + return when (type) { + "mention" -> MentionMessageEntity(offset, length, sourceSubstring) + "hashtag" -> HashTagMessageEntity(offset, length, sourceSubstring) + "cashtag" -> TODO() + "bot_command" -> BotCommandMessageEntity(offset, length, sourceSubstring) + "url" -> URLMessageEntity(offset, length, sourceSubstring) + "email" -> EMailMessageEntity(offset, length, sourceSubstring) + "phone_number" -> PhoneNumberMessageEntity(offset, length, sourceSubstring) + "bold" -> BoldTextMessageEntity(offset, length, sourceSubstring) + "italic" -> ItalicTextMessageEntity(offset, length, sourceSubstring) + "code" -> CodeTextMessageEntity(offset, length, sourceSubstring) + "pre" -> PreTextMessageEntity(offset, length, sourceSubstring) + "text_link" -> TextLinkMessageEntity(offset, length, sourceSubstring, url ?: throw IllegalStateException("URL must not be null for text link")) + "text_mention" -> TextMentionMessageEntity(offset, length, sourceSubstring, user ?: throw IllegalStateException("User must not be null for text mention")) + else -> throw IllegalArgumentException("Unknown type of message entity") + } + } +} + +typealias RawMessageEntities = List + +object RawMessageEntitiesSerializer : KSerializer> by ArrayListSerializer( + RawMessageEntity.serializer() +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt new file mode 100644 index 0000000000..9d149100ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class TextLinkMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String, + val url: String +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString]($url)" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt new file mode 100644 index 0000000000..eba3c210d2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +class TextMentionMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String, + val user: User +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString](tg://user?id=${user.id})" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt new file mode 100644 index 0000000000..53c7142383 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +abstract class TextMessageEntity : MessageEntity { + protected abstract val formatSymbol: String + + override val asMarkdownSource: String by lazy { + "$formatSymbol$sourceString$formatSymbol" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt new file mode 100644 index 0000000000..6a5a182318 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class URLMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + val url: String + get() = sourceString + + override val asMarkdownSource: String by lazy { + "[$sourceString]($url)" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt new file mode 100644 index 0000000000..23e5f3b108 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt @@ -0,0 +1,41 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode + +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +internal const val parseModeField = "parse_mode" + +@Serializable(ParseModeSerializerObject::class) +sealed class ParseMode { + abstract val parseModeName: String +} + +@Serializable(ParseModeSerializerObject::class) +object MarkdownParseMode : ParseMode() { + @Serializable + @SerialName(parseModeField) + override val parseModeName: String = "Markdown" +} + +@Serializable(ParseModeSerializerObject::class) +object HTMLParseMode : ParseMode() { + @Serializable + @SerialName(parseModeField) + override val parseModeName: String = "HTML" +} + +@Serializer(ParseMode::class) +internal class ParseModeSerializerObject: KSerializer { + override fun deserialize(input: Decoder): ParseMode { + val mode = input.decodeString() + return when (mode) { + MarkdownParseMode.parseModeName -> MarkdownParseMode + HTMLParseMode.parseModeName -> HTMLParseMode + else -> throw IllegalArgumentException("Unknown parse mode") + } + } + + override fun serialize(output: Encoder, obj: ParseMode) { + output.encodeString(obj.parseModeName) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt new file mode 100644 index 0000000000..d038f3a323 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt @@ -0,0 +1,30 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import org.joda.time.DateTime +import java.util.concurrent.TimeUnit + +@Serializable +data class ResponseParameters( + val ok: Boolean = false, + @Optional + val description: String? = null, + @SerialName("migrate_to_chat_id") + @Optional + val migrateToChatId: Identifier? = null, + @SerialName("retry_after") + @Optional + val retryAfter: Int? = null, + @SerialName("error_code") + @Optional + val errorCode: Int? = null, + @Optional + val result: T? = null +) { + @Transient + val waitUntil: DateTime? by lazy { + retryAfter ?.let { + DateTime.now().plus(TimeUnit.SECONDS.toMillis(it.toLong())) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt new file mode 100644 index 0000000000..5f6bb99c93 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import org.joda.time.DateTime +import java.util.concurrent.TimeUnit + +@Serializable(TelegramDateSerializer::class) +class TelegramDate( + private val date: Long +) { + constructor(dateTime: DateTime) : this( + TimeUnit.MILLISECONDS.toSeconds(dateTime.millis) + ) + + @Transient + val asDate: DateTime = DateTime( + TimeUnit.SECONDS.toMillis(date) + ) +} + +fun DateTime.toTelegramDate(): TelegramDate = TelegramDate(this) + +@Serializer(TelegramDate::class) +internal class TelegramDateSerializer: KSerializer { + override fun serialize(output: Encoder, obj: TelegramDate) { + output.encodeLong( + TimeUnit.MILLISECONDS.toSeconds(obj.asDate.millis) + ) + } + + override fun deserialize(input: Decoder): TelegramDate { + return TelegramDate( + input.decodeLong() + ) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt new file mode 100644 index 0000000000..4e40b14e93 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +@Serializable +data class User( + val id: ChatId, + @SerialName(isBotField) + @Optional + val isBot: Boolean = false, + @SerialName(firstNameField) + val firstName: String, + @SerialName(lastNameField) + @Optional + val lastName: String? = null, + @SerialName(usernameField) + @Optional + val username: String? = null, + @SerialName(languageCodeField) + @Optional + private val languageCode: String? = null +) { + @Transient + val userLocale: Locale? by lazy { + languageCode ?.let { + Locale.forLanguageTag(it) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt new file mode 100644 index 0000000000..f54cf75787 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Photo +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSerializer +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class UserProfilePhotos ( + @SerialName("total_count") + val count: Int, + @Serializable(UserProfilePhotosPhotosSerializer::class) + val photos: List +) + +object UserProfilePhotosPhotosSerializer : KSerializer> by ArrayListSerializer( + PhotoSerializer +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt new file mode 100644 index 0000000000..f979d0131c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable +data class Venue( + @SerialName(locationField) + val location: Location, + @SerialName(titleField) + val title: String, + @SerialName(addressField) + val address: String, + @SerialName(foursquareIdField) + @Optional + val foursquareId: String? = null, + @SerialName(foursquareTypeField) + @Optional + val foursquareType: String? = null // TODO:: Rewrite with enum or interface +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt new file mode 100644 index 0000000000..23bf23b54e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface Captioned { + val caption: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt new file mode 100644 index 0000000000..e8cbbfeba0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.abstracts + +interface Locationed { + val latitude: Double + val longitude: Double +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt new file mode 100644 index 0000000000..1b5ad39641 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt @@ -0,0 +1,75 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.actions + +import kotlinx.serialization.* + +private val actions = listOf( + TypingAction, + UploadPhotoAction, + RecordVideoAction, + UploadVideoAction, + RecordAudioAction, + UploadAudioAction, + UploadDocumentAction, + FindLocationAction +) + +@Serializable(BotActionSerializer::class) +sealed class BotAction { + abstract val actionName: String +} + +@Serializer(BotAction::class) +class BotActionSerializer: KSerializer { + override fun serialize(output: Encoder, obj: BotAction) { + output.encodeString(obj.actionName) + } + + override fun deserialize(input: Decoder): BotAction { + val actionName = input.decodeString() + return actions.firstOrNull { it.actionName == actionName } ?: throw IllegalStateException("Unknown action type: $actionName") + } +} + +/** + * Use BotAction objects realisations to notify user about bot actions + */ + +@Serializable(BotActionSerializer::class) +object TypingAction : BotAction() { + override val actionName: String = "typing" +} + +@Serializable(BotActionSerializer::class) +object UploadPhotoAction : BotAction() { + override val actionName: String = "upload_photo" +} + +@Serializable(BotActionSerializer::class) +object RecordVideoAction : BotAction() { + override val actionName: String = "record_video" +} + +@Serializable(BotActionSerializer::class) +object UploadVideoAction : BotAction() { + override val actionName: String = "upload_video" +} + +@Serializable(BotActionSerializer::class) +object RecordAudioAction : BotAction() { + override val actionName: String = "record_audio" +} + +@Serializable(BotActionSerializer::class) +object UploadAudioAction : BotAction() { + override val actionName: String = "upload_audio" +} + +@Serializable(BotActionSerializer::class) +object UploadDocumentAction : BotAction() { + override val actionName: String = "upload_document" +} + +@Serializable(BotActionSerializer::class) +object FindLocationAction : BotAction() { + override val actionName: String = "find_location" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt new file mode 100644 index 0000000000..f01fc81609 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +typealias Matrix = List> diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt new file mode 100644 index 0000000000..383d8d5084 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ForceReply( + @Optional + val selective: Boolean? = null +) : KeyboardMarkup { + @SerialName("force_reply") + val forceReply: Boolean = true +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt new file mode 100644 index 0000000000..2610605f94 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import com.github.insanusmokrassar.TelegramBotAPI.types.callbackDataField +import com.github.insanusmokrassar.TelegramBotAPI.types.textField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CallbackDataInlineKeyboardButton( + @SerialName(textField) + override val text: String, + @SerialName(callbackDataField) + val callbackData: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt new file mode 100644 index 0000000000..cf1bfc63b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +interface InlineKeyboardButton { + val text: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt new file mode 100644 index 0000000000..edc357b468 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.Serializable + +//TODO:: add check that this button first in a row (it MUST be first in a row) +@Serializable +data class PayInlineKeyboardButton( + override val text: String, + val pay: Boolean +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt new file mode 100644 index 0000000000..731a3b4cca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SwitchInlineQueryCurrentChatInlineKeyboardButton( + override val text: String, + @SerialName("switch_inline_query_currentChat") + val switchInlineQueryCurrentChat: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt new file mode 100644 index 0000000000..a5134c6a8b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SwitchInlineQueryInlineKeyboardButton( + override val text: String, + @SerialName("switch_inline_query") + val switchInlineQuery: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt new file mode 100644 index 0000000000..5272e43f29 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.Serializable + +@Serializable +data class URLInlineKeyboardButton( + override val text: String, + val url: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt new file mode 100644 index 0000000000..7c5e9e590e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons.InlineKeyboardButton +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class InlineKeyboardMarkup( + @SerialName("inline_keyboard") + val keyboard: Matrix +) : KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt new file mode 100644 index 0000000000..7e03499cc2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class KeyboardButton( + val text: String, + @SerialName("request_contact") + @Optional + val requestContact: Boolean? = null, + @SerialName("request_location") + @Optional + val requestLocation: Boolean? = null +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt new file mode 100644 index 0000000000..09629a51be --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +interface KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt new file mode 100644 index 0000000000..938a1ad8dd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ReplyKeyboardMarkup( + val keyboard: Matrix, + @SerialName("resize_keyboard") + @Optional + val resizeKeyboard: Boolean? = null, + @SerialName("one_time_keyboard") + @Optional + val oneTimeKeyboard: Boolean? = null, + @Optional + val selective: Boolean? = null +) : KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt new file mode 100644 index 0000000000..a5421a7078 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ReplyKeyboardRemove( + @Optional + val selective: Boolean? = null +) : KeyboardMarkup { + @SerialName("remove_keyboard") + val removeKeyboard: Boolean = true +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt new file mode 100644 index 0000000000..6db6fc6773 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage + +data class ChannelChat( + override val id: ChatId, + override val title: String? = null, + val username: String? = null, + val description: String? = null, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null, + val pinnedMessage: RawMessage? +) : PublicChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt new file mode 100644 index 0000000000..59156434e6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface Chat { + val id: ChatId + val chatPhoto: ChatPhoto? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt new file mode 100644 index 0000000000..99f52fa4b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface GroupChat : PublicChat { + val allMembersAreAdmins: Boolean +} + +data class GroupChatImpl( + override val id: ChatId, + override val title: String? = null, + override val allMembersAreAdmins: Boolean, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null) : GroupChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt new file mode 100644 index 0000000000..ebaec2c0de --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class PrivateChat( + override val id: ChatId, + val username: String? = null, + val firstName: String? = null, + val lastName: String? = null, + override val chatPhoto: ChatPhoto? = null +) : Chat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt new file mode 100644 index 0000000000..27087007df --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +interface PublicChat : Chat { + val title: String? + val inviteLink: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt new file mode 100644 index 0000000000..7e8fb87c20 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt @@ -0,0 +1,58 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import kotlinx.serialization.* + +@Serializable +data class RawChat( + override val id: ChatId, + private val type: String, + @Optional private val title: String? = null, + @Optional private val username: String? = null, + @Optional private val first_name: String? = null, + @Optional private val last_name: String? = null, + @Optional private val all_members_are_administrators: Boolean? = null, + @Optional private val description: String? = null, + @Optional private val invite_link: String? = null, + @Optional private val pinned_message: RawMessage? = null, + @Optional private val sticker_set_name: String? = null, + @Optional private val can_set_sticker_set: Boolean? = null, + @SerialName("photo") + @Optional override val chatPhoto: ChatPhoto? = null +) : Chat { + fun extractChat(): Chat { + return when (type) { + "private" -> PrivateChat(id, username, first_name, last_name, chatPhoto) + "group" -> GroupChatImpl( + id, + title, + all_members_are_administrators ?: false, + invite_link, + chatPhoto + ) + "supergroup" -> SupergroupChat( + id, + title, + username, + description, + all_members_are_administrators ?: false, + invite_link, + chatPhoto, + pinned_message, + sticker_set_name, + can_set_sticker_set ?: false + ) + "channel" -> ChannelChat( + id, + title, + username, + description, + invite_link, + chatPhoto, + pinned_message + ) + else -> throw IllegalArgumentException("Unknown type of chat") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt new file mode 100644 index 0000000000..bbb2fd42b6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage + +data class SupergroupChat( + override val id: ChatId, + override val title: String? = null, + val username: String? = null, + val description: String? = null, + override val allMembersAreAdmins: Boolean, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null, + val pinnedMessage: RawMessage? = null, + val stickerSetName: String? = null, + val canSetStickerSet: Boolean +) : GroupChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt new file mode 100644 index 0000000000..4bf40ef200 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class AnimationFile( + @SerialName(fileIdField) + override val fileId: FileId, + override val width: Int, + override val height: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(fileNameField) + @Optional + override val fileName: String? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, CustomNamedMediaFile, SizedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt new file mode 100644 index 0000000000..fa653f0539 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt @@ -0,0 +1,25 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class AudioFile( + @SerialName(fileIdField) + override val fileId: FileId, + @Optional + override val duration: Long? = null, + @Optional + val performer: String? = null, + @Optional + override val title: String? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @Optional + override val thumb: PhotoSize? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, TitledMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt new file mode 100644 index 0000000000..07222aa2ed --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class DocumentFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileNameField) + @Optional + override val fileName: String? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt new file mode 100644 index 0000000000..5cd37e45ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class File( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +): TelegramMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt new file mode 100644 index 0000000000..83c812f8ab --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class PathedFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(filePathField) + val filePath: String, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +): TelegramMediaFile + +fun PathedFile.makeFileUrl( + botToken: String, + apiHost: String = "https://api.telegram.org" +) = "${downloadingFilesBaseUrl(botToken, apiHost)}/$filePath" + +fun downloadingFilesBaseUrl( + botToken: String, + apiHost: String +) = "$apiHost/file/bot$botToken" diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt new file mode 100644 index 0000000000..bb16194cd0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt @@ -0,0 +1,38 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +typealias Photo = List + +fun Photo.biggest(): PhotoSize? { + var biggest: PhotoSize = firstOrNull() ?: return null + forEach { + if (it.resolution > biggest.resolution) { + biggest = it + } + } + return biggest +} + +object PhotoSerializer : KSerializer by ArrayListSerializer( + PhotoSize.serializer() +) + +@Serializable +data class PhotoSize( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + override val width: Int, + override val height: Int +) : SizedMediaFile { + @Transient + val resolution: Long by lazy { + width.toLong() * height + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt new file mode 100644 index 0000000000..0b2b020545 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +@Serializable +data class Sticker( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(widthField) + override val width: Int, + @SerialName(heightField) + override val height: Int, + @SerialName(thumbField) + @Optional + override val thumb: PhotoSize? = null, + @SerialName(emojiField) + @Optional + val emoji: String? = null, + @SerialName(stickerSetNameField) + @Optional + val stickerSetName: String? = null, + @SerialName(maskPositionField) + @Optional + val maskPosition: MaskPosition? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt new file mode 100644 index 0000000000..adfbf76404 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class TelegramFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @SerialName("file_path") + @Optional + val filePath: String? = null +) : TelegramMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt new file mode 100644 index 0000000000..e68d1f7bd2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VideoFile( + @SerialName(fileIdField) + override val fileId: FileId, + override val width: Int, + override val height: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt new file mode 100644 index 0000000000..6e906e57be --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VideoNoteFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName("length") + override val width: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile { + override val height: Int + get() = width +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt new file mode 100644 index 0000000000..bcc8bfb1e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VoiceFile( + @SerialName(fileIdField) + override val fileId: FileId, + @Optional + override val duration: Long? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, PlayableMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt new file mode 100644 index 0000000000..b7e7745c6a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +internal const val fileNameField = "file_name" + +interface CustomNamedMediaFile { + val fileName: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt new file mode 100644 index 0000000000..2ab9ffcf0a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +internal const val mimeTypeField = "mime_type" + +interface MimedMediaFile : TelegramMediaFile { + val mimeType: String? // TODO::replace by something like enum or interface +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt new file mode 100644 index 0000000000..3755952a49 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface PlayableMediaFile : TelegramMediaFile { + val duration: Long? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt new file mode 100644 index 0000000000..1df6fe7a4e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface SizedMediaFile : TelegramMediaFile { + val width: Int + val height: Int +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt new file mode 100644 index 0000000000..c4749caa59 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +internal const val fileIdField = "file_id" +internal const val fileSizeField = "file_size" +internal const val filePathField = "file_path" + +/** + * Declare common part of media files in Telegram. Note: it is not representation of `File` type + */ +interface TelegramMediaFile { + val fileId: FileId + val fileSize: Long? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt new file mode 100644 index 0000000000..4c185377a7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize + +interface ThumbedMediaFile : TelegramMediaFile { + val thumb: PhotoSize? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt new file mode 100644 index 0000000000..2f63e0d6af --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface TitledMediaFile { + val title: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt new file mode 100644 index 0000000000..1d74fd18ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import kotlinx.serialization.Serializable + +@Serializable +class CallbackGame { + init { + TODO() + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt new file mode 100644 index 0000000000..be6dd46cd4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt @@ -0,0 +1,34 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.* +import kotlinx.serialization.* + +@Serializable +data class Game( + @SerialName(titleField) + val title: String, + @SerialName(descriptionField) + val description: String, + @Serializable(PhotoSerializer::class) + @SerialName(photoField) + val photo: Photo, + @SerialName(textField) + @Optional + val text: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @SerialName(textEntitiesField) + @Optional + private val textEntitiesRaw: RawMessageEntities? = null, + @SerialName(animationField) + @Optional + val animation: AnimationFile? = null +) { + @Transient + val textEntities: List? = text ?.let { + textEntitiesRaw ?.map { + it.asMessageEntity(text) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt new file mode 100644 index 0000000000..c01188affd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GameHighScore ( + @SerialName(positionField) + val position: Long, + @SerialName(userField) + val user: User, + @SerialName(scoreField) + val score: Long +) \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt new file mode 100644 index 0000000000..63fb4df00e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.ChannelChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChannelEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class ChannelEventMessage( + override val messageId: MessageIdentifier, + override val chat: ChannelChat, + override val chatEvent: ChannelEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt new file mode 100644 index 0000000000..781e81d0cd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.AuthorSignature +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import org.joda.time.DateTime + +data class ChannelMessage( + override val messageId: MessageIdentifier, + override val chat: Chat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwarded: ForwardedMessage?, + override val replyTo: Message?, + val authorSignature: AuthorSignature? +) : CommonMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt new file mode 100644 index 0000000000..bd07b39c8b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChannelEvent + +class ChannelChatCreated: ChannelEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt new file mode 100644 index 0000000000..c94bf5d8a9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +class DeleteChatPhoto: CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt new file mode 100644 index 0000000000..bedeca44fe --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent + +class GroupChatCreated( + val migratedTo: ChatIdentifier? +): GroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt new file mode 100644 index 0000000000..dcdaa133d3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent + +data class LeftChatMember( + val user: User +): GroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt new file mode 100644 index 0000000000..182fe3c7ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent + +data class NewChatMembers( + val members: List +): GroupEvent, SupergroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt new file mode 100644 index 0000000000..60c3e5d56c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +data class NewChatPhoto( + val photo: List +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt new file mode 100644 index 0000000000..69fdcd826c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +data class NewChatTitle( + val title: String +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt new file mode 100644 index 0000000000..d4890bb1fa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class PinnedMessage( + val message: Message +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt new file mode 100644 index 0000000000..676bf05ba3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent + +class SupergroupChatCreated( + val migratedFrom: ChatIdentifier? +): SupergroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt new file mode 100644 index 0000000000..4acfd4b283 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface ChannelEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt new file mode 100644 index 0000000000..f5fa1558af --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface ChatEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt new file mode 100644 index 0000000000..8878d1a239 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface CommonEvent : ChannelEvent, GroupEvent, SupergroupEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt new file mode 100644 index 0000000000..2a3a35de96 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface GroupEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt new file mode 100644 index 0000000000..b428fa279e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface SupergroupEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt new file mode 100644 index 0000000000..570e048407 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import org.joda.time.DateTime + +data class CommonMessageImpl( + override val messageId: MessageIdentifier, + val user: User, + override val chat: Chat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwarded: ForwardedMessage?, + override val replyTo: Message?, + val paymentInfo: PaymentInfo? +) : Message, CommonMessage \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt new file mode 100644 index 0000000000..d8a6ff5b20 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat + +sealed class ForwardedMessage { + abstract val messageId: MessageIdentifier + abstract val dateOfOriginal: TelegramDate +} + +data class CommonForwardedMessage( + override val messageId: MessageIdentifier, + override val dateOfOriginal: TelegramDate, + val from: User +) : ForwardedMessage() + +data class ForwardedFromChannelMessage( + override val messageId: MessageIdentifier, + override val dateOfOriginal: TelegramDate, + val from: User?, + val channelChat: Chat, + val signature: String? = null +) : ForwardedMessage() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt new file mode 100644 index 0000000000..2a2f7b3e45 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.GroupChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class GroupEventMessage( + override val messageId: MessageIdentifier, + override val chat: GroupChat, + override val chatEvent: GroupEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt new file mode 100644 index 0000000000..922dd39a96 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt @@ -0,0 +1,239 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.* +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.* +import com.github.insanusmokrassar.TelegramBotAPI.types.games.Game +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.InvoiceOfPayment +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.SuccessfulPaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.Invoice +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.SuccessfulPayment +import kotlinx.serialization.* +import kotlin.reflect.KClass + +// TODO:: add PassportData type +@Serializable +data class RawMessage( + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(dateField) + val date: TelegramDate, + @SerialName(chatField) + private val chat: RawChat, + @SerialName(fromField) + @Optional + private val from: User? = null, + @Optional private val forward_from: User? = null, + @Optional private val forward_from_chat: RawChat? = null, + @Optional private val forward_from_message_id: MessageIdentifier? = null, + @Optional private val forward_signature: ForwardSignature? = null, + @Optional private val forward_date: TelegramDate? = null, + @Optional private val reply_to_message: RawMessage? = null, + @Optional private val edit_date: TelegramDate? = null, + @Optional private val media_group_id: MediaGroupIdentifier? = null, + @Optional private val author_signature: AuthorSignature? = null, + @Optional private val text: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @Optional private val entities: RawMessageEntities? = null, + @Optional private val caption: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @Optional private val caption_entities: RawMessageEntities? = null, + @Optional private val audio: AudioFile? = null, + @Optional private val document: DocumentFile? = null, + @Optional private val animation: AnimationFile? = null, + @Optional private val game: Game? = null, + @Serializable(PhotoSerializer::class) + @Optional private val photo: Photo? = null, + @Optional private val sticker: Sticker? = null, + @Optional private val video: VideoFile? = null, + @Optional private val voice: VoiceFile? = null, + @Optional private val video_note: VideoNoteFile? = null, + @Optional private val contact: Contact? = null, + @Optional private val location: Location? = null, + @Optional private val venue: Venue? = null, + @Optional private val new_chat_members: Array? = null, + @Optional private val left_chat_member: User? = null, + @Optional private val new_chat_title: String? = null, + @Serializable(PhotoSerializer::class) + @Optional private val new_chat_photo: Photo? = null, + @Optional private val delete_chat_photo: Boolean = false, + @Optional private val group_chat_created: Boolean = false, + @Optional private val supergroup_chat_created: Boolean = false, + @Optional private val channel_chat_created: Boolean = false, + @Optional private val migrate_to_chat_id: ChatIdentifier? = null, + @Optional private val migrate_from_chat_id: ChatIdentifier? = null, + @Optional private val pinned_message: RawMessage? = null, + @Optional private val invoice: Invoice? = null, + @Optional private val successful_payment: SuccessfulPayment? = null, + + // login property + @Optional private val connected_website: String? = null, + + // passport property + @Optional private val passport_data: Unit? = null +) { + @Transient + private val content: MessageContent? by lazy { + val adaptedCaptionEntities = caption ?.let { _ -> + caption_entities ?.map { + it.asMessageEntity(caption) + } + } ?: emptyList() + + when { + text != null -> TextContent(text, entities ?.map { it.asMessageEntity(text) } ?: emptyList()) + audio != null -> AudioContent( + audio, + caption, + adaptedCaptionEntities + ) + video != null -> VideoContent( + video, + caption, + adaptedCaptionEntities + ) + document != null -> DocumentContent( + document, + caption, + adaptedCaptionEntities + ) + voice != null -> VoiceContent( + voice, + caption, + adaptedCaptionEntities + ) + photo != null -> PhotoContent( + photo.toList(), + caption, + adaptedCaptionEntities + ) + animation != null -> AnimationContent(animation, document) + sticker != null -> StickerContent(sticker) + game != null -> GameContent(game) + video_note != null -> VideoNoteContent(video_note) + contact != null -> ContactContent(contact) + location != null -> LocationContent(location) + venue != null -> VenueContent(venue) + else -> null + } + } + + @Transient + private val forwarded: ForwardedMessage? by lazy { + forward_from_message_id ?.let { + forward_date ?: throw IllegalStateException("For forwarded messages date of original message declared as set up required") + forward_from_chat ?.let { + ForwardedFromChannelMessage( + forward_from_message_id, + forward_date, + forward_from, + forward_from_chat.extractChat(), + forward_signature + ) + } ?: CommonForwardedMessage( + forward_from_message_id, + forward_date, + forward_from + ?: throw IllegalStateException("For common forwarded messages author of original message declared as set up required") + ) + } + } + + @Transient + private val chatEvent: ChatEvent? by lazy { + when { + new_chat_members != null -> NewChatMembers(new_chat_members.toList()) + left_chat_member != null -> LeftChatMember(left_chat_member) + new_chat_title != null -> NewChatTitle(new_chat_title) + new_chat_photo != null -> NewChatPhoto(new_chat_photo.toList()) + delete_chat_photo -> DeleteChatPhoto() + group_chat_created -> GroupChatCreated( + migrate_to_chat_id + ) + supergroup_chat_created -> SupergroupChatCreated( + migrate_from_chat_id + ) + channel_chat_created -> ChannelChatCreated() + pinned_message != null -> PinnedMessage(pinned_message.asMessage) + else -> null + } + } + + @Transient + private val paymentInfo: PaymentInfo? by lazy { + when { + invoice != null -> InvoiceOfPayment(invoice) + successful_payment != null -> SuccessfulPaymentInfo(successful_payment) + else -> null + } + } + + + + @Transient + val asMessage: Message by lazy { + val chat = chat.extractChat() + + chatEvent ?.let { + chatEvent -> + when (chat) { + is GroupChat -> GroupEventMessage( + messageId, + chat, + chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent), + date.asDate + ) + is SupergroupChat -> SupergroupEventMessage( + messageId, + chat, + chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent), + date.asDate + ) + is ChannelChat -> ChannelEventMessage( + messageId, + chat, + chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent), + date.asDate + ) + else -> throw IllegalStateException("Expected one of the public chats, but was $chat (in extracting of chat event message)") + } + } ?: content ?.let { + content -> + when (chat) { + is ChannelChat -> ChannelMessage( + messageId, + chat, + content, + date.asDate, + edit_date ?.asDate, + forwarded, + reply_to_message ?.asMessage, + author_signature + ) + else -> CommonMessageImpl( + messageId, + from ?: throw IllegalStateException("Was detected common message, but owner (sender) of the message was not found"), + chat, + content, + date.asDate, + edit_date ?.asDate, + forwarded, + reply_to_message ?.asMessage, + paymentInfo + ) + } + } ?: throw IllegalStateException("Was not found supported type of data") + } + + private fun throwWrongChatEvent(expected: KClass<*>, but: ChatEvent): CommonEvent { + throw IllegalStateException("Wrong type of chat event: expected $expected, but was $but") + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt new file mode 100644 index 0000000000..d767299b35 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.SupergroupChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class SupergroupEventMessage( + override val messageId: MessageIdentifier, + override val chat: SupergroupChat, + override val chatEvent: SupergroupEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt new file mode 100644 index 0000000000..c3213ef9f4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import org.joda.time.DateTime + +interface AbleToBeEditedMessage : Message { + val editDate: DateTime? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt new file mode 100644 index 0000000000..c1acd3a459 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ForwardedMessage + +interface AbleToBeForwardedMessage : Message { + val forwarded: ForwardedMessage? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt new file mode 100644 index 0000000000..5a879b9e9c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo + +interface AbleToBePaymentedMessage : Message { + val paymentInfo: PaymentInfo? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt new file mode 100644 index 0000000000..3cbe77739e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +interface AbleToReplyMessage { + val replyTo: Message? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt new file mode 100644 index 0000000000..83c1b4bb0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChatEvent + +interface ChatEventMessage : Message { + val chatEvent: ChatEvent +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt new file mode 100644 index 0000000000..6a76684b95 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +interface CommonMessage : Message, + AbleToBeForwardedMessage, + AbleToBeEditedMessage, + AbleToReplyMessage, + ContentMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt new file mode 100644 index 0000000000..e46d31fa86 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +interface ContentMessage: Message { + val content: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt new file mode 100644 index 0000000000..96f376b51c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaGroupContent + +interface MediaGroupMessage { + val mediaGroupId: String + val content: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt new file mode 100644 index 0000000000..a448e9f804 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import org.joda.time.DateTime + +interface Message { + val messageId: MessageIdentifier + val chat: Chat + val date: DateTime +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt new file mode 100644 index 0000000000..67b16e3a9c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Contact +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class ContactContent( + val contact: Contact +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt new file mode 100644 index 0000000000..3c4eff1bc6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.games.Game +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class GameContent( + val game: Game +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt new file mode 100644 index 0000000000..60f5d6b0ae --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Location +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class LocationContent( + val location: Location +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt new file mode 100644 index 0000000000..6350980692 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class TextContent( + val text: String, + val entities: List = emptyList() +) : MessageContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt new file mode 100644 index 0000000000..f86882e707 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Venue +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class VenueContent( + val venue: Venue +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt new file mode 100644 index 0000000000..5f64ac8cb2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity + +interface CaptionedMediaContent { + val caption: String? + val captionEntities: List +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt new file mode 100644 index 0000000000..a815289302 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.TelegramMediaFile + +interface MediaCollectionContent: MessageContent { + val media: List +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt new file mode 100644 index 0000000000..fe3d48b712 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.TelegramMediaFile + +interface MediaContent: MessageContent { + val media: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt new file mode 100644 index 0000000000..587efd1fea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +interface MediaGroupContent : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt new file mode 100644 index 0000000000..7bf160e344 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +interface MessageContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt new file mode 100644 index 0000000000..c6c67fb264 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.AnimationFile +import com.github.insanusmokrassar.TelegramBotAPI.types.files.DocumentFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class AnimationContent( + override val media: AnimationFile, + val includedDocument: DocumentFile? +) : MediaContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt new file mode 100644 index 0000000000..e2c048f82b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.AudioFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class AudioContent( + override val media: AudioFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt new file mode 100644 index 0000000000..dc9607adc4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.DocumentFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class DocumentContent( + override val media: DocumentFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt new file mode 100644 index 0000000000..1fa526eb78 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* + +data class PhotoContent( + override val media: List, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaCollectionContent, CaptionedMediaContent, MediaGroupContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt new file mode 100644 index 0000000000..bf7bc4e48c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Sticker +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class StickerContent( + override val media: Sticker +) : MediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt new file mode 100644 index 0000000000..edf2c4ae38 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VideoFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* + +data class VideoContent( + override val media: VideoFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent, MediaGroupContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt new file mode 100644 index 0000000000..ab5020d1b1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VideoNoteFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class VideoNoteContent( + override val media: VideoNoteFile +) : MediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt new file mode 100644 index 0000000000..a54bb148c9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VoiceFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class VoiceContent( + override val media: VoiceFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt new file mode 100644 index 0000000000..7f90a9f438 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.Invoice + +data class InvoiceOfPayment( + val invoice: Invoice +) : PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt new file mode 100644 index 0000000000..f769e02fa4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.SuccessfulPayment + +data class SuccessfulPaymentInfo( + val payment: SuccessfulPayment +) : PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt new file mode 100644 index 0000000000..d526310e13 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts + +interface PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt new file mode 100644 index 0000000000..1d76520acf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +data class Invoice( + @SerialName(titleField) + val title: String, + @SerialName(descriptionField) + val description: String, + @SerialName(startParameterField) + val startParameter: StartParameter, + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long +) : Amounted, Currencied diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt new file mode 100644 index 0000000000..fd1ea47baa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.Amounted +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class LabeledPrice( + @SerialName(labelField) + val label: String, + @SerialName(amountField) + override val amount: Long +) : Amounted diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt new file mode 100644 index 0000000000..29117ffa25 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class OrderInfo( + @SerialName(nameField) + val name: String, + @SerialName(phoneNumberField) + val phoneNumber: String, + @SerialName(emailField) + val email: String, + @SerialName(shippingAddressField) + val shippingAddress: ShippingAddress +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt new file mode 100644 index 0000000000..0148d2c5ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt @@ -0,0 +1,29 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +// TODO:: separate to normal classes hierarchy +@Serializable +data class PreCheckoutQuery( + @SerialName(idField) + val id: PreCheckoutQueryId, + @SerialName(fromField) + val user: User, + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long, + @SerialName(invoicePayloadField) + val invoicePayload: InvoicePayload, + @SerialName(shippingOptionIdField) + @Optional + val shippingOptionId: ShippingOptionIdentifier? = null, + @SerialName(orderInfoField) + @Optional + val orderInfo: OrderInfo? = null +) : Currencied, Amounted diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt new file mode 100644 index 0000000000..ade1e1a320 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class ShippingAddress( + @SerialName(countryCodeField) + val countryCode: String, + @SerialName(cityField) + val city: String, + @SerialName(firstStreetLineField) + val firstStreetLine: String, + @SerialName(secondStreetLineField) + val secondStreetLine: String, + @SerialName(stateField) + @Optional + val state: String = "", + @SerialName(postCodeField) + @Optional + val postCode: String = "" +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt new file mode 100644 index 0000000000..ebdc3866db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.Priced +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class ShippingOption( + @SerialName(idField) + val id: ShippingOptionIdentifier, + @SerialName(titleField) + val title: String, + @Serializable(LabeledPricesSerializer::class) + @SerialName(pricesField) + override val prices: List +) : Priced + +object LabeledPricesSerializer : KSerializer> by ArrayListSerializer( + LabeledPrice.serializer() +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt new file mode 100644 index 0000000000..a51b028e57 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ShippingQuery( + @SerialName(idField) + val id: ShippingQueryIdentifier, + @SerialName(fromField) + val user: User, + @SerialName(invoicePayloadField) + val invoicePayload: InvoicePayload, + @SerialName(shippingAddressField) + val shippingAddress: ShippingAddress +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt new file mode 100644 index 0000000000..68f0d5fec0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +@Serializable +data class SuccessfulPayment( + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long, + @SerialName(invoicePayloadField) + val invoicePayload: String, + @SerialName(telegramPaymentChargeIdField) + val telegramPaymentChargeId: String, + @SerialName(providerPaymentChargeIdField) + val providerPaymentChargeId: String, + @SerialName(shippingOptionIdField) + @Optional + val shippingOptionId: String? = null, + @SerialName(orderInfoField) + @Optional + val orderInfo: OrderInfo? = null +) : Amounted, Currencied diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt new file mode 100644 index 0000000000..50e1a05c4c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +interface Amounted { + val amount: Long + val adaptedMajorityTotalAmount: Double + get() = amount / 100.0 +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt new file mode 100644 index 0000000000..b0184bda99 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +import kotlinx.serialization.* +import java.util.* + +interface Currencied { + val currency: Currency +} + +@Serializer(Currency::class) +object CurrencySerializer : KSerializer { + override fun serialize(output: Encoder, obj: Currency) { + output.encodeString(obj.currencyCode) + } + + override fun deserialize(input: Decoder): Currency { + return input.decodeString().let { + Currency.getInstance(it) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt new file mode 100644 index 0000000000..d836470a82 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPrice + +interface Priced { + val prices: List +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt new file mode 100644 index 0000000000..b2084697f0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MaskPosition( + @SerialName(pointField) + val point: String, + @SerialName(xShiftField) + val xShift: Float, + @SerialName(yShiftField) + val yShift: Float, + @SerialName(scaleField) + val scale: Float +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt new file mode 100644 index 0000000000..19f8a48121 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Sticker +import kotlinx.serialization.* + +@Serializable +data class StickerSet( + @SerialName(nameField) + val name: String, + @SerialName(titleField) + val title: String, + @SerialName(stickersField) + val stickers: List, + @SerialName(containsMasksField) + @Optional + val containsMasks: Boolean = false +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt new file mode 100644 index 0000000000..2912b1afc0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class CallbackQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: CallbackQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt new file mode 100644 index 0000000000..3b5af5d8aa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class ChannelPostUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt new file mode 100644 index 0000000000..329bb77d24 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class ChosenInlineResultUpdate( + override val updateId: UpdateIdentifier, + override val data: ChosenInlineResult +) : Update \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt new file mode 100644 index 0000000000..621e5c8570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class EditChannelPostUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt new file mode 100644 index 0000000000..82414a2220 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class EditMessageUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt new file mode 100644 index 0000000000..a5b82a311d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class InlineQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: InlineQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt new file mode 100644 index 0000000000..c5779d9cca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class MessageUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt new file mode 100644 index 0000000000..70c22a4027 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class PreCheckoutQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: PreCheckoutQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt new file mode 100644 index 0000000000..63991bd96b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt @@ -0,0 +1,46 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.RawCallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult.RawChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query.RawInlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import com.github.insanusmokrassar.TelegramBotAPI.types.updateIdField +import kotlinx.serialization.* + +// TODO:: add ShippingQuery type +// TODO:: add PreCheckoutQuery type +@Serializable +data class RawUpdate constructor( + @SerialName(updateIdField) + val updateId: UpdateIdentifier, + @Optional private val message: RawMessage? = null, + @Optional private val edited_message: RawMessage? = null, + @Optional private val channel_post: RawMessage? = null, + @Optional private val edited_channel_post: RawMessage? = null, + @Optional private val inline_query: RawInlineQuery? = null, + @Optional private val chosen_inline_result: RawChosenInlineResult? = null, + @Optional private val callback_query: RawCallbackQuery? = null, + @Optional private val shipping_query: ShippingQuery? = null, + @Optional private val pre_checkout_query: PreCheckoutQuery? = null +) { + @Transient + val asUpdate: Update<*> by lazy { + when { + message != null -> MessageUpdate(updateId, message.asMessage) + edited_message != null -> EditMessageUpdate(updateId, edited_message.asMessage) + channel_post != null -> ChannelPostUpdate(updateId, channel_post.asMessage) + edited_channel_post != null -> EditChannelPostUpdate(updateId, edited_channel_post.asMessage) + + chosen_inline_result != null -> ChosenInlineResultUpdate(updateId, chosen_inline_result.asChosenInlineResult) + inline_query != null -> InlineQueryUpdate(updateId, inline_query.asInlineQuery) + callback_query != null -> CallbackQueryUpdate(updateId, callback_query.asCallbackQuery) + shipping_query != null -> ShippingQueryUpdate(updateId, shipping_query) + pre_checkout_query != null -> PreCheckoutQueryUpdate(updateId, pre_checkout_query) + else -> throw IllegalArgumentException("Unsupported type of update") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt new file mode 100644 index 0000000000..51143da3d8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class ShippingQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: ShippingQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt new file mode 100644 index 0000000000..147c4edea6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +interface BaseMessageUpdate : Update \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt new file mode 100644 index 0000000000..8b8029724c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier + +interface Update { + val updateId: UpdateIdentifier + val data: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt new file mode 100644 index 0000000000..792b70cf2a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt @@ -0,0 +1,47 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import kotlinx.serialization.* +import kotlinx.serialization.json.* + +@ImplicitReflectionSerializer +inline fun T.toJsonWithoutNulls(): JsonObject = toJson(serializerByValue(this)).withoutNulls() + +inline fun T.toJsonWithoutNulls(serializer: KSerializer): JsonObject = toJson(serializer).withoutNulls() + +inline fun T.toJson(serializer: KSerializer): JsonObject = JsonTreeMapper().writeTree( + this, + serializer +).jsonObject + +fun JsonArray.withoutNulls(): JsonArray { + return jsonArray { + forEach { + when (it) { + is JsonObject -> +it.withoutNulls() + is JsonArray -> +it.withoutNulls() + is JsonPrimitive -> +it + } + } + } +} + +fun JsonObject.withoutNulls(): JsonObject { + return json { + forEach { (k, v) -> + when (v) { + is JsonObject -> k to v.withoutNulls() + is JsonArray -> k to v.withoutNulls() + !is JsonNull -> k to v + } + } + } +} + +fun JsonObject.mapWithCommonValues(): Map = map { + (key, value) -> + key to when (value) { + is JsonPrimitive -> value.contentOrNull ?: value.booleanOrNull ?: value.doubleOrNull ?: value.floatOrNull ?: value.intOrNull + is JsonArray, is JsonObject -> value.toString() + is JsonNull -> null + } +}.toMap().mapNotNullValues() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt new file mode 100644 index 0000000000..dcef012a1b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +fun mapOfNotNull(vararg pairs: Pair): Map { + return HashMap().apply { + pairs.forEach { + (key, value) -> + value ?.also { + put(key, it) + } + } + } +} + +fun Map.mapNotNullValues(): Map = asSequence().mapNotNull { + it.value ?.let { value -> + it.key to value + } +}.toMap() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt new file mode 100644 index 0000000000..08a661542a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.Matrix + +fun row(block: RowBuilder.() -> Unit): List { + return RowBuilder().also(block).row +} + +fun MatrixBuilder.row(block: RowBuilder.() -> Unit) { + add(RowBuilder().also(block).row) +} + +fun matrix(block: MatrixBuilder.() -> Unit): Matrix { + return MatrixBuilder().also(block).matrix +} + +class RowBuilder { + private val mutRow: MutableList = ArrayList() + val row: List + get() = mutRow + + fun add(t: T) = mutRow.add(t) +} + +class MatrixBuilder { + private val mutMatrix: MutableList> = ArrayList() + val matrix: Matrix + get() = mutMatrix + + fun add(t: List) = mutMatrix.add(t) + operator fun plus(t: List) = add(t) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt new file mode 100644 index 0000000000..66644ff849 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt @@ -0,0 +1,131 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils.extensions + +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestException +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.requests.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.types.update.* +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import kotlinx.coroutines.* + +typealias UpdateReceiver = suspend Update.() -> Unit + +fun RequestsExecutor.startGettingOfUpdates( + requestsDelayMillis: Long = 1000, + scope: CoroutineScope = GlobalScope, + allowedUpdates: List? = null, + block: UpdateReceiver<*> +): Job { + return scope.launch { + var lastHandledUpdate: UpdateIdentifier = 0L + while (isActive) { + delay(requestsDelayMillis) + try { + val updates = execute( + GetUpdates( + lastHandledUpdate + 1, + allowed_updates = allowedUpdates + ) + ) + + for (rawUpdate in updates) { + try { + val update = rawUpdate.asUpdate + block(update) + lastHandledUpdate = update.updateId + } catch (e: Exception) { + // TODO:: add exception handling + e.printStackTrace() + break + } + } + } catch (e: Exception) { + // TODO:: add exception handling + e.printStackTrace() + } + } + } +} + +fun RequestsExecutor.startGettingOfUpdates( + messageCallback: UpdateReceiver? = null, + editedMessageCallback: UpdateReceiver? = null, + channelPostCallback: UpdateReceiver? = null, + editedChannelPostCallback: UpdateReceiver? = null, + chosenInlineResultCallback: UpdateReceiver? = null, + inlineQueryCallback: UpdateReceiver? = null, + callbackQueryCallback: UpdateReceiver? = null, + shippingQueryCallback: UpdateReceiver? = null, + preCheckoutQueryCallback: UpdateReceiver? = null, + requestsDelayMillis: Long = 1000, + scope: CoroutineScope = GlobalScope +): Job { + return startGettingOfUpdates( + requestsDelayMillis, + scope, + listOfNotNull( + messageCallback ?.let { UPDATE_MESSAGE }, + editedMessageCallback ?.let { UPDATE_EDITED_MESSAGE }, + channelPostCallback ?.let { UPDATE_CHANNEL_POST }, + editedChannelPostCallback ?.let { UPDATE_EDITED_CHANNEL_POST }, + chosenInlineResultCallback ?.let { UPDATE_CHOSEN_INLINE_RESULT }, + inlineQueryCallback ?.let { UPDATE_INLINE_QUERY }, + callbackQueryCallback ?.let { UPDATE_CALLBACK_QUERY }, + shippingQueryCallback ?.let { UPDATE_SHIPPING_QUERY }, + preCheckoutQueryCallback ?.let { UPDATE_PRE_CHECKOUT_QUERY } + ) + ) { + when (this) { + is MessageUpdate -> messageCallback ?.invoke(this) + is EditMessageUpdate -> editedMessageCallback ?.invoke(this) + is ChannelPostUpdate -> channelPostCallback ?.invoke(this) + is EditChannelPostUpdate -> editedChannelPostCallback ?.invoke(this) + is ChosenInlineResultUpdate -> chosenInlineResultCallback ?.invoke(this) + is InlineQueryUpdate -> inlineQueryCallback ?.invoke(this) + is CallbackQueryUpdate -> callbackQueryCallback ?.invoke(this) + is ShippingQueryUpdate -> shippingQueryCallback ?.invoke(this) + is PreCheckoutQueryUpdate -> preCheckoutQueryCallback ?.invoke(this) + } + } +} + +fun RequestsExecutor.executeAsync( + request: Request, + onFail: (suspend (ResponseParameters<*>) -> Unit)? = null, + scope: CoroutineScope = GlobalScope, + onSuccess: (suspend (T) -> Unit)? = null +): Job { + return scope.launch { + try { + val result = execute(request) + onSuccess ?.invoke(result) + } catch (e: RequestException) { + onFail ?.invoke(e.response) + } + } +} + +fun RequestsExecutor.executeAsync( + request: Request, + scope: CoroutineScope = GlobalScope +): Job { + return scope.async { execute(request) } +} + +suspend fun RequestsExecutor.executeUnsafe( + request: Request +): T? { + return try { + execute(request) + } catch (e: RequestException) { + null + } +}