Skip to content

Commit bb74f22

Browse files
authored
bot api 9.6 (#319)
* bot api 9.6 * fix tests * fix tests
1 parent cd2935d commit bb74f22

8 files changed

Lines changed: 109 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* feat: Bot API 9.6
6+
* fix(types): add the missing `date_time` message entity kind
7+
38
## 0.48.0 (2026-03-05)
49

510
* feat: Bot API 9.5 - [#317](https://github.com/ayrat555/frankenstein/pull/317)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Telegram bot API client for Rust.
66

7-
It's a complete wrapper for Telegram bot API, and it's up-to-date with version 9.5 of the API.
7+
It's a complete wrapper for Telegram bot API, and it's up-to-date with version 9.6 of the API.
88

99
Frankenstein's data structures (Rust structs and enums) are mapped one-to-one from Telegram bot API types and method parameters.
1010

src/inline_mode.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,3 +516,9 @@ pub struct PreparedInlineMessage {
516516
pub id: String,
517517
pub expiration_date: u64,
518518
}
519+
520+
#[apply(apistruct!)]
521+
#[derive(Eq)]
522+
pub struct PreparedKeyboardButton {
523+
pub id: String,
524+
}

src/methods.rs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use crate::payments::{LabeledPrice, ShippingOption};
1313
use crate::stickers::{InputSticker, MaskPosition, StickerFormat, StickerType};
1414
use crate::types::{
1515
AllowedUpdate, BotCommand, BotCommandScope, ChatAction, ChatAdministratorRights, ChatId,
16-
ChatPermissions, InlineKeyboardMarkup, InputChecklist, InputPollOption, LinkPreviewOptions,
17-
MenuButton, MessageEntity, PollType, ReactionType, ReplyMarkup, ReplyParameters, StoryArea,
18-
SuggestedPostParameters,
16+
ChatPermissions, InlineKeyboardMarkup, InputChecklist, InputPollOption, KeyboardButton,
17+
LinkPreviewOptions, MenuButton, MessageEntity, PollType, ReactionType, ReplyMarkup,
18+
ReplyParameters, StoryArea, SuggestedPostParameters,
1919
};
2020

2121
#[apply(apistruct!)]
@@ -441,13 +441,20 @@ pub struct SendPollParams {
441441
#[serde(rename = "type")]
442442
pub type_field: Option<PollType>,
443443
pub allows_multiple_answers: Option<bool>,
444-
pub correct_option_id: Option<u8>,
444+
pub allows_revoting: Option<bool>,
445+
pub shuffle_options: Option<bool>,
446+
pub allow_adding_options: Option<bool>,
447+
pub hide_results_until_closes: Option<bool>,
448+
pub correct_option_ids: Option<Vec<u8>>,
445449
pub explanation: Option<String>,
446450
pub explanation_parse_mode: Option<ParseMode>,
447451
pub explanation_entities: Option<Vec<MessageEntity>>,
448452
pub open_period: Option<u32>,
449453
pub close_date: Option<u64>,
450454
pub is_closed: Option<bool>,
455+
pub description: Option<String>,
456+
pub description_parse_mode: Option<ParseMode>,
457+
pub description_entities: Option<Vec<MessageEntity>>,
451458
pub disable_notification: Option<bool>,
452459
pub protect_content: Option<bool>,
453460
pub allow_paid_broadcast: Option<bool>,
@@ -531,6 +538,18 @@ pub struct GetUserProfileAudiosParams {
531538
pub limit: Option<u32>,
532539
}
533540

541+
#[apply(apistruct!)]
542+
#[derive(Eq)]
543+
pub struct GetManagedBotTokenParams {
544+
pub user_id: u64,
545+
}
546+
547+
#[apply(apistruct!)]
548+
#[derive(Eq)]
549+
pub struct ReplaceManagedBotTokenParams {
550+
pub user_id: u64,
551+
}
552+
534553
#[apply(apistruct!)]
535554
#[derive(Eq)]
536555
pub struct SetUserEmojiStatusParams {
@@ -1591,6 +1610,13 @@ pub struct SavePreparedInlineMessageParams {
15911610
pub allow_channel_chats: Option<bool>,
15921611
}
15931612

1613+
#[apply(apistruct!)]
1614+
#[derive(Eq)]
1615+
pub struct SavePreparedKeyboardButtonParams {
1616+
pub user_id: u64,
1617+
pub button: KeyboardButton,
1618+
}
1619+
15941620
#[apply(apistruct!)]
15951621
#[derive(Eq)]
15961622
pub struct SetChatMenuButtonParams {

src/trait_async.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::path::PathBuf;
22

33
use crate::games::GameHighScore;
44
use crate::gifts::{Gifts, OwnedGifts};
5-
use crate::inline_mode::{PreparedInlineMessage, SentWebAppMessage};
5+
use crate::inline_mode::{PreparedInlineMessage, PreparedKeyboardButton, SentWebAppMessage};
66
use crate::input_file::HasInputFile;
77
use crate::input_media::{InputMedia, InputProfilePhoto, InputStoryContent, MediaGroupInputMedia};
88
use crate::payments::{StarAmount, StarTransactions};
@@ -159,6 +159,8 @@ where
159159
request!(setMessageReaction, bool);
160160
request!(getUserProfilePhotos, UserProfilePhotos);
161161
request!(getUserProfileAudios, UserProfileAudios);
162+
request!(getManagedBotToken, String);
163+
request!(replaceManagedBotToken, String);
162164
request!(setUserEmojiStatus, bool);
163165
request!(getFile, File);
164166
request!(banChatMember, bool);
@@ -482,6 +484,7 @@ where
482484
request!(getMyDefaultAdministratorRights, ChatAdministratorRights);
483485
request!(answerWebAppQuery, SentWebAppMessage);
484486
request!(savePreparedInlineMessage, PreparedInlineMessage);
487+
request!(savePreparedKeyboardButton, PreparedKeyboardButton);
485488
request!(setChatMenuButton, bool);
486489
request!(getChatMenuButton, MenuButton);
487490
request!(unpinAllGeneralForumTopicMessages, bool);

src/trait_sync.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::path::PathBuf;
22

33
use crate::games::GameHighScore;
44
use crate::gifts::{Gifts, OwnedGifts};
5-
use crate::inline_mode::{PreparedInlineMessage, SentWebAppMessage};
5+
use crate::inline_mode::{PreparedInlineMessage, PreparedKeyboardButton, SentWebAppMessage};
66
use crate::input_file::HasInputFile;
77
use crate::input_media::{InputMedia, InputProfilePhoto, InputStoryContent, MediaGroupInputMedia};
88
use crate::payments::{StarAmount, StarTransactions};
@@ -149,6 +149,8 @@ pub trait TelegramApi {
149149
request!(setMessageReaction, bool);
150150
request!(getUserProfilePhotos, UserProfilePhotos);
151151
request!(getUserProfileAudios, UserProfileAudios);
152+
request!(getManagedBotToken, String);
153+
request!(replaceManagedBotToken, String);
152154
request!(setUserEmojiStatus, bool);
153155
request!(getFile, File);
154156
request!(banChatMember, bool);
@@ -465,6 +467,7 @@ pub trait TelegramApi {
465467
request!(getMyDefaultAdministratorRights, ChatAdministratorRights);
466468
request!(answerWebAppQuery, SentWebAppMessage);
467469
request!(savePreparedInlineMessage, PreparedInlineMessage);
470+
request!(savePreparedKeyboardButton, PreparedKeyboardButton);
468471
request!(setChatMenuButton, bool);
469472
request!(getChatMenuButton, MenuButton);
470473
request!(unpinAllGeneralForumTopicMessages, bool);

src/types.rs

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub struct ReplyParameters {
104104
pub quote_entities: Option<Vec<MessageEntity>>,
105105
pub quote_position: Option<u32>,
106106
pub checklist_task_id: Option<i64>,
107+
pub poll_option_id: Option<String>,
107108
}
108109

109110
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
@@ -146,6 +147,7 @@ pub enum MessageEntityType {
146147
TextLink,
147148
TextMention,
148149
CustomEmoji,
150+
DateTime,
149151
Blockquote,
150152
ExpandableBlockquote,
151153
#[serde(other)]
@@ -327,6 +329,7 @@ pub enum AllowedUpdate {
327329
ChatJoinRequest,
328330
ChatBoost,
329331
RemovedChatBoost,
332+
ManagedBot,
330333
}
331334

332335
#[apply(apistruct!)]
@@ -347,6 +350,7 @@ pub struct User {
347350
pub has_main_web_app: Option<bool>,
348351
pub has_topics_enabled: Option<bool>,
349352
pub allows_users_to_create_topics: Option<bool>,
353+
pub can_manage_bots: Option<bool>,
350354
}
351355

352356
#[apply(apistruct!)]
@@ -440,6 +444,7 @@ pub struct Message {
440444
pub quote: Option<Box<TextQuote>>,
441445
pub reply_to_story: Option<Box<Story>>,
442446
pub reply_to_checklist_task_id: Option<i64>,
447+
pub reply_to_poll_option_id: Option<String>,
443448
pub via_bot: Option<Box<User>>,
444449
pub edit_date: Option<u64>,
445450
pub has_protected_content: Option<bool>,
@@ -514,10 +519,13 @@ pub struct Message {
514519
pub giveaway: Option<Giveaway>,
515520
pub giveaway_winners: Option<GiveawayWinners>,
516521
pub giveaway_completed: Option<GiveawayCompleted>,
522+
pub managed_bot_created: Option<Box<ManagedBotCreated>>,
517523
pub paid_message_price_changed: Option<PaidMessagePriceChanged>,
518524
pub suggested_post_approved: Option<Box<SuggestedPostApproved>>,
519525
pub suggested_post_approval_failed: Option<Box<SuggestedPostApprovalFailed>>,
520526
pub suggested_post_declined: Option<Box<SuggestedPostDeclined>>,
527+
pub poll_option_added: Option<Box<PollOptionAdded>>,
528+
pub poll_option_deleted: Option<Box<PollOptionDeleted>>,
521529
pub suggested_post_paid: Option<Box<SuggestedPostPaid>>,
522530
pub suggested_post_refunded: Option<Box<SuggestedPostRefunded>>,
523531
pub video_chat_scheduled: Option<Box<VideoChatScheduled>>,
@@ -795,9 +803,13 @@ pub struct Dice {
795803
#[apply(apistruct!)]
796804
#[derive(Eq)]
797805
pub struct PollOption {
806+
pub persistent_id: Option<String>,
798807
pub text: String,
799808
pub text_entities: Option<Vec<MessageEntity>>,
800809
pub voter_count: u32,
810+
pub added_by_user: Option<User>,
811+
pub added_by_chat: Option<Box<Chat>>,
812+
pub addition_date: Option<u32>,
801813
}
802814

803815
#[apply(apistruct!)]
@@ -815,6 +827,7 @@ pub struct PollAnswer {
815827
pub voter_chat: Option<Chat>,
816828
pub user: Option<Box<User>>,
817829
pub option_ids: Vec<u8>,
830+
pub option_persistent_ids: Vec<String>,
818831
}
819832

820833
#[apply(apistruct!)]
@@ -829,12 +842,15 @@ pub struct Poll {
829842
pub is_anonymous: bool,
830843
#[serde(rename = "type")]
831844
pub type_field: PollType,
832-
pub allows_multiple_answers: bool,
833-
pub correct_option_id: Option<u8>,
845+
pub allows_multiple_answers: Option<bool>,
846+
pub allows_revoting: Option<bool>,
847+
pub correct_option_ids: Option<Vec<u8>>,
834848
pub explanation: Option<String>,
835849
pub explanation_entities: Option<Vec<MessageEntity>>,
836850
pub open_period: Option<u32>,
837851
pub close_date: Option<u64>,
852+
pub description: Option<String>,
853+
pub description_entities: Option<Vec<MessageEntity>>,
838854
}
839855

840856
#[apply(apistruct!)]
@@ -1124,6 +1140,7 @@ pub struct KeyboardButton {
11241140
pub icon_custom_emoji_id: Option<String>,
11251141
pub request_users: Option<KeyboardButtonRequestUsers>,
11261142
pub request_chat: Option<KeyboardButtonRequestChat>,
1143+
pub request_managed_bot: Option<KeyboardButtonRequestManagedBot>,
11271144
pub request_contact: Option<bool>,
11281145
pub request_location: Option<bool>,
11291146
pub request_poll: Option<KeyboardButtonPollType>,
@@ -1159,6 +1176,14 @@ pub struct KeyboardButtonRequestChat {
11591176
pub request_photo: Option<bool>,
11601177
}
11611178

1179+
#[apply(apistruct!)]
1180+
#[derive(Eq)]
1181+
pub struct KeyboardButtonRequestManagedBot {
1182+
pub request_id: i32,
1183+
pub suggested_name: Option<String>,
1184+
pub suggested_username: Option<String>,
1185+
}
1186+
11621187
#[apply(apistruct!)]
11631188
#[derive(Copy, Eq)]
11641189
pub struct KeyboardButtonPollType {
@@ -1786,6 +1811,35 @@ pub struct InaccessibleMessage {
17861811
pub date: u64,
17871812
}
17881813

1814+
#[apply(apistruct!)]
1815+
#[derive(Eq)]
1816+
pub struct ManagedBotCreated {
1817+
pub bot: User,
1818+
}
1819+
1820+
#[apply(apistruct!)]
1821+
#[derive(Eq)]
1822+
pub struct ManagedBotUpdated {
1823+
pub user: User,
1824+
pub bot: User,
1825+
}
1826+
1827+
#[apply(apistruct!)]
1828+
pub struct PollOptionAdded {
1829+
pub poll_message: Option<MaybeInaccessibleMessage>,
1830+
pub option_persistent_id: String,
1831+
pub option_text: String,
1832+
pub option_text_entities: Option<Vec<MessageEntity>>,
1833+
}
1834+
1835+
#[apply(apistruct!)]
1836+
pub struct PollOptionDeleted {
1837+
pub poll_message: Option<MaybeInaccessibleMessage>,
1838+
pub option_persistent_id: String,
1839+
pub option_text: String,
1840+
pub option_text_entities: Option<Vec<MessageEntity>>,
1841+
}
1842+
17891843
#[cfg(test)]
17901844
mod serde_tests {
17911845
use super::*;

src/updates.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use crate::macros::{apistruct, apply};
77
use crate::payments::{PaidMediaPurchased, PreCheckoutQuery, ShippingQuery};
88
use crate::types::{
99
AllowedUpdate, BusinessConnection, BusinessMessagesDeleted, CallbackQuery, ChatBoostRemoved,
10-
ChatBoostUpdated, ChatJoinRequest, ChatMemberUpdated, Message, MessageReactionCountUpdated,
11-
MessageReactionUpdated, Poll, PollAnswer,
10+
ChatBoostUpdated, ChatJoinRequest, ChatMemberUpdated, ManagedBotUpdated, Message,
11+
MessageReactionCountUpdated, MessageReactionUpdated, Poll, PollAnswer,
1212
};
1313

1414
/// Represents an incoming update from telegram.
@@ -49,6 +49,7 @@ pub enum UpdateContent {
4949
ChatBoost(ChatBoostUpdated),
5050
RemovedChatBoost(ChatBoostRemoved),
5151
PurchasedPaidMedia(PaidMediaPurchased),
52+
ManagedBot(ManagedBotUpdated),
5253
}
5354

5455
#[apply(apistruct!)]

0 commit comments

Comments
 (0)