1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-11-16 12:00:18 +00:00

Compare commits

..

155 Commits

Author SHA1 Message Date
2980b345a9 optimize imports 2020-01-23 04:23:06 +06:00
ca24416934 UpdatesFilter#unknownUpdateTypeCallback 2020-01-23 04:21:45 +06:00
c006b47429 fix in cashTag internal fun 2020-01-23 04:08:56 +06:00
8487ee1f31 fixes in calling of "asUpdate" 2020-01-23 04:01:24 +06:00
f4fe680cac UnknownCallbackQueryType 2020-01-23 03:59:59 +06:00
cf814fcecb update gradle.properties 2020-01-23 03:51:08 +06:00
a967b06d2e remove redundant line from changelog 2020-01-23 03:48:33 +06:00
83e5d40443 UnknownUpdate -> UnknownUpdateType, unknown types for messages and chats 2020-01-23 03:47:43 +06:00
a8ca45a4bd replace UnknownUpdate 2020-01-23 03:35:56 +06:00
961fa65415 UnknownUpdate 2020-01-23 03:31:56 +06:00
4182d66f6e cashtag entity type was added 2020-01-23 03:05:28 +06:00
971589fe99 start 0.22.2 2020-01-23 03:03:38 +06:00
257574324a Update README.md 2020-01-21 16:03:02 +06:00
cf3e372ca3 Added a cut for README 2020-01-21 16:01:53 +06:00
502a53fd62 fixes in new "asInputMedia" functions 2020-01-21 14:30:33 +06:00
353891eb37 Merge pull request #60 from InsanusMokrassar/0.22.1
0.22.1
2020-01-20 22:39:23 +06:00
5f593439a3 remove file link maker 2020-01-20 22:38:45 +06:00
f99873dd70 hotfix 2020-01-20 22:10:46 +06:00
d330cd2bfc hotfix 2020-01-20 20:14:52 +06:00
92224b95df PreviewFeature, message links 2020-01-20 16:35:36 +06:00
63e0f5c054 0.22.1 2020-01-20 14:42:38 +06:00
dd76e704a8 Update README.md 2020-01-17 08:29:22 +06:00
4845a61539 Update README.md 2020-01-17 08:24:38 +06:00
9dfb16f534 update publish scripts 2020-01-15 21:41:52 +06:00
50ae9ef955 Merge pull request #59 from InsanusMokrassar/0.22.0
0.22.0
2020-01-15 13:35:08 +06:00
f80bb18ca5 ResendableContent change fill in changelog 2020-01-15 13:30:28 +06:00
40eaffb8e3 EditChatMessage change fill in changelog 2020-01-15 13:27:29 +06:00
0c9f9f59c1 update changelog 0.22.0 type of title 2020-01-15 13:12:35 +06:00
12496f8261 make all serializers are internal 2020-01-15 13:03:42 +06:00
3fe7bd1382 AbleToBe -> Possibly and ForwardedMessage -> ForwardInfo 2020-01-15 12:52:52 +06:00
e3117f3679 migrate 0.21.1 -> 0.22.0 2020-01-15 12:31:17 +06:00
562459f0b7 update ktor 2020-01-15 12:28:06 +06:00
e98e61747c update README 2020-01-15 11:49:55 +06:00
e1082c3741 update README 2020-01-15 11:48:44 +06:00
3fa2071847 now most part of request have changed return types 2020-01-15 11:17:53 +06:00
4c60b8fd82 Merge branch 'master' into 0.21.1 2020-01-15 09:50:57 +06:00
cb30beaa31 one more fix for publishing 2020-01-13 23:21:57 +06:00
10df8cbc55 one more fix for publishing 2020-01-13 23:21:07 +06:00
4b66617db6 one more fix for publishing 2020-01-13 21:47:41 +06:00
9ddab0bf29 updates in publish script 2020-01-13 11:26:52 +06:00
e43d7350ed started 0.21.1 2020-01-08 12:11:57 +06:00
82129205fa add availability info about maven 2020-01-06 22:47:43 +06:00
034b30d65f update publishing scheme to be able to publish with signed artifacts 2020-01-06 22:44:31 +06:00
0d72c51448 Set theme jekyll-theme-cayman 2020-01-06 22:44:23 +06:00
fe11b088fc Update README.md 2020-01-05 21:39:04 +06:00
336f280b8a Update README.md 2020-01-05 21:30:17 +06:00
0f9e048274 Update README.md 2020-01-05 21:26:43 +06:00
f8b6073cd4 update compatibility info in README 2020-01-05 20:58:07 +06:00
0899a69762 update versions 2020-01-05 20:45:50 +06:00
031c61a872 Merge pull request #54 from InsanusMokrassar/0.21.0
0.21.0 TelegramBotAPI 4.5
2020-01-05 20:31:37 +06:00
33d8dcf977 update CHANGELOG 2020-01-05 20:30:42 +06:00
2f09504f08 fix in formatting of hashtag text 2020-01-05 20:28:44 +06:00
f4c11cacc6 fix in formatting of hashtag text 2020-01-05 20:18:05 +06:00
4ac01d5331 all fields in text sources are lazy 2020-01-05 20:07:51 +06:00
bb3ebb455e update CHANGELOG 2020-01-05 19:58:29 +06:00
7694b25d33 optimize imports 2020-01-05 19:51:32 +06:00
b095f07b9c add subcondition for adding subparts in raw message entities 2020-01-05 19:50:04 +06:00
72127ce133 rework in part of text message entities 2020-01-05 19:24:17 +06:00
398adf06ff Actualized work with pre type of text - now it is possible to use language for formatting of text 2020-01-03 00:27:24 +06:00
dbef69ffac fixed problem that usually string formatting did not trigger escaping of control characters 2020-01-03 00:04:49 +06:00
f68edebd24 RawMessageEntity will not throw exception 2020-01-02 23:58:16 +06:00
482d924070 refactor and preparing to multilevel message entities 2020-01-02 23:55:26 +06:00
e7495468a2 added support of strikethrough and underline 2020-01-02 23:10:39 +06:00
bba37d8889 all TelegramMediaFile instances now have field fileUniqueId, which represents file_unique_id field from API 2020-01-01 22:26:19 +06:00
198e15a937 now ChatPhoto have two additional fields: smallFileUniqueId and bigFileUniqueId 2020-01-01 22:20:08 +06:00
5ee472305c add restrictions check in SetChatAdministratorCustomTitle 2020-01-01 21:56:53 +06:00
47428dd6f9 now any administrator object instance have nullable field 2020-01-01 21:51:11 +06:00
b4e4bed622 added the new request SetChatAdministratorCustomTitle to manage the custom titles of administrators promoted by the bot. 2020-01-01 21:45:39 +06:00
4dd2a8437c added the field slowModeDelay to the ExtendedSupergroupChat objects 2020-01-01 21:38:05 +06:00
8b93922f82 starts 0.21.0 2020-01-01 21:28:00 +06:00
43b08e9319 Now setWebhook supports custom listen address even if certificate was not provided 2020-01-01 14:43:32 +06:00
62d474b7cc Merge pull request #52 from InsanusMokrassar/0.20.4
0.20.4
2020-01-01 14:34:07 +06:00
0066e814b3 a little reorder of arguments in setWebhook 2020-01-01 14:12:37 +06:00
ef7e94ba68 now setWebhook supports setting up of path for listening 2020-01-01 14:07:17 +06:00
27aba72a5a started 0.20.4 2020-01-01 14:06:03 +06:00
680e960037 [0.20.3] hotfix in LeftChatMember parents 2019-12-16 23:24:40 +06:00
ff47168fdc update build status place 2019-12-14 00:13:10 +06:00
a68c31f9d1 0.20.2 - MessageToEditNotFoundException 2019-12-13 23:55:06 +06:00
ac915b79f7 fix of exceptions catching 2019-12-13 23:54:02 +06:00
1659f6f909 a little fix 2019-12-13 23:36:31 +06:00
5249fb517f 0.20.2 - MessageIsNotModifierException 2019-12-13 23:34:58 +06:00
fdf45d7566 a little fix in changelog 2019-12-11 17:05:48 +06:00
dc93997b8c Merge pull request #48 from InsanusMokrassar/0.20.1
0.20.1
2019-12-11 17:05:12 +06:00
6dd701d33c TextSource analogues of MessageEntities 2019-12-11 14:06:09 +06:00
6f1f5e640a add TextSource 2019-12-11 13:49:17 +06:00
dd0e3c04bc fix of TextMentionMessageEntity#asHtmlSource 2019-12-11 10:53:41 +06:00
a17af67f83 User as PrivateChat 2019-12-11 10:18:12 +06:00
761e08afc6 start 0.20.1 2019-12-11 09:45:31 +06:00
a09af8870a optimize imports 2019-12-06 16:46:38 +06:00
0ef4341baf Merge pull request #46 from InsanusMokrassar/0.20.0
0.20.0
2019-12-06 16:28:29 +06:00
91d8fbb232 update README 2019-12-03 12:51:52 +06:00
0c1df47dbb add js target 2019-12-03 12:40:21 +06:00
b582adc3a0 change target version 2019-12-03 12:18:46 +06:00
7660102435 Merge pull request #45 from InsanusMokrassar/task/28-migration_to_mpp
Migration onto Kotlin Multiplatform
2019-12-03 12:17:45 +06:00
5dbfeca18f fix way how multipart messages are sending 2019-12-03 12:15:15 +06:00
f3fc0769ef migration 2019-12-03 11:07:25 +06:00
24d11d2c2b replace joda-time dependency by soywiz klock 2019-12-03 09:47:53 +06:00
498efc2ec3 Merge pull request #44 from InsanusMokrassar/0.19.0
0.19.0
2019-12-02 14:56:41 +06:00
21544013d9 ChatSerializers formatter extracting 2019-12-02 14:51:53 +06:00
e296c2ee00 third part of deprecations removing 2019-12-02 14:48:23 +06:00
ed60dc49e7 second part of deprecations removing 2019-12-02 14:44:23 +06:00
c1b5b3ca19 first part of deprecations removing 2019-12-02 14:39:19 +06:00
24498479a8 total rework of requests serialization 2019-12-02 14:35:37 +06:00
cb64f44ceb start 0.19.0 2019-12-02 13:52:22 +06:00
ba145d3ff8 Merge pull request #43 from InsanusMokrassar/0.18.1
0.18.1
2019-12-02 13:22:53 +06:00
f57bfb017f add BotAction test 2019-12-02 13:21:31 +06:00
8b36767435 added TelegramDate tests and fix in chat identifier functionality 2019-12-02 11:18:08 +06:00
91ab60d1f5 added tests for ParseMode 2019-12-02 11:05:15 +06:00
88208016d4 added ChatIdentifier tests 2019-12-02 10:56:59 +06:00
fec2ef8b30 update version of library 2019-11-29 12:32:06 +06:00
7bc06eae31 update incorrect info about ktor version 2019-11-29 12:26:31 +06:00
128e69e3e3 adapt code to new versions 2019-11-29 12:25:22 +06:00
6c5fc8144b update libraries 2019-11-29 12:19:24 +06:00
73f5bf7e4b Remove extraxtResult from KtorRequestsExecutor 2019-08-19 21:58:30 +06:00
17c10a2975 Merge pull request #41 from InsanusMokrassar/0.18.0
0.18.0
2019-08-19 16:14:54 +06:00
c6638f3102 change type of exception inside of serialization of message 2019-08-19 16:12:19 +06:00
f86ae2b592 Request extracting result method removed 2019-08-19 16:06:12 +06:00
84eb2fac7c small refactoring of KtorRequestsExecutor 2019-08-19 16:03:01 +06:00
bf8096ece2 optimize imports 2019-08-18 12:59:11 +06:00
2ee5d78362 TelegramFile was removed 2019-08-18 12:58:17 +06:00
704457715d RawGame added 2019-08-18 12:31:33 +06:00
44751d94b3 add for Game its own serializer and hide usage of RawMessageEntity 2019-08-18 00:18:13 +06:00
2530b85400 update changelog 2019-08-17 22:55:41 +06:00
49cbcea405 RawChosenInlineResult is internal 2019-08-17 22:51:51 +06:00
0312c57741 RawCallbackQuery is internal 2019-08-17 22:50:52 +06:00
e7af08142b RawInlineQuery is internal 2019-08-17 22:49:37 +06:00
3285b2812e RawMessageEntity is internal 2019-08-17 22:48:18 +06:00
402e1b12dc current raw tools are internal 2019-08-17 22:29:42 +06:00
41c5ba7309 RawChatMember is internal 2019-08-17 22:26:02 +06:00
617bccaa81 RawUpdate is internal 2019-08-17 22:08:36 +06:00
c7a8bc5c9d update description 2019-08-17 11:53:19 +06:00
56f36523db "RawMessage" usages replaced by "Message" usages 2019-08-17 11:50:46 +06:00
8330aa1b3d start 0.18.0 2019-08-17 11:32:39 +06:00
fc0dcae4be update of link to [not] include api 2019-08-14 10:55:17 +06:00
861254fe64 update README 2019-08-14 10:50:02 +06:00
790885fd0d Merge pull request #39 from InsanusMokrassar/0.17.0
0.17.0
2019-08-12 18:18:10 +06:00
a7e533d94e update ktor 2019-08-12 18:03:38 +06:00
7f7e82bbb0 bot command entity command extracting fix 2019-08-12 17:25:51 +06:00
647d1e79f7 ExtendedChat#chatPhoto now is nullable 2019-08-12 17:06:57 +06:00
9e469c7825 fixes in AbstractRequestCallFactory 2019-08-12 17:05:48 +06:00
7e61b77ffe optimize imports 2019-08-12 15:46:31 +06:00
1f62c8cf98 RawChat boilerplate was removed and replaced by serializers 2019-08-12 15:41:07 +06:00
d6bb14e342 total rework of chats 2019-08-12 15:15:22 +06:00
c47c82ac43 Group chats now have a description 2019-08-12 14:15:06 +06:00
8fbda09d24 chat members fields and restrict chat member request updates 2019-08-12 14:09:14 +06:00
6310dceacf allMembersAreAdmins was removed 2019-08-12 13:48:38 +06:00
394bec1805 chat permissions adding 2019-08-12 13:46:16 +06:00
cb94a3a389 Sticker and StickerSet now with isAnimated field 2019-08-12 13:25:55 +06:00
84ad751792 TelegramAPIUrlsKeeper 2019-07-25 16:25:18 +08:00
d8887bb7ff RequestsExecutor now is Closeable 2019-07-23 07:46:19 +08:00
4dba67979d update dependencies versions 2019-07-23 07:43:32 +08:00
8b6947231f "implementation" replaced by "api" in build gradle 2019-07-23 07:34:12 +08:00
76bbe2a064 start 0.17.0 2019-07-23 07:24:14 +08:00
26d001acce replace animation to be sure that it will be correctly invoked in case of document availability 2019-06-28 19:05:40 +08:00
46a4e7ea27 Merge pull request #38 from InsanusMokrassar/0.16.1
0.16.1
2019-06-28 19:00:50 +08:00
517 changed files with 3919 additions and 2001 deletions

View File

@@ -1,5 +1,252 @@
# TelegramBotAPI changelog
## 0.22.0
* **`KtorCallFactory` must return `HttpStatement` instead of `HttpClientCall`**
* `SendMessage` was renamed to `SendTextMessage` and previous `SendMessage` is deprecated
* All `AbleToBe*` interfaces was renamed to `Possibly*`
* `AbleToBeEditedMessage` -> `PossiblyEditedMessage`
* `AbleToBeForwardedMessage` -> `PossiblyForwardedMessage`
* `AbleToBeMarkedUp` -> `PossiblyMarkedUp`
* `AbleToBeEditedMessage` -> `PossiblyEditedMessage`
* `ForwardedMessage` type was renamed to `ForwardInfo`
* `AnonymousForwardedMessage` -> `AnonymousForwardInfo`
* `UserForwardedMessage` -> `UserForwardInfo`
* `ForwardedFromChannelMessage` -> `ForwardFromChannelInfo`
* `PossiblyForwardedMessage#forwarded` field now renamed to `forwardInfo`
* All serializers in library now are `internal`. **If you have used some of them or I have marked as internal by a
mistake - don't hesitate to say this.**
* `EditChatMessage` now have generic type and extends `SimpleRequest<ContentMessage<GenericType>>`
* `ResendableContent` now extends `Request<out Message>` instead of `Request<Message>`
* Most part of requests have changed return type. They are listed below:
<details>
* `ForwardMessage`
* `GetChatAdministrators`
* `EditChatMessageLiveLocation`
* `StopChatMessageLiveLocation`
* `EditChatMessageText`
* `EditChatMessageCaption`
* `EditChatMessageMedia`
* `EditChatMessageReplyMarkup`
* `SendAnimation`
* `SendAudio`
* `SendContact`
* `SendLocation`
* `SendTextMessage`
* `SendPoll`
* `SendVenue`
* `SendGame`
* `SendDocument`
* `SendMediaGroup`
* `SendPhoto`
* `SendVideo`
* `SendVideoNote`
* `SendVoice`
* `SendSticker`
</details>
* Changed type of `createResend`
<details>
* `GameContent`
* `LocationContent`
* `PollContent`
* `TextContent`
* `VenueContent`
* `AnimationContent`
* `AudioContent`
* `DocumentContent`
* `ContactContent`
* `PhotoContent`
* `VideoContent`
* `VideoNoteContent`
* `VoiceContent`
* `StickerContent`
</details>
* Version updates:
* Ktor `1.2.6` -> `1.3.0`
### 0.22.1 MediaContent#asInputMedia
* All `MediaContent` instances now can create their `InputMedia` analog
* New annotation `PreviewFeature` was added to mark new thing as preview for the time
while they can work incorrectly
* Added links utils:
* `makeLinkToMessage` have two signatures - for direct creating using username and for abstract creating using
chat id
### 0.22.2 CashTag and independent updates handling
* `cashtag` entity type was added
* Several `Unknown*` realizations was added:
* `UnknownUpdateType`
* `UnknownMessageType`
* `UnknownChatType`
* `UnknownCallbackQueryType`
* `UpdatesFilter` now have one additional income callback: `unknownUpdateTypeCallback`
* `createSimpleUpdateFilter` can receive one more callback: `unknownCallback` (for `unknownUpdateTypeCallback`)
## 0.21.0 TelegramBotAPI 4.5
* _**All `MessageEntity`'es now are replaced with `TextPart`**_
* Added support of strikethrough and underline
* Added `UnderlineTextSource`
* Added `StrikethroughTextSource`
* Added support in `RawMessageEntity`
* Added support of `MarkdownV2`
* Now will not be thrown exception when there is income unknown type of `RawMessageEntity`. Instead of this will be
created `RegularTextSource` with the same text
* Fixed problem that usually string formatting did not trigger escaping of control characters
* Actualized work with `pre` type of text - now it is possible to use `language` for formatting of text
* Removed constructor of `TextMentionTextSource`, which was deprecated previously
* All `TelegramMediaFile` instances now have field `fileUniqueId`, which represents `file_unique_id` field from API
* Now `ChatPhoto` have two additional fields: `smallFileUniqueId` and `bigFileUniqueId`
* Now any administrator object instance have `customTitle` nullable field
* Added the new request `SetChatAdministratorCustomTitle` to manage the custom titles of administrators promoted by the
bot.
* Added the field `slowModeDelay` to the `ExtendedSupergroupChat` objects.
* `CaptionedInput` now have extension `fullEntitiesList` which will return list of `TextPart` with `RegularSource`'s
* `TextPart` added - it will be used as part of some text and can be not related to telegram bot
* `MultilevelTextSource` was added - it is type of `TextSource`, which can have subsources as parts of this text
* In all `TextSource`s all fields now are lazy for avoiding of potential risk for performance issues
* Updates in versions:
* Coroutines `1.3.2` -> `1.3.3`
* Klock `1.8.0` -> `1.8.6`
* UUID `0.0.6` -> `0.0.7`
## 0.20.0 MPP Migration
* Time library change: `joda-time` -> `com.soywiz.korlibs.klock:klock`
* `Currencied` now using as `currency` value with type `String`
* For `Java` there is `Currencied#javaCurrency` extension function, which will give an old currency work way
* `User` now have no field `userLocale`
* For `Java` there is `User#javaLocale` extension function, which will give an old locale work way
### 0.20.1
* `User` now implement `PrivateChat`
* `TextMentionMessageEntity` now accept `PrivateChat` instead of `User` in main constructor
* `TextMentionMessageEntity` now contains not user, but contains `PrivateChat`
* Fixed: `TextMentionMessageEntity#asHtmlSource` previously worked incorrect
* Abstraction `TextSource`
* `MessageEntity` now extends `TextSource`
* `createFormattedText` method now accept `List<TextSource>`
* `createHtmlText` method now accept `List<TextSource>`
* `createMarkdownText` method now accept `List<TextSource>`
* A lot of `TextSource` implementors was added. More info [here](src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/textsources/)
* All `MessageEntity` implementations now are using new `TextSource` analogues as delegates
### 0.20.2
* New exception type `MessageIsNotModifierException` was added
* New exception type `MessageToEditNotFoundException` was added
* Now exceptions in requests will be caught correctly
### 0.20.3
* Now `LeftChatMamber` is a `CommonEvent`
### 0.20.4
* Now `setWebhook` supports setting up of path for listening
* Now `setWebhook` supports custom listen address even if certificate was not provided
## 0.19.0 ImplicitReflection removing
* Total rework of serialization for requests. Now all `SimpleRequest` children have:
* `requestSerializer` - field, which must provide serializer of current type
* `resultDeserializer` - field, which must provide opportunity to deserializer result. Previously it was a function
* Removed deprecations:
* `com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.WebhookPrivateKeyConfig`
* `com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.UpdatesFilter`
* `com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.createSimpleUpdateFilter`
* `com.github.insanusmokrassar.TelegramBotAPI.utils.createMarkdownText`
* `com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownCaption`
* `com.github.insanusmokrassar.TelegramBotAPI.utils.toMarkdownText`
* `com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.KtorUpdatesPoller`
* `com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent`
* `com.github.insanusmokrassar.TelegramBotAPI.types.message.CommonForwardedMessage`
* `com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.CaptionedInputMedia`
* `com.github.insanusmokrassar.TelegramBotAPI.types.games.Game#text`
* `com.github.insanusmokrassar.TelegramBotAPI.types.games.Game#textEntities`
* `com.github.insanusmokrassar.TelegramBotAPI.types.files.PathedFileKt.makeFileUrl`
* `com.github.insanusmokrassar.TelegramBotAPI.types.files.PathedFileKt.downloadingFilesBaseUrl`
* `com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.Data`
* `com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.ByInlineMessageId`
* `com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.ByMessageId`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.RequestException`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.exceptions.ReplyMessageNotFound`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.BaseRequestsExecutor#baseUrl`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.BaseRequestsExecutor#constructor(token, hostUrl)`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorRequestsExecutor#constructor(token, client, hostUrl, callsFactories, excludeDefaultFactories, requestsLimiter, jsonFormatter)`
* `com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorRequestsExecutor#constructor(token, engine, hostUrl)`
## 0.18.0 Raws cleaning
* Made internal and not available outside of library:
* `RawMessage`
* `RawUpdate`
* `RawChatMember`
* `RawMessageEntity`
* `RawInlineQuery`
* `RawCallbackQuery`
* `RawChosenInlineResult`
* All `RawMessage` usages was replaced with `Message` interface (with some of other raw classes was made the same things)
* `TelegramBotAPIMessageDeserializationStrategy` was created. It was used for deserialization of Telegram Bot API
incoming messages
* `TelegramBotAPIMessageDeserializeOnlySerializer` was created. It **MUST NOT** be used to serialize messages
* Update of description
* Make `Game` object a little bit more standartizated
* `Game` now is not serializable and have no additional trash, related to serialization
* `TelegramFile` was removed
### 0.18.1 Libraries update
* Update libraries:
* `kotlin`: 1.3.41 -> 1.3.61
* `kotlin coroutines`: 1.2.2 -> 1.3.2
* `kotlin serialization`: 0.11.1 -> 0.14.0
* `joda time`: 2.10.3 -> 2.10.5
* `ktor`: 1.2.3 -> 1.2.6
* `BotAction` now will be deserialized in a little bit other way
* `BotActionSerializer` now is internal
* Most part of serializers now are objects (instead of classes as was previously)
## 0.17.0 July 29, 2019 API Update
Libraries updates:
* Kotlin version `1.3.31` -> `1.3.41`
* Kotlin Coroutines version `1.2.1` -> `1.2.2`
* Kotlin Serialization version `0.11.0` -> `0.11.1`
* Joda Time version `2.10.1` -> `2.10.3`
* ktor version `1.1.4` -> `1.2.3`
Changes according to [July 29, 2019 Telegram Bot API update](https://core.telegram.org/bots/api#july-29-2019):
* `Sticker` and `StickerSet` now have field `isAnimated`
* `ChatPermissions` object was added, `GroupChat` interface got `permissions` field, request `SetChatPermissions` was added
* `GroupChat` object now have no field `allMembersAreAdmins`
* `SpecialRightsChatMember` was added for administrators and restricted members rights union, chat members abstractions
was replaced into `abstracts` package and available permissions was updated
* `RestrictChatMember` request now accept `permissions` object instead of separated permissions
* All `GroupChat` instances have description
Other important changes:
* Totally reworked chats hierarchy. `Extended` abstractions was added for cases when called `GetChat` request
* `RawChat` boilerplate was removed and replaced by serializers
* `BotCommandMessageEntity#command` will not contain `/`/`!` parts and also will cut outside of command begin token (`/`
or `!`) and username token (`@`) or end of command (any space character)
* `RequestsExecutor` now is `Closeable`
* `TelegramAPIUrlsKeeper` was added to provide more comfortable work with file urls and other things
like this
## 0.16.0 Bot API 4.3
* `LoginURL` and `LoginURLInlineKeyboardButton` has been added

View File

@@ -1,20 +1,20 @@
# TelegramBotAPI
[![Download](https://api.bintray.com/packages/insanusmokrassar/StandardRepository/TelegramBotAPI/images/download.svg) ](https://bintray.com/insanusmokrassar/StandardRepository/TelegramBotAPI/_latestVersion)
[![Build Status](https://jenkins.insanusmokrassar.space/buildStatus/icon?job=TelegramBotAPI_master__publishing)](https://jenkins.insanusmokrassar.space/job/TelegramBotAPI_master__publishing/)
[![Build Status](https://jenkins.insanusmokrassar.com/buildStatus/icon?job=TelegramBotAPI_master__publishing)](https://jenkins.insanusmokrassar.com/job/TelegramBotAPI_master__publishing/)
## 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).
Library for Object-Oriented and type-safe work with Telegram Bot API. Most part of some specific solves or unuseful
moments are describing by official [Telegram Bot API](https://core.telegram.org/bots/api).
## Compatibility
This version compatible with [31st of May 2019 update of TelegramBotAPI](https://core.telegram.org/bots/api#may-31-2019).
There is one exception of implemented functionality. It is Telegram Passport API, which was presented in
This version compatible with [31th of December 2019 update of TelegramBotAPI (version 4.5)](https://core.telegram.org/bots/api#december-31-2019).
There is Telegram Passport API exception of implemented functionality, which was presented in
[August 2018 update of TelegramBotAPI](https://core.telegram.org/bots/api#august-27-2018) update. It will be implemented
as soon as possible. All included and supported API can be found on
[wiki](https://github.com/InsanusMokrassar/TelegramBotAPI/wiki/Included-API).
as soon as possible. All APIs that are not included are presented
[wiki](https://github.com/InsanusMokrassar/TelegramBotAPI/wiki/Not-included-API).
## How to implement library?
@@ -25,8 +25,17 @@ like inserting of additional libraries (like `kotlin stdlib`). In the examples w
[![Download](https://api.bintray.com/packages/insanusmokrassar/StandardRepository/TelegramBotAPI/images/download.svg) ](https://bintray.com/insanusmokrassar/StandardRepository/TelegramBotAPI/_latestVersion)
Currently, last versions of library can be available from the Maven repository with errors (for the reason difficult in publishing
of signed artifacts in Bintray). You can:
* Use earlier version (available version you can find
[here](https://mvnrepository.com/artifact/com.github.insanusmokrassar/TelegramBotAPI))
* Add `jCenter` repository in build config
### Maven
Dependency config presented here:
```xml
<dependency>
<groupId>com.github.insanusmokrassar</groupId>
@@ -37,14 +46,20 @@ like inserting of additional libraries (like `kotlin stdlib`). In the examples w
### Gradle
To use last versions you will need to add one line in repositories block of your `build.gradle`:
`jcenter()` or `mavenCentral()`
And add next line to your dependencies block:
```groovy
implementation "com.github.insanusmokrassar:TelegramBotAPI:${telegrambotapi.version}"
implementation "com.github.insanusmokrassar:TelegramBotAPI:$telegrambotapi_version"
```
### Gradle (old)
or for old gradle:
```groovy
compile "com.github.insanusmokrassar:TelegramBotAPI:${telegrambotapi.version}"
compile "com.github.insanusmokrassar:TelegramBotAPI:$telegrambotapi_version"
```
## How to work with library?
@@ -52,9 +67,9 @@ compile "com.github.insanusmokrassar:TelegramBotAPI:${telegrambotapi.version}"
For now, this library have no some API god-object. Instead of this, this library has several
important objects:
* [RequestsExecutor](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt)
* [Requests](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests)
* [Types](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types)
* [RequestsExecutor](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt)
* [Requests](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests)
* [Types](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types)
### Types
@@ -81,8 +96,8 @@ val requestsExecutor: RequestsExecutor = ...
requestsExecutor.execute(GetMe())
```
The result type of [GetMe](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe) request is
[User](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User). In fact, in this result must contain
The result type of [GetMe](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt) request is
[User](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt). In fact, in this result must contain
`isBot` equal to `true` always.
@@ -140,7 +155,7 @@ Currently webhook method contains `UpdatesFilter` as necessary argument for gett
separate getting updates for media groups - they are accumulating with debounce in one second
(for being sure that all objects of media group was received).
Updates polling also support `UpdatesFilter` but you must not use it and can get updates directly
Updates polling also support `UpdatesFilter` but it is not required to use it and you can get updates directly
in `UpdateReceiver`, which you will provide to `startGettingOfUpdates` method
### Webhook set up
@@ -173,6 +188,6 @@ Here:
* `WEBHOOK_URL` - the url which will be used by Telegram system to send updates
* `INTERNAL_PORT` - the port which will be used in bot for listening of updates
* `filter` - instance of [UpdatesFilter](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/UpdatesFilter.kt),
* `filter` - instance of [UpdatesFilter](https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/updateshandlers/UpdatesFilter.kt),
which will be used to filter incoming updates
* `ENGINE_FACTORY` - used factory name, for example, `CIO` in case of usage `io.ktor:ktor-server-cio` as server engine

1
_config.yml Normal file
View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman

View File

@@ -1,6 +1,3 @@
project.version = "0.16.1"
project.group = "com.github.insanusmokrassar"
buildscript {
repositories {
mavenLocal()
@@ -15,9 +12,13 @@ buildscript {
}
}
apply plugin: 'java-library'
apply plugin: 'kotlin'
apply plugin: 'kotlinx-serialization'
plugins {
id "org.jetbrains.kotlin.multiplatform" version "$kotlin_version"
id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version"
}
project.version = "0.22.2"
project.group = "com.github.insanusmokrassar"
apply from: "publish.gradle"
@@ -28,21 +29,53 @@ repositories {
maven { url "https://kotlin.bintray.com/kotlinx" }
}
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"
kotlin {
jvm()
js()
implementation "io.ktor:ktor-client:$ktor_version"
implementation "io.ktor:ktor-client-cio:$ktor_version"
sourceSets {
commonMain {
dependencies {
implementation kotlin('stdlib')
api "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$kotlin_coroutines_version"
api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$kotlin_serialisation_runtime_version"
implementation "io.ktor:ktor-server:$ktor_version"
implementation "io.ktor:ktor-server-host-common:$ktor_version"
}
api "com.soywiz.korlibs.klock:klock:$klock_version"
api "com.benasher44:uuid:$uuid_version"
compileKotlin {
kotlinOptions {
freeCompilerArgs = [ disableImplicitReflectionSerializerAnnotation ]
api "io.ktor:ktor-client-core:$ktor_version"
}
}
commonTest {
dependencies {
implementation kotlin('test-common')
implementation kotlin('test-annotations-common')
}
}
jvmMain {
dependencies {
api "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlin_serialisation_runtime_version"
api "io.ktor:ktor-client:$ktor_version"
api "io.ktor:ktor-server:$ktor_version"
api "io.ktor:ktor-server-host-common:$ktor_version"
api "io.ktor:ktor-client-cio:$ktor_version"
}
}
jvmTest {
dependencies {
implementation kotlin('test-junit')
}
}
jsMain {
dependencies {
api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$kotlin_serialisation_runtime_version"
api "org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$kotlin_coroutines_version"
api "io.ktor:ktor-client-js:$ktor_version"
}
}
}
}

View File

@@ -1,13 +1,9 @@
kotlin.code.style=official
kotlin_version=1.3.31
kotlin_coroutines_version=1.2.1
kotlin_serialisation_runtime_version=0.11.0
joda_time_version=2.10.1
ktor_version=1.1.4
kotlin_version=1.3.61
kotlin_coroutines_version=1.3.3
kotlin_serialisation_runtime_version=0.14.0
klock_version=1.8.6
uuid_version=0.0.7
ktor_version=1.3.0
gradle_bintray_plugin_version=1.8.4
project_public_name=Telegram Bot API
project_public_description=It is one more project which wish to be useful and full Telegram Bots API bridge for Kotlin
disableImplicitReflectionSerializerAnnotation=-Xexperimental=kotlinx.serialization.ImplicitReflectionSerializer

View File

@@ -1,6 +1,6 @@
#Thu Feb 21 12:05:40 HKT 2019
#Fri Nov 29 12:11:00 HKT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip

View File

@@ -1,63 +1,57 @@
apply plugin: 'maven-publish'
apply plugin: 'signing'
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
}
task javadocJar(type: Jar) {
from javadoc
task javadocsJar(type: Jar) {
classifier = 'javadoc'
}
publishing {
publications {
maven(MavenPublication) {
from components.java
groupId "${project.group}"
artifactId "${project.name}"
version "${project.version}"
artifact sourcesJar
artifact javadocJar
pom.withXml {
asNode().children().last() + {
resolveStrategy = Closure.DELEGATE_FIRST
name "${project_public_name}"
description "${project_public_description}"
url "https://insanusmokrassar.github.io/${project.name}"
scm {
connection "scm:git:git://github.com/insanusmokrassar/${project.name}.git"
developerConnection "scm:git:[fetch=]https://github.com/insanusmokrassar/${project.name}.git[push=]ssh:git@github.com:insanusmokrassar/${project.name}.git"
url "https://github.com/insanusmokrassar/${project.name}"
}
developers {
developer {
id "InsanusMokrassar"
name "Ovsyannikov Alexey"
email "ovsyannikov.alexey95@gmail.com"
}
}
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/LICENSE'
distribution 'repo'
}
}
}
}
afterEvaluate {
project.publishing.publications.all {
// rename artifacts
groupId "${project.group}"
if (it.name.contains('kotlinMultiplatform')) {
artifactId = "${project.name}"
} else {
artifactId = "${project.name}-$name"
}
}
}
signing {
useGpgCmd()
sign publishing.publications.maven
}
publishing {
publications.all {
artifact javadocsJar
pom.withXml {
asNode().children().last() + {
resolveStrategy = Closure.DELEGATE_FIRST
description "Library for Object-Oriented and type-safe work with Telegram Bot API"
name "Telegram Bot API"
url "https://insanusmokrassar.github.io/TelegramBotAPI"
scm {
developerConnection "scm:git:[fetch=]https://github.com/insanusmokrassar/TelegramBotAPI.git[push=]https://github.com/insanusmokrassar/TelegramBotAPI.git"
url "https://github.com/insanusmokrassar/TelegramBotAPI.git"
}
developers {
developer {
id "InsanusMokrassar"
name "Ovsiannikov Aleksei"
email "ovsyannikov.alexey95@gmail.com"
}
}
licenses {
license {
name "Apache Software License 2.0"
url "https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/LICENSE"
}
}
}
}
}
}

View File

@@ -0,0 +1 @@
{"bintrayConfig":{"repo":"StandardRepository","packageName":"${project.name}","packageVcs":"https://github.com/InsanusMokrassar/TelegramBotAPI"},"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/TelegramBotAPI/blob/master/LICENSE"}],"mavenConfig":{"name":"Telegram Bot API","description":"Library for Object-Oriented and type-safe work with Telegram Bot API","url":"https://insanusmokrassar.github.io/TelegramBotAPI","vcsUrl":"https://github.com/insanusmokrassar/TelegramBotAPI.git","developers":[{"id":"InsanusMokrassar","name":"Ovsiannikov Aleksei","eMail":"ovsyannikov.alexey95@gmail.com"}]}}

View File

@@ -1,33 +1,55 @@
apply plugin: 'com.jfrog.bintray'
ext {
projectBintrayDir = "${project.group}/".replace(".", "/") + "${project.name}/${project.version}"
}
apply from: "maven.publish.gradle"
bintray {
user = project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER')
key = project.hasProperty('BINTRAY_KEY') ? project.property('BINTRAY_KEY') : System.getenv('BINTRAY_KEY')
publications = ["maven"]
filesSpec {
into "$projectBintrayDir"
from("build/libs") {
include "**/*.asc"
}
from("build/publications/maven") {
rename 'pom-default.xml(.*)', "${project.name}-${project.version}.pom\$1"
from "${buildDir}/publications/"
eachFile {
String directorySubname = it.getFile().parentFile.name
if (it.getName() == "module.json") {
if (directorySubname == "kotlinMultiplatform") {
it.setPath("${project.name}/${project.version}/${project.name}-${project.version}.module")
} else {
it.setPath("${project.name}-${directorySubname}/${project.version}/${project.name}-${directorySubname}-${project.version}.module")
}
} else {
if (directorySubname == "kotlinMultiplatform" && it.getName() == "pom-default.xml") {
it.setPath("${project.name}/${project.version}/${project.name}-${project.version}.pom")
} else {
it.exclude()
}
}
}
into "${project.group}".replace(".", "/")
}
pkg {
repo = 'StandardRepository'
repo = "StandardRepository"
name = "${project.name}"
vcsUrl = "https://github.com/InsanusMokrassar/${project.name}"
licenses = ['Apache-2.0']
vcsUrl = "https://github.com/InsanusMokrassar/TelegramBotAPI"
licenses = ["Apache-2.0"]
version {
name = "${project.version}"
released = new Date()
vcsTag = name
vcsTag = "${project.version}"
gpg {
sign = true
passphrase = project.hasProperty('signing.gnupg.passphrase') ? project.property('signing.gnupg.passphrase') : System.getenv('signing.gnupg.passphrase')
}
}
}
}
apply from: "maven.publish.gradle"
bintrayUpload.doFirst {
publications = publishing.publications.collect {
if (it.name.contains('kotlinMultiplatform')) {
null
} else {
it.name
}
} - null
}
bintrayUpload.dependsOn publishToMavenLocal

View File

@@ -1,18 +1 @@
/*
* 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'

View File

@@ -1,7 +1,7 @@
package com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts
import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode
import com.github.insanusmokrassar.TelegramBotAPI.utils.fullListOfSubSource
interface Captioned {
val caption: String?
@@ -12,5 +12,7 @@ interface CaptionedOutput : Captioned {
}
interface CaptionedInput : Captioned {
val captionEntities: List<MessageEntity>
val captionEntities: List<TextPart>
}
fun CaptionedInput.fullEntitiesList() = caption ?.fullListOfSubSource(captionEntities) ?.map { it.source } ?: emptyList()

View File

@@ -0,0 +1,17 @@
package com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts
interface TextSource {
val asMarkdownSource: String
val asMarkdownV2Source: String
val asHtmlSource: String
}
interface MultilevelTextSource : TextSource {
val textParts: List<TextPart>
}
data class TextPart(
val range: IntRange,
val source: TextSource
)

View File

@@ -0,0 +1,7 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot
import com.github.insanusmokrassar.TelegramBotAPI.utils.TelegramAPIUrlsKeeper
abstract class BaseRequestsExecutor(
protected val telegramAPIUrlsKeeper: TelegramAPIUrlsKeeper
) : RequestsExecutor

View File

@@ -2,12 +2,12 @@ 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
import io.ktor.client.statement.HttpStatement
interface KtorCallFactory {
suspend fun <T: Any> prepareCall(
client: HttpClient,
baseUrl: String,
request: Request<T>
) : HttpClientCall?
) : HttpStatement?
}

View File

@@ -9,32 +9,23 @@ import com.github.insanusmokrassar.TelegramBotAPI.bot.settings.limiters.RequestL
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
import com.github.insanusmokrassar.TelegramBotAPI.types.Response
import com.github.insanusmokrassar.TelegramBotAPI.types.RetryAfterError
import com.github.insanusmokrassar.TelegramBotAPI.utils.TelegramAPIUrlsKeeper
import io.ktor.client.HttpClient
import io.ktor.client.call.HttpClientCall
import io.ktor.client.engine.HttpClientEngine
import io.ktor.util.cio.toByteArray
import io.ktor.client.call.receive
import io.ktor.client.features.ClientRequestException
import io.ktor.client.statement.HttpStatement
import io.ktor.client.statement.readText
import kotlinx.coroutines.delay
import kotlinx.serialization.json.Json
class KtorRequestsExecutor(
token: String,
telegramAPIUrlsKeeper: TelegramAPIUrlsKeeper,
private val client: HttpClient = HttpClient(),
hostUrl: String = "https://api.telegram.org",
callsFactories: List<KtorCallFactory> = emptyList(),
excludeDefaultFactories: Boolean = false,
private val requestsLimiter: RequestLimiter = EmptyLimiter,
private val jsonFormatter: Json = Json.nonstrict
) : BaseRequestsExecutor(token, hostUrl) {
constructor(
token: String,
engine: HttpClientEngine? = null,
hostUrl: String = "https://api.telegram.org"
) : this(
token,
engine ?.let { HttpClient(engine) } ?: HttpClient(),
hostUrl
)
) : BaseRequestsExecutor(telegramAPIUrlsKeeper) {
private val callsFactories: List<KtorCallFactory> = callsFactories.run {
if (!excludeDefaultFactories) {
asSequence().plus(SimpleRequestCallFactory()).plus(MultipartRequestCallFactory()).toList()
@@ -45,36 +36,42 @@ class KtorRequestsExecutor(
override suspend fun <T : Any> execute(request: Request<T>): T {
return requestsLimiter.limit {
var call: HttpClientCall? = null
var statement: HttpStatement? = null
for (factory in callsFactories) {
call = factory.prepareCall(
statement = factory.prepareCall(
client,
baseUrl,
telegramAPIUrlsKeeper.commonAPIUrl,
request
)
if (call != null) {
if (statement != null) {
break
}
}
if (call == null) {
throw IllegalArgumentException("Can't execute request: $request")
}
val content = call.response.use {
it.content.toByteArray().toString(Charsets.UTF_8)
}
val responseObject = jsonFormatter.parse(
Response.serializer(request.resultSerializer()),
content
)
responseObject.result ?: responseObject.parameters ?.let {
val error = it.error
if (error is RetryAfterError) {
delay(error.leftToRetry)
execute(request)
} else {
null
}
} ?: call.let {
try {
val response = statement ?.execute() ?: throw IllegalArgumentException("Can't execute request: $request")
val content = response.receive<String>()
val responseObject = jsonFormatter.parse(Response.serializer(), content)
(responseObject.result?.let {
jsonFormatter.fromJson(request.resultDeserializer, it)
} ?: responseObject.parameters?.let {
val error = it.error
if (error is RetryAfterError) {
delay(error.leftToRetry)
execute(request)
} else {
null
}
} ?: response.let {
throw newRequestException(
responseObject,
content,
"Can't get result object from $content"
)
})
} catch (e: ClientRequestException) {
val content = e.response.readText()
val responseObject = jsonFormatter.parse(Response.serializer(), content)
throw newRequestException(
responseObject,
content,
@@ -83,4 +80,8 @@ class KtorRequestsExecutor(
}
}
}
override fun close() {
client.close()
}
}

View File

@@ -3,12 +3,11 @@ 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 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.client.request.*
import io.ktor.client.statement.HttpStatement
import io.ktor.http.ContentType
import io.ktor.http.HttpMethod
import kotlin.collections.set
abstract class AbstractRequestCallFactory : KtorCallFactory {
private val methodsCache: MutableMap<String, String> = mutableMapOf()
@@ -16,21 +15,23 @@ abstract class AbstractRequestCallFactory : KtorCallFactory {
client: HttpClient,
baseUrl: String,
request: Request<T>
): HttpClientCall? {
): HttpStatement? {
val preparedBody = prepareCallBody(client, baseUrl, request) ?: return null
return client.call {
url(
methodsCache[request.method()] ?: "$baseUrl/${request.method()}".also {
methodsCache[request.method()] = it
}
)
method = HttpMethod.Post
accept(ContentType.Application.Json)
return HttpStatement(
HttpRequestBuilder().apply {
url(
methodsCache[request.method()] ?: "$baseUrl/${request.method()}".also {
methodsCache[request.method()] = it
}
)
method = HttpMethod.Post
accept(ContentType.Application.Json)
body = preparedBody
build()
}
body = preparedBody
},
client
)
}
protected abstract fun <T : Any> prepareCallBody(

View File

@@ -20,14 +20,15 @@ class MultipartRequestCallFactory : AbstractRequestCallFactory() {
val params = castedRequest.paramsJson.mapWithCommonValues()
for ((key, value) in castedRequest.mediaMap + params) {
when (value) {
is MultipartFile -> append(
is MultipartFile -> appendInput(
key,
value.file.asInput(),
Headers.build {
append(HttpHeaders.ContentType, value.mimeType)
append(HttpHeaders.ContentDisposition, "filename=${value.fileId}")
}
)
) {
value.file.asInput()
}
is FileId -> append(key, value.fileId)
else -> append(key, value.toString())
}

View File

@@ -1,7 +1,6 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls
import io.ktor.client.HttpClient
import io.ktor.http.ContentType
import io.ktor.http.content.TextContent
@@ -12,12 +11,11 @@ class SimpleRequestCallFactory : AbstractRequestCallFactory() {
baseUrl: String,
request: Request<T>
): Any? = (request as? SimpleRequest<T>) ?.let { _ ->
val content = request.toJsonWithoutNulls(SimpleRequestSerializer).toString()
val content = request.json().toString()
TextContent(
content,
ContentType.Application.Json
)
}
}

View File

@@ -1,9 +1,11 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot
import com.github.insanusmokrassar.TelegramBotAPI.bot.exceptions.RequestException
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
import io.ktor.utils.io.core.Closeable
interface RequestsExecutor {
@Throws(RequestException::class)
interface RequestsExecutor : Closeable {
/**
* @throws com.github.insanusmokrassar.TelegramBotAPI.bot.exceptions.RequestException
*/
suspend fun <T : Any> execute(request: Request<T>): T
}

View File

@@ -1,7 +1,8 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot
import kotlinx.coroutines.*
import kotlinx.io.core.Closeable
import io.ktor.utils.io.core.Closeable
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
interface UpdatesPoller : Closeable {
fun start(scope: CoroutineScope = CoroutineScope(Dispatchers.Default))

View File

@@ -0,0 +1,43 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot.exceptions
import com.github.insanusmokrassar.TelegramBotAPI.types.Response
import kotlinx.io.IOException
fun newRequestException(
response: Response,
plainAnswer: String,
message: String? = null,
cause: Throwable? = null
) = response.description ?.let { description ->
when {
description == "Bad Request: reply message not found" -> ReplyMessageNotFoundException(response, plainAnswer, message, cause)
description == "Bad Request: message to edit not found" -> MessageToEditNotFoundException(response, plainAnswer, message, cause)
description.contains("Bad Request: message is not modified") -> MessageIsNotModifiedException(response, plainAnswer, message, cause)
description == "Unauthorized" -> UnauthorizedException(response, plainAnswer, message, cause)
else -> null
}
} ?: CommonRequestException(response, plainAnswer, message, cause)
sealed class RequestException constructor(
val response: Response,
val plainAnswer: String,
message: String? = null,
override val cause: Throwable? = null
) : IOException(
message ?: "Something went wrong"
)
class CommonRequestException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) :
RequestException(response, plainAnswer, message, cause)
class UnauthorizedException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) :
RequestException(response, plainAnswer, message, cause)
class ReplyMessageNotFoundException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) :
RequestException(response, plainAnswer, message, cause)
class MessageIsNotModifiedException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) :
RequestException(response, plainAnswer, message, cause)
class MessageToEditNotFoundException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) :
RequestException(response, plainAnswer, message, cause)

View File

@@ -1,9 +1,10 @@
package com.github.insanusmokrassar.TelegramBotAPI.bot.settings.limiters
import com.soywiz.klock.DateTime
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
private fun now(): Long = System.currentTimeMillis()
private fun now(): Long = DateTime.nowUnixLong()
class CommonLimiter(
private val lockCount: Int = 10,

View File

@@ -4,8 +4,8 @@ import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import java.util.concurrent.Executors
import kotlin.coroutines.*
import kotlin.math.pow
private sealed class RequestEvent
private class AddRequest(
@@ -21,9 +21,7 @@ data class PowLimiter(
private val powK: Double = 0.0016
) : RequestLimiter {
@Transient
private val scope = CoroutineScope(
Executors.newFixedThreadPool(3).asCoroutineDispatcher()
)
private val scope = CoroutineScope(Dispatchers.Default)
@Transient
private val eventsChannel = Channel<RequestEvent>(Channel.UNLIMITED)
@Transient
@@ -35,7 +33,7 @@ data class PowLimiter(
for (event in eventsChannel) {
when (event) {
is AddRequest -> {
val awaitTime = ((Math.pow(requestsInWork, powValue) * powK) * 1000L).toLong()
val awaitTime = (((requestsInWork.pow(powValue) * powK) * 1000L).toLong())
requestsInWork++
event.continuation.resume(

View File

@@ -15,5 +15,8 @@ data class DeleteMessage(
) : SimpleRequest<Boolean>, MessageAction {
override fun method(): String = "deleteMessage"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,9 +3,12 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.MessageAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.PossiblyForwardedMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
import kotlinx.serialization.*
private val AbleToBeForwardedMessageDeserializer = TelegramBotAPIMessageDeserializationStrategyClass<PossiblyForwardedMessage>()
@Serializable
data class ForwardMessage(
@SerialName(fromChatIdField)
@@ -16,12 +19,14 @@ data class ForwardMessage(
override val messageId: MessageIdentifier,
@SerialName(disableNotificationField)
val disableNotification: Boolean = false
): SimpleRequest<RawMessage>, MessageAction {
@Transient
): SimpleRequest<PossiblyForwardedMessage>, MessageAction {
override val chatId: ChatIdentifier
get() = fromChatId
override fun method(): String = "forwardMessage"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<PossiblyForwardedMessage>
get() = AbleToBeForwardedMessageDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -2,11 +2,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.User
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
class GetMe : SimpleRequest<User> {
override fun method(): String = "getMe"
override fun resultSerializer(): KSerializer<User> = User.serializer()
override val resultDeserializer: DeserializationStrategy<User>
get() = User.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,29 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.ALL_UPDATES_LIST
import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.UpdateSerializerWithoutDeserialization
import kotlinx.serialization.*
import kotlinx.serialization.internal.ArrayListSerializer
private val updatesListSerializer = ArrayListSerializer(
UpdateSerializerWithoutDeserialization
)
@Serializable
data class GetUpdates(
val offset: UpdateIdentifier? = null,// set `last update id + 1` to receive next part of updates
val limit: Int? = null,
val timeout: Int? = null,
val allowed_updates: List<String>? = ALL_UPDATES_LIST
): SimpleRequest<List<Update>> {
override fun method(): String = "getUpdates"
override val resultDeserializer: DeserializationStrategy<List<Update>>
get() = updatesListSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -18,5 +18,8 @@ data class StopPoll(
override val replyMarkup: InlineKeyboardMarkup? = null
) : MessageAction, SimpleRequest<Poll>, ReplyMarkup {
override fun method(): String = "stopPoll"
override fun resultSerializer(): KSerializer<Poll> = Poll.serializer()
override val resultDeserializer: DeserializationStrategy<Poll>
get() = Poll.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,7 +3,6 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.utils.StorageFile
import kotlinx.serialization.*
import kotlinx.serialization.internal.StringDescriptor
import java.io.File
@Serializable(InputFileSerializer::class)
sealed class InputFile {
@@ -22,7 +21,7 @@ data class FileId(
fun String.toInputFile(): InputFile = FileId(this)
@Serializer(InputFile::class)
object InputFileSerializer : KSerializer<InputFile> {
internal object InputFileSerializer : KSerializer<InputFile> {
override val descriptor: SerialDescriptor = StringDescriptor.withName(FileId::class.toString())
override fun serialize(encoder: Encoder, obj: InputFile) = encoder.encodeString(obj.fileId)
override fun deserialize(decoder: Decoder): FileId = FileId(decoder.decodeString())
@@ -40,7 +39,3 @@ data class MultipartFile (
) : InputFile() {
override val fileId: String = file.generateCustomName()
}
fun File.toInputFile(): InputFile = MultipartFile(
StorageFile(this)
)

View File

@@ -0,0 +1,8 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts
import kotlinx.serialization.DeserializationStrategy
interface Request<T: Any> {
fun method(): String
val resultDeserializer: DeserializationStrategy<T>
}

View File

@@ -0,0 +1,12 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.json.JsonObject
interface SimpleRequest<T: Any> : Request<T> {
val requestSerializer: SerializationStrategy<*>
}
@Suppress("UNCHECKED_CAST")
inline fun <T: Any, K: SimpleRequest<T>> K.json(): JsonObject = toJsonWithoutNulls(requestSerializer as SerializationStrategy<K>)

View File

@@ -20,7 +20,10 @@ data class AnswerCallbackQuery(
val cachedTimeSeconds: Int? = null
) : SimpleRequest<Boolean> {
override fun method(): String = "answerCallbackQuery"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
fun CallbackQuery.createAnswer(

View File

@@ -28,7 +28,10 @@ data class AnswerInlineQuery(
val switchPmParameter: String? = null
): SimpleRequest<Boolean> {
override fun method(): String = "answerInlineQuery"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
fun InlineQuery.createAnswer(
@@ -48,6 +51,6 @@ fun InlineQuery.createAnswer(
switchPmParameter
)
object InlineQueryAnswersResultsSerializer: KSerializer<List<InlineQueryResult>> by ArrayListSerializer(
internal object InlineQueryAnswersResultsSerializer: KSerializer<List<InlineQueryResult>> by ArrayListSerializer(
InlineQueryResultSerializer
)

View File

@@ -3,8 +3,7 @@ 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
import kotlinx.serialization.*
@Serializable
data class AnswerPreCheckoutQueryOk(
@@ -13,6 +12,8 @@ data class AnswerPreCheckoutQueryOk(
) : AnswerPreCheckoutQuery {
@SerialName(okField)
override val isOk: Boolean = true
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
@@ -25,6 +26,8 @@ data class AnswerPreCheckoutQueryError(
) : AnswerPreCheckoutQuery {
@SerialName(okField)
override val isOk: Boolean = false
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
fun PreCheckoutQuery.createAnswerOk(): AnswerPreCheckoutQueryOk = AnswerPreCheckoutQueryOk(

View File

@@ -17,9 +17,11 @@ data class AnswerShippingQueryOk(
) : AnswerShippingQuery {
@SerialName(okField)
override val isOk: Boolean = true
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
object ShippingOptionsSerializer : KSerializer<List<ShippingOption>> by ArrayListSerializer(
internal object ShippingOptionsSerializer : KSerializer<List<ShippingOption>> by ArrayListSerializer(
ShippingOption.serializer()
)
@@ -32,6 +34,8 @@ data class AnswerShippingQueryError(
) : AnswerShippingQuery {
@SerialName(okField)
override val isOk: Boolean = false
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}
fun ShippingQuery.createAnswerOk(

View File

@@ -3,11 +3,12 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abs
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.PreCheckoutQueryId
import kotlinx.serialization.KSerializer
import kotlinx.serialization.serializer
import kotlinx.serialization.internal.BooleanSerializer
interface AnswerPreCheckoutQuery : SimpleRequest<Boolean> {
override fun method(): String = "answerPreCheckoutQuery"
override fun resultSerializer(): KSerializer<Boolean> = Boolean.serializer()
override val resultDeserializer: KSerializer<Boolean>
get() = BooleanSerializer
val preCheckoutQueryId: PreCheckoutQueryId
val isOk: Boolean

View File

@@ -2,12 +2,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abs
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.ShippingQueryIdentifier
import kotlinx.serialization.KSerializer
import kotlinx.serialization.serializer
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.internal.BooleanSerializer
interface AnswerShippingQuery : SimpleRequest<Boolean> {
override fun method(): String = "answerShippingQuery"
override fun resultSerializer(): KSerializer<Boolean> = Boolean.serializer()
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
val shippingQueryId: ShippingQueryIdentifier
val isOk: Boolean

View File

@@ -13,5 +13,8 @@ data class ExportChatInviteLink(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<String> {
override fun method(): String = "exportChatInviteLink"
override fun resultSerializer(): KSerializer<String> = StringSerializer
override val resultDeserializer: DeserializationStrategy<String>
get() = StringSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -13,5 +13,8 @@ data class LeaveChat(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "leaveChat"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,7 +3,8 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.ChatRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier
import com.github.insanusmokrassar.TelegramBotAPI.types.chat.RawChat
import com.github.insanusmokrassar.TelegramBotAPI.types.chat.ExtendedChatSerializer
import com.github.insanusmokrassar.TelegramBotAPI.types.chat.abstracts.extended.ExtendedChat
import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField
import kotlinx.serialization.*
@@ -11,7 +12,10 @@ import kotlinx.serialization.*
data class GetChat(
@SerialName(chatIdField)
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<RawChat> {
): ChatRequest, SimpleRequest<ExtendedChat> {
override fun method(): String = "getChat"
override fun resultSerializer(): KSerializer<RawChat> = RawChat.serializer()
override val resultDeserializer: DeserializationStrategy<ExtendedChat>
get() = ExtendedChatSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,16 +3,24 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.ChatRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.abstracts.AdministratorChatMember
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.abstracts.AdministratorChatMemberSerializerWithoutDeserialization
import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField
import kotlinx.serialization.*
import kotlinx.serialization.internal.ArrayListSerializer
private val chatMembersListSerializer = ArrayListSerializer(
AdministratorChatMemberSerializerWithoutDeserialization
)
@Serializable
data class GetChatAdministrators(
@SerialName(chatIdField)
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<List<RawChatMember>> {
): ChatRequest, SimpleRequest<List<AdministratorChatMember>> {
override fun method(): String = "getChatAdministrators"
override fun resultSerializer(): KSerializer<List<RawChatMember>> = ArrayListSerializer(RawChatMember.serializer())
override val resultDeserializer: DeserializationStrategy<List<AdministratorChatMember>>
get() = chatMembersListSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -13,5 +13,8 @@ data class GetChatMembersCount(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<Int> {
override fun method(): String = "getChatMembersCount"
override fun resultSerializer(): KSerializer<Int> = IntSerializer
override val resultDeserializer: DeserializationStrategy<Int>
get() = IntSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -2,7 +2,8 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members
import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.abstracts.ChatMember
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.abstracts.ChatMemberDeserializationStrategy
import kotlinx.serialization.*
@Serializable
@@ -11,7 +12,10 @@ data class GetChatMember(
override val chatId: ChatIdentifier,
@SerialName(userIdField)
override val userId: UserId
) : ChatMemberRequest<RawChatMember> {
) : ChatMemberRequest<ChatMember> {
override fun method(): String = "getChatMember"
override fun resultSerializer(): KSerializer<RawChatMember> = RawChatMember.serializer()
override val resultDeserializer: DeserializationStrategy<ChatMember>
get() = ChatMemberDeserializationStrategy
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -16,5 +16,8 @@ data class KickChatMember(
override val untilDate: TelegramDate? = null
) : ChatMemberRequest<Boolean>, UntilDate {
override fun method(): String = "kickChatMember"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -32,5 +32,8 @@ data class PromoteChatMember(
private val canPromoteMembers: Boolean? = null
) : ChatMemberRequest<Boolean>, UntilDate {
override fun method(): String = "promoteChatMember"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,6 +3,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.UntilDate
import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.chat.ChatPermissions
import kotlinx.serialization.*
import kotlinx.serialization.internal.BooleanSerializer
@@ -14,15 +15,12 @@ data class RestrictChatMember(
override val userId: UserId,
@SerialName(untilDateField)
override val untilDate: TelegramDate? = null,
@SerialName(canSendMessagesField)
private val canSendMessages: Boolean? = null,
@SerialName(canSendMediaMessagesField)
private val canSendMediaMessages: Boolean? = null,
@SerialName(canSendOtherMessagesField)
private val canSendOtherMessages: Boolean? = null,
@SerialName(canAddWebPagePreviewsField)
private val canAddWebPagePreviews: Boolean? = null
@SerialName(permissionsField)
val permissions: ChatPermissions
) : ChatMemberRequest<Boolean>, UntilDate {
override fun method(): String = "restrictChatMember"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,33 @@
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
/**
* Representation of https://core.telegram.org/bots/api#setchatadministratorcustomtitle
*
* Please, remember about restrictions for characters in custom title
*/
@Serializable
data class SetChatAdministratorCustomTitle(
@SerialName(chatIdField)
override val chatId: ChatId,
@SerialName(userIdField)
override val userId: UserId,
@SerialName(customTitleField)
val customTitle: String
) : ChatMemberRequest<Boolean> {
override fun method(): String = "setChatAdministratorCustomTitle"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = RestrictChatMember.serializer()
init {
if (customTitle.length !in customTitleLength) {
throw IllegalArgumentException("Custom title length must be in range $customTitleLength, but was ${customTitle.length}")
}
}
}

View File

@@ -13,5 +13,8 @@ data class UnbanChatMember(
override val userId: UserId
) : ChatMemberRequest<Boolean> {
override fun method(): String = "unbanChatMember"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -13,5 +13,8 @@ data class DeleteChatPhoto(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "deleteChatPhoto"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -16,5 +16,8 @@ data class PinChatMessage (
override val disableNotification: Boolean = false
): ChatRequest, SimpleRequest<Boolean>, MessageAction, DisableNotification {
override fun method(): String = "pinChatMessage"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -20,5 +20,8 @@ data class SetChatDescription (
}
override fun method(): String = "setChatDescription"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,22 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.ChatRequest
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.chat.ChatPermissions
import kotlinx.serialization.*
import kotlinx.serialization.internal.BooleanSerializer
@Serializable
data class SetChatPermissions (
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(permissionsField)
val permissions: ChatPermissions
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "setChatPermissions"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -16,7 +16,8 @@ data class SetChatPhoto (
val photo: MultipartFile = throw IllegalArgumentException("Unfortunately, this type of objects can't be parsed automatically")
): ChatRequest, MultipartRequest<Boolean> {
override fun method(): String = "setChatPhoto"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val mediaMap: Map<String, MultipartFile> = mapOf(photoField to photo)
override val paramsJson: JsonObject = toJson(serializer())
}

View File

@@ -20,5 +20,8 @@ data class SetChatTitle (
}
override fun method(): String = "setChatTitle"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -13,5 +13,8 @@ data class UnpinChatMessage(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "unpinChatMessage"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -13,5 +13,8 @@ data class DeleteChatStickerSet(
override val chatId: ChatIdentifier
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "deleteChatStickerSet"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -11,8 +11,11 @@ data class SetChatStickerSet(
@SerialName(chatIdField)
override val chatId: ChatIdentifier,
@SerialName(stickerSetNameField)
val stickerSetName: String
val stickerSetName: StickerSetName
): ChatRequest, SimpleRequest<Boolean> {
override fun method(): String = "setChatStickerSet"
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -4,7 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.*
import kotlinx.serialization.json.JsonObject
data class CommonMultipartFileRequest<T: Any>(
val data: Request<T>,
val data: SimpleRequest<T>,
override val mediaMap: Map<String, MultipartFile>
) : MultipartRequest<T>, Request<T> by data {
override val paramsJson: JsonObject = data.json()

View File

@@ -3,9 +3,13 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
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.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.LocationContent
import kotlinx.serialization.*
private val commonResultDeserializer = TelegramBotAPIMessageDeserializationStrategyClass<ContentMessage<LocationContent>>()
@Serializable
data class EditChatMessageLiveLocation(
@SerialName(chatIdField)
@@ -18,7 +22,10 @@ data class EditChatMessageLiveLocation(
override val longitude: Double,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditReplyMessage, EditLocationMessage {
) : EditChatMessage<LocationContent>, EditReplyMessage, EditLocationMessage {
override fun method(): String = "editMessageLiveLocation"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<LocationContent>>
get() = commonResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,8 +3,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class EditInlineMessageLiveLocation(
@@ -18,4 +17,6 @@ data class EditInlineMessageLiveLocation(
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditInlineMessage, EditReplyMessage, EditLocationMessage {
override fun method(): String = "editMessageLiveLocation"
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -4,9 +4,13 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditCh
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage
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.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.LocationContent
import kotlinx.serialization.*
private val commonResultDeserializer = TelegramBotAPIMessageDeserializationStrategyClass<ContentMessage<LocationContent>>()
@Serializable
data class StopChatMessageLiveLocation(
@SerialName(chatIdField)
@@ -15,7 +19,10 @@ data class StopChatMessageLiveLocation(
override val messageId: MessageIdentifier,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditReplyMessage {
) : EditChatMessage<LocationContent>, EditReplyMessage {
override fun method(): String = "stopMessageLiveLocation"
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<LocationContent>>
get() = commonResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -4,8 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditIn
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class StopInlineMessageLiveLocation(
@@ -15,4 +14,6 @@ data class StopInlineMessageLiveLocation(
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditInlineMessage, EditReplyMessage {
override fun method(): String = "stopMessageLiveLocation"
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -4,11 +4,15 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditCh
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage
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.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent
import kotlinx.serialization.*
const val editMessageReplyMarkupMethod = "editMessageReplyMarkup"
private val commonResultDeserializer = TelegramBotAPIMessageDeserializationStrategyClass<ContentMessage<MessageContent>>()
@Serializable
data class EditChatMessageReplyMarkup(
@SerialName(chatIdField)
@@ -17,8 +21,11 @@ data class EditChatMessageReplyMarkup(
override val messageId: MessageIdentifier,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditReplyMessage {
) : EditChatMessage<MessageContent>, EditReplyMessage {
override fun method(): String = editMessageReplyMarkupMethod
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<MessageContent>>
get() = commonResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -4,8 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditIn
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class EditInlineMessageReplyMarkup(
@@ -15,4 +14,6 @@ data class EditInlineMessageReplyMarkup(
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditInlineMessage, EditReplyMessage {
override fun method(): String = editMessageReplyMarkupMethod
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -2,6 +2,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.MessageAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent
interface EditChatMessage : SimpleRequest<RawMessage>, MessageAction
interface EditChatMessage<MT: MessageContent> : SimpleRequest<ContentMessage<MT>>, MessageAction

View File

@@ -2,10 +2,11 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest
import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier
import kotlinx.serialization.KSerializer
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.internal.BooleanSerializer
interface EditInlineMessage : SimpleRequest<Boolean> {
val inlineMessageId: InlineMessageIdentifier
override fun resultSerializer(): KSerializer<Boolean> = BooleanSerializer
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = BooleanSerializer
}

View File

@@ -1,11 +1,13 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.caption
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.MediaContentMessageResultDeserializer
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.types.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent
import kotlinx.serialization.*
const val editMessageCaptionMethod = "editMessageCaption"
@@ -22,8 +24,11 @@ data class EditChatMessageCaption(
override val parseMode: ParseMode? = null,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditTextChatMessage, EditReplyMessage {
) : EditChatMessage<MediaContent>, EditTextChatMessage, EditReplyMessage {
override fun method(): String = editMessageCaptionMethod
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<MediaContent>>
get() = MediaContentMessageResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -5,8 +5,7 @@ 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 kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class EditInlineMessageCaption(
@@ -20,4 +19,6 @@ data class EditInlineMessageCaption(
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditInlineMessage, EditTextChatMessage, EditReplyMessage {
override fun method(): String = editMessageCaptionMethod
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -5,11 +5,15 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent
import kotlinx.serialization.*
const val editMessageMediaMethod = "editMessageMedia"
internal val MediaContentMessageResultDeserializer = TelegramBotAPIMessageDeserializationStrategyClass<ContentMessage<MediaContent>>()
@Serializable
data class EditChatMessageMedia(
@SerialName(chatIdField)
@@ -20,7 +24,7 @@ data class EditChatMessageMedia(
override val media: InputMedia,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditReplyMessage, EditMediaMessage {
) : EditChatMessage<MediaContent>, EditReplyMessage, EditMediaMessage {
init {
if (media.file is MultipartFile) {
@@ -29,5 +33,8 @@ data class EditChatMessageMedia(
}
override fun method(): String = editMessageMediaMethod
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<MediaContent>>
get() = MediaContentMessageResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -5,8 +5,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia
import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class EditInlineMessageMedia(
@@ -23,6 +22,8 @@ data class EditInlineMessageMedia(
throw IllegalArgumentException("For editing of media messages you MUST use file id (according to documentation)")
}
}
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
override fun method(): String = editMessageMediaMethod
}

View File

@@ -1,11 +1,13 @@
package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text
import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.TextContentMessageResultDeserializer
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.types.message.abstracts.ContentMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent
import kotlinx.serialization.*
const val editMessageTextMethod = "editMessageText"
@@ -24,8 +26,11 @@ data class EditChatMessageText(
override val disableWebPagePreview: Boolean? = null,
@SerialName(replyMarkupField)
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditChatMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage {
) : EditChatMessage<TextContent>, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage {
override fun method(): String = editMessageTextMethod
override fun resultSerializer(): KSerializer<RawMessage> = RawMessage.serializer()
override val resultDeserializer: DeserializationStrategy<ContentMessage<TextContent>>
get() = TextContentMessageResultDeserializer
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -6,8 +6,7 @@ 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 kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class EditInlineMessageText(
@@ -23,4 +22,6 @@ data class EditInlineMessageText(
override val replyMarkup: InlineKeyboardMarkup? = null
) : EditInlineMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage {
override fun method(): String = editMessageMediaMethod
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,8 +3,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.games
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.MessageAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class GetGameHighScoresByChat (
@@ -14,4 +13,7 @@ data class GetGameHighScoresByChat (
override val chatId: ChatId,
@SerialName(messageIdField)
override val messageId: MessageIdentifier
) : GetGameHighScores, MessageAction
) : GetGameHighScores, MessageAction {
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,8 +3,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.games
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.InlineMessageAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class GetGameHighScoresByInlineMessageId (
@@ -12,4 +11,7 @@ data class GetGameHighScoresByInlineMessageId (
override val userId: UserId,
@SerialName(inlineMessageIdField)
override val inlineMessageId: InlineMessageIdentifier
) : GetGameHighScores, InlineMessageAction
) : GetGameHighScores, InlineMessageAction {
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -3,8 +3,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests.games
import com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts.types.MessageAction
import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.SetGameScore
import com.github.insanusmokrassar.TelegramBotAPI.types.*
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.*
@Serializable
data class SetGameScoreByChatId (
@@ -20,4 +19,7 @@ data class SetGameScoreByChatId (
override val force: Boolean = false,
@SerialName(disableEditMessageField)
override val disableEditMessage: Boolean = false
) : SetGameScore, MessageAction
) : SetGameScore, MessageAction {
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

Some files were not shown because too many files have changed in this diff Show More