botapi-py 1.4.2__tar.gz → 1.4.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: botapi-py
3
- Version: 1.4.2
3
+ Version: 1.4.4
4
4
  Summary: A simple and flexible Python library to conveniently build fast Telegram bots using the Bot API.
5
5
  Requires-Dist: httpx>=0.28.1
6
6
  Requires-Dist: pydantic>=2.12.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "botapi-py"
3
- version = "1.4.2"
3
+ version = "1.4.4"
4
4
  description = "A simple and flexible Python library to conveniently build fast Telegram bots using the Bot API."
5
5
  # readme = "README.md"
6
6
  # authors = [
@@ -36,6 +36,13 @@ class BaseBot:
36
36
  if not session:
37
37
  log.warning('No HTTP session provided, creating a new one.')
38
38
 
39
+ @property
40
+ def bot_id(self) -> int:
41
+ '''
42
+ Returns the bot's user ID by extracting it from the token.
43
+ '''
44
+ return int(self.token.split(':')[0])
45
+
39
46
  def _compose_api_url(self, method: str) -> str:
40
47
  url = f'{self.api_url}/bot{self.token}/'
41
48
  if self.test_server:
@@ -45,8 +45,9 @@ class UpdateType(enum.StrEnum):
45
45
 
46
46
  class MediaType(enum.StrEnum):
47
47
  '''
48
- These are messages containing some kind of multimedia/visual content,
49
- and NOT text-centric content.
48
+ Subset of `MessageType`.
49
+
50
+ This represents **messages** containing some kind of **multimedia/visual content**.
50
51
  '''
51
52
  ANIMATION = 'animation'
52
53
  AUDIO = 'audio'
@@ -61,10 +62,12 @@ class MediaType(enum.StrEnum):
61
62
 
62
63
  class ServiceMessage(enum.StrEnum):
63
64
  '''
64
- These are special types of messages that convey service information.
65
+ Subset of `MessageType`.
66
+
67
+ This represents special types of **service messages**.
65
68
 
66
- They are ALL represented as semi-transparent bubbles in Telegram apps UI,
67
- containing text and/or graphical elements (e.g. gifts, giveaways).
69
+ These messages are ALL represented as semi-transparent bubbles in Telegram apps UI,
70
+ containing text (e.g. "user joined the group") and/or graphical elements (e.g. gifts, giveaways).
68
71
  '''
69
72
  NEW_CHAT_MEMBERS = 'new_chat_members'
70
73
  LEFT_CHAT_MEMBER = 'left_chat_member'
@@ -118,7 +121,10 @@ class ServiceMessage(enum.StrEnum):
118
121
 
119
122
  class OtherMessageType(enum.StrEnum):
120
123
  '''
121
- The type of this message (that does NOT contain multimedia or service content).
124
+ Subset of `MessageType`.
125
+
126
+ This represents other possible types of messages, that do NOT contain
127
+ multimedia nor service content.
122
128
  '''
123
129
  TEXT = 'text'
124
130
  CHECKLIST = 'checklist'
@@ -136,17 +142,19 @@ MessageType = Union[
136
142
  OtherMessageType
137
143
  ]
138
144
  '''
145
+ Possible types of a `UpdateType.Message` update.
146
+
139
147
  The type of the **actual** message content.
140
148
 
141
149
  All of the fields are mutually exclusive, since a message
142
150
  can only be of one 'type' at a time.
143
151
  '''
144
-
152
+
145
153
  class ChatMemberStatus(enum.StrEnum):
146
154
  '''
147
- Statuses of a chat member.
155
+ Possible statuses of a `ChatMember`.
148
156
 
149
- Note that left members that are also restricted (muted), are represented as
157
+ Remember that left members that are also restricted (muted), are represented as
150
158
  `RESTRICTED` with the `is_member` flag set to `False`.
151
159
 
152
160
  See: https://core.telegram.org/bots/api#chatmember
@@ -8,6 +8,8 @@ from typing import Union, Optional, List
8
8
 
9
9
  from . import core
10
10
 
11
+ from . import enums
12
+
11
13
  from .types import (
12
14
  Update,
13
15
  WebhookInfo,
@@ -327,7 +329,7 @@ class Bot(core.BaseBot):
327
329
  offset: Optional[int] = None,
328
330
  limit: Optional[int] = None,
329
331
  timeout: Optional[int] = None,
330
- allowed_updates: Optional[List[str]] = None,
332
+ allowed_updates: Optional[List[enums.UpdateType]] = None,
331
333
  ) -> List[Update]:
332
334
  '''
333
335
  Use this method to receive incoming updates using
@@ -351,7 +353,7 @@ class Bot(core.BaseBot):
351
353
  certificate: Optional[InputFile] = None,
352
354
  ip_address: Optional[str] = None,
353
355
  max_connections: Optional[int] = None,
354
- allowed_updates: Optional[List[str]] = None,
356
+ allowed_updates: Optional[List[enums.UpdateType]] = None,
355
357
  drop_pending_updates: Optional[bool] = None,
356
358
  secret_token: Optional[str] = None,
357
359
  ) -> bool:
@@ -473,7 +475,7 @@ class Bot(core.BaseBot):
473
475
  business_connection_id: Optional[str] = None,
474
476
  message_thread_id: Optional[int] = None,
475
477
  direct_messages_topic_id: Optional[int] = None,
476
- parse_mode: Optional[str] = 'HTML',
478
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
477
479
  entities: Optional[List[MessageEntity]] = None,
478
480
  link_preview_options: Optional[LinkPreviewOptions] = None,
479
481
  disable_notification: Optional[bool] = None,
@@ -586,7 +588,7 @@ class Bot(core.BaseBot):
586
588
  direct_messages_topic_id: Optional[int] = None,
587
589
  video_start_timestamp: Optional[int] = None,
588
590
  caption: Optional[str] = None,
589
- parse_mode: Optional[str] = 'HTML',
591
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
590
592
  caption_entities: Optional[List[MessageEntity]] = None,
591
593
  show_caption_above_media: Optional[bool] = None,
592
594
  disable_notification: Optional[bool] = None,
@@ -680,7 +682,7 @@ class Bot(core.BaseBot):
680
682
  message_thread_id: Optional[int] = None,
681
683
  direct_messages_topic_id: Optional[int] = None,
682
684
  caption: Optional[str] = None,
683
- parse_mode: Optional[str] = 'HTML',
685
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
684
686
  caption_entities: Optional[List[MessageEntity]] = None,
685
687
  show_caption_above_media: Optional[bool] = None,
686
688
  has_spoiler: Optional[bool] = None,
@@ -728,7 +730,7 @@ class Bot(core.BaseBot):
728
730
  message_thread_id: Optional[int] = None,
729
731
  direct_messages_topic_id: Optional[int] = None,
730
732
  caption: Optional[str] = None,
731
- parse_mode: Optional[str] = 'HTML',
733
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
732
734
  caption_entities: Optional[List[MessageEntity]] = None,
733
735
  duration: Optional[int] = None,
734
736
  performer: Optional[str] = None,
@@ -787,7 +789,7 @@ class Bot(core.BaseBot):
787
789
  direct_messages_topic_id: Optional[int] = None,
788
790
  thumbnail: Optional[Union[InputFile, str]] = None,
789
791
  caption: Optional[str] = None,
790
- parse_mode: Optional[str] = 'HTML',
792
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
791
793
  caption_entities: Optional[List[MessageEntity]] = None,
792
794
  disable_content_type_detection: Optional[bool] = None,
793
795
  disable_notification: Optional[bool] = None,
@@ -843,7 +845,7 @@ class Bot(core.BaseBot):
843
845
  cover: Optional[Union[InputFile, str]] = None,
844
846
  start_timestamp: Optional[int] = None,
845
847
  caption: Optional[str] = None,
846
- parse_mode: Optional[str] = 'HTML',
848
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
847
849
  caption_entities: Optional[List[MessageEntity]] = None,
848
850
  show_caption_above_media: Optional[bool] = None,
849
851
  has_spoiler: Optional[bool] = None,
@@ -907,7 +909,7 @@ class Bot(core.BaseBot):
907
909
  height: Optional[int] = None,
908
910
  thumbnail: Optional[Union[InputFile, str]] = None,
909
911
  caption: Optional[str] = None,
910
- parse_mode: Optional[str] = 'HTML',
912
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
911
913
  caption_entities: Optional[List[MessageEntity]] = None,
912
914
  show_caption_above_media: Optional[bool] = None,
913
915
  has_spoiler: Optional[bool] = None,
@@ -963,7 +965,7 @@ class Bot(core.BaseBot):
963
965
  message_thread_id: Optional[int] = None,
964
966
  direct_messages_topic_id: Optional[int] = None,
965
967
  caption: Optional[str] = None,
966
- parse_mode: Optional[str] = 'HTML',
968
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
967
969
  caption_entities: Optional[List[MessageEntity]] = None,
968
970
  duration: Optional[int] = None,
969
971
  disable_notification: Optional[bool] = None,
@@ -1066,7 +1068,7 @@ class Bot(core.BaseBot):
1066
1068
  direct_messages_topic_id: Optional[int] = None,
1067
1069
  payload: Optional[str] = None,
1068
1070
  caption: Optional[str] = None,
1069
- parse_mode: Optional[str] = 'HTML',
1071
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
1070
1072
  caption_entities: Optional[List[MessageEntity]] = None,
1071
1073
  show_caption_above_media: Optional[bool] = None,
1072
1074
  disable_notification: Optional[bool] = None,
@@ -3284,7 +3286,7 @@ class Bot(core.BaseBot):
3284
3286
  content: InputStoryContent,
3285
3287
  active_period: int,
3286
3288
  caption: Optional[str] = None,
3287
- parse_mode: Optional[str] = 'HTML',
3289
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
3288
3290
  caption_entities: Optional[List[MessageEntity]] = None,
3289
3291
  areas: Optional[List[StoryArea]] = None,
3290
3292
  post_to_chat_page: Optional[bool] = None,
@@ -3317,7 +3319,7 @@ class Bot(core.BaseBot):
3317
3319
  story_id: int,
3318
3320
  content: InputStoryContent,
3319
3321
  caption: Optional[str] = None,
3320
- parse_mode: Optional[str] = 'HTML',
3322
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
3321
3323
  caption_entities: Optional[List[MessageEntity]] = None,
3322
3324
  areas: Optional[List[StoryArea]] = None,
3323
3325
  ) -> Story:
@@ -3368,7 +3370,7 @@ class Bot(core.BaseBot):
3368
3370
  chat_id: Optional[Union[int, str]] = None,
3369
3371
  message_id: Optional[int] = None,
3370
3372
  inline_message_id: Optional[str] = None,
3371
- parse_mode: Optional[str] = 'HTML',
3373
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
3372
3374
  entities: Optional[List[MessageEntity]] = None,
3373
3375
  link_preview_options: Optional[LinkPreviewOptions] = None,
3374
3376
  reply_markup: Optional[InlineKeyboardMarkup] = None,
@@ -3409,7 +3411,7 @@ class Bot(core.BaseBot):
3409
3411
  message_id: Optional[int] = None,
3410
3412
  inline_message_id: Optional[str] = None,
3411
3413
  caption: Optional[str] = None,
3412
- parse_mode: Optional[str] = 'HTML',
3414
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
3413
3415
  caption_entities: Optional[List[MessageEntity]] = None,
3414
3416
  show_caption_above_media: Optional[bool] = None,
3415
3417
  reply_markup: Optional[InlineKeyboardMarkup] = None,
@@ -143,7 +143,7 @@ class Message(MaybeInaccessibleMessage, frozen=True):
143
143
  async def pin(
144
144
  self,
145
145
  bot: methods.Bot,
146
- disable_notification: bool | None = None,
146
+ disable_notification: Union[bool, None] = None,
147
147
  ) -> bool:
148
148
  '''
149
149
  Pins this message in the chat.
@@ -171,13 +171,13 @@ class Message(MaybeInaccessibleMessage, frozen=True):
171
171
  async def forward(
172
172
  self,
173
173
  bot: methods.Bot,
174
- chat_id: int | str,
175
- disable_notification: bool | None = None,
176
- protect_content: bool | None = None,
177
- message_thread_id: int | None = None,
178
- direct_messages_topic_id: int | None = None,
179
- video_start_timestamp: int | None = None,
180
- # suggested_post_parameters: SuggestedPostParameters | None = None,
174
+ chat_id: Union[int, str],
175
+ disable_notification: Optional[bool] = None,
176
+ protect_content: Optional[bool] = None,
177
+ message_thread_id: Optional[int] = None,
178
+ direct_messages_topic_id: Optional[int] = None,
179
+ video_start_timestamp: Optional[int] = None,
180
+ # suggested_post_parameters: Optional[SuggestedPostParameters] = None,
181
181
  ) -> Message:
182
182
  '''
183
183
  Forwards this message to another chat.
@@ -198,20 +198,20 @@ class Message(MaybeInaccessibleMessage, frozen=True):
198
198
  async def copy_to(
199
199
  self,
200
200
  bot: methods.Bot,
201
- chat_id: int | str,
202
- message_thread_id: int | None = None,
203
- direct_messages_topic_id: int | None = None,
204
- video_start_timestamp: int | None = None,
205
- # caption: str | None = None,
206
- # parse_mode: str | None = 'HTML',
207
- # caption_entities: List[MessageEntity] | None = None,
208
- # show_caption_above_media: bool | None = None,
209
- disable_notification: bool | None = None,
210
- protect_content: bool | None = None,
211
- # allow_paid_broadcast: bool | None = None,
212
- # suggested_post_parameters: SuggestedPostParameters | None = None,
213
- # reply_parameters: ReplyParameters | None = None,
214
- # reply_markup: InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None = None
201
+ chat_id: Union[int, str],
202
+ message_thread_id: Optional[int] = None,
203
+ direct_messages_topic_id: Optional[int] = None,
204
+ video_start_timestamp: Optional[int] = None,
205
+ # caption: Optional[str] = None,
206
+ # parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
207
+ # caption_entities: Optional[List[MessageEntity]] = None,
208
+ # show_caption_above_media: Optional[bool] = None,
209
+ disable_notification: Optional[bool] = None,
210
+ protect_content: Optional[bool] = None,
211
+ # allow_paid_broadcast: Optional[bool] = None,
212
+ # suggested_post_parameters: Optional[SuggestedPostParameters] = None,
213
+ # reply_parameters: Optional[ReplyParameters] = None,
214
+ # reply_markup: Optional[Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply]] = None
215
215
  ) -> MessageId:
216
216
  '''
217
217
  Copies this message to another chat.
@@ -241,11 +241,11 @@ class Message(MaybeInaccessibleMessage, frozen=True):
241
241
  bot: methods.Bot,
242
242
  text: str,
243
243
  # inline_message_id: Optional[str] = None,
244
- parse_mode: str | None = 'HTML',
245
- entities: list[MessageEntity] | None = None,
246
- link_preview_options: LinkPreviewOptions | None = None,
247
- reply_markup: InlineKeyboardMarkup | None = None,
248
- ) -> Message | bool:
244
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
245
+ entities: Optional[list[MessageEntity]] = None,
246
+ link_preview_options: Optional[LinkPreviewOptions] = None,
247
+ reply_markup: Optional[InlineKeyboardMarkup] = None,
248
+ ) -> Union[Message, bool]:
249
249
  '''
250
250
  Edits the text of this message.
251
251
  Shortcut for `bot.edit_message_text`.
@@ -267,8 +267,8 @@ class Message(MaybeInaccessibleMessage, frozen=True):
267
267
  self,
268
268
  bot: methods.Bot,
269
269
  # inline_message_id: Optional[str] = None,
270
- reply_markup: InlineKeyboardMarkup | None = None,
271
- ) -> Message | bool:
270
+ reply_markup: Optional[InlineKeyboardMarkup] = None,
271
+ ) -> Union[Message, bool]:
272
272
  '''
273
273
  Edits the reply markup (inline keyboard) of this message.
274
274
  Shortcut for `bot.edit_message_reply_markup`.
@@ -285,18 +285,18 @@ class Message(MaybeInaccessibleMessage, frozen=True):
285
285
  self,
286
286
  bot: methods.Bot,
287
287
  text: str,
288
- parse_mode: str | None = 'HTML',
289
- entities: list[MessageEntity] | None = None,
288
+ parse_mode: Optional[enums.ParseMode] = enums.ParseMode.HTML,
289
+ entities: Optional[list[MessageEntity]] = None,
290
290
  reply_to_original_message: bool = True, # CUSTOM
291
291
  allow_sending_without_reply: bool = True, # CUSTOM
292
- link_preview_options: LinkPreviewOptions | None = None,
293
- disable_notification: bool | None = None,
294
- protect_content: bool | None = None,
295
- allow_paid_broadcast: bool | None = None,
296
- message_effect_id: str | None = None,
297
- reply_parameters: ReplyParameters | None = None,
298
- # suggested_post_parameters: SuggestedPostParameters | None = None,
299
- reply_markup: InlineKeyboardMarkup | ReplyKeyboardMarkup | ReplyKeyboardRemove | ForceReply | None = None,
292
+ link_preview_options: Optional[LinkPreviewOptions] = None,
293
+ disable_notification: Optional[bool] = None,
294
+ protect_content: Optional[bool] = None,
295
+ allow_paid_broadcast: Optional[bool] = None,
296
+ message_effect_id: Optional[str] = None,
297
+ reply_parameters: Optional[ReplyParameters] = None,
298
+ # suggested_post_parameters: Optional[SuggestedPostParameters] = None,
299
+ reply_markup: Optional[Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply]] = None,
300
300
  ) -> Message:
301
301
  '''
302
302
  Replies to this message with a text message.
@@ -363,7 +363,7 @@ class Message(MaybeInaccessibleMessage, frozen=True):
363
363
  return None
364
364
 
365
365
  @property
366
- def message_type(self) -> enums.MessageType | None:
366
+ def message_type(self) -> Optional[enums.MessageType]:
367
367
  '''
368
368
  Type of the actual message content (e.g., `text`, `photo`, `sticker`, `poll`, `new_chat_title`, etc.).
369
369
 
@@ -1101,7 +1101,7 @@ class InputMediaAnimation(InputMedia, frozen=True):
1101
1101
  media: str
1102
1102
  thumbnail: Optional[str] = Field(default=None)
1103
1103
  caption: Optional[str] = Field(default=None)
1104
- parse_mode: Optional[str] = Field(default='HTML')
1104
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1105
1105
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1106
1106
  show_caption_above_media: Optional[bool] = Field(default=None)
1107
1107
  width: Optional[int] = Field(default=None)
@@ -1120,7 +1120,7 @@ class InputMediaDocument(InputMedia, frozen=True):
1120
1120
  media: str
1121
1121
  thumbnail: Optional[str] = Field(default=None)
1122
1122
  caption: Optional[str] = Field(default=None)
1123
- parse_mode: Optional[str] = Field(default='HTML')
1123
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1124
1124
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1125
1125
  disable_content_type_detection: Optional[bool] = Field(default=None)
1126
1126
 
@@ -1136,7 +1136,7 @@ class InputMediaAudio(InputMedia, frozen=True):
1136
1136
  media: str
1137
1137
  thumbnail: Optional[str] = Field(default=None)
1138
1138
  caption: Optional[str] = Field(default=None)
1139
- parse_mode: Optional[str] = Field(default='HTML')
1139
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1140
1140
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1141
1141
  duration: Optional[int] = Field(default=None)
1142
1142
  performer: Optional[str] = Field(default=None)
@@ -1152,7 +1152,7 @@ class InputMediaPhoto(InputMedia, frozen=True):
1152
1152
  type: Literal['photo'] = 'photo'
1153
1153
  media: str
1154
1154
  caption: Optional[str] = Field(default=None)
1155
- parse_mode: Optional[str] = Field(default='HTML')
1155
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1156
1156
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1157
1157
  show_caption_above_media: Optional[bool] = Field(default=None)
1158
1158
  has_spoiler: Optional[bool] = Field(default=None)
@@ -1170,7 +1170,7 @@ class InputMediaVideo(InputMedia, frozen=True):
1170
1170
  cover: Optional[str] = Field(default=None)
1171
1171
  start_timestamp: Optional[int] = Field(default=None)
1172
1172
  caption: Optional[str] = Field(default=None)
1173
- parse_mode: Optional[str] = Field(default='HTML')
1173
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1174
1174
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1175
1175
  show_caption_above_media: Optional[bool] = Field(default=None)
1176
1176
  width: Optional[int] = Field(default=None)
@@ -1308,7 +1308,7 @@ class InlineQueryResultCachedAudio(InlineQueryResult, frozen=True):
1308
1308
  id: str
1309
1309
  audio_file_id: str
1310
1310
  caption: Optional[str] = Field(default=None)
1311
- parse_mode: Optional[str] = Field(default='HTML')
1311
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1312
1312
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1313
1313
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
1314
1314
  input_message_content: Optional[InputMessageContent] = Field(default=None)
@@ -1331,7 +1331,7 @@ class InlineQueryResultCachedDocument(InlineQueryResult, frozen=True):
1331
1331
  document_file_id: str
1332
1332
  description: Optional[str] = Field(default=None)
1333
1333
  caption: Optional[str] = Field(default=None)
1334
- parse_mode: Optional[str] = Field(default='HTML')
1334
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1335
1335
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1336
1336
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
1337
1337
  input_message_content: Optional[InputMessageContent] = Field(default=None)
@@ -1353,7 +1353,7 @@ class InlineQueryResultCachedGif(InlineQueryResult, frozen=True):
1353
1353
  gif_file_id: str
1354
1354
  title: Optional[str] = Field(default=None)
1355
1355
  caption: Optional[str] = Field(default=None)
1356
- parse_mode: Optional[str] = Field(default='HTML')
1356
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1357
1357
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1358
1358
  show_caption_above_media: Optional[bool] = Field(default=None)
1359
1359
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1377,7 +1377,7 @@ class InlineQueryResultCachedMpeg4Gif(InlineQueryResult, frozen=True):
1377
1377
  mpeg4_file_id: str
1378
1378
  title: Optional[str] = Field(default=None)
1379
1379
  caption: Optional[str] = Field(default=None)
1380
- parse_mode: Optional[str] = Field(default='HTML')
1380
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1381
1381
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1382
1382
  show_caption_above_media: Optional[bool] = Field(default=None)
1383
1383
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1401,7 +1401,7 @@ class InlineQueryResultCachedPhoto(InlineQueryResult, frozen=True):
1401
1401
  title: Optional[str] = Field(default=None)
1402
1402
  description: Optional[str] = Field(default=None)
1403
1403
  caption: Optional[str] = Field(default=None)
1404
- parse_mode: Optional[str] = Field(default='HTML')
1404
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1405
1405
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1406
1406
  show_caption_above_media: Optional[bool] = Field(default=None)
1407
1407
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1442,7 +1442,7 @@ class InlineQueryResultCachedVideo(InlineQueryResult, frozen=True):
1442
1442
  title: str
1443
1443
  description: Optional[str] = Field(default=None)
1444
1444
  caption: Optional[str] = Field(default=None)
1445
- parse_mode: Optional[str] = Field(default='HTML')
1445
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1446
1446
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1447
1447
  show_caption_above_media: Optional[bool] = Field(default=None)
1448
1448
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1465,7 +1465,7 @@ class InlineQueryResultCachedVoice(InlineQueryResult, frozen=True):
1465
1465
  voice_file_id: str
1466
1466
  title: str
1467
1467
  caption: Optional[str] = Field(default=None)
1468
- parse_mode: Optional[str] = Field(default='HTML')
1468
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1469
1469
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1470
1470
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
1471
1471
  input_message_content: Optional[InputMessageContent] = Field(default=None)
@@ -1505,7 +1505,7 @@ class InlineQueryResultAudio(InlineQueryResult, frozen=True):
1505
1505
  audio_url: str
1506
1506
  title: str
1507
1507
  caption: Optional[str] = Field(default=None)
1508
- parse_mode: Optional[str] = Field(default='HTML')
1508
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1509
1509
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1510
1510
  performer: Optional[str] = Field(default=None)
1511
1511
  audio_duration: Optional[int] = Field(default=None)
@@ -1566,7 +1566,7 @@ class InlineQueryResultDocument(InlineQueryResult, frozen=True):
1566
1566
  document_url: str
1567
1567
  mime_type: str
1568
1568
  caption: Optional[str] = Field(default=None)
1569
- parse_mode: Optional[str] = Field(default='HTML')
1569
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1570
1570
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1571
1571
  description: Optional[str] = Field(default=None)
1572
1572
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1596,7 +1596,7 @@ class InlineQueryResultGif(InlineQueryResult, frozen=True):
1596
1596
  thumbnail_mime_type: Optional[str] = Field(default=None)
1597
1597
  title: Optional[str] = Field(default=None)
1598
1598
  caption: Optional[str] = Field(default=None)
1599
- parse_mode: Optional[str] = Field(default='HTML')
1599
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1600
1600
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1601
1601
  show_caption_above_media: Optional[bool] = Field(default=None)
1602
1602
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1650,7 +1650,7 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult, frozen=True):
1650
1650
  thumbnail_mime_type: Optional[str] = Field(default=None)
1651
1651
  title: Optional[str] = Field(default=None)
1652
1652
  caption: Optional[str] = Field(default=None)
1653
- parse_mode: Optional[str] = Field(default='HTML')
1653
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1654
1654
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1655
1655
  show_caption_above_media: Optional[bool] = Field(default=None)
1656
1656
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1676,7 +1676,7 @@ class InlineQueryResultPhoto(InlineQueryResult, frozen=True):
1676
1676
  title: Optional[str] = Field(default=None)
1677
1677
  description: Optional[str] = Field(default=None)
1678
1678
  caption: Optional[str] = Field(default=None)
1679
- parse_mode: Optional[str] = Field(default='HTML')
1679
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1680
1680
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1681
1681
  show_caption_above_media: Optional[bool] = Field(default=None)
1682
1682
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1727,7 +1727,7 @@ class InlineQueryResultVideo(InlineQueryResult, frozen=True):
1727
1727
  thumbnail_url: str
1728
1728
  title: str
1729
1729
  caption: Optional[str] = Field(default=None)
1730
- parse_mode: Optional[str] = Field(default='HTML')
1730
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1731
1731
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1732
1732
  show_caption_above_media: Optional[bool] = Field(default=None)
1733
1733
  video_width: Optional[int] = Field(default=None)
@@ -1754,7 +1754,7 @@ class InlineQueryResultVoice(InlineQueryResult, frozen=True):
1754
1754
  voice_url: str
1755
1755
  title: str
1756
1756
  caption: Optional[str] = Field(default=None)
1757
- parse_mode: Optional[str] = Field(default='HTML')
1757
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1758
1758
  caption_entities: Optional[List[MessageEntity]] = Field(default=None)
1759
1759
  voice_duration: Optional[int] = Field(default=None)
1760
1760
  reply_markup: Optional[InlineKeyboardMarkup] = Field(default=None)
@@ -1797,7 +1797,7 @@ class InputTextMessageContent(InputMessageContent, frozen=True):
1797
1797
  '''
1798
1798
 
1799
1799
  message_text: str
1800
- parse_mode: Optional[str] = Field(default='HTML')
1800
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
1801
1801
  entities: Optional[List[MessageEntity]] = Field(default=None)
1802
1802
  link_preview_options: Optional[LinkPreviewOptions] = Field(default=None)
1803
1803
 
@@ -2350,12 +2350,21 @@ class MessageEntity(BaseModel, frozen=True):
2350
2350
 
2351
2351
  @staticmethod
2352
2352
  def from_dict(
2353
- json_data: list[dict[str, Any]]
2353
+ json_data: dict[str, Any]
2354
+ ) -> MessageEntity:
2355
+ '''
2356
+ Converts a JSON dictionary to a `MessageEntity` object.
2357
+ '''
2358
+ return MessageEntity.model_validate(json_data)
2359
+
2360
+ @staticmethod
2361
+ def from_list_of_dicts(
2362
+ list_of_json_data: list[dict[str, Any]]
2354
2363
  ) -> list[MessageEntity]:
2355
2364
  '''
2356
- Converts a list of JSON dictionaries to a list of `MessageEntity` objects.
2365
+ Converts a **list** of JSON dictionaries to a **list** of `MessageEntity` objects.
2357
2366
  '''
2358
- return [MessageEntity.model_validate(item) for item in json_data]
2367
+ return [MessageEntity.model_validate(item) for item in list_of_json_data]
2359
2368
 
2360
2369
 
2361
2370
  class TextQuote(BaseModel, frozen=True):
@@ -2674,7 +2683,7 @@ class InputChecklistTask(BaseModel, frozen=True):
2674
2683
 
2675
2684
  id: int
2676
2685
  text: str
2677
- parse_mode: Optional[str] = Field(default='HTML')
2686
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
2678
2687
  text_entities: Optional[List[MessageEntity]] = Field(default=None)
2679
2688
 
2680
2689
  class InputChecklist(BaseModel, frozen=True):
@@ -2686,7 +2695,7 @@ class InputChecklist(BaseModel, frozen=True):
2686
2695
 
2687
2696
  title: str
2688
2697
  tasks: List[InputChecklistTask]
2689
- parse_mode: Optional[str] = Field(default='HTML')
2698
+ parse_mode: Optional[str] = Field(default=enums.ParseMode.HTML.value)
2690
2699
  title_entities: Optional[List[MessageEntity]] = Field(default=None)
2691
2700
  others_can_add_tasks: Optional[bool] = Field(default=None)
2692
2701
  others_can_mark_tasks_as_done: Optional[bool] = Field(default=None)
@@ -4041,7 +4050,7 @@ class InputFile(BaseModel, frozen=True):
4041
4050
 
4042
4051
  file_content: bytes # Raw file content as bytes.
4043
4052
  file_name: str # File name, including its extension.
4044
- mime_type: str | None = Field(default=None) # File MIME type.
4053
+ mime_type: Optional[str] = Field(default=None) # File MIME type.
4045
4054
 
4046
4055
 
4047
4056
  class Sticker(BaseModel, frozen=True):
File without changes